Skip to content

Commit 10f4f9a

Browse files
author
Zsolt Borbély
committed
Function.prototype.bind: incorrect behaviour of ecma_gc_mark()
Related issue: #531 JerryScript-DCO-1.0-Signed-off-by: Zsolt Borbély [email protected]
1 parent 311cc65 commit 10f4f9a

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

jerry-core/ecma/base/ecma-gc.cpp

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -351,13 +351,47 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
351351
case ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_0_31: /* an integer (bit-mask) */
352352
case ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_32_63: /* an integer (bit-mask) */
353353
case ECMA_INTERNAL_PROPERTY_REGEXP_BYTECODE:
354-
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_TARGET_FUNCTION:
355-
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_THIS:
356-
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_ARGS:
357354
{
358355
break;
359356
}
360357

358+
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_THIS: /* an ecma-value */
359+
{
360+
if (ecma_is_value_object (property_value))
361+
{
362+
ecma_object_t *obj_p = ecma_get_object_from_value (property_value);
363+
364+
ecma_gc_set_object_visited (obj_p, true);
365+
}
366+
367+
break;
368+
}
369+
370+
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_ARGS: /* a collection of ecma-values */
371+
{
372+
ecma_collection_header_t *bound_arg_list_p = ECMA_GET_NON_NULL_POINTER (ecma_collection_header_t,
373+
property_value);
374+
375+
ecma_collection_iterator_t bound_args_iterator;
376+
ecma_collection_iterator_init (&bound_args_iterator, bound_arg_list_p);
377+
378+
for (ecma_length_t i = 0; i < bound_arg_list_p->unit_number; i++)
379+
{
380+
bool is_moved = ecma_collection_iterator_next (&bound_args_iterator);
381+
JERRY_ASSERT (is_moved);
382+
383+
if (ecma_is_value_object (*bound_args_iterator.current_value_p))
384+
{
385+
ecma_object_t *obj_p = ecma_get_object_from_value (*bound_args_iterator.current_value_p);
386+
387+
ecma_gc_set_object_visited (obj_p, true);
388+
}
389+
}
390+
391+
break;
392+
}
393+
394+
case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_TARGET_FUNCTION: /* an object */
361395
case ECMA_INTERNAL_PROPERTY_SCOPE: /* a lexical environment */
362396
case ECMA_INTERNAL_PROPERTY_PARAMETERS_MAP: /* an object */
363397
{

0 commit comments

Comments
 (0)