Carry along ContextualMode in JSLoadNamed operators.

R=titzer@chromium.org

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

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22905 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
mstarzinger@chromium.org 2014-08-06 08:50:57 +00:00
parent f771870229
commit b47fe57307
4 changed files with 16 additions and 23 deletions

View File

@ -1685,21 +1685,9 @@ Node* AstGraphBuilder::BuildVariableLoad(Variable* variable,
switch (variable->location()) { switch (variable->location()) {
case Variable::UNALLOCATED: { case Variable::UNALLOCATED: {
// Global var, const, or let variable. // Global var, const, or let variable.
if (!info()->is_native()) {
// TODO(turbofan): This special case is needed only because we don't
// use LoadICs yet. Remove this once LoadNamed is lowered to an IC.
Node* name = jsgraph()->Constant(variable->name());
Runtime::FunctionId function_id =
(contextual_mode == CONTEXTUAL)
? Runtime::kLoadLookupSlot
: Runtime::kLoadLookupSlotNoReferenceError;
Operator* op = javascript()->Runtime(function_id, 2);
Node* pair = NewNode(op, current_context(), name);
return NewNode(common()->Projection(0), pair);
}
Node* global = BuildLoadGlobalObject(); Node* global = BuildLoadGlobalObject();
PrintableUnique<Name> name = MakeUnique(variable->name()); PrintableUnique<Name> name = MakeUnique(variable->name());
Operator* op = javascript()->LoadNamed(name); Operator* op = javascript()->LoadNamed(name, contextual_mode);
return NewNode(op, global); return NewNode(op, global);
} }
case Variable::PARAMETER: case Variable::PARAMETER:

View File

@ -429,11 +429,9 @@ Node* JSGenericLowering::LowerJSLoadProperty(Node* node) {
Node* JSGenericLowering::LowerJSLoadNamed(Node* node) { Node* JSGenericLowering::LowerJSLoadNamed(Node* node) {
PrintableUnique<Name> key = OpParameter<PrintableUnique<Name> >(node); LoadNamedParameters p = OpParameter<LoadNamedParameters>(node);
// TODO(mstarzinger): The ContextualMode needs to be carried along in the LoadICStubShim stub(isolate(), p.contextual_mode);
// operator to use JSLoadNamed for global variable loads. PatchInsertInput(node, 1, jsgraph()->HeapConstant(p.name));
LoadICStubShim stub(isolate(), NOT_CONTEXTUAL);
PatchInsertInput(node, 1, jsgraph()->HeapConstant(key));
ReplaceWithICStubCall(node, &stub); ReplaceWithICStubCall(node, &stub);
return node; return node;
} }

View File

@ -36,6 +36,13 @@ class ContextAccess {
const uint32_t index_; const uint32_t index_;
}; };
// Defines the property being loaded from an object by a named load. This is
// used as a parameter by JSLoadNamed operators.
struct LoadNamedParameters {
PrintableUnique<Name> name;
ContextualMode contextual_mode;
};
// Defines the arity and the call flags for a JavaScript function call. This is // Defines the arity and the call flags for a JavaScript function call. This is
// used as a parameter by JSCall operators. // used as a parameter by JSCall operators.
struct CallParameters { struct CallParameters {
@ -109,9 +116,11 @@ class JSOperatorBuilder {
} }
Operator* LoadProperty() { BINOP(JSLoadProperty); } Operator* LoadProperty() { BINOP(JSLoadProperty); }
Operator* LoadNamed(PrintableUnique<Name> name) { Operator* LoadNamed(PrintableUnique<Name> name,
OP1(JSLoadNamed, PrintableUnique<Name>, name, Operator::kNoProperties, 1, ContextualMode contextual_mode = NOT_CONTEXTUAL) {
1); LoadNamedParameters parameters = {name, contextual_mode};
OP1(JSLoadNamed, LoadNamedParameters, parameters, Operator::kNoProperties,
1, 1);
} }
Operator* StoreProperty() { NOPROPS(JSStoreProperty, 3, 0); } Operator* StoreProperty() { NOPROPS(JSStoreProperty, 3, 0); }

View File

@ -16,8 +16,6 @@ namespace v8 {
namespace internal { namespace internal {
namespace compiler { namespace compiler {
class JSBinopReduction;
// Lowers JS-level operators to simplified operators based on types. // Lowers JS-level operators to simplified operators based on types.
class JSTypedLowering : public LoweringBuilder { class JSTypedLowering : public LoweringBuilder {
public: public: