diff --git a/src/maglev/maglev-graph-builder.cc b/src/maglev/maglev-graph-builder.cc
index d5f6128..2c5227e 100644
--- a/src/maglev/maglev-graph-builder.cc
+++ b/src/maglev/maglev-graph-builder.cc
@@ -5347,6 +5347,14 @@
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);
@@ -5380,7 +5388,9 @@
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()),
diff --git a/src/maglev/maglev-graph-builder.h b/src/maglev/maglev-graph-builder.h
index 0abb4a8..d92354c 100644
--- a/src/maglev/maglev-graph-builder.h
+++ b/src/maglev/maglev-graph-builder.h
@@ -1884,6 +1884,9 @@
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);