| 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);
|
|
|