Chromium Code Reviews| Index: src/compiler/ast-graph-builder.cc |
| diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc |
| index 49a67157c7a96866fbd12045e1070ee59c76aace..d418af7d1b0526fca536670a26dd217b7ec084aa 100644 |
| --- a/src/compiler/ast-graph-builder.cc |
| +++ b/src/compiler/ast-graph-builder.cc |
| @@ -6,6 +6,7 @@ |
| #include "src/compiler.h" |
| #include "src/compiler/control-builders.h" |
| +#include "src/compiler/machine-operator.h" |
| #include "src/compiler/node-properties.h" |
| #include "src/compiler/node-properties-inl.h" |
| #include "src/full-codegen.h" |
| @@ -737,13 +738,12 @@ void AstGraphBuilder::VisitForInStatement(ForInStatement* stmt) { |
| test_should_filter.If(should_filter_cond); |
| test_should_filter.Then(); |
| value = environment()->Pop(); |
| - // TODO(dcarney): Better load from function context. |
| - // See comment in BuildLoadBuiltinsObject. |
| - Handle<JSFunction> function(JSFunction::cast( |
| - info()->context()->builtins()->javascript_builtin( |
| - Builtins::FILTER_KEY))); |
| + Node* builtins = BuildLoadBuiltinsObject(); |
| + Node* function = BuildLoadObjectField( |
| + builtins, |
| + JSBuiltinsObject::OffsetOfFunctionWithId(Builtins::FILTER_KEY)); |
| // Callee. |
| - environment()->Push(jsgraph()->HeapConstant(function)); |
| + environment()->Push(function); |
| // Receiver. |
| environment()->Push(obj); |
| // Args. |
| @@ -875,10 +875,11 @@ void AstGraphBuilder::VisitLiteral(Literal* expr) { |
| void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
| - Handle<JSFunction> closure = info()->closure(); |
| + Node* closure = GetFunctionClosure(); |
| // Create node to materialize a regular expression literal. |
| - Node* literals_array = jsgraph()->Constant(handle(closure->literals())); |
| + Node* literals_array = |
| + BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); |
| Node* literal_index = jsgraph()->Constant(expr->literal_index()); |
| Node* pattern = jsgraph()->Constant(expr->pattern()); |
| Node* flags = jsgraph()->Constant(expr->flags()); |
| @@ -889,11 +890,12 @@ void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { |
| void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| - Handle<JSFunction> closure = info()->closure(); |
| + Node* closure = GetFunctionClosure(); |
| // Create node to deep-copy the literal boilerplate. |
| expr->BuildConstantProperties(isolate()); |
| - Node* literals_array = jsgraph()->Constant(handle(closure->literals())); |
| + Node* literals_array = |
| + BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); |
| Node* literal_index = jsgraph()->Constant(expr->literal_index()); |
| Node* constants = jsgraph()->Constant(expr->constant_properties()); |
| Node* flags = jsgraph()->Constant(expr->ComputeFlags()); |
| @@ -998,11 +1000,12 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
| - Handle<JSFunction> closure = info()->closure(); |
| + Node* closure = GetFunctionClosure(); |
| // Create node to deep-copy the literal boilerplate. |
| expr->BuildConstantElements(isolate()); |
| - Node* literals_array = jsgraph()->Constant(handle(closure->literals())); |
| + Node* literals_array = |
| + BuildLoadObjectField(closure, JSFunction::kLiteralsOffset); |
| Node* literal_index = jsgraph()->Constant(expr->literal_index()); |
| Node* constants = jsgraph()->Constant(expr->constant_elements()); |
| Node* flags = jsgraph()->Constant(expr->ComputeFlags()); |
| @@ -1933,25 +1936,28 @@ Node* AstGraphBuilder::BuildVariableAssignment(Variable* variable, Node* value, |
| } |
| +Node* AstGraphBuilder::BuildLoadObjectField(Node* object, int offset) { |
| + // TODO(sigurds) Use simplified load here once it is ready. |
| + MachineOperatorBuilder machine(zone()); |
| + Node* field_load = NewNode(machine.Load(kRepTagged), object, |
|
titzer
2014/08/18 10:20:29
I think you want kAnyTagged here, that's both a ty
sigurds
2014/08/19 11:39:17
Done.
|
| + jsgraph_->Int32Constant(offset - kHeapObjectTag)); |
| + return field_load; |
| +} |
| + |
| + |
| Node* AstGraphBuilder::BuildLoadBuiltinsObject() { |
| - // TODO(mstarzinger): Better load from function context, otherwise optimized |
| - // code cannot be shared across native contexts. |
| - return jsgraph()->Constant(handle(info()->context()->builtins())); |
| + Node* global = BuildLoadGlobalObject(); |
| + Node* builtins = |
| + BuildLoadObjectField(global, JSGlobalObject::kBuiltinsOffset); |
| + return builtins; |
| } |
| Node* AstGraphBuilder::BuildLoadGlobalObject() { |
| -#if 0 |
| Node* context = GetFunctionContext(); |
| - // TODO(mstarzinger): Use mid-level operator on FixedArray instead of the |
| - // JS-level operator that targets JSObject. |
| - Node* index = jsgraph()->Constant(Context::GLOBAL_OBJECT_INDEX); |
| - return NewNode(javascript()->LoadProperty(), context, index); |
| -#else |
| - // TODO(mstarzinger): Better load from function context, otherwise optimized |
| - // code cannot be shared across native contexts. See unused code above. |
| - return jsgraph()->Constant(handle(info()->context()->global_object())); |
| -#endif |
| + Operator* load_op = |
| + javascript()->LoadContext(0, Context::GLOBAL_OBJECT_INDEX, true); |
| + return NewNode(load_op, context); |
| } |