|
28 | 28 | #define ECMA_BUILTINS_INTERNAL |
29 | 29 | #include "ecma-builtins-internal.h" |
30 | 30 |
|
| 31 | +/** |
| 32 | + * This object has a custom dispatch function. |
| 33 | + */ |
| 34 | + #define BUILTIN_CUSTOM_DISPATCH |
| 35 | + |
| 36 | +/** |
| 37 | + * List of built-in routine identifiers. |
| 38 | + */ |
| 39 | +enum |
| 40 | +{ |
| 41 | + ECMA_GENERATOR_PROTOTYPE_ROUTINE_START = ECMA_BUILTIN_ID__COUNT - 1, |
| 42 | + ECMA_GENERATOR_PROTOTYPE_ROUTINE_RETURN, |
| 43 | + ECMA_GENERATOR_PROTOTYPE_ROUTINE_THROW, |
| 44 | + ECMA_GENERATOR_PROTOTYPE_ROUTINE_NEXT |
| 45 | +}; |
| 46 | + |
31 | 47 | #define BUILTIN_INC_HEADER_NAME "ecma-builtin-generator-prototype.inc.h" |
32 | 48 | #define BUILTIN_UNDERSCORED_ID generator_prototype |
33 | 49 | #include "ecma-builtin-internal-routines-template.inc.h" |
@@ -65,42 +81,10 @@ static const uint8_t ecma_builtin_generator_prototype_throw[1] = |
65 | 81 | * Returned value must be freed with ecma_free_value. |
66 | 82 | */ |
67 | 83 | static ecma_value_t |
68 | | -ecma_builtin_generator_prototype_object_do (ecma_value_t this_arg, /**< this argument */ |
| 84 | +ecma_builtin_generator_prototype_object_do (vm_executable_object_t *executable_object_p, /**< executable object */ |
69 | 85 | ecma_value_t arg, /**< argument */ |
70 | 86 | ecma_iterator_command_type_t resume_mode) /**< resume mode */ |
71 | 87 | { |
72 | | - vm_executable_object_t *executable_object_p = NULL; |
73 | | - |
74 | | - if (ecma_is_value_object (this_arg)) |
75 | | - { |
76 | | - ecma_object_t *object_p = ecma_get_object_from_value (this_arg); |
77 | | - |
78 | | - if (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_CLASS) |
79 | | - { |
80 | | - ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; |
81 | | - |
82 | | - if (ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_GENERATOR_UL) |
83 | | - { |
84 | | - executable_object_p = (vm_executable_object_t *) ext_object_p; |
85 | | - } |
86 | | - } |
87 | | - } |
88 | | - |
89 | | - if (executable_object_p == NULL) |
90 | | - { |
91 | | - return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not a generator object.")); |
92 | | - } |
93 | | - |
94 | | - if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_EXECUTABLE_OBJECT_RUNNING) |
95 | | - { |
96 | | - return ecma_raise_type_error (ECMA_ERR_MSG ("Generator is currently under execution.")); |
97 | | - } |
98 | | - |
99 | | - if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_EXECUTABLE_OBJECT_COMPLETED) |
100 | | - { |
101 | | - return ecma_create_iter_result_object (ECMA_VALUE_UNDEFINED, ECMA_VALUE_TRUE); |
102 | | - } |
103 | | - |
104 | 88 | arg = ecma_copy_value (arg); |
105 | 89 |
|
106 | 90 | while (true) |
@@ -194,52 +178,81 @@ ecma_builtin_generator_prototype_object_do (ecma_value_t this_arg, /**< this arg |
194 | 178 | } /* ecma_builtin_generator_prototype_object_do */ |
195 | 179 |
|
196 | 180 | /** |
197 | | - * The Generator.prototype object's 'next' routine |
198 | | - * |
199 | | - * See also: |
200 | | - * ECMA-262 v6, 25.3.1.2 |
201 | | - * |
202 | | - * @return ecma value |
203 | | - * Returned value must be freed with ecma_free_value. |
204 | | - */ |
205 | | -static ecma_value_t |
206 | | -ecma_builtin_generator_prototype_object_next (ecma_value_t this_arg, /**< this argument */ |
207 | | - ecma_value_t next_arg) /**< next argument */ |
| 181 | + * Dispatcher of the Generator built-in's routines |
| 182 | + * |
| 183 | + * @return ecma value |
| 184 | + * Returned value must be freed with ecma_free_value. |
| 185 | + */ |
| 186 | +ecma_value_t |
| 187 | +ecma_builtin_generator_prototype_dispatch_routine (uint16_t builtin_routine_id, /**< built-in wide routine |
| 188 | + * identifier */ |
| 189 | + ecma_value_t this_arg, /**< 'this' argument value */ |
| 190 | + const ecma_value_t arguments_list_p[], /**< list of arguments |
| 191 | + * passed to routine */ |
| 192 | + ecma_length_t arguments_number) /**< length of arguments' list */ |
208 | 193 | { |
209 | | - return ecma_builtin_generator_prototype_object_do (this_arg, next_arg, ECMA_ITERATOR_NEXT); |
210 | | -} /* ecma_builtin_generator_prototype_object_next */ |
| 194 | + JERRY_UNUSED (arguments_number); |
211 | 195 |
|
212 | | -/** |
213 | | - * The Generator.prototype object's 'return' routine |
214 | | - * |
215 | | - * See also: |
216 | | - * ECMA-262 v6, 25.3.1.3 |
217 | | - * |
218 | | - * @return ecma value |
219 | | - * Returned value must be freed with ecma_free_value. |
220 | | - */ |
221 | | -static ecma_value_t |
222 | | -ecma_builtin_generator_prototype_object_return (ecma_value_t this_arg, /**< this argument */ |
223 | | - ecma_value_t return_arg) /**< return argument */ |
224 | | -{ |
225 | | - return ecma_builtin_generator_prototype_object_do (this_arg, return_arg, ECMA_ITERATOR_RETURN); |
226 | | -} /* ecma_builtin_generator_prototype_object_return */ |
| 196 | + vm_executable_object_t *executable_object_p = NULL; |
227 | 197 |
|
228 | | -/** |
229 | | - * The Generator.prototype object's 'throw' routine |
230 | | - * |
231 | | - * See also: |
232 | | - * ECMA-262 v6, 25.3.1.4 |
233 | | - * |
234 | | - * @return ecma value |
235 | | - * Returned value must be freed with ecma_free_value. |
236 | | - */ |
237 | | -static ecma_value_t |
238 | | -ecma_builtin_generator_prototype_object_throw (ecma_value_t this_arg, /**< this argument */ |
239 | | - ecma_value_t throw_arg) /**< throw argument */ |
240 | | -{ |
241 | | - return ecma_builtin_generator_prototype_object_do (this_arg, throw_arg, ECMA_ITERATOR_THROW); |
242 | | -} /* ecma_builtin_generator_prototype_object_throw */ |
| 198 | + if (ecma_is_value_object (this_arg)) |
| 199 | + { |
| 200 | + ecma_object_t *object_p = ecma_get_object_from_value (this_arg); |
| 201 | + |
| 202 | + if (ecma_get_object_type (object_p) == ECMA_OBJECT_TYPE_CLASS) |
| 203 | + { |
| 204 | + ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; |
| 205 | + |
| 206 | + if (ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_GENERATOR_UL) |
| 207 | + { |
| 208 | + executable_object_p = (vm_executable_object_t *) ext_object_p; |
| 209 | + } |
| 210 | + } |
| 211 | + } |
| 212 | + |
| 213 | + if (executable_object_p == NULL) |
| 214 | + { |
| 215 | + return ecma_raise_type_error (ECMA_ERR_MSG ("Argument 'this' is not a generator object.")); |
| 216 | + } |
| 217 | + |
| 218 | + if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_EXECUTABLE_OBJECT_RUNNING) |
| 219 | + { |
| 220 | + return ecma_raise_type_error (ECMA_ERR_MSG ("Generator is currently under execution.")); |
| 221 | + } |
| 222 | + |
| 223 | + if (executable_object_p->extended_object.u.class_prop.extra_info & ECMA_EXECUTABLE_OBJECT_COMPLETED) |
| 224 | + { |
| 225 | + return ecma_create_iter_result_object (ECMA_VALUE_UNDEFINED, ECMA_VALUE_TRUE); |
| 226 | + } |
| 227 | + |
| 228 | + switch (builtin_routine_id) |
| 229 | + { |
| 230 | + case ECMA_GENERATOR_PROTOTYPE_ROUTINE_NEXT: |
| 231 | + { |
| 232 | + return ecma_builtin_generator_prototype_object_do (executable_object_p, |
| 233 | + arguments_list_p[0], |
| 234 | + ECMA_ITERATOR_NEXT); |
| 235 | + } |
| 236 | + case ECMA_GENERATOR_PROTOTYPE_ROUTINE_THROW: |
| 237 | + { |
| 238 | + return ecma_builtin_generator_prototype_object_do (executable_object_p, |
| 239 | + arguments_list_p[0], |
| 240 | + ECMA_ITERATOR_THROW); |
| 241 | + } |
| 242 | + case ECMA_GENERATOR_PROTOTYPE_ROUTINE_RETURN: |
| 243 | + { |
| 244 | + return ecma_builtin_generator_prototype_object_do (executable_object_p, |
| 245 | + arguments_list_p[0], |
| 246 | + ECMA_ITERATOR_RETURN); |
| 247 | + } |
| 248 | + default: |
| 249 | + { |
| 250 | + JERRY_UNREACHABLE (); |
| 251 | + } |
| 252 | + } |
| 253 | + |
| 254 | + return ECMA_VALUE_EMPTY; |
| 255 | +} /* ecma_builtin_generator_prototype_dispatch_routine */ |
243 | 256 |
|
244 | 257 | /** |
245 | 258 | * @} |
|
0 commit comments