v8/test/mjsunit/reindexing-in-classes.js
Leszek Swirski 1e37ca26cc [parser] Fix reindexing of functions inside classes
A class's fields can appear twice in the class AST, via the properties
array and the synthetised initializer method. This means that the
reindexer can end up visiting the same function literal twice, since the
T in AST is no longer a T but rather a DAG.

Now, we special case the class visitor in the reindexer to avoid these
double visits where appropriate. We know what kinds of fields can be
double visisted, so we don't need a visited set, but we now also have
one for debug builds to verify that each function is visited exactly
once.

Bug: chromium:974627
Change-Id: Ib531becc6e3f3c73f420b5fb49790fe4a2022d65
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1667003
Reviewed-by: Sathya Gunasekaran <gsathya@chromium.org>
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/master@{#62282}
2019-06-19 11:27:55 +00:00

73 lines
2.1 KiB
JavaScript

// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Test the reindexer visiting classes, avoiding repeat visits of the same
// function.
//
// For each test, create function literals inside a class, where the functions
// have to be reindexed due to the whole thing being inside an arrow head scope.
((arg = (function wrapper() {
// Class with field that has computed property name with a function in the
// computation.
class g {
[{b: function in_computed_field_name() {}}]
}
})) => {})();
((arg = (function wrapper() {
// Class with initialized field that has computed property name with a
// function in the computation.
class g {
[{b: function in_computed_field_name_with_init() {}}] = ""
}
})) => {})();
((arg = (function wrapper() {
// Class with initialized field that has literal property name with a function
// in the initializer value.
class g {
b = (function in_init_value_of_field(){})()
}
})) => {})();
((arg = (function wrapper() {
// Class with initialized field that has private property name with a function
// in the initializer value.
class g {
#b = (function in_init_value_of_private_field(){})()
}
})) => {})();
((arg = (function wrapper() {
// Class with initialized field that has computed property name with a
// function in the initializer value.
class g {
["b"] = (function in_init_value_of_computed_field_name(){})()
}
})) => {})();
((arg = (function wrapper() {
// Class with method that has computed property name with a function in the
// computation.
class g {
[{b: function in_computed_method_name() {}}] () {}
}
})) => {})();
((arg = (function wrapper() {
// Class with method that has an argument with a default function init.
class g {
b(arg = function in_method_arg_default_init() {}) {}
}
})) => {})();
((arg = (function wrapper() {
// Class with method that has a computed property name and an argument with a
// default function init.
class g {
["b"] (arg = function in_computed_method_arg_default_init() {}) {}
}
})) => {})();