@@ -39,14 +39,15 @@ jerryx_arg_transform_optional (jerryx_arg_js_iterator_t *js_arg_iter_p, /**< ava
39
39
} /* jerryx_arg_transform_optional */
40
40
41
41
/**
42
- * Tranform a JS argument to a double. Type coercion is not allowed.
42
+ * The common part in transforming a JS argument to a number (double or certain int) type.
43
+ * Type coercion is not allowed.
43
44
*
44
45
* @return jerry undefined: the transformer passes,
45
46
* jerry error: the transformer fails.
46
47
*/
47
- jerry_value_t
48
- jerryx_arg_transform_number_strict (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
49
- const jerryx_arg_t * c_arg_p ) /**< the native arg */
48
+ static jerry_value_t
49
+ jerryx_arg_transform_number_strict_common (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
50
+ double * number_p ) /**< OUT: the number in JS arg */
50
51
{
51
52
jerry_value_t js_arg = jerryx_arg_js_iterator_pop (js_arg_iter_p );
52
53
@@ -56,21 +57,21 @@ jerryx_arg_transform_number_strict (jerryx_arg_js_iterator_t *js_arg_iter_p, /**
56
57
(jerry_char_t * ) "It is not a number." );
57
58
}
58
59
59
- double * dest = c_arg_p -> dest ;
60
- * dest = jerry_get_number_value (js_arg );
60
+ * number_p = jerry_get_number_value (js_arg );
61
61
62
62
return jerry_create_undefined ();
63
- } /* jerryx_arg_transform_number_strict */
63
+ } /* jerryx_arg_transform_number_strict_common */
64
64
65
65
/**
66
- * Tranform a JS argument to a double. Type coercion is allowed.
66
+ * The common part in transforming a JS argument to a number (double or certain int) type.
67
+ * Type coercion is allowed.
67
68
*
68
69
* @return jerry undefined: the transformer passes,
69
70
* jerry error: the transformer fails.
70
71
*/
71
- jerry_value_t
72
- jerryx_arg_transform_number (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
73
- const jerryx_arg_t * c_arg_p ) /**< the native arg */
72
+ static jerry_value_t
73
+ jerryx_arg_transform_number_common (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
74
+ double * number_p ) /**< OUT: the number in JS arg */
74
75
{
75
76
jerry_value_t js_arg = jerryx_arg_js_iterator_pop (js_arg_iter_p );
76
77
@@ -84,13 +85,90 @@ jerryx_arg_transform_number (jerryx_arg_js_iterator_t *js_arg_iter_p, /**< avail
84
85
(jerry_char_t * ) "It can not be converted to a number." );
85
86
}
86
87
87
- double * dest = c_arg_p -> dest ;
88
- * dest = jerry_get_number_value (to_number );
88
+ * number_p = jerry_get_number_value (to_number );
89
89
jerry_release_value (to_number );
90
90
91
91
return jerry_create_undefined ();
92
+ } /* jerryx_arg_transform_number_common */
93
+
94
+ /**
95
+ * clamp a double by given min and max value
96
+ * @return clamped double value
97
+ */
98
+ static double
99
+ jerryx_arg_clamp_double (double d , /**< the double value */
100
+ double min , /**< min value */
101
+ double max ) /**< max value */
102
+ {
103
+ const double t = d < min ? min : d ;
104
+ return t > max ? max : t ;
105
+ } /* jerryx_arg_clamp_double */
106
+
107
+ /**
108
+ * Tranform a JS argument to a double. Type coercion is not allowed.
109
+ *
110
+ * @return jerry undefined: the transformer passes,
111
+ * jerry error: the transformer fails.
112
+ */
113
+ jerry_value_t
114
+ jerryx_arg_transform_number_strict (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
115
+ const jerryx_arg_t * c_arg_p ) /**< the native arg */
116
+ {
117
+ return jerryx_arg_transform_number_strict_common (js_arg_iter_p ,
118
+ c_arg_p -> dest );
119
+ } /* jerryx_arg_transform_number_strict */
120
+
121
+ /**
122
+ * Tranform a JS argument to a double. Type coercion is allowed.
123
+ *
124
+ * @return jerry undefined: the transformer passes,
125
+ * jerry error: the transformer fails.
126
+ */
127
+ jerry_value_t
128
+ jerryx_arg_transform_number (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
129
+ const jerryx_arg_t * c_arg_p ) /**< the native arg */
130
+ {
131
+ return jerryx_arg_transform_number_common (js_arg_iter_p ,
132
+ c_arg_p -> dest );
92
133
} /* jerryx_arg_transform_number */
93
134
135
+ /**
136
+ * Use the macro to define two transform functions for int type.
137
+ * One is non-strict version and the other is the strict version.
138
+ */
139
+ #define GENERATE_JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (type , min , max ) \
140
+ jerry_value_t jerryx_arg_transform_ ## type ## _strict (jerryx_arg_js_iterator_t *js_arg_iter_p, \
141
+ const jerryx_arg_t *c_arg_p) \
142
+ { \
143
+ double tmp; \
144
+ jerry_value_t rv = jerryx_arg_transform_number_strict_common (js_arg_iter_p, &tmp);\
145
+ if (!jerry_value_has_error_flag (rv)) \
146
+ { \
147
+ tmp = jerryx_arg_clamp_double (tmp, min, max); \
148
+ *(type ## _t *) c_arg_p->dest = (type ## _t) tmp; \
149
+ } \
150
+ return rv; \
151
+ } \
152
+ jerry_value_t jerryx_arg_transform_ ## type (jerryx_arg_js_iterator_t *js_arg_iter_p, \
153
+ const jerryx_arg_t *c_arg_p) \
154
+ { \
155
+ double tmp; \
156
+ jerry_value_t rv = jerryx_arg_transform_number_common (js_arg_iter_p, &tmp); \
157
+ if (!jerry_value_has_error_flag (rv)) \
158
+ { \
159
+ tmp = jerryx_arg_clamp_double (tmp, min, max); \
160
+ *(type ## _t *) c_arg_p->dest = (type ## _t) tmp; \
161
+ } \
162
+ return rv; \
163
+ }
164
+
165
+ GENERATE_JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (uint8 , 0 , 255 )
166
+ GENERATE_JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (int8 , -128 , 127 )
167
+ GENERATE_JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (uint16 , 0 , 65535 )
168
+ GENERATE_JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (int16 , -32767 , 32767 )
169
+ GENERATE_JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (uint32 , 0 , 4294967295 )
170
+ GENERATE_JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (int32 , -2147483648 , 2147483647 )
171
+
94
172
/**
95
173
* Tranform a JS argument to a boolean. Type coercion is not allowed.
96
174
*
@@ -251,7 +329,7 @@ jerryx_arg_transform_native_pointer (jerryx_arg_js_iterator_t *js_arg_iter_p, /*
251
329
if (!jerry_value_is_object (js_arg ))
252
330
{
253
331
return jerry_create_error (JERRY_ERROR_TYPE ,
254
- (jerry_char_t * ) "It is not a object." );
332
+ (jerry_char_t * ) "It is not an object." );
255
333
}
256
334
257
335
const jerry_object_native_info_t * expected_info_p ;
@@ -289,6 +367,19 @@ JERRYX_ARG_TRANSFORM_OPTIONAL (string_strict)
289
367
JERRYX_ARG_TRANSFORM_OPTIONAL (function )
290
368
JERRYX_ARG_TRANSFORM_OPTIONAL (native_pointer )
291
369
370
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint8 )
371
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint16 )
372
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint32 )
373
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int8 )
374
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int16 )
375
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int32 )
376
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int8_strict )
377
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int16_strict )
378
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int32_strict )
379
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint8_strict )
380
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint16_strict )
381
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint32_strict )
382
+
292
383
/**
293
384
* Ignore the JS argument.
294
385
*
0 commit comments