Optimize the copying/freeing of ecma values (#4602)

JerryScript-DCO-1.0-Signed-off-by: Dániel Bátyai daniel.batyai@h-lab.eu
This commit is contained in:
Dániel Bátyai
2021-02-22 08:32:10 +01:00
committed by GitHub
parent 242c3a55e3
commit 2240a9153a
6 changed files with 67 additions and 37 deletions
+2 -2
View File
@@ -51,7 +51,7 @@ JERRY_STATIC_ASSERT (sizeof (ecma_extended_object_t) - sizeof (ecma_object_t) <=
* *
* @return pointer to allocated memory * @return pointer to allocated memory
*/ */
ecma_number_t * extern inline ecma_number_t * JERRY_ATTR_ALWAYS_INLINE
ecma_alloc_number (void) ecma_alloc_number (void)
{ {
return (ecma_number_t *) jmem_pools_alloc (sizeof (ecma_number_t)); return (ecma_number_t *) jmem_pools_alloc (sizeof (ecma_number_t));
@@ -60,7 +60,7 @@ ecma_alloc_number (void)
/** /**
* Dealloc memory from an ecma-number * Dealloc memory from an ecma-number
*/ */
void extern inline void JERRY_ATTR_ALWAYS_INLINE
ecma_dealloc_number (ecma_number_t *number_p) /**< number to be freed */ ecma_dealloc_number (ecma_number_t *number_p) /**< number to be freed */
{ {
jmem_pools_free ((uint8_t *) number_p, sizeof (ecma_number_t)); jmem_pools_free ((uint8_t *) number_p, sizeof (ecma_number_t));
+11 -2
View File
@@ -127,8 +127,8 @@ ecma_init_gc_info (ecma_object_t *object_p) /**< object */
/** /**
* Increase reference counter of an object * Increase reference counter of an object
*/ */
void extern inline void JERRY_ATTR_ALWAYS_INLINE
ecma_ref_object (ecma_object_t *object_p) /**< object */ ecma_ref_object_inline (ecma_object_t *object_p) /**< object */
{ {
if (JERRY_LIKELY (object_p->type_flags_refs < ECMA_OBJECT_MAX_REF)) if (JERRY_LIKELY (object_p->type_flags_refs < ECMA_OBJECT_MAX_REF))
{ {
@@ -138,6 +138,15 @@ ecma_ref_object (ecma_object_t *object_p) /**< object */
{ {
jerry_fatal (ERR_REF_COUNT_LIMIT); jerry_fatal (ERR_REF_COUNT_LIMIT);
} }
} /* ecma_ref_object_inline */
/**
* Increase reference counter of an object
*/
void
ecma_ref_object (ecma_object_t *object_p) /**< object */
{
ecma_ref_object_inline (object_p);
} /* ecma_ref_object */ } /* ecma_ref_object */
/** /**
+1
View File
@@ -28,6 +28,7 @@
void ecma_init_gc_info (ecma_object_t *object_p); void ecma_init_gc_info (ecma_object_t *object_p);
void ecma_ref_object (ecma_object_t *object_p); void ecma_ref_object (ecma_object_t *object_p);
void ecma_ref_object_inline (ecma_object_t *object_p);
void ecma_deref_object (ecma_object_t *object_p); void ecma_deref_object (ecma_object_t *object_p);
void ecma_gc_free_properties (ecma_object_t *object_p); void ecma_gc_free_properties (ecma_object_t *object_p);
void ecma_gc_run (void); void ecma_gc_run (void);
+36 -12
View File
@@ -843,17 +843,13 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
} /* ecma_concat_ecma_strings */ } /* ecma_concat_ecma_strings */
/** /**
* Increase reference counter of ecma-string. * Increase reference counter of non-direct ecma-string.
*/ */
void extern inline void JERRY_ATTR_ALWAYS_INLINE
ecma_ref_ecma_string (ecma_string_t *string_p) /**< string descriptor */ ecma_ref_ecma_string_non_direct (ecma_string_t *string_p) /**< string descriptor */
{ {
JERRY_ASSERT (string_p != NULL); JERRY_ASSERT (string_p != NULL);
JERRY_ASSERT (!ECMA_IS_DIRECT_STRING (string_p));
if (ECMA_IS_DIRECT_STRING (string_p))
{
return;
}
#ifdef JERRY_NDEBUG #ifdef JERRY_NDEBUG
if (ECMA_STRING_IS_STATIC (string_p)) if (ECMA_STRING_IS_STATIC (string_p))
@@ -873,14 +869,13 @@ ecma_ref_ecma_string (ecma_string_t *string_p) /**< string descriptor */
{ {
jerry_fatal (ERR_REF_COUNT_LIMIT); jerry_fatal (ERR_REF_COUNT_LIMIT);
} }
} /* ecma_ref_ecma_string */ } /* ecma_ref_ecma_string_non_direct */
/** /**
* Decrease reference counter and deallocate ecma-string * Increase reference counter of ecma-string.
* if the counter becomes zero.
*/ */
void void
ecma_deref_ecma_string (ecma_string_t *string_p) /**< ecma-string */ ecma_ref_ecma_string (ecma_string_t *string_p) /**< string descriptor */
{ {
JERRY_ASSERT (string_p != NULL); JERRY_ASSERT (string_p != NULL);
@@ -889,6 +884,18 @@ ecma_deref_ecma_string (ecma_string_t *string_p) /**< ecma-string */
return; return;
} }
ecma_ref_ecma_string_non_direct (string_p);
} /* ecma_ref_ecma_string */
/**
* Decrease reference counter and deallocate a non-direct ecma-string
* if the counter becomes zero.
*/
extern inline void JERRY_ATTR_ALWAYS_INLINE
ecma_deref_ecma_string_non_direct (ecma_string_t *string_p) /**< ecma-string */
{
JERRY_ASSERT (!ECMA_IS_DIRECT_STRING (string_p));
#ifdef JERRY_NDEBUG #ifdef JERRY_NDEBUG
if (ECMA_STRING_IS_STATIC (string_p)) if (ECMA_STRING_IS_STATIC (string_p))
{ {
@@ -907,6 +914,23 @@ ecma_deref_ecma_string (ecma_string_t *string_p) /**< ecma-string */
} }
ecma_destroy_ecma_string (string_p); ecma_destroy_ecma_string (string_p);
} /* ecma_deref_ecma_string_non_direct */
/**
* Decrease reference counter and deallocate ecma-string
* if the counter becomes zero.
*/
void
ecma_deref_ecma_string (ecma_string_t *string_p) /**< ecma-string */
{
JERRY_ASSERT (string_p != NULL);
if (ECMA_IS_DIRECT_STRING (string_p))
{
return;
}
ecma_deref_ecma_string_non_direct (string_p);
} /* ecma_deref_ecma_string */ } /* ecma_deref_ecma_string */
/** /**
+15 -21
View File
@@ -536,7 +536,7 @@ ecma_create_float_number (ecma_number_t ecma_number) /**< value of the float num
* *
* @return ecma-value * @return ecma-value
*/ */
ecma_value_t extern inline ecma_value_t JERRY_ATTR_ALWAYS_INLINE
ecma_make_float_value (ecma_number_t *ecma_num_p) /**< pointer to the float number */ ecma_make_float_value (ecma_number_t *ecma_num_p) /**< pointer to the float number */
{ {
return ecma_pointer_to_ecma_value (ecma_num_p) | ECMA_TYPE_FLOAT; return ecma_pointer_to_ecma_value (ecma_num_p) | ECMA_TYPE_FLOAT;
@@ -899,21 +899,21 @@ ecma_copy_value (ecma_value_t value) /**< value description */
case ECMA_TYPE_FLOAT: case ECMA_TYPE_FLOAT:
{ {
ecma_number_t *num_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (value); ecma_number_t *num_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
ecma_number_t *new_num_p = ecma_alloc_number ();
return ecma_create_float_number (*num_p); *new_num_p = *num_p;
}
case ECMA_TYPE_STRING: return ecma_make_float_value (new_num_p);
{
ecma_ref_ecma_string (ecma_get_string_from_value (value));
return value;
} }
#if JERRY_ESNEXT #if JERRY_ESNEXT
case ECMA_TYPE_SYMBOL: case ECMA_TYPE_SYMBOL:
#endif /* JERRY_ESNEXT */
case ECMA_TYPE_STRING:
{ {
ecma_ref_ecma_string (ecma_get_symbol_from_value (value)); ecma_string_t *string_p = (ecma_string_t *) ecma_get_pointer_from_ecma_value (value);
ecma_ref_ecma_string_non_direct (string_p);
return value; return value;
} }
#endif /* JERRY_ESNEXT */
#if JERRY_BUILTIN_BIGINT #if JERRY_BUILTIN_BIGINT
case ECMA_TYPE_BIGINT: case ECMA_TYPE_BIGINT:
{ {
@@ -926,7 +926,7 @@ ecma_copy_value (ecma_value_t value) /**< value description */
#endif /* JERRY_BUILTIN_BIGINT */ #endif /* JERRY_BUILTIN_BIGINT */
case ECMA_TYPE_OBJECT: case ECMA_TYPE_OBJECT:
{ {
ecma_ref_object (ecma_get_object_from_value (value)); ecma_ref_object_inline (ecma_get_object_from_value (value));
return value; return value;
} }
default: default:
@@ -1131,26 +1131,20 @@ ecma_free_value (ecma_value_t value) /**< value description */
ecma_dealloc_number (number_p); ecma_dealloc_number (number_p);
break; break;
} }
case ECMA_TYPE_STRING:
{
ecma_string_t *string_p = ecma_get_string_from_value (value);
ecma_deref_ecma_string (string_p);
break;
}
#if JERRY_ESNEXT #if JERRY_ESNEXT
case ECMA_TYPE_SYMBOL: case ECMA_TYPE_SYMBOL:
#endif /* JERRY_ESNEXT */
case ECMA_TYPE_STRING:
{ {
ecma_deref_ecma_string (ecma_get_symbol_from_value (value)); ecma_string_t *string_p = (ecma_string_t *) ecma_get_pointer_from_ecma_value (value);
ecma_deref_ecma_string_non_direct (string_p);
break; break;
} }
#endif /* JERRY_ESNEXT */
case ECMA_TYPE_OBJECT: case ECMA_TYPE_OBJECT:
{ {
ecma_deref_object (ecma_get_object_from_value (value)); ecma_deref_object (ecma_get_object_from_value (value));
break; break;
} }
#if JERRY_BUILTIN_BIGINT #if JERRY_BUILTIN_BIGINT
case ECMA_TYPE_BIGINT: case ECMA_TYPE_BIGINT:
{ {
@@ -1158,10 +1152,10 @@ ecma_free_value (ecma_value_t value) /**< value description */
{ {
ecma_deref_bigint (ecma_get_extended_primitive_from_value (value)); ecma_deref_bigint (ecma_get_extended_primitive_from_value (value));
} }
break; break;
} }
#endif /* JERRY_BUILTIN_BIGINT */ #endif /* JERRY_BUILTIN_BIGINT */
default: default:
{ {
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT
+2
View File
@@ -321,7 +321,9 @@ ecma_string_t *ecma_append_chars_to_string (ecma_string_t *string1_p,
lit_utf8_size_t cesu8_string2_length); lit_utf8_size_t cesu8_string2_length);
ecma_string_t *ecma_concat_ecma_strings (ecma_string_t *string1_p, ecma_string_t *string2_p); ecma_string_t *ecma_concat_ecma_strings (ecma_string_t *string1_p, ecma_string_t *string2_p);
void ecma_ref_ecma_string (ecma_string_t *string_p); void ecma_ref_ecma_string (ecma_string_t *string_p);
void ecma_ref_ecma_string_non_direct (ecma_string_t *string_p);
void ecma_deref_ecma_string (ecma_string_t *string_p); void ecma_deref_ecma_string (ecma_string_t *string_p);
void ecma_deref_ecma_string_non_direct (ecma_string_t *string_p);
void ecma_destroy_ecma_string (ecma_string_t *string_p); void ecma_destroy_ecma_string (ecma_string_t *string_p);
ecma_number_t ecma_string_to_number (const ecma_string_t *str_p); ecma_number_t ecma_string_to_number (const ecma_string_t *str_p);
uint32_t ecma_string_get_array_index (const ecma_string_t *str_p); uint32_t ecma_string_get_array_index (const ecma_string_t *str_p);