Implement function name support for script functions and classes (#3745)

JerryScript-DCO-1.0-Signed-off-by: Robert Fancsik frobert@inf.u-szeged.hu
This commit is contained in:
Robert Fancsik
2020-05-28 12:33:21 +02:00
committed by GitHub
parent 562dcc8630
commit 104001df68
29 changed files with 875 additions and 397 deletions
-69
View File
@@ -57,17 +57,11 @@
<test id="built-ins/Date/prototype/Symbol.toPrimitive/name.js"><reason></reason></test>
<test id="built-ins/decodeURIComponent/S15.1.3.2_A2.5_T1.js"><reason></reason></test>
<test id="built-ins/decodeURI/S15.1.3.1_A2.5_T1.js"><reason></reason></test>
<test id="built-ins/Function/instance-name.js"><reason></reason></test>
<test id="built-ins/Function/prototype/bind/15.3.4.5-15-5.js"><reason></reason></test>
<test id="built-ins/Function/prototype/bind/BoundFunction_restricted-properties.js"><reason></reason></test>
<test id="built-ins/Function/prototype/bind/instance-name-chained.js"><reason></reason></test>
<test id="built-ins/Function/prototype/bind/instance-name-error.js"><reason></reason></test>
<test id="built-ins/Function/prototype/bind/instance-name.js"><reason></reason></test>
<test id="built-ins/Function/prototype/bind/instance-name-non-string.js"><reason></reason></test>
<test id="built-ins/Function/prototype/name.js"><reason></reason></test>
<test id="built-ins/Function/prototype/Symbol.hasInstance/name.js"><reason></reason></test>
<test id="built-ins/Function/StrictFunction_restricted-properties.js"><reason></reason></test>
<test id="built-ins/GeneratorFunction/instance-name.js"><reason></reason></test>
<test id="built-ins/GeneratorFunction/instance-restricted-properties.js"><reason></reason></test>
<test id="built-ins/GeneratorPrototype/next/context-constructor-invocation.js"><reason></reason></test>
<test id="built-ins/GeneratorPrototype/throw/from-state-completed.js"><reason></reason></test>
@@ -444,40 +438,17 @@
<test id="language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-function-declaration-with-function-declaration.js"><reason></reason></test>
<test id="language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-function-declaration-with-var.js"><reason></reason></test>
<test id="language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-var-with-function-declaration.js"><reason></reason></test>
<test id="language/computed-property-names/class/static/method-number.js"><reason></reason></test>
<test id="language/computed-property-names/class/static/method-string.js"><reason></reason></test>
<test id="language/computed-property-names/class/static/method-symbol.js"><reason></reason></test>
<test id="language/computed-property-names/object/accessor/getter-super.js"><reason></reason></test>
<test id="language/computed-property-names/object/accessor/setter-super.js"><reason></reason></test>
<test id="language/computed-property-names/object/method/super.js"><reason></reason></test>
<test id="language/default-parameters/function-length.js"><reason></reason></test>
<test id="language/expressions/arrow-function/ArrowFunction_restricted-properties.js"><reason></reason></test>
<test id="language/expressions/arrow-function/lexical-super-call-from-within-constructor.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/array-elem-init-fn-name-arrow.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/array-elem-init-fn-name-class.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/array-elem-init-fn-name-cover.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/array-elem-init-fn-name-fn.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/array-elem-init-fn-name-gen.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/array-rest-init.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-id-init-fn-name-arrow.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-id-init-fn-name-class.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-id-init-fn-name-cover.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-id-init-fn-name-fn.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-id-init-fn-name-gen.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-arrow.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-class.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-cover.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-fn.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-elem-init-fn-name-gen.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-elem-target-yield-expr.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-elem-target-yield-ident-valid.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-put-prop-ref.js"><reason></reason></test>
<test id="language/expressions/assignment/destructuring/obj-prop-put-prop-ref-no-get.js"><reason></reason></test>
<test id="language/expressions/assignment/fn-name-arrow.js"><reason></reason></test>
<test id="language/expressions/assignment/fn-name-class.js"><reason></reason></test>
<test id="language/expressions/assignment/fn-name-cover.js"><reason></reason></test>
<test id="language/expressions/assignment/fn-name-fn.js"><reason></reason></test>
<test id="language/expressions/assignment/fn-name-gen.js"><reason></reason></test>
<test id="language/expressions/assignment/S11.13.1_A5_T1.js"><reason></reason></test>
<test id="language/expressions/assignment/S11.13.1_A5_T2.js"><reason></reason></test>
<test id="language/expressions/assignment/S11.13.1_A5_T3.js"><reason></reason></test>
@@ -489,7 +460,6 @@
<test id="language/expressions/assignment/S11.13.1_A7_T1.js"><reason></reason></test>
<test id="language/expressions/assignment/S11.13.1_A7_T2.js"><reason></reason></test>
<test id="language/expressions/assignment/S11.13.1_A7_T3.js"><reason></reason></test>
<test id="language/expressions/class/name.js"><reason></reason></test>
<test id="language/expressions/compound-assignment/S11.13.2_A7.10_T4.js"><reason></reason></test>
<test id="language/expressions/compound-assignment/S11.13.2_A7.11_T4.js"><reason></reason></test>
<test id="language/expressions/compound-assignment/S11.13.2_A7.1_T4.js"><reason></reason></test>
@@ -502,29 +472,13 @@
<test id="language/expressions/compound-assignment/S11.13.2_A7.8_T4.js"><reason></reason></test>
<test id="language/expressions/compound-assignment/S11.13.2_A7.9_T4.js"><reason></reason></test>
<test id="language/expressions/equals/coerce-symbol-to-prim-return-prim.js"><reason></reason></test>
<test id="language/expressions/function/name.js"><reason></reason></test>
<test id="language/expressions/generators/has-instance.js"><reason></reason></test>
<test id="language/expressions/generators/implicit-name.js"><reason></reason></test>
<test id="language/expressions/generators/name.js"><reason></reason></test>
<test id="language/expressions/generators/no-name.js"><reason></reason></test>
<test id="language/expressions/generators/prototype-value.js"><reason></reason></test>
<test id="language/expressions/object/fn-name-accessor-get.js"><reason></reason></test>
<test id="language/expressions/object/fn-name-accessor-set.js"><reason></reason></test>
<test id="language/expressions/object/fn-name-arrow.js"><reason></reason></test>
<test id="language/expressions/object/fn-name-class.js"><reason></reason></test>
<test id="language/expressions/object/fn-name-cover.js"><reason></reason></test>
<test id="language/expressions/object/fn-name-fn.js"><reason></reason></test>
<test id="language/expressions/object/fn-name-gen.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/fn-name-fn.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/fn-name-gen.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/generator-invoke-ctor.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/generator-name-prop-string.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/generator-name-prop-symbol.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/generator-super-prop-body.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/generator-super-prop-param.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/name-invoke-ctor.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/name-name-prop-string.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/name-name-prop-symbol.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/name-prototype-prop.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/name-super-prop-body.js"><reason></reason></test>
<test id="language/expressions/object/method-definition/name-super-prop-param.js"><reason></reason></test>
@@ -579,11 +533,6 @@
<test id="language/object-literal/method.js"><reason></reason></test>
<test id="language/object-literal/setter.js"><reason></reason></test>
<test id="language/statements/class/definition/accessors.js"><reason></reason></test>
<test id="language/statements/class/definition/basics.js"><reason></reason></test>
<test id="language/statements/class/definition/fn-name-accessor-get.js"><reason></reason></test>
<test id="language/statements/class/definition/fn-name-accessor-set.js"><reason></reason></test>
<test id="language/statements/class/definition/fn-name-gen-method.js"><reason></reason></test>
<test id="language/statements/class/definition/fn-name-method.js"><reason></reason></test>
<test id="language/statements/class/definition/getters.js"><reason></reason></test>
<test id="language/statements/class/definition/methods.js"><reason></reason></test>
<test id="language/statements/class/definition/numeric-property-names.js"><reason></reason></test>
@@ -592,15 +541,9 @@
<test id="language/statements/class/definition/this-check-ordering.js"><reason></reason></test>
<test id="language/statements/class/name-binding/in-extends-expression-assigned.js"><reason></reason></test>
<test id="language/statements/class/name-binding/in-extends-expression.js"><reason></reason></test>
<test id="language/statements/class/name.js"><reason></reason></test>
<test id="language/statements/class/strict-mode/arguments-caller.js"><reason></reason></test>
<test id="language/statements/class/strict-mode/with.js"><reason></reason></test>
<test id="language/statements/class/syntax/early-errors/class-body-static-method-get-propname-prototype.js"><reason></reason></test>
<test id="language/statements/const/fn-name-arrow.js"><reason></reason></test>
<test id="language/statements/const/fn-name-class.js"><reason></reason></test>
<test id="language/statements/const/fn-name-cover.js"><reason></reason></test>
<test id="language/statements/const/fn-name-fn.js"><reason></reason></test>
<test id="language/statements/const/fn-name-gen.js"><reason></reason></test>
<test id="language/statements/continue/labeled-continue.js"><reason></reason></test>
<test id="language/statements/continue/nested-let-bound-for-loops-labeled-continue.js"><reason></reason></test>
<test id="language/statements/continue/simple-and-labeled.js"><reason></reason></test>
@@ -613,20 +556,8 @@
<test id="language/statements/for/S12.6.3_A9.1.js"><reason></reason></test>
<test id="language/statements/for/S12.6.3_A9.js"><reason></reason></test>
<test id="language/statements/function/13.2-30-s.js"><reason></reason></test>
<test id="language/statements/function/name.js"><reason></reason></test>
<test id="language/statements/generators/has-instance.js"><reason></reason></test>
<test id="language/statements/generators/name.js"><reason></reason></test>
<test id="language/statements/generators/prototype-value.js"><reason></reason></test>
<test id="language/statements/generators/restricted-properties.js"><reason></reason></test>
<test id="language/statements/let/fn-name-arrow.js"><reason></reason></test>
<test id="language/statements/let/fn-name-class.js"><reason></reason></test>
<test id="language/statements/let/fn-name-cover.js"><reason></reason></test>
<test id="language/statements/let/fn-name-fn.js"><reason></reason></test>
<test id="language/statements/let/fn-name-gen.js"><reason></reason></test>
<test id="language/statements/let/syntax/identifier-let-disallowed-as-boundname.js"><reason></reason></test>
<test id="language/statements/variable/fn-name-arrow.js"><reason></reason></test>
<test id="language/statements/variable/fn-name-class.js"><reason></reason></test>
<test id="language/statements/variable/fn-name-cover.js"><reason></reason></test>
<test id="language/statements/variable/fn-name-fn.js"><reason></reason></test>
<test id="language/statements/variable/fn-name-gen.js"><reason></reason></test>
</excludeList>
+1 -71
View File
@@ -195,79 +195,13 @@ static void test_exec_snapshot (uint32_t *snapshot_p, size_t snapshot_size, uint
int
main (void)
{
static uint32_t snapshot_buffer[SNAPSHOT_BUFFER_SIZE];
TEST_INIT ();
/* Dump / execute snapshot */
if (jerry_is_feature_enabled (JERRY_FEATURE_SNAPSHOT_SAVE)
&& jerry_is_feature_enabled (JERRY_FEATURE_SNAPSHOT_EXEC))
{
const jerry_char_t code_to_snapshot[] = "(function () { return 'string from snapshot'; }) ();";
jerry_init (JERRY_INIT_EMPTY);
jerry_value_t generate_result;
generate_result = jerry_generate_snapshot (NULL,
0,
code_to_snapshot,
sizeof (code_to_snapshot) - 1,
0,
snapshot_buffer,
SNAPSHOT_BUFFER_SIZE);
TEST_ASSERT (!jerry_value_is_error (generate_result)
&& jerry_value_is_number (generate_result));
size_t snapshot_size = (size_t) jerry_get_number_value (generate_result);
jerry_release_value (generate_result);
/* Check the snapshot data. Unused bytes should be filled with zeroes */
const uint8_t expected_data[] =
{
0x4A, 0x52, 0x52, 0x59, 0x2C, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x03, 0x00, 0x01, 0x00, 0x41, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x00,
0x2C, 0x00, 0xC9, 0x53, 0x00, 0x00, 0x00, 0x00,
0x03, 0x00, 0x01, 0x00, 0x41, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00,
0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x14, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x73, 0x6E,
0x61, 0x70, 0x73, 0x68, 0x6F, 0x74,
};
if (sizeof (expected_data) != snapshot_size || memcmp (expected_data, snapshot_buffer, sizeof (expected_data)))
{
printf ("Snapshot data has been changed, please update tests/unit-core/test-snapshot.c.\n");
printf ("-------------------------------------------------------------------------------\n");
printf (" const uint8_t expected_data[] =\n");
printf (" {");
for (unsigned int i = 0; i < snapshot_size; i++)
{
if ((i % 8) == 0)
{
printf ("\n ");
}
printf (" 0x%02X,", ((uint8_t *) snapshot_buffer)[i]);
}
printf ("\n };\n");
printf ("-------------------------------------------------------------------------------\n");
}
TEST_ASSERT (sizeof (expected_data) == snapshot_size);
TEST_ASSERT (0 == memcmp (expected_data, snapshot_buffer, sizeof (expected_data)));
jerry_cleanup ();
test_exec_snapshot (snapshot_buffer, snapshot_size, 0);
test_exec_snapshot (snapshot_buffer, snapshot_size, JERRY_SNAPSHOT_EXEC_COPY_DATA);
}
/* Static snapshot */
if (jerry_is_feature_enabled (JERRY_FEATURE_SNAPSHOT_SAVE)
&& jerry_is_feature_enabled (JERRY_FEATURE_SNAPSHOT_EXEC))
{
static uint32_t snapshot_buffer[SNAPSHOT_BUFFER_SIZE];
const jerry_char_t code_to_snapshot[] = TEST_STRING_LITERAL (
"function func(a, b, c) {"
" c = 'snapshot';"
@@ -417,10 +351,6 @@ main (void)
size_t snapshot_size = (size_t) jerry_get_number_value (generate_result);
jerry_release_value (generate_result);
/* In ES2015 we emit extra bytecode instructions to check global variable redeclaration. */
const size_t expected_size = (jerry_is_feature_enabled (JERRY_FEATURE_SYMBOL)) ? 132 : 124;
TEST_ASSERT (snapshot_size == expected_size);
const size_t lit_c_buf_sz = jerry_get_literals_from_snapshot (literal_snapshot_buffer,
snapshot_size,
literal_buffer_c,