diff --git a/jerry-core/CMakeLists.txt b/jerry-core/CMakeLists.txt index 13688953ba..7c57bd8aea 100644 --- a/jerry-core/CMakeLists.txt +++ b/jerry-core/CMakeLists.txt @@ -17,23 +17,24 @@ set(JERRY_CORE_NAME jerry-core) project (${JERRY_CORE_NAME} C) # Optional features -set(FEATURE_CPOINTER_32_BIT OFF CACHE BOOL "Enable 32 bit compressed pointers?") -set(FEATURE_DEBUGGER OFF CACHE BOOL "Enable JerryScript debugger?") -set(FEATURE_ERROR_MESSAGES OFF CACHE BOOL "Enable error messages?") -set(FEATURE_EXTERNAL_CONTEXT OFF CACHE BOOL "Enable external context?") -set(FEATURE_JS_PARSER ON CACHE BOOL "Enable js-parser?") -set(FEATURE_MEM_STATS OFF CACHE BOOL "Enable memory statistics?") -set(FEATURE_MEM_STRESS_TEST OFF CACHE BOOL "Enable mem-stress test?") -set(FEATURE_PARSER_DUMP OFF CACHE BOOL "Enable parser byte-code dumps?") -set(FEATURE_PROFILE "es5.1" CACHE STRING "Use default or other profile?") -set(FEATURE_REGEXP_DUMP OFF CACHE BOOL "Enable regexp byte-code dumps?") -set(FEATURE_SNAPSHOT_EXEC OFF CACHE BOOL "Enable executing snapshot files?") -set(FEATURE_SNAPSHOT_SAVE OFF CACHE BOOL "Enable saving snapshot files?") -set(FEATURE_SYSTEM_ALLOCATOR OFF CACHE BOOL "Enable system allocator?") -set(FEATURE_VALGRIND OFF CACHE BOOL "Enable Valgrind support?") -set(FEATURE_VALGRIND_FREYA OFF CACHE BOOL "Enable Valgrind-Freya support?") -set(FEATURE_VM_EXEC_STOP OFF CACHE BOOL "Enable VM execution stopping?") -set(MEM_HEAP_SIZE_KB "512" CACHE STRING "Size of memory heap, in kilobytes") +set(FEATURE_CPOINTER_32_BIT OFF CACHE BOOL "Enable 32 bit compressed pointers?") +set(FEATURE_DEBUGGER OFF CACHE BOOL "Enable JerryScript debugger?") +set(FEATURE_ERROR_MESSAGES OFF CACHE BOOL "Enable error messages?") +set(FEATURE_EXTERNAL_CONTEXT OFF CACHE BOOL "Enable external context?") +set(FEATURE_JS_PARSER ON CACHE BOOL "Enable js-parser?") +set(FEATURE_MEM_STATS OFF CACHE BOOL "Enable memory statistics?") +set(FEATURE_MEM_STRESS_TEST OFF CACHE BOOL "Enable mem-stress test?") +set(FEATURE_PARSER_DUMP OFF CACHE BOOL "Enable parser byte-code dumps?") +set(FEATURE_PROFILE "es5.1" CACHE STRING "Use default or other profile?") +set(FEATURE_REGEXP_STRICT_MODE OFF CACHE BOOL "Enable regexp strict mode?") +set(FEATURE_REGEXP_DUMP OFF CACHE BOOL "Enable regexp byte-code dumps?") +set(FEATURE_SNAPSHOT_EXEC OFF CACHE BOOL "Enable executing snapshot files?") +set(FEATURE_SNAPSHOT_SAVE OFF CACHE BOOL "Enable saving snapshot files?") +set(FEATURE_SYSTEM_ALLOCATOR OFF CACHE BOOL "Enable system allocator?") +set(FEATURE_VALGRIND OFF CACHE BOOL "Enable Valgrind support?") +set(FEATURE_VALGRIND_FREYA OFF CACHE BOOL "Enable Valgrind-Freya support?") +set(FEATURE_VM_EXEC_STOP OFF CACHE BOOL "Enable VM execution stopping?") +set(MEM_HEAP_SIZE_KB "512" CACHE STRING "Size of memory heap, in kilobytes") # Option overrides if(FEATURE_SYSTEM_ALLOCATOR) @@ -57,23 +58,24 @@ if(JERRY_CMDLINE_SNAPSHOT) endif() # Status messages -message(STATUS "FEATURE_CPOINTER_32_BIT " ${FEATURE_CPOINTER_32_BIT} ${FEATURE_CPOINTER_32_BIT_MESSAGE}) -message(STATUS "FEATURE_DEBUGGER " ${FEATURE_DEBUGGER}) -message(STATUS "FEATURE_ERROR_MESSAGES " ${FEATURE_ERROR_MESSAGES}) -message(STATUS "FEATURE_EXTERNAL_CONTEXT " ${FEATURE_EXTERNAL_CONTEXT}) -message(STATUS "FEATURE_JS_PARSER " ${FEATURE_JS_PARSER}) -message(STATUS "FEATURE_MEM_STATS " ${FEATURE_MEM_STATS}) -message(STATUS "FEATURE_MEM_STRESS_TEST " ${FEATURE_MEM_STRESS_TEST}) -message(STATUS "FEATURE_PARSER_DUMP " ${FEATURE_PARSER_DUMP} ${FEATURE_PARSER_DUMP_MESSAGE}) -message(STATUS "FEATURE_PROFILE " ${FEATURE_PROFILE}) -message(STATUS "FEATURE_REGEXP_DUMP " ${FEATURE_REGEXP_DUMP}) -message(STATUS "FEATURE_SNAPSHOT_EXEC " ${FEATURE_SNAPSHOT_EXEC} ${FEATURE_SNAPSHOT_EXEC_MESSAGE}) -message(STATUS "FEATURE_SNAPSHOT_SAVE " ${FEATURE_SNAPSHOT_SAVE} ${FEATURE_SNAPSHOT_SAVE_MESSAGE}) -message(STATUS "FEATURE_SYSTEM_ALLOCATOR " ${FEATURE_SYSTEM_ALLOCATOR}) -message(STATUS "FEATURE_VALGRIND " ${FEATURE_VALGRIND}) -message(STATUS "FEATURE_VALGRIND_FREYA " ${FEATURE_VALGRIND_FREYA}) -message(STATUS "FEATURE_VM_EXEC_STOP " ${FEATURE_VM_EXEC_STOP}) -message(STATUS "MEM_HEAP_SIZE_KB " ${MEM_HEAP_SIZE_KB}) +message(STATUS "FEATURE_CPOINTER_32_BIT " ${FEATURE_CPOINTER_32_BIT} ${FEATURE_CPOINTER_32_BIT_MESSAGE}) +message(STATUS "FEATURE_DEBUGGER " ${FEATURE_DEBUGGER}) +message(STATUS "FEATURE_ERROR_MESSAGES " ${FEATURE_ERROR_MESSAGES}) +message(STATUS "FEATURE_EXTERNAL_CONTEXT " ${FEATURE_EXTERNAL_CONTEXT}) +message(STATUS "FEATURE_JS_PARSER " ${FEATURE_JS_PARSER}) +message(STATUS "FEATURE_MEM_STATS " ${FEATURE_MEM_STATS}) +message(STATUS "FEATURE_MEM_STRESS_TEST " ${FEATURE_MEM_STRESS_TEST}) +message(STATUS "FEATURE_PARSER_DUMP " ${FEATURE_PARSER_DUMP} ${FEATURE_PARSER_DUMP_MESSAGE}) +message(STATUS "FEATURE_PROFILE " ${FEATURE_PROFILE}) +message(STATUS "FEATURE_REGEXP_STRICT_MODE " ${FEATURE_REGEXP_STRICT_MODE}) +message(STATUS "FEATURE_REGEXP_DUMP " ${FEATURE_REGEXP_DUMP}) +message(STATUS "FEATURE_SNAPSHOT_EXEC " ${FEATURE_SNAPSHOT_EXEC} ${FEATURE_SNAPSHOT_EXEC_MESSAGE}) +message(STATUS "FEATURE_SNAPSHOT_SAVE " ${FEATURE_SNAPSHOT_SAVE} ${FEATURE_SNAPSHOT_SAVE_MESSAGE}) +message(STATUS "FEATURE_SYSTEM_ALLOCATOR " ${FEATURE_SYSTEM_ALLOCATOR}) +message(STATUS "FEATURE_VALGRIND " ${FEATURE_VALGRIND}) +message(STATUS "FEATURE_VALGRIND_FREYA " ${FEATURE_VALGRIND_FREYA}) +message(STATUS "FEATURE_VM_EXEC_STOP " ${FEATURE_VM_EXEC_STOP}) +message(STATUS "MEM_HEAP_SIZE_KB " ${MEM_HEAP_SIZE_KB}) # Include directories set(INCLUDE_CORE @@ -224,6 +226,11 @@ if(JERRY_LIBC AND FEATURE_SYSTEM_ALLOCATOR) MESSAGE(FATAL_ERROR "This configuration is not supported. Please build against your system libc to enable the system allocator.") endif() +# RegExp strict mode +if(FEATURE_REGEXP_STRICT_MODE) + set(DEFINES_JERRY ${DEFINES_JERRY} ENABLE_REGEXP_STRICT_MODE) +endif() + # RegExp byte-code dumps if(FEATURE_REGEXP_DUMP) set(DEFINES_JERRY ${DEFINES_JERRY} REGEXP_DUMP_BYTE_CODE) diff --git a/jerry-core/parser/regexp/re-parser.c b/jerry-core/parser/regexp/re-parser.c index 7479603dbd..0046acea24 100644 --- a/jerry-core/parser/regexp/re-parser.c +++ b/jerry-core/parser/regexp/re-parser.c @@ -881,9 +881,35 @@ re_parse_next_token (re_parser_ctx_t *parser_ctx_p, /**< RegExp parser context * case LIT_CHAR_QUESTION: case LIT_CHAR_ASTERISK: case LIT_CHAR_PLUS: + { + return ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp token.")); + } case LIT_CHAR_LEFT_BRACE: { +#ifdef ENABLE_REGEXP_STRICT_MODE return ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp token.")); +#else /* !ENABLE_REGEXP_STRICT_MODE */ + const lit_utf8_byte_t *input_curr_p = parser_ctx_p->input_curr_p; + + lit_utf8_decr (&parser_ctx_p->input_curr_p); + if (ecma_is_value_empty (re_parse_iterator (parser_ctx_p, out_token_p))) + { + return ecma_raise_syntax_error (ECMA_ERR_MSG ("Invalid RegExp token.")); + } + + parser_ctx_p->input_curr_p = input_curr_p; + + out_token_p->type = RE_TOK_CHAR; + out_token_p->value = ch; + ret_value = re_parse_iterator (parser_ctx_p, out_token_p); + + if (!ecma_is_value_empty (ret_value)) + { + parser_ctx_p->input_curr_p = input_curr_p; + ret_value = ECMA_VALUE_EMPTY; + } +#endif /* ENABLE_REGEXP_STRICT_MODE */ + break; } case LIT_CHAR_NULL: { diff --git a/tools/build.py b/tools/build.py index 06b67b97f7..8030239f8a 100755 --- a/tools/build.py +++ b/tools/build.py @@ -126,6 +126,8 @@ def devhelp(helpstring): help=devhelp('enable memory statistics (%(choices)s; default: %(default)s)')) devgroup.add_argument('--mem-stress-test', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper, help=devhelp('enable mem-stress test (%(choices)s; default: %(default)s)')) + devgroup.add_argument('--regexp-strict-mode', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper, + help=devhelp('enable regexp strict mode (%(choices)s; default: %(default)s)')) devgroup.add_argument('--show-opcodes', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper, help=devhelp('enable parser byte-code dumps (%(choices)s; default: %(default)s)')) devgroup.add_argument('--show-regexp-opcodes', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper, @@ -186,6 +188,7 @@ def generate_build_options(arguments): build_options.append('-DFEATURE_MEM_STATS=%s' % arguments.mem_stats) build_options.append('-DFEATURE_MEM_STRESS_TEST=%s' % arguments.mem_stress_test) build_options.append('-DFEATURE_PARSER_DUMP=%s' % arguments.show_opcodes) + build_options.append('-DFEATURE_REGEXP_STRICT_MODE=%s' % arguments.regexp_strict_mode) build_options.append('-DFEATURE_REGEXP_DUMP=%s' % arguments.show_regexp_opcodes) build_options.append('-DFEATURE_VALGRIND=%s' % arguments.valgrind) build_options.append('-DFEATURE_VALGRIND_FREYA=%s' % arguments.valgrind_freya)