[runtime] [proxy] removing JSFunctionProxy and related code.

BUG=v8:1543
LOG=N

Review URL: https://codereview.chromium.org/1496503002

Cr-Commit-Position: refs/heads/master@{#32616}
This commit is contained in:
cbruni 2015-12-04 05:49:08 -08:00 committed by Commit bot
parent eb9407c6f5
commit 747f455b07
45 changed files with 122 additions and 382 deletions

View File

@ -7093,7 +7093,7 @@ class Internals {
static const int kNodeIsPartiallyDependentShift = 4; static const int kNodeIsPartiallyDependentShift = 4;
static const int kNodeIsActiveShift = 4; static const int kNodeIsActiveShift = 4;
static const int kJSObjectType = 0xb8; static const int kJSObjectType = 0xb7;
static const int kFirstNonstringType = 0x80; static const int kFirstNonstringType = 0x80;
static const int kOddballType = 0x83; static const int kOddballType = 0x83;
static const int kForeignType = 0x87; static const int kForeignType = 0x87;

View File

@ -1682,14 +1682,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ CompareObjectType(r1, r4, r5, JS_FUNCTION_TYPE); __ CompareObjectType(r1, r4, r5, JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->CallFunction(mode), __ Jump(masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET, eq); RelocInfo::CODE_TARGET, eq);
__ cmp(r5, Operand(JS_FUNCTION_PROXY_TYPE)); __ cmp(r5, Operand(JS_PROXY_TYPE));
__ b(ne, &non_function); __ b(ne, &non_function);
// 1. Call to function proxy. // 1. Call to Proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): Implement [[Call]] on proxies.
__ ldr(r1, FieldMemOperand(r1, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(r1);
__ b(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1741,13 +1738,12 @@ void Builtins::Generate_ConstructFunction(MacroAssembler* masm) {
void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- r0 : the number of arguments (not including the receiver) // -- r0 : the number of arguments (not including the receiver)
// -- r1 : the constructor to call (checked to be a JSFunctionProxy) // -- r1 : the constructor to call (checked to be a JSProxy)
// -- r3 : the new target (either the same as the constructor or // -- r3 : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ ldr(r1, FieldMemOperand(r1, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1769,7 +1765,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ CompareObjectType(r1, r4, r5, JS_FUNCTION_TYPE); __ CompareObjectType(r1, r4, r5, JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->ConstructFunction(), __ Jump(masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET, eq); RelocInfo::CODE_TARGET, eq);
__ cmp(r5, Operand(JS_FUNCTION_PROXY_TYPE)); __ cmp(r5, Operand(JS_PROXY_TYPE));
__ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET,
eq); eq);

View File

@ -1674,14 +1674,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ CompareObjectType(x1, x4, x5, JS_FUNCTION_TYPE); __ CompareObjectType(x1, x4, x5, JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->CallFunction(mode), __ Jump(masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET, eq); RelocInfo::CODE_TARGET, eq);
__ Cmp(x5, JS_FUNCTION_PROXY_TYPE); __ Cmp(x5, JS_PROXY_TYPE);
__ B(ne, &non_function); __ B(ne, &non_function);
// 1. Call to function proxy. // 1. Call to proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies.
__ Ldr(x1, FieldMemOperand(x1, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(x1);
__ B(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1733,13 +1730,12 @@ void Builtins::Generate_ConstructFunction(MacroAssembler* masm) {
void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- x0 : the number of arguments (not including the receiver) // -- x0 : the number of arguments (not including the receiver)
// -- x1 : the constructor to call (checked to be a JSFunctionProxy) // -- x1 : the constructor to call (checked to be a JSProxy)
// -- x3 : the new target (either the same as the constructor or // -- x3 : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ Ldr(x1, FieldMemOperand(x1, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1761,7 +1757,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ CompareObjectType(x1, x4, x5, JS_FUNCTION_TYPE); __ CompareObjectType(x1, x4, x5, JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->ConstructFunction(), __ Jump(masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET, eq); RelocInfo::CODE_TARGET, eq);
__ Cmp(x5, JS_FUNCTION_PROXY_TYPE); __ Cmp(x5, JS_PROXY_TYPE);
__ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET,
eq); eq);

View File

@ -724,10 +724,9 @@ void JSGenericLowering::LowerJSForInPrepare(Node* node) {
jsgraph()->IntPtrConstant(Map::kInstanceTypeOffset - kHeapObjectTag), jsgraph()->IntPtrConstant(Map::kInstanceTypeOffset - kHeapObjectTag),
effect, if_false0); effect, if_false0);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); Node* check1 =
Node* check1 = graph()->NewNode( graph()->NewNode(machine()->Word32Equal(), object_instance_type,
machine()->Uint32LessThanOrEqual(), object_instance_type, jsgraph()->Uint32Constant(JS_PROXY_TYPE));
jsgraph()->Uint32Constant(LAST_JS_PROXY_TYPE));
Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kFalse), Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
check1, if_false0); check1, if_false0);

View File

@ -2137,12 +2137,10 @@ Reduction JSTypedLowering::ReduceJSForInPrepare(Node* node) {
simplified()->LoadField(AccessBuilder::ForMapInstanceType()), simplified()->LoadField(AccessBuilder::ForMapInstanceType()),
receiver_map, effect, if_false0); receiver_map, effect, if_false0);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
cache_type_false0 = graph()->NewNode( cache_type_false0 = graph()->NewNode(
common()->Select(kMachAnyTagged, BranchHint::kFalse), common()->Select(kMachAnyTagged, BranchHint::kFalse),
graph()->NewNode(machine()->Uint32LessThanOrEqual(), graph()->NewNode(machine()->Word32Equal(), receiver_instance_type,
receiver_instance_type, jsgraph()->Uint32Constant(JS_PROXY_TYPE)),
jsgraph()->Uint32Constant(LAST_JS_PROXY_TYPE)),
jsgraph()->ZeroConstant(), // Zero indicagtes proxy. jsgraph()->ZeroConstant(), // Zero indicagtes proxy.
jsgraph()->OneConstant()); // One means slow check. jsgraph()->OneConstant()); // One means slow check.

View File

@ -5498,8 +5498,8 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
__ SmiTst(r0); __ SmiTst(r0);
DeoptimizeIf(eq, instr, Deoptimizer::kSmi); DeoptimizeIf(eq, instr, Deoptimizer::kSmi);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CompareObjectType(r0, r1, r1, LAST_JS_PROXY_TYPE); __ CompareObjectType(r0, r1, r1, JS_PROXY_TYPE);
DeoptimizeIf(le, instr, Deoptimizer::kWrongInstanceType); DeoptimizeIf(le, instr, Deoptimizer::kWrongInstanceType);
Label use_cache, call_runtime; Label use_cache, call_runtime;

View File

@ -2770,8 +2770,8 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
DeoptimizeIfSmi(object, instr, Deoptimizer::kSmi); DeoptimizeIfSmi(object, instr, Deoptimizer::kSmi);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CompareObjectType(object, x1, x1, LAST_JS_PROXY_TYPE); __ CompareObjectType(object, x1, x1, JS_PROXY_TYPE);
DeoptimizeIf(le, instr, Deoptimizer::kNotAJavaScriptObject); DeoptimizeIf(le, instr, Deoptimizer::kNotAJavaScriptObject);
Label use_cache, call_runtime; Label use_cache, call_runtime;

View File

@ -12314,10 +12314,7 @@ void HOptimizedGraphBuilder::GenerateIsJSProxy(CallRuntime* call) {
HValue* instance_type = HValue* instance_type =
Add<HLoadNamedField>(map, nullptr, HObjectAccess::ForMapInstanceType()); Add<HLoadNamedField>(map, nullptr, HObjectAccess::ForMapInstanceType());
if_proxy.If<HCompareNumericAndBranch>( if_proxy.If<HCompareNumericAndBranch>(
instance_type, Add<HConstant>(FIRST_JS_PROXY_TYPE), Token::GTE); instance_type, Add<HConstant>(JS_PROXY_TYPE), Token::EQ);
if_proxy.And();
if_proxy.If<HCompareNumericAndBranch>(
instance_type, Add<HConstant>(LAST_JS_PROXY_TYPE), Token::LTE);
if_proxy.CaptureContinuation(&continuation); if_proxy.CaptureContinuation(&continuation);
return ast_context()->ReturnContinuation(&continuation, call->id()); return ast_context()->ReturnContinuation(&continuation, call->id());

View File

@ -5373,8 +5373,8 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
__ test(eax, Immediate(kSmiTagMask)); __ test(eax, Immediate(kSmiTagMask));
DeoptimizeIf(zero, instr, Deoptimizer::kSmi); DeoptimizeIf(zero, instr, Deoptimizer::kSmi);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CmpObjectType(eax, LAST_JS_PROXY_TYPE, ecx); __ CmpObjectType(eax, JS_PROXY_TYPE, ecx);
DeoptimizeIf(below_equal, instr, Deoptimizer::kWrongInstanceType); DeoptimizeIf(below_equal, instr, Deoptimizer::kWrongInstanceType);
Label use_cache, call_runtime; Label use_cache, call_runtime;

View File

@ -5542,10 +5542,10 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
__ And(at, object, kSmiTagMask); __ And(at, object, kSmiTagMask);
DeoptimizeIf(eq, instr, Deoptimizer::kSmi, at, Operand(zero_reg)); DeoptimizeIf(eq, instr, Deoptimizer::kSmi, at, Operand(zero_reg));
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ GetObjectType(object, a1, a1); __ GetObjectType(object, a1, a1);
DeoptimizeIf(le, instr, Deoptimizer::kNotAJavaScriptObject, a1, DeoptimizeIf(le, instr, Deoptimizer::kNotAJavaScriptObject, a1,
Operand(LAST_JS_PROXY_TYPE)); Operand(JS_PROXY_TYPE));
Label use_cache, call_runtime; Label use_cache, call_runtime;
DCHECK(object.is(a0)); DCHECK(object.is(a0));

View File

@ -5732,10 +5732,10 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
__ And(at, object, kSmiTagMask); __ And(at, object, kSmiTagMask);
DeoptimizeIf(eq, instr, Deoptimizer::kSmi, at, Operand(zero_reg)); DeoptimizeIf(eq, instr, Deoptimizer::kSmi, at, Operand(zero_reg));
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ GetObjectType(object, a1, a1); __ GetObjectType(object, a1, a1);
DeoptimizeIf(le, instr, Deoptimizer::kNotAJavaScriptObject, a1, DeoptimizeIf(le, instr, Deoptimizer::kNotAJavaScriptObject, a1,
Operand(LAST_JS_PROXY_TYPE)); Operand(JS_PROXY_TYPE));
Label use_cache, call_runtime; Label use_cache, call_runtime;
DCHECK(object.is(a0)); DCHECK(object.is(a0));

View File

@ -5777,8 +5777,8 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
__ TestIfSmi(r3, r0); __ TestIfSmi(r3, r0);
DeoptimizeIf(eq, instr, Deoptimizer::kSmi, cr0); DeoptimizeIf(eq, instr, Deoptimizer::kSmi, cr0);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CompareObjectType(r3, r4, r4, LAST_JS_PROXY_TYPE); __ CompareObjectType(r3, r4, r4, JS_PROXY_TYPE);
DeoptimizeIf(le, instr, Deoptimizer::kWrongInstanceType); DeoptimizeIf(le, instr, Deoptimizer::kWrongInstanceType);
Label use_cache, call_runtime; Label use_cache, call_runtime;

View File

@ -5571,8 +5571,8 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
Condition cc = masm()->CheckSmi(rax); Condition cc = masm()->CheckSmi(rax);
DeoptimizeIf(cc, instr, Deoptimizer::kSmi); DeoptimizeIf(cc, instr, Deoptimizer::kSmi);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CmpObjectType(rax, LAST_JS_PROXY_TYPE, rcx); __ CmpObjectType(rax, JS_PROXY_TYPE, rcx);
DeoptimizeIf(below_equal, instr, Deoptimizer::kWrongInstanceType); DeoptimizeIf(below_equal, instr, Deoptimizer::kWrongInstanceType);
Label use_cache, call_runtime; Label use_cache, call_runtime;

View File

@ -5933,8 +5933,8 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) {
__ test(eax, Immediate(kSmiTagMask)); __ test(eax, Immediate(kSmiTagMask));
DeoptimizeIf(zero, instr, Deoptimizer::kSmi); DeoptimizeIf(zero, instr, Deoptimizer::kSmi);
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CmpObjectType(eax, LAST_JS_PROXY_TYPE, ecx); __ CmpObjectType(eax, JS_PROXY_TYPE, ecx);
DeoptimizeIf(below_equal, instr, Deoptimizer::kWrongInstanceType); DeoptimizeIf(below_equal, instr, Deoptimizer::kWrongInstanceType);
Label use_cache, call_runtime; Label use_cache, call_runtime;

View File

@ -1951,30 +1951,6 @@ Handle<JSProxy> Factory::NewJSProxy(Handle<JSReceiver> target,
} }
Handle<JSProxy> Factory::NewJSFunctionProxy(Handle<JSReceiver> target,
Handle<JSReceiver> handler,
Handle<JSReceiver> call_trap,
Handle<Object> construct_trap,
Handle<Object> prototype) {
// Allocate map.
// TODO(rossberg): Once we optimize proxies, think about a scheme to share
// maps. Will probably depend on the identity of the handler object, too.
Handle<Map> map = NewMap(JS_FUNCTION_PROXY_TYPE, JSFunctionProxy::kSize);
Map::SetPrototype(map, prototype);
map->set_is_callable();
map->set_is_constructor(construct_trap->IsCallable());
// Allocate the proxy object.
Handle<JSFunctionProxy> result = New<JSFunctionProxy>(map, NEW_SPACE);
result->set_target(*target);
result->set_handler(*handler);
result->set_hash(*undefined_value(), SKIP_WRITE_BARRIER);
result->set_call_trap(*call_trap);
result->set_construct_trap(*construct_trap);
return result;
}
Handle<JSGlobalProxy> Factory::NewUninitializedJSGlobalProxy() { Handle<JSGlobalProxy> Factory::NewUninitializedJSGlobalProxy() {
// Create an empty shell of a JSGlobalProxy that needs to be reinitialized // Create an empty shell of a JSGlobalProxy that needs to be reinitialized
// via ReinitializeJSGlobalProxy later. // via ReinitializeJSGlobalProxy later.

View File

@ -481,13 +481,6 @@ class Factory final {
Handle<JSProxy> NewJSProxy(Handle<JSReceiver> target, Handle<JSProxy> NewJSProxy(Handle<JSReceiver> target,
Handle<JSReceiver> handler); Handle<JSReceiver> handler);
// Allocates a Harmony function proxy.
Handle<JSProxy> NewJSFunctionProxy(Handle<JSReceiver> target,
Handle<JSReceiver> handler,
Handle<JSReceiver> call_trap,
Handle<Object> construct_trap,
Handle<Object> prototype);
// Reinitialize an JSGlobalProxy based on a constructor. The object // Reinitialize an JSGlobalProxy based on a constructor. The object
// must have the same size as objects allocated using the // must have the same size as objects allocated using the
// constructor. The object is reinitialized and behaves as an // constructor. The object is reinitialized and behaves as an

View File

@ -1046,9 +1046,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime; Label call_runtime;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); __ CompareObjectType(r0, r1, r1, JS_PROXY_TYPE);
__ CompareObjectType(r0, r1, r1, LAST_JS_PROXY_TYPE); __ b(eq, &call_runtime);
__ b(le, &call_runtime);
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1111,8 +1110,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
__ mov(r1, Operand(Smi::FromInt(1))); // Smi indicates slow check __ mov(r1, Operand(Smi::FromInt(1))); // Smi indicates slow check
__ ldr(r2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object __ ldr(r2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CompareObjectType(r2, r3, r3, LAST_JS_PROXY_TYPE); __ CompareObjectType(r2, r3, r3, JS_PROXY_TYPE);
__ b(gt, &non_proxy); __ b(gt, &non_proxy);
__ mov(r1, Operand(Smi::FromInt(0))); // Zero indicates proxy __ mov(r1, Operand(Smi::FromInt(0))); // Zero indicates proxy
__ bind(&non_proxy); __ bind(&non_proxy);
@ -3256,14 +3255,9 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(r0, if_false); __ JumpIfSmi(r0, if_false);
Register map = r1; __ CompareObjectType(r0, r1, r1, JS_PROXY_TYPE);
Register type_reg = r2;
__ ldr(map, FieldMemOperand(r0, HeapObject::kMapOffset));
__ ldrb(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
__ sub(type_reg, type_reg, Operand(FIRST_JS_PROXY_TYPE));
__ cmp(type_reg, Operand(LAST_JS_PROXY_TYPE - FIRST_JS_PROXY_TYPE));
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ls, if_true, if_false, fall_through); Split(eq, if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -1046,8 +1046,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime; Label call_runtime;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); __ JumpIfObjectType(x0, x10, x11, JS_PROXY_TYPE, &call_runtime, eq);
__ JumpIfObjectType(x0, x10, x11, LAST_JS_PROXY_TYPE, &call_runtime, le);
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1105,11 +1104,10 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
__ Mov(x1, Smi::FromInt(1)); // Smi indicates slow check. __ Mov(x1, Smi::FromInt(1)); // Smi indicates slow check.
__ Peek(x10, 0); // Get enumerated object. __ Peek(x10, 0); // Get enumerated object.
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
// TODO(all): similar check was done already. Can we avoid it here? __ CompareObjectType(x10, x11, x12, JS_PROXY_TYPE);
__ CompareObjectType(x10, x11, x12, LAST_JS_PROXY_TYPE);
DCHECK(Smi::FromInt(0) == 0); DCHECK(Smi::FromInt(0) == 0);
__ CzeroX(x1, le); // Zero indicates proxy. __ CzeroX(x1, eq); // Zero indicates proxy.
__ Ldr(x2, FieldMemOperand(x0, FixedArray::kLengthOffset)); __ Ldr(x2, FieldMemOperand(x0, FixedArray::kLengthOffset));
// Smi and array, fixed array length (as smi) and initial index. // Smi and array, fixed array length (as smi) and initial index.
__ Push(x1, x0, x2, xzr); __ Push(x1, x0, x2, xzr);
@ -2965,14 +2963,9 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(x0, if_false); __ JumpIfSmi(x0, if_false);
Register map = x10; __ CompareObjectType(x0, x10, x11, JS_PROXY_TYPE);
Register type_reg = x11;
__ Ldr(map, FieldMemOperand(x0, HeapObject::kMapOffset));
__ Ldrb(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
__ Sub(type_reg, type_reg, Operand(FIRST_JS_PROXY_TYPE));
__ Cmp(type_reg, Operand(LAST_JS_PROXY_TYPE - FIRST_JS_PROXY_TYPE));
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ls, if_true, if_false, fall_through); Split(eq, if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -980,9 +980,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime, use_cache, fixed_array; Label call_runtime, use_cache, fixed_array;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); __ CmpObjectType(eax, JS_PROXY_TYPE, ecx);
__ CmpObjectType(eax, LAST_JS_PROXY_TYPE, ecx); __ j(equal, &call_runtime);
__ j(below_equal, &call_runtime);
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1038,8 +1037,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
__ mov(ebx, Immediate(Smi::FromInt(1))); // Smi indicates slow check __ mov(ebx, Immediate(Smi::FromInt(1))); // Smi indicates slow check
__ mov(ecx, Operand(esp, 0 * kPointerSize)); // Get enumerated object __ mov(ecx, Operand(esp, 0 * kPointerSize)); // Get enumerated object
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CmpObjectType(ecx, LAST_JS_PROXY_TYPE, ecx); __ CmpObjectType(ecx, JS_PROXY_TYPE, ecx);
__ j(above, &non_proxy); __ j(above, &non_proxy);
__ Move(ebx, Immediate(Smi::FromInt(0))); // Zero indicates proxy __ Move(ebx, Immediate(Smi::FromInt(0))); // Zero indicates proxy
__ bind(&non_proxy); __ bind(&non_proxy);
@ -3137,13 +3136,9 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(eax, if_false); __ JumpIfSmi(eax, if_false);
Register map = ebx; __ CmpObjectType(eax, JS_PROXY_TYPE, ebx);
__ mov(map, FieldOperand(eax, HeapObject::kMapOffset));
__ CmpInstanceType(map, FIRST_JS_PROXY_TYPE);
__ j(less, if_false);
__ CmpInstanceType(map, LAST_JS_PROXY_TYPE);
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(less_equal, if_true, if_false, fall_through); Split(equal, if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -1040,9 +1040,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime; Label call_runtime;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ GetObjectType(a0, a1, a1); __ GetObjectType(a0, a1, a1);
__ Branch(&call_runtime, le, a1, Operand(LAST_JS_PROXY_TYPE)); __ Branch(&call_runtime, eq, a1, Operand(JS_PROXY_TYPE));
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1102,9 +1101,9 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
__ li(a1, Operand(Smi::FromInt(1))); // Smi indicates slow check __ li(a1, Operand(Smi::FromInt(1))); // Smi indicates slow check
__ lw(a2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object __ lw(a2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ GetObjectType(a2, a3, a3); __ GetObjectType(a2, a3, a3);
__ Branch(&non_proxy, gt, a3, Operand(LAST_JS_PROXY_TYPE)); __ Branch(&non_proxy, gt, a3, Operand(JS_PROXY_TYPE));
__ li(a1, Operand(Smi::FromInt(0))); // Zero indicates proxy __ li(a1, Operand(Smi::FromInt(0))); // Zero indicates proxy
__ bind(&non_proxy); __ bind(&non_proxy);
__ Push(a1, v0); // Smi and array __ Push(a1, v0); // Smi and array
@ -3250,13 +3249,9 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(v0, if_false); __ JumpIfSmi(v0, if_false);
Register map = a1; __ GetObjectType(v0, a1, a1);
Register type_reg = a2;
__ GetObjectType(v0, map, type_reg);
__ Subu(type_reg, type_reg, Operand(FIRST_JS_PROXY_TYPE));
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ls, type_reg, Operand(LAST_JS_PROXY_TYPE - FIRST_JS_PROXY_TYPE), Split(eq, a1, Operand(JS_PROXY_TYPE), if_true, if_false, fall_through);
if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -1040,9 +1040,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime; Label call_runtime;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ GetObjectType(a0, a1, a1); __ GetObjectType(a0, a1, a1);
__ Branch(&call_runtime, le, a1, Operand(LAST_JS_PROXY_TYPE)); __ Branch(&call_runtime, eq, a1, Operand(JS_PROXY_TYPE));
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1102,9 +1101,9 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
__ li(a1, Operand(Smi::FromInt(1))); // Smi indicates slow check __ li(a1, Operand(Smi::FromInt(1))); // Smi indicates slow check
__ ld(a2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object __ ld(a2, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ GetObjectType(a2, a3, a3); __ GetObjectType(a2, a3, a3);
__ Branch(&non_proxy, gt, a3, Operand(LAST_JS_PROXY_TYPE)); __ Branch(&non_proxy, gt, a3, Operand(JS_PROXY_TYPE));
__ li(a1, Operand(Smi::FromInt(0))); // Zero indicates proxy __ li(a1, Operand(Smi::FromInt(0))); // Zero indicates proxy
__ bind(&non_proxy); __ bind(&non_proxy);
__ Push(a1, v0); // Smi and array __ Push(a1, v0); // Smi and array
@ -3254,13 +3253,9 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(v0, if_false); __ JumpIfSmi(v0, if_false);
Register map = a1; __ GetObjectType(v0, a1, a1);
Register type_reg = a2;
__ GetObjectType(v0, map, type_reg);
__ Subu(type_reg, type_reg, Operand(FIRST_JS_PROXY_TYPE));
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(ls, type_reg, Operand(LAST_JS_PROXY_TYPE - FIRST_JS_PROXY_TYPE), Split(eq, a1, Operand(JS_PROXY_TYPE), if_true, if_false, fall_through);
if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -1003,9 +1003,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime; Label call_runtime;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); __ CompareObjectType(r3, r4, r4, JS_PROXY_TYPE);
__ CompareObjectType(r3, r4, r4, LAST_JS_PROXY_TYPE); __ beq(&call_runtime);
__ ble(&call_runtime);
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1070,8 +1069,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
__ LoadSmiLiteral(r4, Smi::FromInt(1)); // Smi indicates slow check __ LoadSmiLiteral(r4, Smi::FromInt(1)); // Smi indicates slow check
__ LoadP(r5, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object __ LoadP(r5, MemOperand(sp, 0 * kPointerSize)); // Get enumerated object
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CompareObjectType(r5, r6, r6, LAST_JS_PROXY_TYPE); __ CompareObjectType(r5, r6, r6, JS_PROXY_TYPE);
__ bgt(&non_proxy); __ bgt(&non_proxy);
__ LoadSmiLiteral(r4, Smi::FromInt(0)); // Zero indicates proxy __ LoadSmiLiteral(r4, Smi::FromInt(0)); // Zero indicates proxy
__ bind(&non_proxy); __ bind(&non_proxy);
@ -3253,14 +3252,9 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(r3, if_false); __ JumpIfSmi(r3, if_false);
Register map = r4; __ CompareObjectType(r3, r4, r4, JS_PROXY_TYPE);
Register type_reg = r5;
__ LoadP(map, FieldMemOperand(r3, HeapObject::kMapOffset));
__ lbz(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset));
__ subi(type_reg, type_reg, Operand(FIRST_JS_PROXY_TYPE));
__ cmpli(type_reg, Operand(LAST_JS_PROXY_TYPE - FIRST_JS_PROXY_TYPE));
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(le, if_true, if_false, fall_through); Split(eq, if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -994,9 +994,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime; Label call_runtime;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); __ CmpObjectType(rax, JS_PROXY_TYPE, rcx);
__ CmpObjectType(rax, LAST_JS_PROXY_TYPE, rcx); __ j(equal, &call_runtime);
__ j(below_equal, &call_runtime);
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1059,8 +1058,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
TypeFeedbackVector::MegamorphicSentinel(isolate())); TypeFeedbackVector::MegamorphicSentinel(isolate()));
__ Move(rbx, Smi::FromInt(1)); // Smi indicates slow check __ Move(rbx, Smi::FromInt(1)); // Smi indicates slow check
__ movp(rcx, Operand(rsp, 0 * kPointerSize)); // Get enumerated object __ movp(rcx, Operand(rsp, 0 * kPointerSize)); // Get enumerated object
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CmpObjectType(rcx, LAST_JS_PROXY_TYPE, rcx); __ CmpObjectType(rcx, JS_PROXY_TYPE, rcx);
__ j(above, &non_proxy); __ j(above, &non_proxy);
__ Move(rbx, Smi::FromInt(0)); // Zero indicates proxy __ Move(rbx, Smi::FromInt(0)); // Zero indicates proxy
__ bind(&non_proxy); __ bind(&non_proxy);
@ -3119,14 +3118,11 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
context()->PrepareTest(&materialize_true, &materialize_false, &if_true, context()->PrepareTest(&materialize_true, &materialize_false, &if_true,
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(rax, if_false); __ JumpIfSmi(rax, if_false);
Register map = rbx; __ CmpObjectType(rax, JS_PROXY_TYPE, rbx);
__ movp(map, FieldOperand(rax, HeapObject::kMapOffset));
__ CmpInstanceType(map, FIRST_JS_PROXY_TYPE);
__ j(less, if_false);
__ CmpInstanceType(map, LAST_JS_PROXY_TYPE);
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(less_equal, if_true, if_false, fall_through); Split(equal, if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -983,9 +983,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
// Check for proxies. // Check for proxies.
Label call_runtime, use_cache, fixed_array; Label call_runtime, use_cache, fixed_array;
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); __ CmpObjectType(eax, JS_PROXY_TYPE, ecx);
__ CmpObjectType(eax, LAST_JS_PROXY_TYPE, ecx); __ j(equal, &call_runtime);
__ j(below_equal, &call_runtime);
// Check cache validity in generated code. This is a fast case for // Check cache validity in generated code. This is a fast case for
// the JSObject::IsSimpleEnum cache validity checks. If we cannot // the JSObject::IsSimpleEnum cache validity checks. If we cannot
@ -1041,8 +1040,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
__ mov(ebx, Immediate(Smi::FromInt(1))); // Smi indicates slow check __ mov(ebx, Immediate(Smi::FromInt(1))); // Smi indicates slow check
__ mov(ecx, Operand(esp, 0 * kPointerSize)); // Get enumerated object __ mov(ecx, Operand(esp, 0 * kPointerSize)); // Get enumerated object
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
__ CmpObjectType(ecx, LAST_JS_PROXY_TYPE, ecx); __ CmpObjectType(ecx, JS_PROXY_TYPE, ecx);
__ j(above, &non_proxy); __ j(above, &non_proxy);
__ Move(ebx, Immediate(Smi::FromInt(0))); // Zero indicates proxy __ Move(ebx, Immediate(Smi::FromInt(0))); // Zero indicates proxy
__ bind(&non_proxy); __ bind(&non_proxy);
@ -3139,14 +3138,11 @@ void FullCodeGenerator::EmitIsJSProxy(CallRuntime* expr) {
context()->PrepareTest(&materialize_true, &materialize_false, &if_true, context()->PrepareTest(&materialize_true, &materialize_false, &if_true,
&if_false, &fall_through); &if_false, &fall_through);
__ JumpIfSmi(eax, if_false); __ JumpIfSmi(eax, if_false);
Register map = ebx; __ CmpObjectType(eax, JS_PROXY_TYPE, ebx);
__ mov(map, FieldOperand(eax, HeapObject::kMapOffset));
__ CmpInstanceType(map, FIRST_JS_PROXY_TYPE);
__ j(less, if_false);
__ CmpInstanceType(map, LAST_JS_PROXY_TYPE);
PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
Split(less_equal, if_true, if_false, fall_through); Split(equal, if_true, if_false, fall_through);
context()->Plug(if_true, if_false); context()->Plug(if_true, if_false);
} }

View File

@ -93,7 +93,6 @@ StaticVisitorBase::VisitorId StaticVisitorBase::GetVisitorId(
return kVisitSharedFunctionInfo; return kVisitSharedFunctionInfo;
case JS_PROXY_TYPE: case JS_PROXY_TYPE:
case JS_FUNCTION_PROXY_TYPE:
return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric, return GetVisitorIdForSize(kVisitStruct, kVisitStructGeneric,
instance_size, has_unboxed_fields); instance_size, has_unboxed_fields);

View File

@ -1539,14 +1539,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx);
__ j(equal, masm->isolate()->builtins()->CallFunction(mode), __ j(equal, masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);
__ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); __ CmpInstanceType(ecx, JS_PROXY_TYPE);
__ j(not_equal, &non_function); __ j(not_equal, &non_function);
// 1. Call to function proxy. // 1. Call to Proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): Implement [[Call]] on proxies.
__ mov(edi, FieldOperand(edi, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(edi);
__ jmp(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1600,11 +1597,10 @@ void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// -- eax : the number of arguments (not including the receiver) // -- eax : the number of arguments (not including the receiver)
// -- edx : the new target (either the same as the constructor or // -- edx : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// -- edi : the constructor to call (checked to be a JSFunctionProxy) // -- edi : the constructor to call (checked to be a JSProxy)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ mov(edi, FieldOperand(edi, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1626,7 +1622,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx);
__ j(equal, masm->isolate()->builtins()->ConstructFunction(), __ j(equal, masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);
__ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); __ CmpInstanceType(ecx, JS_PROXY_TYPE);
__ j(equal, masm->isolate()->builtins()->ConstructProxy(), __ j(equal, masm->isolate()->builtins()->ConstructProxy(),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);

View File

@ -22,26 +22,6 @@ utils.Import(function(from) {
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
function ProxyCreateFunction(handler, callTrap, constructTrap) {
if (!IS_SPEC_OBJECT(handler))
throw MakeTypeError(kProxyHandlerNonObject, "createFunction")
if (!IS_CALLABLE(callTrap))
throw MakeTypeError(kProxyTrapFunctionExpected, "call")
if (IS_UNDEFINED(constructTrap)) {
constructTrap = DerivedConstructTrap(callTrap)
} else if (IS_CALLABLE(constructTrap)) {
// Make sure the trap receives 'undefined' as this.
var construct = constructTrap
constructTrap = function() {
return %Apply(construct, UNDEFINED, arguments, 0, %_ArgumentsLength());
}
} else {
throw MakeTypeError(kProxyTrapFunctionExpected, "construct")
}
return %CreateJSFunctionProxy(
{}, handler, callTrap, constructTrap, GlobalFunction.prototype)
}
function ProxyCreateRevocable(target, handler) { function ProxyCreateRevocable(target, handler) {
var p = new GlobalProxy(target, handler); var p = new GlobalProxy(target, handler);
return {proxy: p, revoke: () => %RevokeProxy(p)}; return {proxy: p, revoke: () => %RevokeProxy(p)};
@ -149,8 +129,7 @@ function ProxyEnumerate(trap, handler, target) {
//Set up non-enumerable properties of the Proxy object. //Set up non-enumerable properties of the Proxy object.
utils.InstallFunctions(GlobalProxy, DONT_ENUM, [ utils.InstallFunctions(GlobalProxy, DONT_ENUM, [
"revocable", ProxyCreateRevocable, "revocable", ProxyCreateRevocable
"createFunction", ProxyCreateFunction
]); ]);
// ------------------------------------------------------------------- // -------------------------------------------------------------------

View File

@ -1542,10 +1542,6 @@ function NativeCodeFunctionSourceString(func) {
} }
function FunctionSourceString(func) { function FunctionSourceString(func) {
while (%IsJSFunctionProxy(func)) {
func = %GetCallTrap(func);
}
if (!IS_FUNCTION(func)) { if (!IS_FUNCTION(func)) {
throw MakeTypeError(kNotGeneric, 'Function.prototype.toString'); throw MakeTypeError(kNotGeneric, 'Function.prototype.toString');
} }

View File

@ -1692,13 +1692,10 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ GetObjectType(a1, t1, t2); __ GetObjectType(a1, t1, t2);
__ Jump(masm->isolate()->builtins()->CallFunction(mode), __ Jump(masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE)); RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE));
__ Branch(&non_function, ne, t2, Operand(JS_FUNCTION_PROXY_TYPE)); __ Branch(&non_function, ne, t2, Operand(JS_PROXY_TYPE));
// 1. Call to function proxy. // 1. Call Proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): implement call on Proxy
__ lw(a1, FieldMemOperand(a1, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(a1);
__ Branch(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1753,13 +1750,12 @@ void Builtins::Generate_ConstructFunction(MacroAssembler* masm) {
void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- a0 : the number of arguments (not including the receiver) // -- a0 : the number of arguments (not including the receiver)
// -- a1 : the constructor to call (checked to be a JSFunctionProxy) // -- a1 : the constructor to call (checked to be a JSProxy)
// -- a3 : the new target (either the same as the constructor or // -- a3 : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ lw(a1, FieldMemOperand(a1, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1783,7 +1779,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ Jump(masm->isolate()->builtins()->ConstructFunction(), __ Jump(masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE)); RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE));
__ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET,
eq, t2, Operand(JS_FUNCTION_PROXY_TYPE)); eq, t2, Operand(JS_PROXY_TYPE));
// Check if target has a [[Construct]] internal method. // Check if target has a [[Construct]] internal method.
__ lbu(t2, FieldMemOperand(t1, Map::kBitFieldOffset)); __ lbu(t2, FieldMemOperand(t1, Map::kBitFieldOffset));

View File

@ -1684,13 +1684,10 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ GetObjectType(a1, t1, t2); __ GetObjectType(a1, t1, t2);
__ Jump(masm->isolate()->builtins()->CallFunction(mode), __ Jump(masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE)); RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE));
__ Branch(&non_function, ne, t2, Operand(JS_FUNCTION_PROXY_TYPE)); __ Branch(&non_function, ne, t2, Operand(JS_PROXY_TYPE));
// 1. Call to function proxy. // 1. Call to function proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): Implement [[Call]] on proxies.
__ ld(a1, FieldMemOperand(a1, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(a1);
__ Branch(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1744,13 +1741,12 @@ void Builtins::Generate_ConstructFunction(MacroAssembler* masm) {
void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- a0 : the number of arguments (not including the receiver) // -- a0 : the number of arguments (not including the receiver)
// -- a1 : the constructor to call (checked to be a JSFunctionProxy) // -- a1 : the constructor to call (checked to be a JSProxy)
// -- a3 : the new target (either the same as the constructor or // -- a3 : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ ld(a1, FieldMemOperand(a1, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1774,7 +1770,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ Jump(masm->isolate()->builtins()->ConstructFunction(), __ Jump(masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE)); RelocInfo::CODE_TARGET, eq, t2, Operand(JS_FUNCTION_TYPE));
__ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET,
eq, t2, Operand(JS_FUNCTION_PROXY_TYPE)); eq, t2, Operand(JS_PROXY_TYPE));
// Check if target has a [[Construct]] internal method. // Check if target has a [[Construct]] internal method.
__ lbu(t2, FieldMemOperand(t1, Map::kBitFieldOffset)); __ lbu(t2, FieldMemOperand(t1, Map::kBitFieldOffset));

View File

@ -481,8 +481,6 @@ ReturnType BodyDescriptorApply(InstanceType type, T1 p1, T2 p2, T3 p3) {
return Op::template apply<Oddball::BodyDescriptor>(p1, p2, p3); return Op::template apply<Oddball::BodyDescriptor>(p1, p2, p3);
case JS_PROXY_TYPE: case JS_PROXY_TYPE:
return Op::template apply<JSProxy::BodyDescriptor>(p1, p2, p3); return Op::template apply<JSProxy::BodyDescriptor>(p1, p2, p3);
case JS_FUNCTION_PROXY_TYPE:
return Op::template apply<JSFunctionProxy::BodyDescriptor>(p1, p2, p3);
case FOREIGN_TYPE: case FOREIGN_TYPE:
return Op::template apply<Foreign::BodyDescriptor>(p1, p2, p3); return Op::template apply<Foreign::BodyDescriptor>(p1, p2, p3);
case MAP_TYPE: case MAP_TYPE:

View File

@ -164,9 +164,6 @@ void HeapObject::HeapObjectVerify() {
case JS_PROXY_TYPE: case JS_PROXY_TYPE:
JSProxy::cast(this)->JSProxyVerify(); JSProxy::cast(this)->JSProxyVerify();
break; break;
case JS_FUNCTION_PROXY_TYPE:
JSFunctionProxy::cast(this)->JSFunctionProxyVerify();
break;
case FOREIGN_TYPE: case FOREIGN_TYPE:
Foreign::cast(this)->ForeignVerify(); Foreign::cast(this)->ForeignVerify();
break; break;
@ -820,15 +817,6 @@ void JSProxy::JSProxyVerify() {
} }
void JSFunctionProxy::JSFunctionProxyVerify() {
CHECK(IsJSFunctionProxy());
JSProxyVerify();
VerifyPointer(call_trap());
VerifyPointer(construct_trap());
CHECK(map()->is_callable());
}
void JSArrayBuffer::JSArrayBufferVerify() { void JSArrayBuffer::JSArrayBufferVerify() {
CHECK(IsJSArrayBuffer()); CHECK(IsJSArrayBuffer());
JSObjectVerify(); JSObjectVerify();

View File

@ -702,7 +702,6 @@ bool Object::IsJSProxy() const {
} }
TYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE)
TYPE_CHECKER(JSSet, JS_SET_TYPE) TYPE_CHECKER(JSSet, JS_SET_TYPE)
TYPE_CHECKER(JSMap, JS_MAP_TYPE) TYPE_CHECKER(JSMap, JS_MAP_TYPE)
TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE) TYPE_CHECKER(JSSetIterator, JS_SET_ITERATOR_TYPE)
@ -3222,7 +3221,6 @@ CAST_ACCESSOR(JSArrayBufferView)
CAST_ACCESSOR(JSDataView) CAST_ACCESSOR(JSDataView)
CAST_ACCESSOR(JSDate) CAST_ACCESSOR(JSDate)
CAST_ACCESSOR(JSFunction) CAST_ACCESSOR(JSFunction)
CAST_ACCESSOR(JSFunctionProxy)
CAST_ACCESSOR(JSGeneratorObject) CAST_ACCESSOR(JSGeneratorObject)
CAST_ACCESSOR(JSGlobalObject) CAST_ACCESSOR(JSGlobalObject)
CAST_ACCESSOR(JSGlobalProxy) CAST_ACCESSOR(JSGlobalProxy)
@ -4822,10 +4820,7 @@ bool Map::IsJSObjectMap() {
bool Map::IsJSArrayMap() { return instance_type() == JS_ARRAY_TYPE; } bool Map::IsJSArrayMap() { return instance_type() == JS_ARRAY_TYPE; }
bool Map::IsJSFunctionMap() { return instance_type() == JS_FUNCTION_TYPE; } bool Map::IsJSFunctionMap() { return instance_type() == JS_FUNCTION_TYPE; }
bool Map::IsStringMap() { return instance_type() < FIRST_NONSTRING_TYPE; } bool Map::IsStringMap() { return instance_type() < FIRST_NONSTRING_TYPE; }
bool Map::IsJSProxyMap() { bool Map::IsJSProxyMap() { return instance_type() == JS_PROXY_TYPE; }
InstanceType type = instance_type();
return FIRST_JS_PROXY_TYPE <= type && type <= LAST_JS_PROXY_TYPE;
}
bool Map::IsJSGlobalProxyMap() { bool Map::IsJSGlobalProxyMap() {
return instance_type() == JS_GLOBAL_PROXY_TYPE; return instance_type() == JS_GLOBAL_PROXY_TYPE;
} }
@ -6342,10 +6337,6 @@ ACCESSORS(JSProxy, hash, Object, kHashOffset)
bool JSProxy::IsRevoked() const { return !handler()->IsJSReceiver(); } bool JSProxy::IsRevoked() const { return !handler()->IsJSReceiver(); }
ACCESSORS(JSFunctionProxy, call_trap, JSReceiver, kCallTrapOffset)
ACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset)
ACCESSORS(JSCollection, table, Object, kTableOffset) ACCESSORS(JSCollection, table, Object, kTableOffset)

View File

@ -131,9 +131,6 @@ void HeapObject::HeapObjectPrint(std::ostream& os) { // NOLINT
case JS_PROXY_TYPE: case JS_PROXY_TYPE:
JSProxy::cast(this)->JSProxyPrint(os); JSProxy::cast(this)->JSProxyPrint(os);
break; break;
case JS_FUNCTION_PROXY_TYPE:
JSFunctionProxy::cast(this)->JSFunctionProxyPrint(os);
break;
case JS_SET_TYPE: case JS_SET_TYPE:
JSSet::cast(this)->JSSetPrint(os); JSSet::cast(this)->JSSetPrint(os);
break; break;
@ -751,19 +748,6 @@ void JSProxy::JSProxyPrint(std::ostream& os) { // NOLINT
} }
void JSFunctionProxy::JSFunctionProxyPrint(std::ostream& os) { // NOLINT
HeapObject::PrintHeader(os, "JSFunctionProxy");
os << " - map = " << reinterpret_cast<void*>(map()) << "\n";
os << " - handler = ";
handler()->Print(os);
os << "\n - call_trap = ";
call_trap()->Print(os);
os << "\n - construct_trap = ";
construct_trap()->Print(os);
os << "\n";
}
void JSSet::JSSetPrint(std::ostream& os) { // NOLINT void JSSet::JSSetPrint(std::ostream& os) { // NOLINT
JSObjectPrintHeader(os, this, "JSSet"); JSObjectPrintHeader(os, this, "JSSet");
os << " - table = " << Brief(table()); os << " - table = " << Brief(table());

View File

@ -2102,9 +2102,6 @@ void HeapObject::HeapObjectShortPrint(std::ostream& os) { // NOLINT
case JS_PROXY_TYPE: case JS_PROXY_TYPE:
os << "<JSProxy>"; os << "<JSProxy>";
break; break;
case JS_FUNCTION_PROXY_TYPE:
os << "<JSFunctionProxy>";
break;
case FOREIGN_TYPE: case FOREIGN_TYPE:
os << "<Foreign>"; os << "<Foreign>";
break; break;
@ -2288,7 +2285,7 @@ void Simd128Value::CopyBits(void* destination) const {
String* JSReceiver::class_name() { String* JSReceiver::class_name() {
if (IsJSFunction() || IsJSFunctionProxy()) { if (IsJSFunction()) {
return GetHeap()->Function_string(); return GetHeap()->Function_string();
} }
Object* maybe_constructor = map()->GetConstructor(); Object* maybe_constructor = map()->GetConstructor();
@ -4798,12 +4795,8 @@ MaybeHandle<Context> JSProxy::GetFunctionRealm(Handle<JSProxy> proxy) {
THROW_NEW_ERROR(proxy->GetIsolate(), THROW_NEW_ERROR(proxy->GetIsolate(),
NewTypeError(MessageTemplate::kProxyRevoked), Context); NewTypeError(MessageTemplate::kProxyRevoked), Context);
} }
Handle<JSReceiver> target(JSReceiver::cast(proxy->target()));
// TODO(verwaest): Get rid of JSFunctionProxies. return JSReceiver::GetFunctionRealm(target);
Object* target = proxy->IsJSFunctionProxy()
? JSFunctionProxy::cast(*proxy)->construct_trap()
: proxy->target();
return JSReceiver::GetFunctionRealm(handle(JSReceiver::cast(target)));
} }
@ -12522,7 +12515,6 @@ bool CanSubclassHaveInobjectProperties(InstanceType instance_type) {
case JS_FUNCTION_TYPE: case JS_FUNCTION_TYPE:
return true; return true;
case JS_FUNCTION_PROXY_TYPE:
case JS_PROXY_TYPE: case JS_PROXY_TYPE:
case JS_GLOBAL_PROXY_TYPE: case JS_GLOBAL_PROXY_TYPE:
case JS_GLOBAL_OBJECT_TYPE: case JS_GLOBAL_OBJECT_TYPE:

View File

@ -69,7 +69,6 @@
// - JSDate // - JSDate
// - JSMessageObject // - JSMessageObject
// - JSProxy // - JSProxy
// - JSFunctionProxy
// - FixedArrayBase // - FixedArrayBase
// - ByteArray // - ByteArray
// - BytecodeArray // - BytecodeArray
@ -439,7 +438,6 @@ const int kStubMinorKeyBits = kSmiValueSize - kStubMajorKeyBits - 1;
V(JS_REGEXP_TYPE) \ V(JS_REGEXP_TYPE) \
\ \
V(JS_FUNCTION_TYPE) \ V(JS_FUNCTION_TYPE) \
V(JS_FUNCTION_PROXY_TYPE) \
V(DEBUG_INFO_TYPE) \ V(DEBUG_INFO_TYPE) \
V(BREAK_POINT_INFO_TYPE) V(BREAK_POINT_INFO_TYPE)
@ -711,9 +709,8 @@ enum InstanceType {
// objects in the JS sense. The first and the last type in this range are // objects in the JS sense. The first and the last type in this range are
// the two forms of function. This organization enables using the same // the two forms of function. This organization enables using the same
// compares for checking the JS_RECEIVER and the NONCALLABLE_JS_OBJECT range. // compares for checking the JS_RECEIVER and the NONCALLABLE_JS_OBJECT range.
JS_FUNCTION_PROXY_TYPE, // FIRST_JS_RECEIVER_TYPE, FIRST_JS_PROXY_TYPE JS_PROXY_TYPE, // FIRST_JS_RECEIVER_TYPE
JS_PROXY_TYPE, // LAST_JS_PROXY_TYPE JS_VALUE_TYPE, // FIRST_JS_OBJECT_TYPE
JS_VALUE_TYPE, // FIRST_JS_OBJECT_TYPE
JS_MESSAGE_OBJECT_TYPE, JS_MESSAGE_OBJECT_TYPE,
JS_DATE_TYPE, JS_DATE_TYPE,
JS_OBJECT_TYPE, JS_OBJECT_TYPE,
@ -757,16 +754,13 @@ enum InstanceType {
// are not continuous in this enum! The enum ranges instead reflect the // are not continuous in this enum! The enum ranges instead reflect the
// external class names, where proxies are treated as either ordinary objects, // external class names, where proxies are treated as either ordinary objects,
// or functions. // or functions.
FIRST_JS_RECEIVER_TYPE = JS_FUNCTION_PROXY_TYPE, FIRST_JS_RECEIVER_TYPE = JS_PROXY_TYPE,
LAST_JS_RECEIVER_TYPE = LAST_TYPE, LAST_JS_RECEIVER_TYPE = LAST_TYPE,
// Boundaries for testing the types represented as JSObject // Boundaries for testing the types represented as JSObject
FIRST_JS_OBJECT_TYPE = JS_VALUE_TYPE, FIRST_JS_OBJECT_TYPE = JS_VALUE_TYPE,
LAST_JS_OBJECT_TYPE = LAST_TYPE, LAST_JS_OBJECT_TYPE = LAST_TYPE,
// Boundaries for testing the types represented as JSProxy
FIRST_JS_PROXY_TYPE = JS_FUNCTION_PROXY_TYPE,
LAST_JS_PROXY_TYPE = JS_PROXY_TYPE,
// //
FIRST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_PROXY_TYPE, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_VALUE_TYPE,
LAST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_REGEXP_TYPE, LAST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_REGEXP_TYPE,
// Note that the types for which typeof is "function" are not continuous. // Note that the types for which typeof is "function" are not continuous.
// Define this so that we can put assertions on discrete checks. // Define this so that we can put assertions on discrete checks.
@ -975,7 +969,6 @@ template <class C> inline bool Is(Object* obj);
V(JSTypedArray) \ V(JSTypedArray) \
V(JSDataView) \ V(JSDataView) \
V(JSProxy) \ V(JSProxy) \
V(JSFunctionProxy) \
V(JSSet) \ V(JSSet) \
V(JSMap) \ V(JSMap) \
V(JSSetIterator) \ V(JSSetIterator) \
@ -9597,32 +9590,6 @@ class JSProxy: public JSReceiver {
}; };
class JSFunctionProxy: public JSProxy {
public:
// [call_trap]: The call trap.
DECL_ACCESSORS(call_trap, JSReceiver)
// [construct_trap]: The construct trap.
DECL_ACCESSORS(construct_trap, Object)
DECLARE_CAST(JSFunctionProxy)
// Dispatched behavior.
DECLARE_PRINTER(JSFunctionProxy)
DECLARE_VERIFIER(JSFunctionProxy)
// Layout description.
static const int kCallTrapOffset = JSProxy::kSize;
static const int kConstructTrapOffset = kCallTrapOffset + kPointerSize;
static const int kSize = kConstructTrapOffset + kPointerSize;
typedef FixedBodyDescriptor<kTargetOffset, kSize, kSize> BodyDescriptor;
private:
DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunctionProxy);
};
class JSCollection : public JSObject { class JSCollection : public JSObject {
public: public:
// [table]: the backing hash table // [table]: the backing hash table

View File

@ -1695,14 +1695,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ CompareObjectType(r4, r7, r8, JS_FUNCTION_TYPE); __ CompareObjectType(r4, r7, r8, JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->CallFunction(mode), __ Jump(masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET, eq); RelocInfo::CODE_TARGET, eq);
__ cmpi(r8, Operand(JS_FUNCTION_PROXY_TYPE)); __ cmpi(r8, Operand(JS_PROXY_TYPE));
__ bne(&non_function); __ bne(&non_function);
// 1. Call to function proxy. // 1. Call to function proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): Implement [[Call]] on proxies.
__ LoadP(r4, FieldMemOperand(r4, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(r4);
__ b(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1756,13 +1753,12 @@ void Builtins::Generate_ConstructFunction(MacroAssembler* masm) {
void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// ----------- S t a t e ------------- // ----------- S t a t e -------------
// -- r3 : the number of arguments (not including the receiver) // -- r3 : the number of arguments (not including the receiver)
// -- r4 : the constructor to call (checked to be a JSFunctionProxy) // -- r4 : the constructor to call (checked to be a JSProxy)
// -- r6 : the new target (either the same as the constructor or // -- r6 : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ LoadP(r4, FieldMemOperand(r4, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1784,7 +1780,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ CompareObjectType(r4, r7, r8, JS_FUNCTION_TYPE); __ CompareObjectType(r4, r7, r8, JS_FUNCTION_TYPE);
__ Jump(masm->isolate()->builtins()->ConstructFunction(), __ Jump(masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET, eq); RelocInfo::CODE_TARGET, eq);
__ cmpi(r8, Operand(JS_FUNCTION_PROXY_TYPE)); __ cmpi(r8, Operand(JS_PROXY_TYPE));
__ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET, __ Jump(masm->isolate()->builtins()->ConstructProxy(), RelocInfo::CODE_TARGET,
eq); eq);

View File

@ -175,9 +175,8 @@ RUNTIME_FUNCTION(Runtime_InterpreterForInPrepare) {
cache_array = Handle<FixedArray>::cast(cache_type); cache_array = Handle<FixedArray>::cast(cache_type);
cache_length = cache_array->length(); cache_length = cache_array->length();
STATIC_ASSERT(FIRST_JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE);
if (receiver_map->instance_type() <= LAST_JS_PROXY_TYPE) { if (receiver_map->instance_type() == JS_PROXY_TYPE) {
DCHECK_GE(receiver_map->instance_type(), LAST_JS_PROXY_TYPE);
// Zero indicates proxy // Zero indicates proxy
cache_type = Handle<Object>(Smi::FromInt(0), isolate); cache_type = Handle<Object>(Smi::FromInt(0), isolate);
} else { } else {

View File

@ -11,19 +11,6 @@
namespace v8 { namespace v8 {
namespace internal { namespace internal {
RUNTIME_FUNCTION(Runtime_CreateJSFunctionProxy) {
HandleScope scope(isolate);
DCHECK(args.length() == 5);
CONVERT_ARG_HANDLE_CHECKED(JSReceiver, target, 0);
CONVERT_ARG_HANDLE_CHECKED(JSReceiver, handler, 1);
CONVERT_ARG_HANDLE_CHECKED(JSReceiver, call_trap, 2);
RUNTIME_ASSERT(call_trap->IsJSFunction() || call_trap->IsJSFunctionProxy());
CONVERT_ARG_HANDLE_CHECKED(JSFunction, construct_trap, 3);
CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 4);
if (!prototype->IsJSReceiver()) prototype = isolate->factory()->null_value();
return *isolate->factory()->NewJSFunctionProxy(target, handler, call_trap,
construct_trap, prototype);
}
RUNTIME_FUNCTION(Runtime_IsJSProxy) { RUNTIME_FUNCTION(Runtime_IsJSProxy) {
@ -34,14 +21,6 @@ RUNTIME_FUNCTION(Runtime_IsJSProxy) {
} }
RUNTIME_FUNCTION(Runtime_IsJSFunctionProxy) {
SealHandleScope shs(isolate);
DCHECK(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0);
return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy());
}
RUNTIME_FUNCTION(Runtime_GetHandler) { RUNTIME_FUNCTION(Runtime_GetHandler) {
SealHandleScope shs(isolate); SealHandleScope shs(isolate);
DCHECK(args.length() == 1); DCHECK(args.length() == 1);
@ -50,22 +29,6 @@ RUNTIME_FUNCTION(Runtime_GetHandler) {
} }
RUNTIME_FUNCTION(Runtime_GetCallTrap) {
SealHandleScope shs(isolate);
DCHECK(args.length() == 1);
CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0);
return proxy->call_trap();
}
RUNTIME_FUNCTION(Runtime_GetConstructTrap) {
SealHandleScope shs(isolate);
DCHECK(args.length() == 1);
CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0);
return proxy->construct_trap();
}
RUNTIME_FUNCTION(Runtime_RevokeProxy) { RUNTIME_FUNCTION(Runtime_RevokeProxy) {
HandleScope scope(isolate); HandleScope scope(isolate);
DCHECK(args.length() == 1); DCHECK(args.length() == 1);
@ -74,6 +37,5 @@ RUNTIME_FUNCTION(Runtime_RevokeProxy) {
return isolate->heap()->undefined_value(); return isolate->heap()->undefined_value();
} }
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8

View File

@ -542,15 +542,10 @@ namespace internal {
F(BitwiseXor_Strong, 2, 1) F(BitwiseXor_Strong, 2, 1)
#define FOR_EACH_INTRINSIC_PROXY(F) \ #define FOR_EACH_INTRINSIC_PROXY(F) \
F(CreateJSFunctionProxy, 5, 1) \
F(IsJSProxy, 1, 1) \ F(IsJSProxy, 1, 1) \
F(IsJSFunctionProxy, 1, 1) \
F(GetHandler, 1, 1) \ F(GetHandler, 1, 1) \
F(GetCallTrap, 1, 1) \
F(GetConstructTrap, 1, 1) \
F(RevokeProxy, 1, 1) F(RevokeProxy, 1, 1)
#define FOR_EACH_INTRINSIC_REGEXP(F) \ #define FOR_EACH_INTRINSIC_REGEXP(F) \
F(StringReplaceGlobalRegExpWithString, 4, 1) \ F(StringReplaceGlobalRegExpWithString, 4, 1) \
F(StringSplit, 3, 1) \ F(StringSplit, 3, 1) \

View File

@ -253,7 +253,6 @@ TypeImpl<Config>::BitsetType::Lub(i::Map* map) {
case JS_REGEXP_TYPE: case JS_REGEXP_TYPE:
return kOtherObject; // TODO(rossberg): there should be a RegExp type. return kOtherObject; // TODO(rossberg): there should be a RegExp type.
case JS_PROXY_TYPE: case JS_PROXY_TYPE:
case JS_FUNCTION_PROXY_TYPE:
return kProxy; return kProxy;
case MAP_TYPE: case MAP_TYPE:
// When compiling stub templates, the meta map is used as a place holder // When compiling stub templates, the meta map is used as a place holder

View File

@ -1742,14 +1742,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx);
__ j(equal, masm->isolate()->builtins()->CallFunction(mode), __ j(equal, masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);
__ CmpInstanceType(rcx, JS_FUNCTION_PROXY_TYPE); __ CmpInstanceType(rcx, JS_PROXY_TYPE);
__ j(not_equal, &non_function); __ j(not_equal, &non_function);
// 1. Call to function proxy. // 1. Call to function proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): Implement [[Call]] on proxies.
__ movp(rdi, FieldOperand(rdi, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(rdi);
__ jmp(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1804,11 +1801,10 @@ void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// -- rax : the number of arguments (not including the receiver) // -- rax : the number of arguments (not including the receiver)
// -- rdx : the new target (either the same as the constructor or // -- rdx : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// -- rdi : the constructor to call (checked to be a JSFunctionProxy) // -- rdi : the constructor to call (checked to be a JSProxy)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ movp(rdi, FieldOperand(rdi, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1831,7 +1827,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx);
__ j(equal, masm->isolate()->builtins()->ConstructFunction(), __ j(equal, masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);
__ CmpInstanceType(rcx, JS_FUNCTION_PROXY_TYPE); __ CmpInstanceType(rcx, JS_PROXY_TYPE);
__ j(equal, masm->isolate()->builtins()->ConstructProxy(), __ j(equal, masm->isolate()->builtins()->ConstructProxy(),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);

View File

@ -1552,14 +1552,11 @@ void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode) {
__ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx);
__ j(equal, masm->isolate()->builtins()->CallFunction(mode), __ j(equal, masm->isolate()->builtins()->CallFunction(mode),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);
__ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); __ CmpInstanceType(ecx, JS_PROXY_TYPE);
__ j(not_equal, &non_function); __ j(not_equal, &non_function);
// 1. Call to function proxy. // 1. Call to function proxy.
// TODO(neis): This doesn't match the ES6 spec for [[Call]] on proxies. // TODO(neis): Implement [[Call]] on proxies.
__ mov(edi, FieldOperand(edi, JSFunctionProxy::kCallTrapOffset));
__ AssertNotSmi(edi);
__ jmp(&non_smi);
// 2. Call to something else, which might have a [[Call]] internal method (if // 2. Call to something else, which might have a [[Call]] internal method (if
// not we raise an exception). // not we raise an exception).
@ -1613,11 +1610,10 @@ void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
// -- eax : the number of arguments (not including the receiver) // -- eax : the number of arguments (not including the receiver)
// -- edx : the new target (either the same as the constructor or // -- edx : the new target (either the same as the constructor or
// the JSFunction on which new was invoked initially) // the JSFunction on which new was invoked initially)
// -- edi : the constructor to call (checked to be a JSFunctionProxy) // -- edi : the constructor to call (checked to be a JSProxy)
// ----------------------------------- // -----------------------------------
// TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies. // TODO(neis): This doesn't match the ES6 spec for [[Construct]] on proxies.
__ mov(edi, FieldOperand(edi, JSFunctionProxy::kConstructTrapOffset));
__ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
} }
@ -1639,7 +1635,7 @@ void Builtins::Generate_Construct(MacroAssembler* masm) {
__ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx); __ CmpObjectType(edi, JS_FUNCTION_TYPE, ecx);
__ j(equal, masm->isolate()->builtins()->ConstructFunction(), __ j(equal, masm->isolate()->builtins()->ConstructFunction(),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);
__ CmpInstanceType(ecx, JS_FUNCTION_PROXY_TYPE); __ CmpInstanceType(ecx, JS_PROXY_TYPE);
__ j(equal, masm->isolate()->builtins()->ConstructProxy(), __ j(equal, masm->isolate()->builtins()->ConstructProxy(),
RelocInfo::CODE_TARGET); RelocInfo::CODE_TARGET);

View File

@ -32,9 +32,10 @@
function TestWithProxies(test, x, y, z) { function TestWithProxies(test, x, y, z) {
test(function(h){ return new Proxy({}, h) }, x, y, z) test(function(h){ return new Proxy({}, h) }, x, y, z)
test(function(h) { // TODO(cbruni): enable once we have [[Call]] working.
return Proxy.createFunction(h, function() {}) // test(function(h) {
}, x, y, z) // return Proxy.createFunction(h, function() {})
// }, x, y, z)
} }

View File

@ -87,6 +87,7 @@
# Proxy tests rely on non ES6 version of Proxies # Proxy tests rely on non ES6 version of Proxies
# TODO(neis,cbruni): figure out which Proxy tests can be reused # TODO(neis,cbruni): figure out which Proxy tests can be reused
'es6/classes-proxy' : [SKIP],
'es6/regress/regress-cr493566': [SKIP], 'es6/regress/regress-cr493566': [SKIP],
'for-in-opt': [SKIP], 'for-in-opt': [SKIP],
'harmony/proxies-example-membrane': [SKIP], 'harmony/proxies-example-membrane': [SKIP],