Create special objects for scripts instead of functions (#4610)
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
@@ -41,6 +41,8 @@ Enum that contains JerryScript **object** value types:
|
||||
- JERRY_OBJECT_TYPE_GENERIC - Generic JavaScript object without any internal property
|
||||
- JERRY_OBJECT_TYPE_ARRAY - Array object
|
||||
- JERRY_OBJECT_TYPE_PROXY - Proxy object
|
||||
- JERRY_OBJECT_TYPE_SCRIPT - Script object (see [jerry_parse](#jerry_parse))
|
||||
- JERRY_OBJECT_TYPE_MODULE - Module object (see [jerry_parse](#jerry_parse))
|
||||
- JERRY_OBJECT_TYPE_FUNCTION - Function object (see [jerry_function_get_type](#jerry_function_get_type))
|
||||
- JERRY_OBJECT_TYPE_TYPEDARRAY - %TypedArray% object (see [jerry_get_typedarray_type](#jerry_get_typedarray_type))
|
||||
- JERRY_OBJECT_TYPE_ITERATOR - Iterator object (see [jerry_iterator_get_type](#jerry_get_typedarray_type))
|
||||
@@ -58,6 +60,8 @@ Enum that contains JerryScript **object** value types:
|
||||
|
||||
*New in version 2.4*.
|
||||
|
||||
*Changed in version [[NEXT_RELEASE]]*: Added `JERRY_OBJECT_TYPE_SCRIPT`, `JERRY_OBJECT_TYPE_MODULE` values.
|
||||
|
||||
## jerry_function_type_t
|
||||
|
||||
Enum that contains JerryScript **function** value types:
|
||||
@@ -159,6 +163,7 @@ Possible compile time enabled feature types:
|
||||
- JERRY_FEATURE_REALM - realm support
|
||||
- JERRY_FEATURE_GLOBAL_THIS - GlobalThisValue support
|
||||
- JERRY_FEATURE_PROMISE_CALLBACK - Promise callback support
|
||||
- JERRY_FEATURE_MODULE - Module support
|
||||
|
||||
*New in version 2.0*.
|
||||
|
||||
@@ -166,7 +171,7 @@ Possible compile time enabled feature types:
|
||||
|
||||
*Changed in version 2.4*: Added `JERRY_FEATURE_BIGINT`, `JERRY_FEATURE_REALM` values.
|
||||
|
||||
*Changed in version [[NEXT_RELEASE]]*: Added `JERRY_FEATURE_GLOBAL_THIS`, `JERRY_FEATURE_PROMISE_CALLBACK` values.
|
||||
*Changed in version [[NEXT_RELEASE]]*: Added `JERRY_FEATURE_GLOBAL_THIS`, `JERRY_FEATURE_PROMISE_CALLBACK`, `JERRY_FEATURE_MODULE` values.
|
||||
|
||||
## jerry_container_type_t
|
||||
|
||||
@@ -1515,7 +1520,7 @@ main (void)
|
||||
|
||||
**Summary**
|
||||
|
||||
Run an EcmaScript function created by `jerry_parse`.
|
||||
Run a Script or Module created by [jerry_parse](#jerry_parse).
|
||||
|
||||
*Notes*:
|
||||
- The code should be previously parsed with `jerry_parse`.
|
||||
|
||||
+41
-36
@@ -521,7 +521,7 @@ jerry_parse (const jerry_char_t *resource_name_p, /**< resource name (usually a
|
||||
}
|
||||
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
if ((parse_opts & JERRY_PARSE_MODULE) != 0)
|
||||
if (JERRY_UNLIKELY (parse_opts & JERRY_PARSE_MODULE))
|
||||
{
|
||||
if (ECMA_IS_VALUE_ERROR (ecma_module_parse_referenced_modules ()))
|
||||
{
|
||||
@@ -531,16 +531,15 @@ jerry_parse (const jerry_char_t *resource_name_p, /**< resource name (usually a
|
||||
return ecma_create_error_reference_from_context ();
|
||||
}
|
||||
|
||||
ecma_object_t *obj_p = ecma_create_object (NULL, sizeof (ecma_extended_object_t), ECMA_OBJECT_TYPE_CLASS);
|
||||
|
||||
ecma_extended_object_t *wrapper_p = (ecma_extended_object_t *) obj_p;
|
||||
wrapper_p->u.class_prop.class_id = LIT_MAGIC_STRING_RUNNABLE_UL;
|
||||
wrapper_p->u.class_prop.extra_info = ECMA_RUNNABLE_FLAGS_MODULE;
|
||||
|
||||
ecma_module_t *root_module_p = JERRY_CONTEXT (module_current_p);
|
||||
root_module_p->compiled_code_p = bytecode_data_p;
|
||||
|
||||
ECMA_SET_INTERNAL_VALUE_POINTER (wrapper_p->u.class_prop.u.value, root_module_p);
|
||||
ecma_object_t *obj_p = ecma_create_object (NULL, sizeof (ecma_extended_object_t), ECMA_OBJECT_TYPE_CLASS);
|
||||
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) obj_p;
|
||||
ext_object_p->u.class_prop.class_id = LIT_MAGIC_STRING_MODULE_UL;
|
||||
ECMA_SET_INTERNAL_VALUE_POINTER (ext_object_p->u.class_prop.u.value, root_module_p);
|
||||
|
||||
JERRY_CONTEXT (module_current_p) = NULL;
|
||||
JERRY_CONTEXT (module_list_p) = NULL;
|
||||
|
||||
@@ -548,20 +547,13 @@ jerry_parse (const jerry_char_t *resource_name_p, /**< resource name (usually a
|
||||
}
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
|
||||
ecma_object_t *global_object_p = ecma_builtin_get_global ();
|
||||
ecma_object_t *object_p = ecma_create_object (NULL, sizeof (ecma_extended_object_t), ECMA_OBJECT_TYPE_CLASS);
|
||||
|
||||
#if JERRY_BUILTIN_REALMS
|
||||
JERRY_ASSERT (global_object_p == (ecma_object_t *) ecma_op_function_get_realm (bytecode_data_p));
|
||||
#endif /* JERRY_BUILTIN_REALMS */
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
|
||||
ext_object_p->u.class_prop.class_id = LIT_MAGIC_STRING_SCRIPT_UL;
|
||||
ECMA_SET_INTERNAL_VALUE_POINTER (ext_object_p->u.class_prop.u.value, bytecode_data_p);
|
||||
|
||||
ecma_object_t *lex_env_p = ecma_get_global_environment (global_object_p);
|
||||
|
||||
/* TODO(dbatyai): For now Scripts continue to return Function objects due to backwards compatibility. This should be
|
||||
* changed to also return a Runnable object eventually. */
|
||||
ecma_object_t *func_obj_p = ecma_op_create_simple_function_object (lex_env_p, bytecode_data_p);
|
||||
ecma_bytecode_deref (bytecode_data_p);
|
||||
|
||||
return ecma_make_object_value (func_obj_p);
|
||||
return ecma_make_object_value (object_p);
|
||||
#else /* !JERRY_PARSER */
|
||||
JERRY_UNUSED (source_p);
|
||||
JERRY_UNUSED (source_size);
|
||||
@@ -653,7 +645,7 @@ jerry_parse_function (const jerry_char_t *resource_name_p, /**< resource name (u
|
||||
} /* jerry_parse_function */
|
||||
|
||||
/**
|
||||
* Run an EcmaScript function created by jerry_parse.
|
||||
* Run a Script or Module created by jerry_parse.
|
||||
*
|
||||
* Note:
|
||||
* returned value must be freed with jerry_release_value, when it is no longer needed.
|
||||
@@ -671,14 +663,19 @@ jerry_run (const jerry_value_t func_val) /**< function to run */
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
ecma_object_t *obj_p = ecma_get_object_from_value (func_val);
|
||||
ecma_object_t *object_p = ecma_get_object_from_value (func_val);
|
||||
|
||||
if (ecma_get_object_type (object_p) != ECMA_OBJECT_TYPE_CLASS)
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
|
||||
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
if (ecma_object_class_is (obj_p, LIT_MAGIC_STRING_RUNNABLE_UL))
|
||||
if (ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_MODULE_UL)
|
||||
{
|
||||
ecma_extended_object_t *wrapper_p = (ecma_extended_object_t *) obj_p;
|
||||
JERRY_ASSERT (wrapper_p->u.class_prop.extra_info == ECMA_RUNNABLE_FLAGS_MODULE);
|
||||
ecma_module_t *root_module_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_module_t, wrapper_p->u.class_prop.u.value);
|
||||
ecma_module_t *root_module_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_module_t, ext_object_p->u.class_prop.u.value);
|
||||
|
||||
#if JERRY_BUILTIN_REALMS
|
||||
ecma_object_t *global_object_p = (ecma_object_t *) ecma_op_function_get_realm (root_module_p->compiled_code_p);
|
||||
@@ -693,22 +690,17 @@ jerry_run (const jerry_value_t func_val) /**< function to run */
|
||||
}
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
|
||||
if (ecma_get_object_type (obj_p) != ECMA_OBJECT_TYPE_FUNCTION
|
||||
|| ecma_get_object_is_builtin (obj_p))
|
||||
if (ext_object_p->u.class_prop.class_id != LIT_MAGIC_STRING_SCRIPT_UL)
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
ecma_extended_object_t *ext_func_p = (ecma_extended_object_t *) obj_p;
|
||||
const ecma_compiled_code_t *bytecode_data_p;
|
||||
bytecode_data_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t, ext_object_p->u.class_prop.u.value);
|
||||
|
||||
const ecma_compiled_code_t *bytecode_data_p = ecma_op_function_get_compiled_code (ext_func_p);
|
||||
JERRY_ASSERT (CBC_FUNCTION_GET_TYPE (bytecode_data_p->status_flags) == CBC_FUNCTION_SCRIPT);
|
||||
|
||||
if (CBC_FUNCTION_GET_TYPE (bytecode_data_p->status_flags) != CBC_FUNCTION_SCRIPT)
|
||||
{
|
||||
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
|
||||
}
|
||||
|
||||
return jerry_return (vm_run_global (ecma_op_function_get_compiled_code (ext_func_p)));
|
||||
return jerry_return (vm_run_global (bytecode_data_p));
|
||||
} /* jerry_run */
|
||||
|
||||
/**
|
||||
@@ -1178,6 +1170,16 @@ jerry_object_get_type (const jerry_value_t value) /**< input value to check */
|
||||
{
|
||||
switch (ext_obj_p->u.class_prop.class_id)
|
||||
{
|
||||
case LIT_MAGIC_STRING_SCRIPT_UL:
|
||||
{
|
||||
return JERRY_OBJECT_TYPE_SCRIPT;
|
||||
}
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
case LIT_MAGIC_STRING_MODULE_UL:
|
||||
{
|
||||
return JERRY_OBJECT_TYPE_MODULE;
|
||||
}
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
case LIT_MAGIC_STRING_ARGUMENTS_UL:
|
||||
{
|
||||
return JERRY_OBJECT_TYPE_ARGUMENTS;
|
||||
@@ -1470,6 +1472,9 @@ jerry_is_feature_enabled (const jerry_feature_t feature) /**< feature to check *
|
||||
#if JERRY_PROMISE_CALLBACK
|
||||
|| feature == JERRY_FEATURE_PROMISE_CALLBACK
|
||||
#endif /* JERRY_PROMISE_CALLBACK */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
|| feature == JERRY_FEATURE_MODULE
|
||||
#endif /* JERRY_MODULE_SYSTEM */
|
||||
);
|
||||
} /* jerry_is_feature_enabled */
|
||||
|
||||
|
||||
@@ -1571,6 +1571,15 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
|
||||
switch (ext_object_p->u.class_prop.class_id)
|
||||
{
|
||||
case LIT_MAGIC_STRING_SCRIPT_UL:
|
||||
{
|
||||
ecma_compiled_code_t *compiled_code_p;
|
||||
compiled_code_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_compiled_code_t,
|
||||
ext_object_p->u.class_prop.u.value);
|
||||
|
||||
ecma_bytecode_deref (compiled_code_p);
|
||||
break;
|
||||
}
|
||||
case LIT_MAGIC_STRING_STRING_UL:
|
||||
case LIT_MAGIC_STRING_NUMBER_UL:
|
||||
#if JERRY_ESNEXT
|
||||
@@ -1684,13 +1693,10 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
|
||||
}
|
||||
#endif /* JERRY_ESNEXT */
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
case LIT_MAGIC_STRING_RUNNABLE_UL:
|
||||
case LIT_MAGIC_STRING_MODULE_UL:
|
||||
{
|
||||
ecma_extended_object_t *wrapper_p = (ecma_extended_object_t *) object_p;
|
||||
|
||||
JERRY_ASSERT (wrapper_p->u.class_prop.extra_info == ECMA_RUNNABLE_FLAGS_MODULE);
|
||||
ecma_module_t *root_module_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_module_t,
|
||||
wrapper_p->u.class_prop.u.value);
|
||||
ext_object_p->u.class_prop.u.value);
|
||||
|
||||
ecma_bytecode_deref (root_module_p->compiled_code_p);
|
||||
ecma_module_cleanup (root_module_p);
|
||||
|
||||
@@ -1097,14 +1097,6 @@ typedef struct
|
||||
#endif /* JERRY_SNAPSHOT_EXEC */
|
||||
|
||||
#if JERRY_ESNEXT
|
||||
/**
|
||||
* Flags for runnable objects.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
ECMA_RUNNABLE_FLAGS_EMPTY = (0), /**< empty flags */
|
||||
ECMA_RUNNABLE_FLAGS_MODULE = (1 << 0) /**< runnable is a module */
|
||||
} ecma_runnable_flags_t;
|
||||
|
||||
/**
|
||||
* Description of arrow function objects.
|
||||
|
||||
@@ -108,6 +108,7 @@ typedef enum
|
||||
JERRY_FEATURE_REALM, /**< realm support */
|
||||
JERRY_FEATURE_GLOBAL_THIS, /**< GlobalThisValue support */
|
||||
JERRY_FEATURE_PROMISE_CALLBACK, /**< Promise callback support */
|
||||
JERRY_FEATURE_MODULE, /**< Module support */
|
||||
JERRY_FEATURE__COUNT /**< number of features. NOTE: must be at the end of the list */
|
||||
} jerry_feature_t;
|
||||
|
||||
@@ -474,6 +475,8 @@ typedef enum
|
||||
JERRY_OBJECT_TYPE_GENERIC, /**< Generic JavaScript object without any internal property */
|
||||
JERRY_OBJECT_TYPE_ARRAY, /**< Array object */
|
||||
JERRY_OBJECT_TYPE_PROXY, /**< Proxy object */
|
||||
JERRY_OBJECT_TYPE_SCRIPT, /**< Script object (see jerry_parse) */
|
||||
JERRY_OBJECT_TYPE_MODULE, /**< Module object (see jerry_parse) */
|
||||
JERRY_OBJECT_TYPE_FUNCTION, /**< Function object (see jerry_function_get_type) */
|
||||
JERRY_OBJECT_TYPE_TYPEDARRAY, /**< %TypedArray% object (see jerry_get_typedarray_type) */
|
||||
JERRY_OBJECT_TYPE_ITERATOR, /**< Iterator object (see jerry_iterator_get_type) */
|
||||
|
||||
@@ -319,9 +319,13 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_BIGINT_UL, "BigInt")
|
||||
#if JERRY_BUILTIN_MATH
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_LOG10E_U, "LOG10E")
|
||||
#endif
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_MODULE_UL, "Module")
|
||||
#endif
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_NUMBER_UL, "Number")
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_OBJECT_UL, "Object")
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_REGEXP_UL, "RegExp")
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SCRIPT_UL, "Script")
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_STRING_UL, "String")
|
||||
#if JERRY_ESNEXT
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_SYMBOL_UL, "Symbol")
|
||||
@@ -552,9 +556,6 @@ LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_DATAVIEW_UL, "DataView")
|
||||
#endif
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_FUNCTION_UL, "Function")
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_INFINITY_UL, "Infinity")
|
||||
#if JERRY_MODULE_SYSTEM
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_RUNNABLE_UL, "Runnable")
|
||||
#endif
|
||||
#if JERRY_BUILTIN_ERRORS
|
||||
LIT_MAGIC_STRING_DEF (LIT_MAGIC_STRING_URI_ERROR_UL, "URIError")
|
||||
#endif
|
||||
@@ -1053,6 +1054,8 @@ LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_RESOURCE_EVAL)
|
||||
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_BIGINT_UL)
|
||||
#elif JERRY_BUILTIN_MATH
|
||||
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_LOG10E_U)
|
||||
#elif JERRY_MODULE_SYSTEM
|
||||
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_MODULE_UL)
|
||||
#else
|
||||
LIT_MAGIC_STRING_FIRST_STRING_WITH_SIZE (6, LIT_MAGIC_STRING_NUMBER_UL)
|
||||
#endif
|
||||
|
||||
@@ -136,9 +136,11 @@ LIT_MAGIC_STRING_VALUE = "value"
|
||||
LIT_MAGIC_STRING_RESOURCE_EVAL = "<eval>"
|
||||
LIT_MAGIC_STRING_BIGINT_UL = "BigInt"
|
||||
LIT_MAGIC_STRING_LOG10E_U = "LOG10E"
|
||||
LIT_MAGIC_STRING_MODULE_UL = "Module"
|
||||
LIT_MAGIC_STRING_NUMBER_UL = "Number"
|
||||
LIT_MAGIC_STRING_OBJECT_UL = "Object"
|
||||
LIT_MAGIC_STRING_REGEXP_UL = "RegExp"
|
||||
LIT_MAGIC_STRING_SCRIPT_UL = "Script"
|
||||
LIT_MAGIC_STRING_STRING_UL = "String"
|
||||
LIT_MAGIC_STRING_SYMBOL_UL = "Symbol"
|
||||
LIT_MAGIC_STRING_ASSIGN = "assign"
|
||||
@@ -215,7 +217,6 @@ LIT_MAGIC_STRING_VALUE_OF_UL = "valueOf"
|
||||
LIT_MAGIC_STRING_WEAKMAP_UL = "WeakMap"
|
||||
LIT_MAGIC_STRING_WEAKSET_UL = "WeakSet"
|
||||
LIT_MAGIC_STRING_EPSILON_U = "EPSILON"
|
||||
LIT_MAGIC_STRING_RUNNABLE_UL = "Runnable"
|
||||
LIT_MAGIC_STRING_DATAVIEW_UL = "DataView"
|
||||
LIT_MAGIC_STRING_FUNCTION_UL = "Function"
|
||||
LIT_MAGIC_STRING_INFINITY_UL = "Infinity"
|
||||
|
||||
@@ -28,6 +28,7 @@ typedef struct
|
||||
#define ENTRY(TYPE, VALUE) { TYPE, VALUE, true }
|
||||
#define ENTRY_IF(TYPE, VALUE, FEATURE) { TYPE, VALUE, jerry_is_feature_enabled (FEATURE) }
|
||||
#define EVALUATE(BUFF) (jerry_eval ((BUFF), sizeof ((BUFF)) - 1, JERRY_PARSE_NO_OPTS))
|
||||
#define PARSE(OPTS) (jerry_parse (NULL, 0, (const jerry_char_t *) "", 0, (OPTS)))
|
||||
static jerry_value_t
|
||||
test_ext_function (const jerry_call_info_t *call_info_p, /**< call information */
|
||||
const jerry_value_t args_p[], /**< array of arguments */
|
||||
@@ -90,6 +91,8 @@ main (void)
|
||||
ENTRY_IF (JERRY_OBJECT_TYPE_CONTAINER, EVALUATE (container_object), JERRY_FEATURE_MAP),
|
||||
ENTRY_IF (JERRY_OBJECT_TYPE_ITERATOR, EVALUATE (iterator_object), JERRY_FEATURE_SYMBOL),
|
||||
|
||||
ENTRY (JERRY_OBJECT_TYPE_SCRIPT, PARSE (JERRY_PARSE_NO_OPTS)),
|
||||
ENTRY_IF (JERRY_OBJECT_TYPE_MODULE, PARSE (JERRY_PARSE_MODULE), JERRY_FEATURE_MODULE),
|
||||
ENTRY_IF (JERRY_OBJECT_TYPE_FUNCTION, EVALUATE (arrow_function), JERRY_FEATURE_SYMBOL),
|
||||
ENTRY_IF (JERRY_OBJECT_TYPE_FUNCTION, EVALUATE (async_arrow_function), JERRY_FEATURE_SYMBOL),
|
||||
ENTRY_IF (JERRY_OBJECT_TYPE_FUNCTION, EVALUATE (generator_function), JERRY_FEATURE_SYMBOL),
|
||||
|
||||
Reference in New Issue
Block a user