Commit 5cc4ba59 authored by mstarzinger's avatar mstarzinger Committed by Commit bot

Distinguish Call::CallType::PROPERTY_CALL further.

Most use sites of Call::GetCallType already distinguish the property
call case (i.e. formerly known as Call::PROPERTY_CALL) further. This
introduces this distinction to simplify use sites.

R=rossberg@chromium.org

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

Cr-Commit-Position: refs/heads/master@{#31663}
parent 46878c1d
......@@ -761,7 +761,16 @@ Call::CallType Call::GetCallType(Isolate* isolate) const {
if (expression()->IsSuperCallReference()) return SUPER_CALL;
Property* property = expression()->AsProperty();
return property != NULL ? PROPERTY_CALL : OTHER_CALL;
if (property != nullptr) {
bool is_super = property->IsSuperAccess();
if (property->key()->IsPropertyName()) {
return is_super ? NAMED_SUPER_PROPERTY_CALL : NAMED_PROPERTY_CALL;
} else {
return is_super ? KEYED_SUPER_PROPERTY_CALL : KEYED_PROPERTY_CALL;
}
}
return OTHER_CALL;
}
......
......@@ -1912,7 +1912,10 @@ class Call final : public Expression {
POSSIBLY_EVAL_CALL,
GLOBAL_CALL,
LOOKUP_SLOT_CALL,
PROPERTY_CALL,
NAMED_PROPERTY_CALL,
KEYED_PROPERTY_CALL,
NAMED_SUPER_PROPERTY_CALL,
KEYED_SUPER_PROPERTY_CALL,
SUPER_CALL,
OTHER_CALL
};
......
......@@ -2342,87 +2342,84 @@ void AstGraphBuilder::VisitCall(Call* expr) {
OutputFrameStateCombine::Push(2));
break;
}
case Call::PROPERTY_CALL: {
case Call::NAMED_PROPERTY_CALL: {
Property* property = callee->AsProperty();
VectorSlotPair pair =
VectorSlotPair feedback =
CreateVectorSlotPair(property->PropertyFeedbackSlot());
LhsKind property_type = Property::GetAssignType(property);
switch (property_type) {
case NAMED_PROPERTY: {
VisitForValue(property->obj());
FrameStateBeforeAndAfter states(this, property->obj()->id());
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
Node* object = environment()->Top();
callee_value = BuildNamedLoad(object, name, pair);
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that a PROPERTY_CALL requires the receiver to be wrapped into
// an object for sloppy callees. However the receiver is guaranteed
// not to be null or undefined at this point.
receiver_hint = ConvertReceiverMode::kNotNullOrUndefined;
receiver_value = environment()->Pop();
flags = CALL_AS_METHOD;
break;
}
case KEYED_PROPERTY: {
VisitForValue(property->obj());
VisitForValue(property->key());
FrameStateBeforeAndAfter states(this, property->key()->id());
Node* key = environment()->Pop();
Node* object = environment()->Top();
callee_value = BuildKeyedLoad(object, key, pair);
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that a PROPERTY_CALL requires the receiver to be wrapped into
// an object for sloppy callees. However the receiver is guaranteed
// not to be null or undefined at this point.
receiver_hint = ConvertReceiverMode::kNotNullOrUndefined;
receiver_value = environment()->Pop();
flags = CALL_AS_METHOD;
break;
}
case NAMED_SUPER_PROPERTY: {
SuperPropertyReference* super_ref =
property->obj()->AsSuperPropertyReference();
VisitForValue(super_ref->home_object());
VisitForValue(super_ref->this_var());
Node* home = environment()->Peek(1);
Node* object = environment()->Top();
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
FrameStateBeforeAndAfter states(this, property->obj()->id());
callee_value = BuildNamedSuperLoad(object, home, name, pair);
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that the receiver is not the target of the property load, so
// it could very well be null or undefined at this point.
receiver_value = environment()->Pop();
environment()->Drop(1);
break;
}
case KEYED_SUPER_PROPERTY: {
SuperPropertyReference* super_ref =
property->obj()->AsSuperPropertyReference();
VisitForValue(super_ref->home_object());
VisitForValue(super_ref->this_var());
environment()->Push(environment()->Top()); // Duplicate this_var.
environment()->Push(environment()->Peek(2)); // Duplicate home_obj.
VisitForValue(property->key());
Node* key = environment()->Pop();
Node* home = environment()->Pop();
Node* object = environment()->Pop();
FrameStateBeforeAndAfter states(this, property->key()->id());
callee_value = BuildKeyedSuperLoad(object, home, key, pair);
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that the receiver is not the target of the property load, so
// it could very well be null or undefined at this point.
receiver_value = environment()->Pop();
environment()->Drop(1);
break;
}
case VARIABLE:
UNREACHABLE();
}
VisitForValue(property->obj());
FrameStateBeforeAndAfter states(this, property->obj()->id());
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
Node* object = environment()->Top();
callee_value = BuildNamedLoad(object, name, feedback);
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that a PROPERTY_CALL requires the receiver to be wrapped into
// an object for sloppy callees. However the receiver is guaranteed
// not to be null or undefined at this point.
receiver_hint = ConvertReceiverMode::kNotNullOrUndefined;
receiver_value = environment()->Pop();
flags = CALL_AS_METHOD;
break;
}
case Call::KEYED_PROPERTY_CALL: {
Property* property = callee->AsProperty();
VectorSlotPair feedback =
CreateVectorSlotPair(property->PropertyFeedbackSlot());
VisitForValue(property->obj());
VisitForValue(property->key());
FrameStateBeforeAndAfter states(this, property->key()->id());
Node* key = environment()->Pop();
Node* object = environment()->Top();
callee_value = BuildKeyedLoad(object, key, feedback);
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that a PROPERTY_CALL requires the receiver to be wrapped into
// an object for sloppy callees. However the receiver is guaranteed
// not to be null or undefined at this point.
receiver_hint = ConvertReceiverMode::kNotNullOrUndefined;
receiver_value = environment()->Pop();
flags = CALL_AS_METHOD;
break;
}
case Call::NAMED_SUPER_PROPERTY_CALL: {
Property* property = callee->AsProperty();
SuperPropertyReference* super_ref =
property->obj()->AsSuperPropertyReference();
VisitForValue(super_ref->home_object());
VisitForValue(super_ref->this_var());
Node* home = environment()->Peek(1);
Node* object = environment()->Top();
Handle<Name> name = property->key()->AsLiteral()->AsPropertyName();
FrameStateBeforeAndAfter states(this, property->obj()->id());
callee_value = BuildNamedSuperLoad(object, home, name, VectorSlotPair());
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that the receiver is not the target of the property load, so
// it could very well be null or undefined at this point.
receiver_value = environment()->Pop();
environment()->Drop(1);
break;
}
case Call::KEYED_SUPER_PROPERTY_CALL: {
Property* property = callee->AsProperty();
SuperPropertyReference* super_ref =
property->obj()->AsSuperPropertyReference();
VisitForValue(super_ref->home_object());
VisitForValue(super_ref->this_var());
environment()->Push(environment()->Top()); // Duplicate this_var.
environment()->Push(environment()->Peek(2)); // Duplicate home_obj.
VisitForValue(property->key());
Node* key = environment()->Pop();
Node* home = environment()->Pop();
Node* object = environment()->Pop();
FrameStateBeforeAndAfter states(this, property->key()->id());
callee_value = BuildKeyedSuperLoad(object, home, key, VectorSlotPair());
states.AddToNode(callee_value, property->LoadId(),
OutputFrameStateCombine::Push());
// Note that the receiver is not the target of the property load, so
// it could very well be null or undefined at this point.
receiver_value = environment()->Pop();
environment()->Drop(1);
break;
}
case Call::SUPER_CALL:
......
......@@ -3091,23 +3091,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -2798,23 +2798,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -2978,23 +2978,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -3080,23 +3080,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -3082,23 +3082,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -3084,23 +3084,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -2969,23 +2969,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -2971,23 +2971,18 @@ void FullCodeGenerator::VisitCall(Call* expr) {
// Call to a lookup slot (dynamically introduced variable).
PushCalleeAndWithBaseObject(expr);
EmitCall(expr);
} else if (call_type == Call::PROPERTY_CALL) {
} else if (call_type == Call::NAMED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
bool is_named_call = property->key()->IsPropertyName();
if (property->IsSuperAccess()) {
if (is_named_call) {
EmitSuperCallWithLoadIC(expr);
} else {
EmitKeyedSuperCallWithLoadIC(expr);
}
} else {
VisitForStackValue(property->obj());
if (is_named_call) {
EmitCallWithLoadIC(expr);
} else {
EmitKeyedCallWithLoadIC(expr, property->key());
}
}
VisitForStackValue(property->obj());
EmitCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_PROPERTY_CALL) {
Property* property = callee->AsProperty();
VisitForStackValue(property->obj());
EmitKeyedCallWithLoadIC(expr, property->key());
} else if (call_type == Call::NAMED_SUPER_PROPERTY_CALL) {
EmitSuperCallWithLoadIC(expr);
} else if (call_type == Call::KEYED_SUPER_PROPERTY_CALL) {
EmitKeyedSuperCallWithLoadIC(expr);
} else if (call_type == Call::SUPER_CALL) {
EmitSuperConstructorCall(expr);
} else {
......
......@@ -1412,12 +1412,9 @@ void BytecodeGenerator::VisitCall(Call* expr) {
Register receiver = execution_result()->NextConsecutiveRegister();
switch (call_type) {
case Call::PROPERTY_CALL: {
case Call::NAMED_PROPERTY_CALL:
case Call::KEYED_PROPERTY_CALL: {
Property* property = callee_expr->AsProperty();
if (property->IsSuperAccess()) {
UNIMPLEMENTED();
}
VisitForAccumulatorValue(property->obj());
builder()->StoreAccumulatorInRegister(receiver);
VisitPropertyLoadForAccumulator(receiver, property);
......@@ -1440,6 +1437,8 @@ void BytecodeGenerator::VisitCall(Call* expr) {
builder()->StoreAccumulatorInRegister(callee);
break;
}
case Call::NAMED_SUPER_PROPERTY_CALL:
case Call::KEYED_SUPER_PROPERTY_CALL:
case Call::LOOKUP_SLOT_CALL:
case Call::SUPER_CALL:
case Call::POSSIBLY_EVAL_CALL:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment