Skip to content
forked from v8/v8

Commit

Permalink
[maglev] Fix default constructor instantiation
Browse files Browse the repository at this point in the history
The new.target may not be in the correct state for fast instantiation.

Bug: v8:7700, chromium:1465326
Change-Id: I09f92576c0b5573e902ae3b2210a7b5fdbd1e415
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4694007
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#89006}
  • Loading branch information
verwaest authored and V8 LUCI CQ committed Jul 18, 2023
1 parent 7f22404 commit ed93bef
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
12 changes: 11 additions & 1 deletion src/maglev/maglev-graph-builder.cc
Expand Up @@ -5347,6 +5347,14 @@ void MaglevGraphBuilder::VisitGetSuperConstructor() {
StoreRegister(iterator_.GetRegisterOperand(0), map_proto);
}

bool MaglevGraphBuilder::HasValidInitialMap(
compiler::JSFunctionRef new_target, compiler::JSFunctionRef constructor) {
if (!new_target.map(broker()).has_prototype_slot()) return false;
if (!new_target.has_initial_map(broker())) return false;
compiler::MapRef initial_map = new_target.initial_map(broker());
return initial_map.GetConstructor(broker()).equals(constructor);
}

void MaglevGraphBuilder::VisitFindNonDefaultConstructorOrConstruct() {
ValueNode* this_function = LoadRegisterTagged(0);
ValueNode* new_target = LoadRegisterTagged(1);
Expand Down Expand Up @@ -5380,7 +5388,9 @@ void MaglevGraphBuilder::VisitFindNonDefaultConstructorOrConstruct() {
TryGetConstant(new_target);
if (kind == FunctionKind::kDefaultBaseConstructor) {
ValueNode* object;
if (new_target_function && new_target_function->IsJSFunction()) {
if (new_target_function && new_target_function->IsJSFunction() &&
HasValidInitialMap(new_target_function->AsJSFunction(),
current_function)) {
object = BuildAllocateFastObject(
FastObject(new_target_function->AsJSFunction(), zone(),
broker()),
Expand Down
3 changes: 3 additions & 0 deletions src/maglev/maglev-graph-builder.h
Expand Up @@ -1884,6 +1884,9 @@ class MaglevGraphBuilder {
void MergeDeadLoopIntoFrameState(int target);
void MergeIntoInlinedReturnFrameState(BasicBlock* block);

bool HasValidInitialMap(compiler::JSFunctionRef new_target,
compiler::JSFunctionRef constructor);

enum JumpType { kJumpIfTrue, kJumpIfFalse };
enum class BranchSpecializationMode { kDefault, kAlwaysBoolean };
JumpType NegateJumpType(JumpType jump_type);
Expand Down
25 changes: 25 additions & 0 deletions test/mjsunit/maglev/regress/regress-crbug-1465326.js
@@ -0,0 +1,25 @@
// Copyright 2023 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: --maglev --allow-natives-syntax

class A {}

var x = Function;

class B extends A {
constructor() {
x = new.target;
super();
}
}
function construct() {
return Reflect.construct(B, [], Function);
}
%PrepareFunctionForOptimization(B);
construct();
construct();
%OptimizeMaglevOnNextCall(B);
var arr = construct();
console.log(arr.prototype);

0 comments on commit ed93bef

Please sign in to comment.