Index: src/mips64/builtins-mips64.cc |
diff --git a/src/mips64/builtins-mips64.cc b/src/mips64/builtins-mips64.cc |
index 59b5e228d65c3475b31cfddc1065c5d32c24e250..97174eed860569c767ae1526b75822856a9f502b 100644 |
--- a/src/mips64/builtins-mips64.cc |
+++ b/src/mips64/builtins-mips64.cc |
@@ -1752,8 +1752,14 @@ void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { |
// the JSFunction on which new was invoked initially) |
// ----------------------------------- |
- // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. |
- __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); |
+ // Call into the Runtime for Proxy [[Construct]]. |
+ __ Push(a1); |
+ __ Push(a3); |
+ // Include the pushed new_target, constructor and the receiver. |
+ __ Daddu(a0, a0, 3); |
+ // Tail-call to the runtime. |
+ __ JumpToExternalReference( |
+ ExternalReference(Runtime::kJSProxyConstruct, masm->isolate())); |
} |
@@ -1775,14 +1781,16 @@ void Builtins::Generate_Construct(MacroAssembler* masm) { |
__ lbu(t2, FieldMemOperand(t1, Map::kInstanceTypeOffset)); |
__ Jump(masm->isolate()->builtins()->ConstructFunction(), |
RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE)); |
- __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, |
- eq, t2, Operand(JS_PROXY_TYPE)); |
// Check if target has a [[Construct]] internal method. |
__ lbu(t2, FieldMemOperand(t1, Map::kBitFieldOffset)); |
__ And(t2, t2, Operand(1 << Map::kIsCallable)); |
__ Branch(&non_constructor, eq, t2, Operand(zero_reg)); |
+ // Only dispatch to proxies after checking whether they are constructors. |
+ __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, |
+ eq, t2, Operand(JS_PROXY_TYPE)); |
+ |
// Called Construct on an exotic Object with a [[Construct]] internal method. |
{ |
// Overwrite the original receiver with the (original) target. |