From 66975236bc42fdfcfcb74b6996601c1401f2b62e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zsolt=20Borb=C3=A9ly?= Date: Wed, 26 Aug 2015 16:12:08 +0200 Subject: [PATCH] Function.prototype.bind: incorrect behaviour of ecma_gc_mark() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Related issue: #531 JerryScript-DCO-1.0-Signed-off-by: Zsolt Borbély zsborbely.u-szeged@partner.samsung.com --- jerry-core/ecma/base/ecma-gc.cpp | 40 +++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/jerry-core/ecma/base/ecma-gc.cpp b/jerry-core/ecma/base/ecma-gc.cpp index b4983212e5..5d0d36684a 100644 --- a/jerry-core/ecma/base/ecma-gc.cpp +++ b/jerry-core/ecma/base/ecma-gc.cpp @@ -351,13 +351,47 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */ case ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_0_31: /* an integer (bit-mask) */ case ECMA_INTERNAL_PROPERTY_NON_INSTANTIATED_BUILT_IN_MASK_32_63: /* an integer (bit-mask) */ case ECMA_INTERNAL_PROPERTY_REGEXP_BYTECODE: - case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_TARGET_FUNCTION: - case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_THIS: - case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_ARGS: { break; } + case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_THIS: /* an ecma-value */ + { + if (ecma_is_value_object (property_value)) + { + ecma_object_t *obj_p = ecma_get_object_from_value (property_value); + + ecma_gc_set_object_visited (obj_p, true); + } + + break; + } + + case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_BOUND_ARGS: /* a collection of ecma-values */ + { + ecma_collection_header_t *bound_arg_list_p = ECMA_GET_NON_NULL_POINTER (ecma_collection_header_t, + property_value); + + ecma_collection_iterator_t bound_args_iterator; + ecma_collection_iterator_init (&bound_args_iterator, bound_arg_list_p); + + for (ecma_length_t i = 0; i < bound_arg_list_p->unit_number; i++) + { + bool is_moved = ecma_collection_iterator_next (&bound_args_iterator); + JERRY_ASSERT (is_moved); + + if (ecma_is_value_object (*bound_args_iterator.current_value_p)) + { + ecma_object_t *obj_p = ecma_get_object_from_value (*bound_args_iterator.current_value_p); + + ecma_gc_set_object_visited (obj_p, true); + } + } + + break; + } + + case ECMA_INTERNAL_PROPERTY_BOUND_FUNCTION_TARGET_FUNCTION: /* an object */ case ECMA_INTERNAL_PROPERTY_SCOPE: /* a lexical environment */ case ECMA_INTERNAL_PROPERTY_PARAMETERS_MAP: /* an object */ {