@@ -44,6 +44,126 @@ main_register_global_function (const char *name_p, /**< name of the function */
4444 jerry_release_value (result_val );
4545} /* main_register_global_function */
4646
47+ #if defined (JERRY_TEST262 ) && (JERRY_TEST262 == 1 )
48+
49+ static void
50+ test262_register_function (jerry_value_t test262_obj , /** $262 object */
51+ const char * name_p , /**< name of the function */
52+ jerry_external_handler_t handler_p ) /**< function callback */
53+ {
54+ jerry_value_t function_name_val = jerry_create_string ((const jerry_char_t * ) name_p );
55+ jerry_value_t function_val = jerry_create_external_function (handler_p );
56+
57+ jerry_value_t result_val = jerry_set_property (test262_obj , function_name_val , function_val );
58+
59+ jerry_release_value (function_val );
60+ jerry_release_value (function_name_val );
61+
62+ assert (!jerry_value_is_error (result_val ));
63+ jerry_release_value (result_val );
64+ } /* test262_register_function */
65+
66+ /**
67+ * $262.detachArrayBuffer
68+ *
69+ * A function which implements the DetachArrayBuffer abstract operation
70+ *
71+ * @return null value - if success
72+ * value marked with error flag - otherwise
73+ */
74+ static jerry_value_t
75+ test262_detach_array_buffer (const jerry_value_t func_obj_val , /**< function object */
76+ const jerry_value_t this_p , /**< this arg */
77+ const jerry_value_t args_p [], /**< function arguments */
78+ const jerry_length_t args_cnt ) /**< number of function arguments */
79+ {
80+ (void ) func_obj_val ; /* unused */
81+ (void ) this_p ; /* unused */
82+
83+ if (args_cnt < 1 || !jerry_value_is_arraybuffer (args_p [0 ]))
84+ {
85+ return jerry_create_error (JERRY_ERROR_TYPE , (jerry_char_t * ) "Expected an ArrayBuffer object" );
86+ }
87+
88+ /* TODO: support the optional 'key' argument */
89+
90+ return jerry_detach_arraybuffer (args_p [0 ]);
91+ } /* test262_detach_array_buffer */
92+
93+ /**
94+ * $262.evalScript
95+ *
96+ * A function which accepts a string value as its first argument and executes it
97+ *
98+ * @return completion of the script parsing and execution.
99+ */
100+ static jerry_value_t
101+ test262_eval_script (const jerry_value_t func_obj_val , /**< function object */
102+ const jerry_value_t this_p , /**< this arg */
103+ const jerry_value_t args_p [], /**< function arguments */
104+ const jerry_length_t args_cnt ) /**< number of function arguments */
105+ {
106+ (void ) func_obj_val ; /* unused */
107+ (void ) this_p ; /* unused */
108+
109+ if (args_cnt < 1 || !jerry_value_is_string (args_p [0 ]))
110+ {
111+ return jerry_create_error (JERRY_ERROR_TYPE , (jerry_char_t * ) "Expected a string" );
112+ }
113+
114+ jerry_size_t str_size = jerry_get_utf8_string_size (args_p [0 ]);
115+ jerry_char_t * str_buf_p = malloc (str_size * sizeof (jerry_char_t ));
116+
117+ if (str_buf_p == NULL || jerry_string_to_utf8_char_buffer (args_p [0 ], str_buf_p , str_size ) != str_size )
118+ {
119+ return jerry_create_error (JERRY_ERROR_RANGE , (jerry_char_t * ) "Internal error" );
120+ }
121+
122+ jerry_value_t ret_value = jerry_parse (NULL , 0 , str_buf_p , str_size , JERRY_PARSE_NO_OPTS );
123+
124+ if (!jerry_value_is_error (ret_value ))
125+ {
126+ jerry_value_t func_val = ret_value ;
127+ ret_value = jerry_run (func_val );
128+ jerry_release_value (func_val );
129+ }
130+
131+ free (str_buf_p );
132+
133+ return ret_value ;
134+ } /* test262_eval_script */
135+
136+ /**
137+ * Init the $262 object
138+ */
139+ static void
140+ register_test262 (void )
141+ {
142+ jerry_value_t global_obj = jerry_get_global_object ();
143+ jerry_value_t test262_object = jerry_create_object ();
144+
145+ test262_register_function (test262_object , "detachArrayBuffer" , test262_detach_array_buffer );
146+ test262_register_function (test262_object , "evalScript" , test262_eval_script );
147+ test262_register_function (test262_object , "gc" , jerryx_handler_gc );
148+
149+ jerry_value_t prop_name = jerry_create_string ((const jerry_char_t * ) "global" );
150+ jerry_value_t result = jerry_set_property (test262_object , prop_name , global_obj );
151+
152+ jerry_release_value (prop_name );
153+ assert (!jerry_value_is_error (result ));
154+
155+ prop_name = jerry_create_string ((const jerry_char_t * ) "$262" );
156+ result = jerry_set_property (global_obj , prop_name , test262_object );
157+
158+ assert (!jerry_value_is_error (result ));
159+ jerry_release_value (prop_name );
160+
161+ jerry_release_value (global_obj );
162+ jerry_release_value (test262_object );
163+ jerry_release_value (result );
164+ } /* register_test262 */
165+ #endif /* defined (JERRY_TEST262) && (JERRY_TEST262 == 1) */
166+
47167/**
48168 * Inits the engine and the debugger
49169 */
@@ -81,6 +201,9 @@ main_init_engine (main_args_t *arguments_p) /** main arguments */
81201 main_register_global_function ("gc" , jerryx_handler_gc );
82202 main_register_global_function ("print" , jerryx_handler_print );
83203 main_register_global_function ("resourceName" , jerryx_handler_resource_name );
204+ #if defined (JERRY_TEST262 ) && (JERRY_TEST262 == 1 )
205+ register_test262 ();
206+ #endif /* defined (JERRY_TEST262) && (JERRY_TEST262 == 1) */
84207} /* main_init_engine */
85208
86209/**
0 commit comments