diff --git a/jerry-core/ecma/operations/ecma-eval.cpp b/jerry-core/ecma/operations/ecma-eval.cpp index 05d8d6fa4..97f456d9d 100644 --- a/jerry-core/ecma/operations/ecma-eval.cpp +++ b/jerry-core/ecma/operations/ecma-eval.cpp @@ -92,9 +92,16 @@ ecma_op_eval_chars_buffer (const ecma_char_t *code_p, /**< code characters buffe serializer_print_opcodes (); parser_free (); - // FIXME: + opcode_counter_t first_opcode_index = 0u; bool is_strict_prologue = false; - (void) is_strict_prologue; + opcode_scope_code_flags_t scope_flags = vm_get_scope_flags (opcodes_p, + first_opcode_index++); + if (scope_flags & OPCODE_SCOPE_CODE_FLAGS_STRICT) + { + is_strict_prologue = true; + } + + bool is_strict = (is_strict_prologue || (is_direct && is_called_from_strict_mode_code)); if (!is_syntax_correct) { @@ -117,8 +124,7 @@ ecma_op_eval_chars_buffer (const ecma_char_t *code_p, /**< code characters buffe lex_env_p = ecma_get_global_environment (); } - if (is_strict_prologue - || (is_direct && is_called_from_strict_mode_code)) + if (is_strict) { ecma_object_t *strict_lex_env_p = ecma_create_decl_lex_env (lex_env_p); ecma_deref_object (lex_env_p); @@ -126,10 +132,12 @@ ecma_op_eval_chars_buffer (const ecma_char_t *code_p, /**< code characters buffe lex_env_p = strict_lex_env_p; } - // FIXME: Call interpreter - (void) opcodes_p; - completion = ecma_make_return_completion_value (ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED)); - JERRY_UNIMPLEMENTED ("eval operation is not implemented"); + completion = vm_run_from_pos (opcodes_p, + first_opcode_index, + this_binding, + lex_env_p, + is_strict, + true); if (ecma_is_completion_value_return (completion)) { diff --git a/tests/unit/test-api.cpp b/tests/unit/test-api.cpp index ddd8977d0..9636fd049 100644 --- a/tests/unit/test-api.cpp +++ b/tests/unit/test-api.cpp @@ -435,6 +435,26 @@ main (void) jerry_api_release_value (&val_t); jerry_api_release_value (&res); + const char *eval_code_src_p = "(function () { return 123; })"; + jerry_completion_code_t status = jerry_api_eval (eval_code_src_p, + strlen (eval_code_src_p), + false, + true, + &val_t); + JERRY_ASSERT (status == JERRY_COMPLETION_CODE_OK); + JERRY_ASSERT (val_t.type == JERRY_API_DATA_TYPE_OBJECT); + JERRY_ASSERT (jerry_api_is_function (val_t.v_object)); + + is_ok = jerry_api_call_function (val_t.v_object, + NULL, + &res, + NULL, 0); + JERRY_ASSERT (is_ok); + JERRY_ASSERT (res.type == JERRY_API_DATA_TYPE_FLOAT64 + && res.v_float64 == 123.0); + jerry_api_release_value (&res); + + jerry_api_release_value (&val_t); // cleanup. jerry_api_release_object (global_obj_p);