1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation
2425bb815Sopenharmony_ci *
3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License.
5425bb815Sopenharmony_ci * You may obtain a copy of the License at
6425bb815Sopenharmony_ci *
7425bb815Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8425bb815Sopenharmony_ci *
9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS
11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and
13425bb815Sopenharmony_ci * limitations under the License.
14425bb815Sopenharmony_ci */
15425bb815Sopenharmony_ci
16425bb815Sopenharmony_ci#include "ecma-builtins.h"
17425bb815Sopenharmony_ci#include "ecma-exceptions.h"
18425bb815Sopenharmony_ci#include "ecma-eval.h"
19425bb815Sopenharmony_ci#include "ecma-gc.h"
20425bb815Sopenharmony_ci#include "ecma-globals.h"
21425bb815Sopenharmony_ci#include "ecma-helpers.h"
22425bb815Sopenharmony_ci#include "ecma-lex-env.h"
23425bb815Sopenharmony_ci#include "js-parser.h"
24425bb815Sopenharmony_ci#include "vm.h"
25425bb815Sopenharmony_ci#include "jcontext.h"
26425bb815Sopenharmony_ci
27425bb815Sopenharmony_ci/** \addtogroup ecma ECMA
28425bb815Sopenharmony_ci * @{
29425bb815Sopenharmony_ci *
30425bb815Sopenharmony_ci * \addtogroup eval eval
31425bb815Sopenharmony_ci * @{
32425bb815Sopenharmony_ci */
33425bb815Sopenharmony_ci
34425bb815Sopenharmony_ci/**
35425bb815Sopenharmony_ci * Perform 'eval' with code stored in ecma-string
36425bb815Sopenharmony_ci *
37425bb815Sopenharmony_ci * See also:
38425bb815Sopenharmony_ci *          ecma_op_eval_chars_buffer
39425bb815Sopenharmony_ci *          ECMA-262 v5, 15.1.2.1 (steps 2 to 8)
40425bb815Sopenharmony_ci *
41425bb815Sopenharmony_ci * @return ecma value
42425bb815Sopenharmony_ci */
43425bb815Sopenharmony_ciecma_value_t
44425bb815Sopenharmony_ciecma_op_eval (ecma_string_t *code_p, /**< code string */
45425bb815Sopenharmony_ci              uint32_t parse_opts) /**< ecma_parse_opts_t option bits */
46425bb815Sopenharmony_ci{
47425bb815Sopenharmony_ci  ecma_value_t ret_value;
48425bb815Sopenharmony_ci
49425bb815Sopenharmony_ci#if defined (JERRY_BUILTIN_EVAL_DISABLED) && ENABLED (JERRY_BUILTIN_EVAL_DISABLED)
50425bb815Sopenharmony_ci  JERRY_UNUSED(code_p);
51425bb815Sopenharmony_ci  JERRY_UNUSED(parse_opts);
52425bb815Sopenharmony_ci  ret_value = ECMA_VALUE_UNDEFINED;
53425bb815Sopenharmony_ci#else /* ENABLED (JERRY_BUILTIN_EVAL_DISABLED) */
54425bb815Sopenharmony_ci  lit_utf8_size_t chars_num = ecma_string_get_size (code_p);
55425bb815Sopenharmony_ci  if (chars_num == 0)
56425bb815Sopenharmony_ci  {
57425bb815Sopenharmony_ci    ret_value = ECMA_VALUE_UNDEFINED;
58425bb815Sopenharmony_ci  }
59425bb815Sopenharmony_ci  else
60425bb815Sopenharmony_ci  {
61425bb815Sopenharmony_ci    ECMA_STRING_TO_UTF8_STRING (code_p, code_utf8_buffer_p, code_utf8_buffer_size);
62425bb815Sopenharmony_ci
63425bb815Sopenharmony_ci    ret_value = ecma_op_eval_chars_buffer (code_utf8_buffer_p,
64425bb815Sopenharmony_ci                                           chars_num,
65425bb815Sopenharmony_ci                                           parse_opts);
66425bb815Sopenharmony_ci
67425bb815Sopenharmony_ci    ECMA_FINALIZE_UTF8_STRING (code_utf8_buffer_p, code_utf8_buffer_size);
68425bb815Sopenharmony_ci  }
69425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_BUILTIN_EVAL_DISABLED) */
70425bb815Sopenharmony_ci
71425bb815Sopenharmony_ci  return ret_value;
72425bb815Sopenharmony_ci} /* ecma_op_eval */
73425bb815Sopenharmony_ci
74425bb815Sopenharmony_ci/**
75425bb815Sopenharmony_ci * Perform 'eval' with code stored in continuous character buffer
76425bb815Sopenharmony_ci *
77425bb815Sopenharmony_ci * See also:
78425bb815Sopenharmony_ci *          ecma_op_eval
79425bb815Sopenharmony_ci *          ECMA-262 v5, 15.1.2.1 (steps 2 to 8)
80425bb815Sopenharmony_ci *
81425bb815Sopenharmony_ci * @return ecma value
82425bb815Sopenharmony_ci */
83425bb815Sopenharmony_ciecma_value_t
84425bb815Sopenharmony_ciecma_op_eval_chars_buffer (const lit_utf8_byte_t *code_p, /**< code characters buffer */
85425bb815Sopenharmony_ci                           size_t code_buffer_size, /**< size of the buffer */
86425bb815Sopenharmony_ci                           uint32_t parse_opts) /**< ecma_parse_opts_t option bits */
87425bb815Sopenharmony_ci{
88425bb815Sopenharmony_ci#if ENABLED (JERRY_PARSER)
89425bb815Sopenharmony_ci  JERRY_ASSERT (code_p != NULL);
90425bb815Sopenharmony_ci
91425bb815Sopenharmony_ci  ecma_compiled_code_t *bytecode_data_p;
92425bb815Sopenharmony_ci
93425bb815Sopenharmony_ci  uint32_t is_strict_call = ECMA_PARSE_STRICT_MODE | ECMA_PARSE_DIRECT_EVAL;
94425bb815Sopenharmony_ci
95425bb815Sopenharmony_ci  if ((parse_opts & is_strict_call) != is_strict_call)
96425bb815Sopenharmony_ci  {
97425bb815Sopenharmony_ci    parse_opts &= (uint32_t) ~ECMA_PARSE_STRICT_MODE;
98425bb815Sopenharmony_ci  }
99425bb815Sopenharmony_ci
100425bb815Sopenharmony_ci  parse_opts |= ECMA_PARSE_EVAL;
101425bb815Sopenharmony_ci
102425bb815Sopenharmony_ci#if ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES)
103425bb815Sopenharmony_ci  JERRY_CONTEXT (resource_name) = ecma_make_magic_string_value (LIT_MAGIC_STRING_RESOURCE_EVAL);
104425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_LINE_INFO) || ENABLED (JERRY_ERROR_MESSAGES) */
105425bb815Sopenharmony_ci
106425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015)
107425bb815Sopenharmony_ci  ECMA_CLEAR_LOCAL_PARSE_OPTS ();
108425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */
109425bb815Sopenharmony_ci
110425bb815Sopenharmony_ci  ecma_value_t parse_status = parser_parse_script (NULL,
111425bb815Sopenharmony_ci                                                   0,
112425bb815Sopenharmony_ci                                                   code_p,
113425bb815Sopenharmony_ci                                                   code_buffer_size,
114425bb815Sopenharmony_ci                                                   parse_opts,
115425bb815Sopenharmony_ci                                                   &bytecode_data_p);
116425bb815Sopenharmony_ci
117425bb815Sopenharmony_ci  if (ECMA_IS_VALUE_ERROR (parse_status))
118425bb815Sopenharmony_ci  {
119425bb815Sopenharmony_ci    return parse_status;
120425bb815Sopenharmony_ci  }
121425bb815Sopenharmony_ci
122425bb815Sopenharmony_ci  return vm_run_eval (bytecode_data_p, parse_opts);
123425bb815Sopenharmony_ci#else /* !ENABLED (JERRY_PARSER) */
124425bb815Sopenharmony_ci  JERRY_UNUSED (code_p);
125425bb815Sopenharmony_ci  JERRY_UNUSED (code_buffer_size);
126425bb815Sopenharmony_ci  JERRY_UNUSED (parse_opts);
127425bb815Sopenharmony_ci
128425bb815Sopenharmony_ci  return ecma_raise_syntax_error (ECMA_ERR_MSG ("The parser has been disabled."));
129425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_PARSER) */
130425bb815Sopenharmony_ci} /* ecma_op_eval_chars_buffer */
131425bb815Sopenharmony_ci
132425bb815Sopenharmony_ci/**
133425bb815Sopenharmony_ci * @}
134425bb815Sopenharmony_ci * @}
135425bb815Sopenharmony_ci */
136