13
13
* limitations under the License.
14
14
*/
15
15
16
+ #include <math.h>
17
+
16
18
#include "jerryscript-ext/arg.h"
17
19
#include "jerryscript.h"
18
20
@@ -39,14 +41,15 @@ jerryx_arg_transform_optional (jerryx_arg_js_iterator_t *js_arg_iter_p, /**< ava
39
41
} /* jerryx_arg_transform_optional */
40
42
41
43
/**
42
- * Tranform a JS argument to a double. Type coercion is not allowed.
44
+ * The common part in transforming a JS argument to a number (double or certain int) type.
45
+ * Type coercion is not allowed.
43
46
*
44
47
* @return jerry undefined: the transformer passes,
45
48
* jerry error: the transformer fails.
46
49
*/
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 */
50
+ static jerry_value_t
51
+ jerryx_arg_transform_number_strict_common (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
52
+ double * number_p ) /**< [out] the number in JS arg */
50
53
{
51
54
jerry_value_t js_arg = jerryx_arg_js_iterator_pop (js_arg_iter_p );
52
55
@@ -56,21 +59,21 @@ jerryx_arg_transform_number_strict (jerryx_arg_js_iterator_t *js_arg_iter_p, /**
56
59
(jerry_char_t * ) "It is not a number." );
57
60
}
58
61
59
- double * dest = c_arg_p -> dest ;
60
- * dest = jerry_get_number_value (js_arg );
62
+ * number_p = jerry_get_number_value (js_arg );
61
63
62
64
return jerry_create_undefined ();
63
- } /* jerryx_arg_transform_number_strict */
65
+ } /* jerryx_arg_transform_number_strict_common */
64
66
65
67
/**
66
- * Transform a JS argument to a double. Type coercion is allowed.
68
+ * The common part in transforming a JS argument to a number (double or certain int) type.
69
+ * Type coercion is allowed.
67
70
*
68
71
* @return jerry undefined: the transformer passes,
69
72
* jerry error: the transformer fails.
70
73
*/
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 */
74
+ static jerry_value_t
75
+ jerryx_arg_transform_number_common (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
76
+ double * number_p ) /**< [out] the number in JS arg */
74
77
{
75
78
jerry_value_t js_arg = jerryx_arg_js_iterator_pop (js_arg_iter_p );
76
79
@@ -84,13 +87,118 @@ jerryx_arg_transform_number (jerryx_arg_js_iterator_t *js_arg_iter_p, /**< avail
84
87
(jerry_char_t * ) "It can not be converted to a number." );
85
88
}
86
89
87
- double * dest = c_arg_p -> dest ;
88
- * dest = jerry_get_number_value (to_number );
90
+ * number_p = jerry_get_number_value (to_number );
89
91
jerry_release_value (to_number );
90
92
91
93
return jerry_create_undefined ();
94
+ } /* jerryx_arg_transform_number_common */
95
+
96
+ /**
97
+ * Transform a JS argument to a double. Type coercion is not allowed.
98
+ *
99
+ * @return jerry undefined: the transformer passes,
100
+ * jerry error: the transformer fails.
101
+ */
102
+ jerry_value_t
103
+ jerryx_arg_transform_number_strict (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
104
+ const jerryx_arg_t * c_arg_p ) /**< the native arg */
105
+ {
106
+ return jerryx_arg_transform_number_strict_common (js_arg_iter_p , c_arg_p -> dest );
107
+ } /* jerryx_arg_transform_number_strict */
108
+
109
+ /**
110
+ * Tranform a JS argument to a double. Type coercion is allowed.
111
+ *
112
+ * @return jerry undefined: the transformer passes,
113
+ * jerry error: the transformer fails.
114
+ */
115
+ jerry_value_t
116
+ jerryx_arg_transform_number (jerryx_arg_js_iterator_t * js_arg_iter_p , /**< available JS args */
117
+ const jerryx_arg_t * c_arg_p ) /**< the native arg */
118
+ {
119
+ return jerryx_arg_transform_number_common (js_arg_iter_p , c_arg_p -> dest );
92
120
} /* jerryx_arg_transform_number */
93
121
122
+ /**
123
+ * Helper function to process a double number before converting it
124
+ * to an integer.
125
+ *
126
+ * @return jerry undefined: the transformer passes,
127
+ * jerry error: the transformer fails.
128
+ */
129
+ static jerry_value_t
130
+ jerryx_arg_helper_process_double (double * d , /**< [in, out] the number to be processed */
131
+ double min , /**< the min value for clamping */
132
+ double max , /**< the max value for clamping */
133
+ jerryx_arg_int_option_t option ) /**< the converting policies */
134
+ {
135
+ if (option .clamp == JERRYX_ARG_NO_CLAMP )
136
+ {
137
+ if (* d > max || * d < min )
138
+ {
139
+ return jerry_create_error (JERRY_ERROR_TYPE ,
140
+ (jerry_char_t * ) "The number is out of range." );
141
+ }
142
+ }
143
+ else
144
+ {
145
+ * d = * d < min ? min : * d ;
146
+ * d = * d > max ? max : * d ;
147
+ }
148
+
149
+ if (option .round == JERRYX_ARG_ROUND )
150
+ {
151
+ * d = (* d >= 0.0 ) ? floor (* d + 0.5 ) : ceil (* d - 0.5 );
152
+ }
153
+ else if (option .round == JERRYX_ARG_FLOOR )
154
+ {
155
+ * d = floor (* d );
156
+ }
157
+ else
158
+ {
159
+ * d = ceil (* d );
160
+ }
161
+
162
+ return jerry_create_undefined ();
163
+ } /* jerryx_arg_helper_process_double */
164
+
165
+ /**
166
+ * Use the macro to define thr transform functions for int type.
167
+ */
168
+ #define JERRYX_ARG_TRANSFORM_FUNC_FOR_INT_TEMPLATE (type , suffix , min , max ) \
169
+ jerry_value_t jerryx_arg_transform_ ## type ## suffix (jerryx_arg_js_iterator_t *js_arg_iter_p, \
170
+ const jerryx_arg_t *c_arg_p) \
171
+ { \
172
+ double tmp; \
173
+ jerry_value_t rv = jerryx_arg_transform_number ## suffix ## _common (js_arg_iter_p, &tmp); \
174
+ if (jerry_value_has_error_flag (rv)) \
175
+ { \
176
+ return rv; \
177
+ } \
178
+ jerry_release_value (rv); \
179
+ jerryx_arg_int_option_t *options_p = (jerryx_arg_int_option_t *) &c_arg_p->extra_info; \
180
+ rv = jerryx_arg_helper_process_double (&tmp, min, max, *options_p); \
181
+ if (jerry_value_has_error_flag (rv)) \
182
+ { \
183
+ return rv; \
184
+ } \
185
+ *(type ## _t *) c_arg_p->dest = (type ## _t) tmp; \
186
+ return rv; \
187
+ }
188
+
189
+ #define JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (type , min , max ) \
190
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT_TEMPLATE (type, _strict, min, max) \
191
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT_TEMPLATE (type, , min, max)
192
+
193
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (uint8 , 0 , UINT8_MAX )
194
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (int8 , INT8_MIN , INT8_MAX )
195
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (uint16 , 0 , UINT16_MAX )
196
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (int16 , INT16_MIN , INT16_MAX )
197
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (uint32 , 0 , UINT32_MAX )
198
+ JERRYX_ARG_TRANSFORM_FUNC_FOR_INT (int32 , INT32_MIN , INT32_MAX )
199
+
200
+ #undef JERRYX_ARG_TRANSFORM_FUNC_FOR_INT_TEMPLATE
201
+ #undef JERRYX_ARG_TRANSFORM_FUNC_FOR_INT
94
202
/**
95
203
* Tranform a JS argument to a boolean. Type coercion is not allowed.
96
204
*
@@ -294,12 +402,12 @@ jerryx_arg_transform_object_props (jerryx_arg_js_iterator_t *js_arg_iter_p, /**<
294
402
* Define transformer for optional argument.
295
403
*/
296
404
#define JERRYX_ARG_TRANSFORM_OPTIONAL (type ) \
297
- jerry_value_t \
298
- jerryx_arg_transform_ ## type ## _optional (jerryx_arg_js_iterator_t *js_arg_iter_p, \
299
- const jerryx_arg_t *c_arg_p) \
300
- { \
301
- return jerryx_arg_transform_optional (js_arg_iter_p, c_arg_p, jerryx_arg_transform_ ## type); \
302
- }
405
+ jerry_value_t \
406
+ jerryx_arg_transform_ ## type ## _optional (jerryx_arg_js_iterator_t *js_arg_iter_p, \
407
+ const jerryx_arg_t *c_arg_p) \
408
+ { \
409
+ return jerryx_arg_transform_optional (js_arg_iter_p, c_arg_p, jerryx_arg_transform_ ## type); \
410
+ }
303
411
304
412
JERRYX_ARG_TRANSFORM_OPTIONAL (number )
305
413
JERRYX_ARG_TRANSFORM_OPTIONAL (number_strict )
@@ -311,6 +419,21 @@ JERRYX_ARG_TRANSFORM_OPTIONAL (function)
311
419
JERRYX_ARG_TRANSFORM_OPTIONAL (native_pointer )
312
420
JERRYX_ARG_TRANSFORM_OPTIONAL (object_props )
313
421
422
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint8 )
423
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint16 )
424
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint32 )
425
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int8 )
426
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int16 )
427
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int32 )
428
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int8_strict )
429
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int16_strict )
430
+ JERRYX_ARG_TRANSFORM_OPTIONAL (int32_strict )
431
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint8_strict )
432
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint16_strict )
433
+ JERRYX_ARG_TRANSFORM_OPTIONAL (uint32_strict )
434
+
435
+ #undef JERRYX_ARG_TRANSFORM_OPTIONAL
436
+
314
437
/**
315
438
* Ignore the JS argument.
316
439
*
0 commit comments