Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index 688f4c1a29d8ae961e7bf50c223b2f40ba27b6fb..047b190a8e8b99e6e3065cd1f876dbd4b2de8f9b 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -2896,6 +2896,13 @@ Node* CodeStubAssembler::IsCallableMap(Node* map) { |
Int32Constant(0)); |
} |
+Node* CodeStubAssembler::IsConstructorMap(Node* map) { |
+ CSA_ASSERT(this, IsMap(map)); |
+ return Word32NotEqual( |
+ Word32And(LoadMapBitField(map), Int32Constant(1 << Map::kIsConstructor)), |
+ Int32Constant(0)); |
+} |
+ |
Node* CodeStubAssembler::IsSpecialReceiverInstanceType(Node* instance_type) { |
STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE); |
return Int32LessThanOrEqual(instance_type, |
@@ -2992,6 +2999,10 @@ Node* CodeStubAssembler::IsUnseededNumberDictionary(Node* object) { |
LoadRoot(Heap::kUnseededNumberDictionaryMapRootIndex)); |
} |
+Node* CodeStubAssembler::IsJSFunction(Node* object) { |
+ return HasInstanceType(object, JS_FUNCTION_TYPE); |
+} |
+ |
Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) { |
CSA_ASSERT(this, IsString(string)); |
// Translate the {index} into a Word. |
@@ -7846,6 +7857,32 @@ Node* CodeStubAssembler::Typeof(Node* value, Node* context) { |
return result_var.value(); |
} |
+Node* CodeStubAssembler::GetSuperConstructor(Node* active_function, |
+ Node* context) { |
+ CSA_ASSERT(this, IsJSFunction(active_function)); |
+ |
+ Label is_not_constructor(this, Label::kDeferred), out(this); |
+ Variable result(this, MachineRepresentation::kTagged); |
+ |
+ Node* map = LoadMap(active_function); |
+ Node* prototype = LoadMapPrototype(map); |
+ Node* prototype_map = LoadMap(prototype); |
+ GotoUnless(IsConstructorMap(prototype_map), &is_not_constructor); |
+ |
+ result.Bind(prototype); |
+ Goto(&out); |
+ |
+ Bind(&is_not_constructor); |
+ { |
+ result.Bind(CallRuntime(Runtime::kThrowNotSuperConstructor, context, |
+ prototype, active_function)); |
+ Goto(&out); |
+ } |
+ |
+ Bind(&out); |
+ return result.value(); |
+} |
+ |
Node* CodeStubAssembler::InstanceOf(Node* object, Node* callable, |
Node* context) { |
Label return_runtime(this, Label::kDeferred), end(this); |