| 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);
|
| }
|
|
|
|
|
|
|