Skip to content

Commit

Permalink
deps: V8: cherry-pick 8361fa58 from upstream
Browse files Browse the repository at this point in the history
Original commit message:
  [runtime] Fix derived class instantiation

  Bug: chromium:806388
  Change-Id: Ieb343f0d532c16b6102e85222b77713f23bacf8c
  Reviewed-on: https://chromium-review.googlesource.com/894942
  Reviewed-by: Igor Sheludko <[email protected]>
  Commit-Queue: Camillo Bruni <[email protected]>
  Cr-Commit-Position: refs/heads/master@{#50990}

PR-URL: #21294
Reviewed-By: Myles Borins <[email protected]>
  • Loading branch information
ofrobots authored and rvagg committed Aug 16, 2018
1 parent b1110b2 commit 9aeffab
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 9 deletions.
2 changes: 1 addition & 1 deletion deps/v8/include/v8-version.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#define V8_MAJOR_VERSION 6
#define V8_MINOR_VERSION 2
#define V8_BUILD_NUMBER 414
#define V8_PATCH_LEVEL 58
#define V8_PATCH_LEVEL 59

// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
Expand Down
27 changes: 20 additions & 7 deletions deps/v8/src/objects.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13056,14 +13056,19 @@ MaybeHandle<Map> JSFunction::GetDerivedMap(Isolate* isolate,
constructor_initial_map->unused_property_fields();
int instance_size;
int in_object_properties;
CalculateInstanceSizeForDerivedClass(function, instance_type,
embedder_fields, &instance_size,
&in_object_properties);
bool success = CalculateInstanceSizeForDerivedClass(
function, instance_type, embedder_fields, &instance_size,
&in_object_properties);

int unused_property_fields = in_object_properties - pre_allocated;
Handle<Map> map =
Map::CopyInitialMap(constructor_initial_map, instance_size,
in_object_properties, unused_property_fields);

Handle<Map> map;
if (success) {
map = Map::CopyInitialMap(constructor_initial_map, instance_size,
in_object_properties, unused_property_fields);
} else {
map = Map::CopyInitialMap(constructor_initial_map);
}
map->set_new_target_is_base(false);

JSFunction::SetInitialMap(function, map, prototype);
Expand Down Expand Up @@ -13789,12 +13794,14 @@ void JSFunction::CalculateInstanceSizeHelper(InstanceType instance_type,
requested_embedder_fields;
}

void JSFunction::CalculateInstanceSizeForDerivedClass(
// static
bool JSFunction::CalculateInstanceSizeForDerivedClass(
Handle<JSFunction> function, InstanceType instance_type,
int requested_embedder_fields, int* instance_size,
int* in_object_properties) {
Isolate* isolate = function->GetIsolate();
int expected_nof_properties = 0;
bool result = true;
for (PrototypeIterator iter(isolate, function, kStartAtReceiver);
!iter.IsAtEnd(); iter.Advance()) {
Handle<JSReceiver> current =
Expand All @@ -13808,6 +13815,11 @@ void JSFunction::CalculateInstanceSizeForDerivedClass(
Compiler::Compile(func, Compiler::CLEAR_EXCEPTION)) {
DCHECK(shared->is_compiled());
expected_nof_properties += shared->expected_nof_properties();
} else if (!shared->is_compiled()) {
// In case there was a compilation error for the constructor we will
// throw an error during instantiation. Hence we directly return 0;
result = false;
break;
}
if (!IsDerivedConstructor(shared->kind())) {
break;
Expand All @@ -13816,6 +13828,7 @@ void JSFunction::CalculateInstanceSizeForDerivedClass(
CalculateInstanceSizeHelper(instance_type, requested_embedder_fields,
expected_nof_properties, instance_size,
in_object_properties);
return result;
}


Expand Down
2 changes: 1 addition & 1 deletion deps/v8/src/objects.h
Original file line number Diff line number Diff line change
Expand Up @@ -5003,7 +5003,7 @@ class JSFunction: public JSObject {
DECL_CAST(JSFunction)

// Calculate the instance size and in-object properties count.
static void CalculateInstanceSizeForDerivedClass(
static bool CalculateInstanceSizeForDerivedClass(
Handle<JSFunction> function, InstanceType instance_type,
int requested_embedder_fields, int* instance_size,
int* in_object_properties);
Expand Down
20 changes: 20 additions & 0 deletions deps/v8/test/mjsunit/regress/regress-crbug-806388.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright 2018 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.

// Flags: --allow-natives-syntax --enable-slow-asserts --expose-gc

class Derived extends Array {
constructor(a) {
// Syntax Error.
const a = 1;
}
}

// Derived is not a subclass of RegExp
let o = Reflect.construct(RegExp, [], Derived);
o.lastIndex = 0x1234;
%HeapObjectVerify(o);

gc();
%HeapObjectVerify(o);

0 comments on commit 9aeffab

Please sign in to comment.