Generational mark and sweep GC.
This commit is contained in:
@@ -167,7 +167,7 @@ ecma_op_to_primitive( ecma_value_t value, /**< ecma-value */
|
||||
case ECMA_TYPE_STRING:
|
||||
{
|
||||
return ecma_make_completion_value( ECMA_COMPLETION_TYPE_NORMAL,
|
||||
ecma_copy_value( value),
|
||||
ecma_copy_value( value, true),
|
||||
ECMA_TARGET_ID_RESERVED);
|
||||
}
|
||||
case ECMA_TYPE_OBJECT:
|
||||
@@ -266,7 +266,7 @@ ecma_op_to_number( ecma_value_t value) /**< ecma-value */
|
||||
case ECMA_TYPE_NUMBER:
|
||||
{
|
||||
return ecma_make_completion_value( ECMA_COMPLETION_TYPE_NORMAL,
|
||||
ecma_copy_value( value),
|
||||
ecma_copy_value( value, true),
|
||||
ECMA_TARGET_ID_RESERVED);
|
||||
}
|
||||
case ECMA_TYPE_SIMPLE:
|
||||
|
||||
@@ -130,11 +130,11 @@ ecma_op_create_function_object( const ecma_char_t* formal_parameter_list_p[], /*
|
||||
class_prop_p->u.internal_property.value = ECMA_OBJECT_CLASS_FUNCTION;
|
||||
|
||||
// 9.
|
||||
ecma_ref_object( scope_p);
|
||||
|
||||
ecma_property_t *scope_prop_p = ecma_create_internal_property( f, ECMA_INTERNAL_PROPERTY_SCOPE);
|
||||
ecma_set_pointer( scope_prop_p->u.internal_property.value, scope_p);
|
||||
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object( f, scope_p);
|
||||
|
||||
// 10., 11., 14., 15.
|
||||
if ( formal_parameters_number != 0 )
|
||||
{
|
||||
@@ -255,7 +255,7 @@ ecma_op_function_call( ecma_object_t *func_obj_p, /**< Function object */
|
||||
// 1.
|
||||
if ( is_strict )
|
||||
{
|
||||
this_binding = ecma_copy_value( this_arg_value);
|
||||
this_binding = ecma_copy_value( this_arg_value, true);
|
||||
}
|
||||
else if ( ecma_is_value_undefined( this_arg_value)
|
||||
|| ecma_is_value_null( this_arg_value) )
|
||||
@@ -301,7 +301,7 @@ ecma_op_function_call( ecma_object_t *func_obj_p, /**< Function object */
|
||||
}
|
||||
|
||||
ecma_deref_object( local_env_p);
|
||||
ecma_free_value( this_binding);
|
||||
ecma_free_value( this_binding, true);
|
||||
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
@@ -193,8 +193,10 @@ ecma_op_set_mutable_binding(ecma_object_t *lex_env_p, /**< lexical environment *
|
||||
|
||||
if ( property_p->u.named_data_property.writable == ECMA_PROPERTY_WRITABLE )
|
||||
{
|
||||
ecma_free_value( property_p->u.named_data_property.value);
|
||||
property_p->u.named_data_property.value = ecma_copy_value( value);
|
||||
ecma_free_value( property_p->u.named_data_property.value, false);
|
||||
property_p->u.named_data_property.value = ecma_copy_value( value, false);
|
||||
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_value( lex_env_p, value);
|
||||
}
|
||||
else if ( is_strict )
|
||||
{
|
||||
@@ -256,7 +258,7 @@ ecma_op_get_binding_value(ecma_object_t *lex_env_p, /**< lexical environment */
|
||||
if ( property_p->u.named_data_property.writable == ECMA_PROPERTY_WRITABLE )
|
||||
{
|
||||
return ecma_make_completion_value( ECMA_COMPLETION_TYPE_NORMAL,
|
||||
ecma_copy_value( prop_value),
|
||||
ecma_copy_value( prop_value, true),
|
||||
ECMA_TARGET_ID_RESERVED);
|
||||
} else if ( ecma_is_value_empty( prop_value) )
|
||||
{
|
||||
@@ -463,7 +465,9 @@ ecma_op_initialize_immutable_binding(ecma_object_t *lex_env_p, /**< lexical envi
|
||||
JERRY_ASSERT( prop_p->u.named_data_property.writable == ECMA_PROPERTY_NOT_WRITABLE
|
||||
&& ecma_is_value_empty( prop_p->u.named_data_property.value) );
|
||||
|
||||
prop_p->u.named_data_property.value = ecma_copy_value( value);
|
||||
prop_p->u.named_data_property.value = ecma_copy_value( value, false);
|
||||
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_value( lex_env_p, value);
|
||||
}
|
||||
case ECMA_LEXICAL_ENVIRONMENT_OBJECTBOUND:
|
||||
{
|
||||
|
||||
@@ -80,7 +80,7 @@ ecma_op_object_get( ecma_object_t *obj_p, /**< the object */
|
||||
if ( prop_p->type == ECMA_PROPERTY_NAMEDDATA )
|
||||
{
|
||||
return ecma_make_completion_value( ECMA_COMPLETION_TYPE_NORMAL,
|
||||
ecma_copy_value( prop_p->u.named_data_property.value),
|
||||
ecma_copy_value( prop_p->u.named_data_property.value, true),
|
||||
ECMA_TARGET_ID_RESERVED);
|
||||
}
|
||||
else
|
||||
@@ -547,23 +547,15 @@ ecma_op_object_define_own_property( ecma_object_t *obj_p, /**< the object */
|
||||
property_desc.enumerable,
|
||||
property_desc.configurable);
|
||||
|
||||
new_prop_p->u.named_data_property.value = ecma_copy_value( property_desc.value);
|
||||
new_prop_p->u.named_data_property.value = ecma_copy_value( property_desc.value, false);
|
||||
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_value( obj_p, property_desc.value);
|
||||
}
|
||||
else
|
||||
{
|
||||
// b.
|
||||
JERRY_ASSERT( is_property_desc_accessor_descriptor );
|
||||
|
||||
if ( property_desc.get_p != NULL )
|
||||
{
|
||||
ecma_ref_object( property_desc.get_p);
|
||||
}
|
||||
|
||||
if ( property_desc.set_p != NULL )
|
||||
{
|
||||
ecma_ref_object( property_desc.set_p);
|
||||
}
|
||||
|
||||
ecma_create_named_accessor_property( obj_p,
|
||||
property_name_p,
|
||||
property_desc.get_p,
|
||||
@@ -757,8 +749,10 @@ ecma_op_object_define_own_property( ecma_object_t *obj_p, /**< the object */
|
||||
{
|
||||
JERRY_ASSERT( is_current_data_descriptor );
|
||||
|
||||
ecma_free_value( current_p->u.named_data_property.value);
|
||||
current_p->u.named_data_property.value = ecma_copy_value( property_desc.value);
|
||||
ecma_free_value( current_p->u.named_data_property.value, false);
|
||||
current_p->u.named_data_property.value = ecma_copy_value( property_desc.value, false);
|
||||
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_value( obj_p, property_desc.value);
|
||||
}
|
||||
|
||||
if ( property_desc.is_writable_defined )
|
||||
@@ -772,16 +766,18 @@ ecma_op_object_define_own_property( ecma_object_t *obj_p, /**< the object */
|
||||
{
|
||||
JERRY_ASSERT( is_current_accessor_descriptor );
|
||||
|
||||
ecma_ref_object( property_desc.get_p);
|
||||
ecma_set_pointer( current_p->u.named_accessor_property.get_p, property_desc.get_p);
|
||||
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object( obj_p, property_desc.get_p);
|
||||
}
|
||||
|
||||
if ( property_desc.is_set_defined )
|
||||
{
|
||||
JERRY_ASSERT( is_current_accessor_descriptor );
|
||||
|
||||
ecma_ref_object( property_desc.set_p);
|
||||
ecma_set_pointer( current_p->u.named_accessor_property.set_p, property_desc.set_p);
|
||||
|
||||
ecma_gc_update_may_ref_younger_object_flag_by_object( obj_p, property_desc.set_p);
|
||||
}
|
||||
|
||||
if ( property_desc.is_enumerable_defined )
|
||||
|
||||
@@ -86,7 +86,7 @@ ecma_make_reference(ecma_value_t base, /**< base value */
|
||||
const ecma_char_t *name_p, /**< referenced name */
|
||||
bool is_strict) /**< strict reference flag */
|
||||
{
|
||||
ecma_reference_t ref = (ecma_reference_t) { .base = ecma_copy_value( base),
|
||||
ecma_reference_t ref = (ecma_reference_t) { .base = ecma_copy_value( base, true),
|
||||
.referenced_name_p = name_p,
|
||||
.is_strict = is_strict };
|
||||
|
||||
@@ -102,7 +102,7 @@ ecma_make_reference(ecma_value_t base, /**< base value */
|
||||
void
|
||||
ecma_free_reference( const ecma_reference_t ref) /**< reference */
|
||||
{
|
||||
ecma_free_value( ref.base);
|
||||
ecma_free_value( ref.base, true);
|
||||
} /* ecma_free_reference */
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user