Commit ae41c7e4 authored by sigurds@chromium.org's avatar sigurds@chromium.org

Revert "Load global object and builtins from activation."

This reverts commit r23205.

Setting string-type flags in unit tests is not a good idea.

TBR=titzer@chromium.org

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

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23208 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f47ff8f1
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include "src/compiler.h" #include "src/compiler.h"
#include "src/compiler/control-builders.h" #include "src/compiler/control-builders.h"
#include "src/compiler/machine-operator.h"
#include "src/compiler/node-properties.h" #include "src/compiler/node-properties.h"
#include "src/compiler/node-properties-inl.h" #include "src/compiler/node-properties-inl.h"
#include "src/full-codegen.h" #include "src/full-codegen.h"
...@@ -738,12 +737,13 @@ void AstGraphBuilder::VisitForInStatement(ForInStatement* stmt) { ...@@ -738,12 +737,13 @@ void AstGraphBuilder::VisitForInStatement(ForInStatement* stmt) {
test_should_filter.If(should_filter_cond); test_should_filter.If(should_filter_cond);
test_should_filter.Then(); test_should_filter.Then();
value = environment()->Pop(); value = environment()->Pop();
Node* builtins = BuildLoadBuiltinsObject(); // TODO(dcarney): Better load from function context.
Node* function = BuildLoadObjectField( // See comment in BuildLoadBuiltinsObject.
builtins, Handle<JSFunction> function(JSFunction::cast(
JSBuiltinsObject::OffsetOfFunctionWithId(Builtins::FILTER_KEY)); info()->context()->builtins()->javascript_builtin(
Builtins::FILTER_KEY)));
// Callee. // Callee.
environment()->Push(function); environment()->Push(jsgraph()->HeapConstant(function));
// Receiver. // Receiver.
environment()->Push(obj); environment()->Push(obj);
// Args. // Args.
...@@ -875,11 +875,10 @@ void AstGraphBuilder::VisitLiteral(Literal* expr) { ...@@ -875,11 +875,10 @@ void AstGraphBuilder::VisitLiteral(Literal* expr) {
void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) {
Node* closure = GetFunctionClosure(); Handle<JSFunction> closure = info()->closure();
// Create node to materialize a regular expression literal. // Create node to materialize a regular expression literal.
Node* literals_array = Node* literals_array = jsgraph()->Constant(handle(closure->literals()));
BuildLoadObjectField(closure, JSFunction::kLiteralsOffset);
Node* literal_index = jsgraph()->Constant(expr->literal_index()); Node* literal_index = jsgraph()->Constant(expr->literal_index());
Node* pattern = jsgraph()->Constant(expr->pattern()); Node* pattern = jsgraph()->Constant(expr->pattern());
Node* flags = jsgraph()->Constant(expr->flags()); Node* flags = jsgraph()->Constant(expr->flags());
...@@ -890,12 +889,11 @@ void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { ...@@ -890,12 +889,11 @@ void AstGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) {
void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
Node* closure = GetFunctionClosure(); Handle<JSFunction> closure = info()->closure();
// Create node to deep-copy the literal boilerplate. // Create node to deep-copy the literal boilerplate.
expr->BuildConstantProperties(isolate()); expr->BuildConstantProperties(isolate());
Node* literals_array = Node* literals_array = jsgraph()->Constant(handle(closure->literals()));
BuildLoadObjectField(closure, JSFunction::kLiteralsOffset);
Node* literal_index = jsgraph()->Constant(expr->literal_index()); Node* literal_index = jsgraph()->Constant(expr->literal_index());
Node* constants = jsgraph()->Constant(expr->constant_properties()); Node* constants = jsgraph()->Constant(expr->constant_properties());
Node* flags = jsgraph()->Constant(expr->ComputeFlags()); Node* flags = jsgraph()->Constant(expr->ComputeFlags());
...@@ -1000,12 +998,11 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -1000,12 +998,11 @@ void AstGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { void AstGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
Node* closure = GetFunctionClosure(); Handle<JSFunction> closure = info()->closure();
// Create node to deep-copy the literal boilerplate. // Create node to deep-copy the literal boilerplate.
expr->BuildConstantElements(isolate()); expr->BuildConstantElements(isolate());
Node* literals_array = Node* literals_array = jsgraph()->Constant(handle(closure->literals()));
BuildLoadObjectField(closure, JSFunction::kLiteralsOffset);
Node* literal_index = jsgraph()->Constant(expr->literal_index()); Node* literal_index = jsgraph()->Constant(expr->literal_index());
Node* constants = jsgraph()->Constant(expr->constant_elements()); Node* constants = jsgraph()->Constant(expr->constant_elements());
Node* flags = jsgraph()->Constant(expr->ComputeFlags()); Node* flags = jsgraph()->Constant(expr->ComputeFlags());
...@@ -1941,28 +1938,25 @@ Node* AstGraphBuilder::BuildVariableAssignment(Variable* variable, Node* value, ...@@ -1941,28 +1938,25 @@ 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() { Node* AstGraphBuilder::BuildLoadBuiltinsObject() {
Node* global = BuildLoadGlobalObject(); // TODO(mstarzinger): Better load from function context, otherwise optimized
Node* builtins = // code cannot be shared across native contexts.
BuildLoadObjectField(global, JSGlobalObject::kBuiltinsOffset); return jsgraph()->Constant(handle(info()->context()->builtins()));
return builtins;
} }
Node* AstGraphBuilder::BuildLoadGlobalObject() { Node* AstGraphBuilder::BuildLoadGlobalObject() {
#if 0
Node* context = GetFunctionContext(); Node* context = GetFunctionContext();
Operator* load_op = // TODO(mstarzinger): Use mid-level operator on FixedArray instead of the
javascript()->LoadContext(0, Context::GLOBAL_OBJECT_INDEX, true); // JS-level operator that targets JSObject.
return NewNode(load_op, context); 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
} }
......
...@@ -88,7 +88,6 @@ class AstGraphBuilder : public StructuredGraphBuilder, public AstVisitor { ...@@ -88,7 +88,6 @@ class AstGraphBuilder : public StructuredGraphBuilder, public AstVisitor {
Node* BuildLoadBuiltinsObject(); Node* BuildLoadBuiltinsObject();
Node* BuildLoadGlobalObject(); Node* BuildLoadGlobalObject();
Node* BuildLoadClosure(); Node* BuildLoadClosure();
Node* BuildLoadObjectField(Node* object, int offset);
// Builders for automatic type conversion. // Builders for automatic type conversion.
Node* BuildToBoolean(Node* value); Node* BuildToBoolean(Node* value);
......
...@@ -245,88 +245,3 @@ TEST(CallEval) { ...@@ -245,88 +245,3 @@ TEST(CallEval) {
T.CheckCall(T.Val(42), T.Val("x"), T.undefined()); T.CheckCall(T.Val(42), T.Val("x"), T.undefined());
} }
#if V8_TURBOFAN_TARGET
TEST(ContextLoadedFromActivation) {
i::FLAG_turbo_filter = "*";
i::FLAG_always_opt = true;
i::FLAG_context_specialization = false;
const char* script =
"var x = 42;"
"(function() {"
" return function () { return x };"
"})()";
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope outer(isolate);
v8::Local<v8::Value> fun;
{
v8::Local<v8::Context> env = v8::Context::New(isolate);
env->Enter();
CompileRun("var x = 42;");
fun = CompileRun(script);
env->Global()->Set(v8_str("foo"), fun);
ExpectInt32("foo();", 42);
env->Exit();
}
{
v8::Local<v8::Context> env = v8::Context::New(isolate);
env->Enter();
v8::Local<v8::Value> fun2 = CompileRun(script);
i::Handle<i::Object> oifun = v8::Utils::OpenHandle(*fun);
i::Handle<i::JSFunction> ifun = Handle<JSFunction>::cast(oifun);
i::Handle<i::Object> oifun2 = v8::Utils::OpenHandle(*fun2);
i::Handle<i::JSFunction> ifun2 = Handle<JSFunction>::cast(oifun2);
ifun2->set_code(ifun->code());
env->Global()->Set(v8_str("foo"), fun2);
CompileRun("var x = 24;");
ExpectInt32("foo();", 24);
env->Exit();
}
}
TEST(BuiltinLoadedFromActivation) {
i::FLAG_turbo_filter = "*";
i::FLAG_always_opt = true;
i::FLAG_context_specialization = false;
const char* script =
"var x = 42;"
"(function() {"
" return function () { return this; };"
"})()";
v8::Isolate* isolate = CcTest::isolate();
v8::HandleScope outer(isolate);
v8::Local<v8::Value> fun;
{
v8::Local<v8::Context> env = v8::Context::New(isolate);
env->Enter();
CompileRun("var x = 42;");
fun = CompileRun(script);
env->Global()->Set(v8_str("foo"), fun);
ExpectObject("foo()", env->Global());
env->Exit();
}
{
v8::Local<v8::Context> env = v8::Context::New(isolate);
env->Enter();
v8::Local<v8::Value> fun2 = CompileRun(script);
i::Handle<i::Object> oifun = v8::Utils::OpenHandle(*fun);
i::Handle<i::JSFunction> ifun = Handle<JSFunction>::cast(oifun);
i::Handle<i::Object> oifun2 = v8::Utils::OpenHandle(*fun2);
i::Handle<i::JSFunction> ifun2 = Handle<JSFunction>::cast(oifun2);
ifun2->set_code(ifun->code());
env->Global()->Set(v8_str("foo"), fun2);
CompileRun("var x = 24;");
ExpectObject("foo()", env->Global());
env->Exit();
}
}
#endif // V8_TURBO_TARGET
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