diff --git a/docs/02.API-REFERENCE.md b/docs/02.API-REFERENCE.md index bc8762a98..a66915469 100644 --- a/docs/02.API-REFERENCE.md +++ b/docs/02.API-REFERENCE.md @@ -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`. diff --git a/jerry-core/api/jerry.c b/jerry-core/api/jerry.c index 952af5457..ce9e8ea77 100644 --- a/jerry-core/api/jerry.c +++ b/jerry-core/api/jerry.c @@ -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 */ diff --git a/jerry-core/ecma/base/ecma-gc.c b/jerry-core/ecma/base/ecma-gc.c index 0c4003a55..70bef914c 100644 --- a/jerry-core/ecma/base/ecma-gc.c +++ b/jerry-core/ecma/base/ecma-gc.c @@ -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); diff --git a/jerry-core/ecma/base/ecma-globals.h b/jerry-core/ecma/base/ecma-globals.h index 9ef7523da..a0cb0a3aa 100644 --- a/jerry-core/ecma/base/ecma-globals.h +++ b/jerry-core/ecma/base/ecma-globals.h @@ -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. diff --git a/jerry-core/include/jerryscript-core.h b/jerry-core/include/jerryscript-core.h index 5b819a23b..53797dfae 100644 --- a/jerry-core/include/jerryscript-core.h +++ b/jerry-core/include/jerryscript-core.h @@ -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) */ diff --git a/jerry-core/lit/lit-magic-strings.inc.h b/jerry-core/lit/lit-magic-strings.inc.h index 33c8ec6b7..3ec2161ff 100644 --- a/jerry-core/lit/lit-magic-strings.inc.h +++ b/jerry-core/lit/lit-magic-strings.inc.h @@ -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 diff --git a/jerry-core/lit/lit-magic-strings.ini b/jerry-core/lit/lit-magic-strings.ini index c9cd3b882..08dc19d44 100644 --- a/jerry-core/lit/lit-magic-strings.ini +++ b/jerry-core/lit/lit-magic-strings.ini @@ -136,9 +136,11 @@ LIT_MAGIC_STRING_VALUE = "value" LIT_MAGIC_STRING_RESOURCE_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" diff --git a/tests/unit-core/test-api-objecttype.c b/tests/unit-core/test-api-objecttype.c index 985fb9e5b..6aca06f5b 100644 --- a/tests/unit-core/test-api-objecttype.c +++ b/tests/unit-core/test-api-objecttype.c @@ -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),