Skip to content

Commit eb8e81d

Browse files
authored
Add Generator Prototype custom dispatcher (#3864)
JerryScript-DCO-1.0-Signed-off-by: Daniella Barsony [email protected]
1 parent b469f0e commit eb8e81d

File tree

2 files changed

+92
-79
lines changed

2 files changed

+92
-79
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-generator-prototype.c

Lines changed: 89 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,22 @@
2828
#define ECMA_BUILTINS_INTERNAL
2929
#include "ecma-builtins-internal.h"
3030

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+
3147
#define BUILTIN_INC_HEADER_NAME "ecma-builtin-generator-prototype.inc.h"
3248
#define BUILTIN_UNDERSCORED_ID generator_prototype
3349
#include "ecma-builtin-internal-routines-template.inc.h"
@@ -65,42 +81,10 @@ static const uint8_t ecma_builtin_generator_prototype_throw[1] =
6581
* Returned value must be freed with ecma_free_value.
6682
*/
6783
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 */
6985
ecma_value_t arg, /**< argument */
7086
ecma_iterator_command_type_t resume_mode) /**< resume mode */
7187
{
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-
10488
arg = ecma_copy_value (arg);
10589

10690
while (true)
@@ -194,52 +178,81 @@ ecma_builtin_generator_prototype_object_do (ecma_value_t this_arg, /**< this arg
194178
} /* ecma_builtin_generator_prototype_object_do */
195179

196180
/**
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 */
208193
{
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);
211195

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;
227197

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 */
243256

244257
/**
245258
* @}

jerry-core/ecma/builtin-objects/ecma-builtin-generator-prototype.inc.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ OBJECT_VALUE (LIT_MAGIC_STRING_CONSTRUCTOR,
3636

3737
/* Routine properties:
3838
* (property name, C routine name, arguments number or NON_FIXED, value of the routine's length property) */
39-
ROUTINE (LIT_MAGIC_STRING_NEXT, ecma_builtin_generator_prototype_object_next, 1, 1)
40-
ROUTINE (LIT_MAGIC_STRING_RETURN, ecma_builtin_generator_prototype_object_return, 1, 1)
41-
ROUTINE (LIT_MAGIC_STRING_THROW, ecma_builtin_generator_prototype_object_throw, 1, 1)
39+
ROUTINE (LIT_MAGIC_STRING_NEXT, ECMA_GENERATOR_PROTOTYPE_ROUTINE_NEXT, 1, 1)
40+
ROUTINE (LIT_MAGIC_STRING_RETURN, ECMA_GENERATOR_PROTOTYPE_ROUTINE_RETURN, 1, 1)
41+
ROUTINE (LIT_MAGIC_STRING_THROW, ECMA_GENERATOR_PROTOTYPE_ROUTINE_THROW, 1, 1)
4242

4343
#endif /* ENABLED (JERRY_ESNEXT) */
4444

0 commit comments

Comments
 (0)