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..c328202fb2f8a2d3d1b3ae53afef086a852fcf25 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(kMachAnyTagged), object, |
+ 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); |
} |