v8/test
Benedikt Meurer 4b9eb7f711 [runtime] Better instance pre-sizing with transpiled classes.
For instances created via constructors and `new` we try to pre-size
the instances such that ideally all the data properties can be
allocated as in-object properties (and we don't need to allocate the
out-of-object PropertyArray backing store). This is accomplished with
the helper of the Parser, which counts the property assignments to
`this` in the constructor, and we use that as the starting point for
pre-sizing logic (a mechanism called *slack tracking* is used to
dynamically shrink the objects based on the real memory usage, and
eventually compute the final starting size for instances of the
individual constructors).

This works well even with class hierarchies, since for a derived class
constructor we just include the current constructor plus all the base
constructors. I.e. with

```js
class A {
  constructor() {
    this.x00 = null;
    this.x01 = null;
    this.x02 = null;
    this.x03 = null;
    this.x04 = null;
    this.x05 = null;
    this.x06 = null;
    this.x07 = null;
    this.x08 = null;
    this.x09 = null;
    this.x10 = null;
    this.x11 = null;
    this.x12 = null;
    this.x13 = null;
    this.x14 = null;
    this.x15 = null;
    this.x16 = null;
    this.x17 = null;
    this.x18 = null;
    this.x19 = null;
  }
}

class B extends A {
  constructor() {
    super();
  }
}
```

we will eventually learn that instances of `B` need 20 in-object
properties. However this breaks with transpiled code (i.e. as
generated via TypeScript or Babel), even when the constructors are
properly chained.

```js
function A() {
  this.x00 = null;
  this.x01 = null;
  this.x02 = null;
  this.x03 = null;
  this.x04 = null;
  this.x05 = null;
  this.x06 = null;
  this.x07 = null;
  this.x08 = null;
  this.x09 = null;
  this.x10 = null;
  this.x11 = null;
  this.x12 = null;
  this.x13 = null;
  this.x14 = null;
  this.x15 = null;
  this.x16 = null;
  this.x17 = null;
  this.x18 = null;
  this.x19 = null;
}

function B() {
  A.call(this);
}
Object.setPrototypeOf(B, A);
```

Here we will always have 10 in-object properties for instances of
`B` (due to the generic over-allocation logic), and the other 10
properties have to be allocated in the out-of-object PropertyArray.

This is unfortunate and actually not necessary. Instead we could just
do the same [[Prototype]] walk on the constructor for regular function
constructors that we perform for derived (native) class constructors.
This CL changes that, such that we give the same treatment to transpiled
class that we have for native classes.

R=verwaest@chromium.org

Bug: v8:8764, v8:8765
Doc: https://bit.ly/v8-instance-presizing-with-transpiled-classes
Change-Id: Iac54391e41c9a39101751a678b3a647269fb009d
Reviewed-on: https://chromium-review.googlesource.com/c/1442643
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59214}
2019-01-30 15:20:24 +00:00
..
benchmarks [Test] CSuite benchmark runner 2018-12-21 13:15:57 +00:00
cctest [runtime] Better instance pre-sizing with transpiled classes. 2019-01-30 15:20:24 +00:00
common Move CodeDesc to dedicated file 2019-01-30 14:08:59 +00:00
debugger [parser] Don't create proxies for vars without initialisers 2019-01-28 15:54:40 +00:00
fuzzer [wasm] Move Isolate management to WasmEngine 2019-01-25 11:19:54 +00:00
inspector [parser] Allow declaring variables without a proxy 2019-01-25 09:10:59 +00:00
intl [Intl] Skip regress-7770 on Android 2019-01-30 06:22:10 +00:00
js-perf-test [test] add performance tests for String#startsWith 2019-01-17 08:23:06 +00:00
memory [snapshot] Remove the builtins snapshot 2018-10-31 10:18:28 +00:00
message [js weak refs] Update to new API 2019-01-30 13:47:18 +00:00
mjsunit [wasm] js module-builder and constants improvements 2019-01-30 15:18:44 +00:00
mkgrokdump [nojit] Don't allocate executable memory in jitless mode 2019-01-10 10:55:48 +00:00
mozilla Revert "[runtime] Reduce spread/apply call max arguments" 2018-11-30 09:54:47 +00:00
preparser [test] Share resource-fetching logic with all d8 test cases 2018-08-29 17:51:43 +00:00
test262 [parser] Allow try {} catch (e) { for (var e of x) {} } 2019-01-30 14:20:58 +00:00
torque Reland "[torque] Implement safe initialization of classes through hidden structs" 2019-01-22 17:49:39 +00:00
unittests [heap] Refactor usages of the InNewSpace() predicate 2019-01-29 09:34:26 +00:00
wasm-js [wasm] fix js-api module/customSection 2019-01-29 20:05:10 +00:00
wasm-spec-tests [wasm] Update core wasm spec tests 2019-01-29 11:58:25 +00:00
webkit [json] Extend JSON#stringify error message for circular structures 2019-01-29 08:00:10 +00:00
BUILD.gn Reland "[wasm] Add a new wasm-js testsuite to run js-api tests" 2018-10-18 20:18:55 +00:00