Generational mark and sweep GC.

This commit is contained in:
Ruben Ayrapetyan
2014-08-07 14:54:32 +04:00
parent ba6713e295
commit e3cd8ee942
15 changed files with 475 additions and 180 deletions
+2 -2
View File
@@ -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:
+4 -4
View File
@@ -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;
}
+8 -4
View File
@@ -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:
{
+12 -16
View File
@@ -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 )
+2 -2
View File
@@ -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 */
/**