diff options
-rw-r--r-- | jerry-core/parser/js/js-parser-util.c | 16 | ||||
-rw-r--r-- | tests/unit-core/test-backtrace.c | 91 |
2 files changed, 86 insertions, 21 deletions
diff --git a/jerry-core/parser/js/js-parser-util.c b/jerry-core/parser/js/js-parser-util.c index b831802e..ad7c86e2 100644 --- a/jerry-core/parser/js/js-parser-util.c +++ b/jerry-core/parser/js/js-parser-util.c @@ -418,13 +418,21 @@ parser_emit_line_info (parser_context_t *context_p, /**< context */ context_p->last_line_info_line = line; + const uint32_t max_shift_plus_7 = 7 * 5; + uint32_t shift = 7; + + while (shift < max_shift_plus_7 && (line >> shift) > 0) + { + shift += 7; + } + do { - uint8_t byte = (uint8_t) (line & CBC_LOWER_SEVEN_BIT_MASK); + shift -= 7; - line >>= 7; + uint8_t byte = (uint8_t) ((line >> shift) & CBC_LOWER_SEVEN_BIT_MASK); - if (line > 0) + if (shift > 0) { byte = (uint8_t) (byte | CBC_HIGHEST_BIT_MASK); } @@ -432,7 +440,7 @@ parser_emit_line_info (parser_context_t *context_p, /**< context */ PARSER_APPEND_TO_BYTE_CODE (context_p, byte); context_p->byte_code_size++; } - while (line > 0); + while (shift > 0); } /* parser_emit_line_info */ #endif /* JERRY_ENABLE_LINE_INFO */ diff --git a/tests/unit-core/test-backtrace.c b/tests/unit-core/test-backtrace.c index 3ebee54d..663d1be7 100644 --- a/tests/unit-core/test-backtrace.c +++ b/tests/unit-core/test-backtrace.c @@ -79,13 +79,9 @@ compare (jerry_value_t array, /**< array */ TEST_ASSERT (memcmp (buf, str, len) == 0); } /* compare */ -int -main (void) +static void +test_get_backtrace_api_call (void) { - TEST_INIT (); - - TEST_ASSERT (jerry_is_feature_enabled (JERRY_FEATURE_LINE_INFO)); - jerry_init (JERRY_INIT_EMPTY); jerry_value_t global = jerry_get_global_object (); @@ -158,18 +154,22 @@ main (void) jerry_release_value (backtrace); jerry_cleanup (); +} /* test_get_backtrace_api_call */ +static void +test_exception_backtrace (void) +{ jerry_init (JERRY_INIT_EMPTY); - source = ("function f() {\n" - " undef_reference;\n" - "}\n" - "\n" - "function g() {\n" - " return f();\n" - "}\n" - "\n" - "g();\n"); + const char *source = ("function f() {\n" + " undef_reference;\n" + "}\n" + "\n" + "function g() {\n" + " return f();\n" + "}\n" + "\n" + "g();\n"); jerry_value_t error = run ("bad.js", source); @@ -179,8 +179,8 @@ main (void) TEST_ASSERT (jerry_value_is_object (error)); - name = jerry_create_string ((const jerry_char_t *) "stack"); - backtrace = jerry_get_property (error, name); + jerry_value_t name = jerry_create_string ((const jerry_char_t *) "stack"); + jerry_value_t backtrace = jerry_get_property (error, name); jerry_release_value (name); jerry_release_value (error); @@ -197,6 +197,63 @@ main (void) jerry_release_value (backtrace); jerry_cleanup (); +} /* test_exception_backtrace */ + +static void +test_large_line_count (void) +{ + jerry_init (JERRY_INIT_EMPTY); + + const char *source = ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + "g();\n"); + + jerry_value_t error = run ("bad.js", source); + + TEST_ASSERT (jerry_value_is_error (error)); + + error = jerry_get_value_from_error (error, true); + + TEST_ASSERT (jerry_value_is_object (error)); + + jerry_value_t name = jerry_create_string ((const jerry_char_t *) "stack"); + jerry_value_t backtrace = jerry_get_property (error, name); + + jerry_release_value (name); + jerry_release_value (error); + + TEST_ASSERT (!jerry_value_is_error (backtrace) + && jerry_value_is_array (backtrace)); + + TEST_ASSERT (jerry_get_array_length (backtrace) == 1); + + compare (backtrace, 0, "bad.js:385"); + + jerry_release_value (backtrace); + + jerry_cleanup (); +} /* test_large_line_count */ + +int +main (void) +{ + TEST_INIT (); + + TEST_ASSERT (jerry_is_feature_enabled (JERRY_FEATURE_LINE_INFO)); + + test_get_backtrace_api_call (); + test_exception_backtrace (); + test_large_line_count (); return 0; } /* main */ |