v8/test/mjsunit/harmony
Sathya Gunasekaran 4ca9d843f8 [class] Store class fields initializer on the constructor
Previously, the class fields initializer function was stored on a
synthetic context allocated variable. This approach had sevaral
problems:

- We didn't know that class literal had fields until after we had
completely parsed the class literal. This meant that we had to go back
and fix up the scope of the constructor to have this synthetic
variable. This resulted in mismatch between parser and preparsed scope
data.

- This synthetic variable could potentially resolve to an initializer
of an outer class.

For ex:
class X extends Object {
  c = 1;
  constructor() {
    var t = () => {
      class P extends Object {
        constructor() {
          var t = () => { super(); };
          t();
        }
      }
      super();
    }
    t();
  }
}

In this the inner class P could access the outer class X's initiliazer
function. We would have to maintain extra metadata to make sure this
doesn't happen.

Instead this new approach uses a private symbol to store the
initializer function on the class constructor itself.

For the base constructor case, we can simply check for a bit on the
constructor function literal to see if we need to emit code that loads
and calls this initializer function. Therefore, we don't pay the cost
of loading this function in case there are no class fields.

For the derived constructor case, there are two possiblities:
(a) We are in a super() call directly in the derived constructor:

In this case we can do a check similar to the base constructor check,
we can check for a bit on the derived constructor and emit code for
loading and calling the initializer function.

This is usually the common case and we don't pay any cost for not using
class fields.

(b) We are in a super() call inside an arrow function in the derived
constructor:

In this case, we /always/ emit code to load and call the initializer
function. If the function doesn't exist then we have undefined and we
don't call anything. Otherwise we call the function.

super() can't be called twice so even if we emit code to load and call
the initializer function multiple times, it doesn't matter because it
would have already been an error.

Bug: v8:5367
Change-Id: I7f77cd6493ff84cf0e430a8c1039bc9ac6941a88
Reviewed-on: https://chromium-review.googlesource.com/781660
Commit-Queue: Sathya Gunasekaran <gsathya@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Reviewed-by: Mythri Alle <mythria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49628}
2017-11-27 10:35:11 +00:00
..
bigint [bigint] Fix accidental input modification in Divide 2017-11-17 01:50:50 +00:00
regress [esnext] fix MaterializeCapturedObjectAt for async generator objects 2017-10-10 11:18:10 +00:00
array-concat-array-proto-getter.js [runtime] Avoid @@isConcatSpreadable lookup for fast path Array.prototype.concat 2016-05-12 08:52:36 +00:00
array-concat-array-proto.js [runtime] Avoid @@isConcatSpreadable lookup for fast path Array.prototype.concat 2016-05-12 08:52:36 +00:00
array-concat-object-proto-dict-getter.js [runtime] Avoid @@isConcatSpreadable lookup for fast path Array.prototype.concat 2016-05-12 08:52:36 +00:00
array-concat-object-proto-dict.js [runtime] Avoid @@isConcatSpreadable lookup for fast path Array.prototype.concat 2016-05-12 08:52:36 +00:00
array-concat-object-proto-generic-dict.js [runtime] Avoid @@isConcatSpreadable lookup for fast path Array.prototype.concat 2016-05-12 08:52:36 +00:00
array-concat-object-proto.js [runtime] Avoid @@isConcatSpreadable lookup for fast path Array.prototype.concat 2016-05-12 08:52:36 +00:00
array-sort-comparefn.js [js] Remove CHECK_OBJECT_COERCIBLE for Array methods 2017-10-20 19:29:36 +00:00
async-for-of-non-iterable.js [parser] Improve error message for destructuring non iterable 2017-07-06 19:57:44 +00:00
async-from-sync-iterator.js Reland "[runtime] Make all built-in functions strict." 2017-06-27 15:26:10 +00:00
async-generators-basic.js [async-iteration] implement spec update for yield* in async generators 2017-04-13 14:32:30 +00:00
async-generators-resume-return.js Reland "[async-iteration] implement spec-change to yield in async generators" 2017-08-01 18:39:26 +00:00
async-generators-return.js Reland "[async-iteration] implement spec-change to yield in async generators" 2017-08-01 18:39:26 +00:00
async-generators-yield.js Reland "[async-iteration] implement spec-change to yield in async generators" 2017-08-01 18:39:26 +00:00
atomics-value-check.js [Atomics] use TFJ builtins for atomic add, sub, and, or, and xor 2017-04-11 00:09:37 +00:00
atomics.js [SAB] Validate index before value conversion using ToIndex 2017-04-12 19:08:40 +00:00
block-lazy-compile.js Preliminary code for block scopes and block contexts. 2011-08-11 16:29:28 +00:00
dataview-accessors.js Reland of Amend DataView, ArrayBuffer, and TypedArray methods to use ToIndex. (patchset #2 id:170001 of https://codereview.chromium.org/2113593002/ ) 2016-08-17 17:38:56 +00:00
default-parameter-do-expression.js Merge DeclarationScope::temps_ and Scope::ordered_variables_ into Scope::locals_ 2016-08-25 19:12:00 +00:00
do-expressions-arrow-param-scope.js Add test coverage for do-expressions in ReparentExpressionScope() 2017-08-03 16:07:41 +00:00
do-expressions-control.js [fullcodegen] Implement control flow across do-expressions. 2016-02-24 11:06:08 +00:00
do-expressions.js [fullcodegen] Remove --stress-fullcodegen flag. 2017-08-10 09:52:49 +00:00
for-await-of.js [async-iteration] add support for for-await-of loops in Async Functions 2017-02-15 19:39:06 +00:00
function-sent.js Fix behavior of return on yield*. 2016-06-28 07:10:54 +00:00
function-tostring.js Implement new Function.prototype.toString --harmony-function-tostring 2017-02-16 20:19:24 +00:00
futex.js Fix Check failure on OOB access in Atomics.wait 2017-05-31 15:08:52 +00:00
generators-reduced.js This is a first step towards reducing the number of stores/loads when suspending/resuming a generator. 2017-06-02 11:55:48 +00:00
generators.js Remove the --ignition-generators flag. 2016-07-25 12:56:27 +00:00
harmony-string-pad-end.js [builtins] Port String.prototype.{padStart, padEnd} to CSA 2017-10-16 14:19:19 +00:00
harmony-string-pad-start.js [builtins] Port String.prototype.{padStart, padEnd} to CSA 2017-10-16 14:19:19 +00:00
import-from-compilation-errored.js [modules] Implement the new semantics of instantiation and evaluation. 2017-06-28 14:24:37 +00:00
import-from-evaluation-errored.js [modules] Implement the new semantics of instantiation and evaluation. 2017-06-28 14:24:37 +00:00
import-from-fetch-errored.js [modules] Implement the new semantics of instantiation and evaluation. 2017-06-28 14:24:37 +00:00
import-from-instantiation-errored.js [modules] Implement the new semantics of instantiation and evaluation. 2017-06-28 14:24:37 +00:00
intl-numberformat-formattoparts.js [intl] Implement Intl.NumberFormat.prototype.formatToParts 2017-06-30 20:14:18 +00:00
intl-pluralrules-select.js [intl] Implement Intl.PluralRules behind --harmony-plural-rules 2017-08-21 22:23:59 +00:00
module-parsing-eval.js Remove --harmony-modules flag and let embedder decide when modules are used 2016-03-15 00:45:00 +00:00
modules-import-1.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-2.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-3.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-4.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-5.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-6.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-7.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-8.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-9.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-10.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-11.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-12.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-13.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-14.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-15.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-import-16.js [modules] Fix dynamic import in eval 2017-08-14 23:21:49 +00:00
modules-import-large.js [modules] Turbofan inlining support for namespace accesses 2017-09-05 20:11:09 +00:00
modules-import-meta.js [modules] Fix lazy parsing of functions in modules. 2017-10-22 09:03:34 +00:00
modules-skip-1.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-2.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-3.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-4.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-5.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-6.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-7.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-8.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-9.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-10.js [modules] Implement the new semantics of instantiation and evaluation. 2017-06-28 14:24:37 +00:00
modules-skip-11.js [modules] Implement the new semantics of instantiation and evaluation. 2017-06-28 14:24:37 +00:00
modules-skip-12.js [modules] Implement the new semantics of instantiation and evaluation. 2017-06-28 14:24:37 +00:00
modules-skip-empty.js [ESNext] Implement DynamicImportCall 2017-04-11 09:33:11 +00:00
modules-skip-export-import-meta.js Reland "[modules] Implement import.meta proposal" 2017-10-11 15:37:10 +00:00
modules-skip-large1.js [modules] Turbofan inlining support for namespace accesses 2017-09-05 20:11:09 +00:00
modules-skip-large2.js [modules] Turbofan inlining support for namespace accesses 2017-09-05 20:11:09 +00:00
private-symbols.js [builtins] Port Proxy has trap to CSA 2017-08-16 13:05:45 +00:00
private.js [runtime] PreventExtensionsWithTransition: before adding the new 2017-06-22 12:19:26 +00:00
promise-prototype-finally.js [ESNext] Update Promise.prototype.finally to match latest spec 2017-09-07 17:56:21 +00:00
public-instance-class-fields.js [class] Store class fields initializer on the constructor 2017-11-27 10:35:11 +00:00
public-static-class-fields.js [class] Use CreateDataProperty runtime call 2017-11-08 20:27:00 +00:00
regexp-change-exec.js Remove all harmony runtime flags which shipped in M51 2016-06-24 01:13:10 +00:00
regexp-dotall.js Ship RegExp dotAll mode / s flag 2017-07-28 08:17:38 +00:00
regexp-named-captures.js Remove always-on flags for RegExp dotAll and lookbehind 2017-11-17 16:47:19 +00:00
regexp-property-binary.js [regexp] Support Regional_Indicator property class 2017-11-09 07:52:35 +00:00
regexp-property-char-class.js [regexp] Throw for patterns like /[\p{...}-\p{...}]/u. 2017-07-25 08:25:43 +00:00
regexp-property-disabled.js Remove all harmony runtime flags which shipped in M51 2016-06-24 01:13:10 +00:00
regexp-property-enumerated.js [regexp] implement latest spec draft for property class. 2016-11-18 06:10:14 +00:00
regexp-property-exact-match.js [regexp] implement latest spec draft for property class. 2016-11-18 06:10:14 +00:00
regexp-property-general-category.js [regexp] implement latest spec draft for property class. 2016-11-18 06:10:14 +00:00
regexp-property-invalid.js [regexp] implement latest spec draft for property class. 2016-11-18 06:10:14 +00:00
regexp-property-lu-ui0.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui1.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui2.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui3.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui4.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui5.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui6.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui7.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui8.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui9.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-lu-ui.js [mjsunit] Split up long RegExp tests 2017-11-22 13:38:52 +00:00
regexp-property-script-extensions.js [regexp] implement latest spec draft for property class. 2016-11-18 06:10:14 +00:00
regexp-property-scripts.js Remove all harmony runtime flags which shipped in M51 2016-06-24 01:13:10 +00:00
regexp-property-special.js [regexp] remove \p{Other_ID_Start} and \p{Other_ID_Continue} 2017-04-11 12:40:41 +00:00
regress-generators-resume.js This is a first step towards reducing the number of stores/loads when suspending/resuming a generator. 2017-06-02 11:55:48 +00:00
set-prototype-of.js Fix corner-case behavior of JSObject::SetPrototype. 2015-10-23 14:52:26 +00:00
sharedarraybuffer.js [SAB] Fix {newtarget-prototype-is-not-object,proto-from-ctor-realm} tests 2017-04-08 20:13:45 +00:00
symbol-async-iterator.js [async-iteration] expose Symbol.asyncIterator behind flag --harmony-async-iteration 2017-01-20 00:42:09 +00:00
template-escapes.js [parser] Correctly handle invalid escapes in adjacent template tokens. 2017-03-03 22:08:57 +00:00
to-length.js [runtime] Implement %_ToLength via ToLengthStub. 2015-10-19 08:35:18 +00:00
to-name.js [intrinsics] Remove obsolete intrinsics. 2016-07-12 06:41:23 +00:00
to-number.js [es6] Implement Date.prototype[@@toPrimitive] as C++ builtin. 2015-08-31 12:53:10 +00:00
to-primitive.js [intrinsics] Remove obsolete intrinsics. 2016-07-12 06:41:23 +00:00
to-string.js [intrinsics] Remove obsolete intrinsics. 2016-07-12 06:41:23 +00:00
trailing-commas-length.js [cleanup] Remove on-by-default --harmony-trailing-commas flag 2017-06-13 00:09:23 +00:00