[jerryx-arg]Check NaN in jerryx_arg_int

JerryScript-DCO-1.0-Signed-off-by: Zidong Jiang zidong.jiang@intel.com
This commit is contained in:
Zidong Jiang
2017-08-11 15:38:47 +08:00
committed by yichoi
parent c1cff3f961
commit 2888a6f488
2 changed files with 46 additions and 8 deletions
+6
View File
@@ -132,6 +132,12 @@ jerryx_arg_helper_process_double (double *d, /**< [in, out] the number to be pro
double max, /**< the max value for clamping */ double max, /**< the max value for clamping */
jerryx_arg_int_option_t option) /**< the converting policies */ jerryx_arg_int_option_t option) /**< the converting policies */
{ {
if (isnan (*d))
{
return jerry_create_error (JERRY_ERROR_TYPE,
(jerry_char_t *) "The number is NaN.");
}
if (option.clamp == JERRYX_ARG_NO_CLAMP) if (option.clamp == JERRYX_ARG_NO_CLAMP)
{ {
if (*d > max || *d < min) if (*d > max || *d < min)
+40 -8
View File
@@ -53,7 +53,8 @@ const char *test_source = (
"test_validator_prop3(obj2);" "test_validator_prop3(obj2);"
"test_validator_int1(-1000, 1000, 128, -1000, 1000, -127," "test_validator_int1(-1000, 1000, 128, -1000, 1000, -127,"
" -1000, 4294967297, 65536, -2200000000, 4294967297, -2147483647);" " -1000, 4294967297, 65536, -2200000000, 4294967297, -2147483647);"
"test_validator_int2(-1.5, -1.5, -1.5, 1.5, 1.5, 1.5, 300.5, 300.5);" "test_validator_int2(-1.5, -1.5, -1.5, 1.5, 1.5, 1.5, Infinity, -Infinity, 300.5, 300.5);"
"test_validator_int3(NaN);"
); );
static const jerry_object_native_info_t thing_a_info = static const jerry_object_native_info_t thing_a_info =
@@ -420,9 +421,9 @@ test_validator_int2_handler (const jerry_value_t func_obj_val __attribute__((unu
const jerry_value_t args_p[], /**< arguments list */ const jerry_value_t args_p[], /**< arguments list */
const jerry_length_t args_cnt) /**< arguments length */ const jerry_length_t args_cnt) /**< arguments length */
{ {
int8_t num0, num1, num2, num3, num4, num5, num6, num7; int8_t num0, num1, num2, num3, num4, num5, num6, num7, num8, num9;
num6 = 123; num8 = 123;
num7 = 123; num9 = 123;
jerryx_arg_t mapping[] = jerryx_arg_t mapping[] =
{ {
@@ -433,13 +434,15 @@ test_validator_int2_handler (const jerry_value_t func_obj_val __attribute__((unu
jerryx_arg_int8 (&num4, JERRYX_ARG_FLOOR, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num4, JERRYX_ARG_FLOOR, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED),
jerryx_arg_int8 (&num5, JERRYX_ARG_CEIL, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num5, JERRYX_ARG_CEIL, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED),
jerryx_arg_int8 (&num6, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num6, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED),
jerryx_arg_int8 (&num7, JERRYX_ARG_ROUND, JERRYX_ARG_NO_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED), jerryx_arg_int8 (&num7, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED),
jerryx_arg_int8 (&num8, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED),
jerryx_arg_int8 (&num9, JERRYX_ARG_ROUND, JERRYX_ARG_NO_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED),
}; };
jerry_value_t is_ok = jerryx_arg_transform_args (args_p, jerry_value_t is_ok = jerryx_arg_transform_args (args_p,
args_cnt, args_cnt,
mapping, mapping,
8); 10);
TEST_ASSERT (jerry_value_has_error_flag (is_ok)); TEST_ASSERT (jerry_value_has_error_flag (is_ok));
TEST_ASSERT (num0 == -2); TEST_ASSERT (num0 == -2);
@@ -449,7 +452,9 @@ test_validator_int2_handler (const jerry_value_t func_obj_val __attribute__((unu
TEST_ASSERT (num4 == 1); TEST_ASSERT (num4 == 1);
TEST_ASSERT (num5 == 2); TEST_ASSERT (num5 == 2);
TEST_ASSERT (num6 == 127); TEST_ASSERT (num6 == 127);
TEST_ASSERT (num7 == 123); TEST_ASSERT (num7 == -128);
TEST_ASSERT (num8 == 127);
TEST_ASSERT (num9 == 123);
jerry_release_value (is_ok); jerry_release_value (is_ok);
validator_int_count++; validator_int_count++;
@@ -457,6 +462,32 @@ test_validator_int2_handler (const jerry_value_t func_obj_val __attribute__((unu
return jerry_create_undefined (); return jerry_create_undefined ();
} /* test_validator_int2_handler */ } /* test_validator_int2_handler */
static jerry_value_t
test_validator_int3_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */
const jerry_value_t this_val __attribute__((unused)), /**< this value */
const jerry_value_t args_p[], /**< arguments list */
const jerry_length_t args_cnt) /**< arguments length */
{
int8_t num0;
jerryx_arg_t mapping[] =
{
jerryx_arg_int8 (&num0, JERRYX_ARG_ROUND, JERRYX_ARG_CLAMP, JERRYX_ARG_COERCE, JERRYX_ARG_REQUIRED),
};
jerry_value_t is_ok = jerryx_arg_transform_args (args_p,
args_cnt,
mapping,
1);
TEST_ASSERT (jerry_value_has_error_flag (is_ok));
jerry_release_value (is_ok);
validator_int_count++;
return jerry_create_undefined ();
} /* test_validator_int3_handler */
static jerry_value_t static jerry_value_t
create_object_a_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */ create_object_a_handler (const jerry_value_t func_obj_val __attribute__((unused)), /**< function object */
const jerry_value_t this_val, /**< this value */ const jerry_value_t this_val, /**< this value */
@@ -518,6 +549,7 @@ main (void)
register_js_function ("test_validator2", test_validator2_handler); register_js_function ("test_validator2", test_validator2_handler);
register_js_function ("test_validator_int1", test_validator_int1_handler); register_js_function ("test_validator_int1", test_validator_int1_handler);
register_js_function ("test_validator_int2", test_validator_int2_handler); register_js_function ("test_validator_int2", test_validator_int2_handler);
register_js_function ("test_validator_int3", test_validator_int3_handler);
register_js_function ("MyObjectA", create_object_a_handler); register_js_function ("MyObjectA", create_object_a_handler);
register_js_function ("MyObjectB", create_object_b_handler); register_js_function ("MyObjectB", create_object_b_handler);
register_js_function ("test_validator_prop1", test_validator_prop1_handler); register_js_function ("test_validator_prop1", test_validator_prop1_handler);
@@ -532,7 +564,7 @@ main (void)
TEST_ASSERT (validator1_count == 5); TEST_ASSERT (validator1_count == 5);
TEST_ASSERT (validator2_count == 3); TEST_ASSERT (validator2_count == 3);
TEST_ASSERT (validator_prop_count == 4); TEST_ASSERT (validator_prop_count == 4);
TEST_ASSERT (validator_int_count == 2); TEST_ASSERT (validator_int_count == 3);
jerry_release_value (res); jerry_release_value (res);
jerry_release_value (parsed_code_val); jerry_release_value (parsed_code_val);