Commit 912ec759 authored by whesse@chromium.org's avatar whesse@chromium.org

Revert "First step in letting Crankshaft inline functions with a different context."

This reverts commit r7807.  TBR=kmillikin@chromium.org.

BUG=
TEST=

Review URL: http://codereview.chromium.org/6928061

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7810 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 913ce07e
...@@ -1015,8 +1015,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1015,8 +1015,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
outer); outer);
int argument_index = 0; int argument_index = 0;
for (int i = 0; i < value_count; ++i) { for (int i = 0; i < value_count; ++i) {
if (hydrogen_env->is_special_index(i)) continue;
HValue* value = hydrogen_env->values()->at(i); HValue* value = hydrogen_env->values()->at(i);
LOperand* op = NULL; LOperand* op = NULL;
if (value->IsArgumentsObject()) { if (value->IsArgumentsObject()) {
......
...@@ -3311,7 +3311,7 @@ class HLoadKeyedSpecializedArrayElement: public HBinaryOperation { ...@@ -3311,7 +3311,7 @@ class HLoadKeyedSpecializedArrayElement: public HBinaryOperation {
class HLoadKeyedGeneric: public HTemplateInstruction<3> { class HLoadKeyedGeneric: public HTemplateInstruction<3> {
public: public:
HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { HLoadKeyedGeneric(HContext* context, HValue* obj, HValue* key) {
set_representation(Representation::Tagged()); set_representation(Representation::Tagged());
SetOperandAt(0, obj); SetOperandAt(0, obj);
SetOperandAt(1, key); SetOperandAt(1, key);
......
...@@ -2229,21 +2229,14 @@ void HGraphBuilder::SetupScope(Scope* scope) { ...@@ -2229,21 +2229,14 @@ void HGraphBuilder::SetupScope(Scope* scope) {
// Set the initial values of parameters including "this". "This" has // Set the initial values of parameters including "this". "This" has
// parameter index 0. // parameter index 0.
ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count()); int count = scope->num_parameters() + 1;
for (int i = 0; i < count; ++i) {
for (int i = 0; i < environment()->parameter_count(); ++i) {
HInstruction* parameter = AddInstruction(new(zone()) HParameter(i)); HInstruction* parameter = AddInstruction(new(zone()) HParameter(i));
environment()->Bind(i, parameter); environment()->Bind(i, parameter);
} }
// First special is HContext. // Set the initial values of stack-allocated locals.
HInstruction* context = AddInstruction(new(zone()) HContext); for (int i = count; i < environment()->length(); ++i) {
environment()->BindContext(context);
// Initialize specials and locals to undefined.
for (int i = environment()->parameter_count() + 1;
i < environment()->length();
++i) {
environment()->Bind(i, undefined_constant); environment()->Bind(i, undefined_constant);
} }
...@@ -2600,18 +2593,17 @@ void HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) { ...@@ -2600,18 +2593,17 @@ void HGraphBuilder::PreProcessOsrEntry(IterationStatement* statement) {
int osr_entry_id = statement->OsrEntryId(); int osr_entry_id = statement->OsrEntryId();
// We want the correct environment at the OsrEntry instruction. Build // We want the correct environment at the OsrEntry instruction. Build
// it explicitly. The expression stack should be empty. // it explicitly. The expression stack should be empty.
ASSERT(environment()->ExpressionStackIsEmpty()); int count = environment()->length();
for (int i = 0; i < environment()->length(); ++i) { ASSERT(count ==
HUnknownOSRValue* osr_value = new(zone()) HUnknownOSRValue; (environment()->parameter_count() + environment()->local_count()));
AddInstruction(osr_value); for (int i = 0; i < count; ++i) {
environment()->Bind(i, osr_value); HUnknownOSRValue* unknown = new(zone()) HUnknownOSRValue;
AddInstruction(unknown);
environment()->Bind(i, unknown);
} }
AddSimulate(osr_entry_id); AddSimulate(osr_entry_id);
AddInstruction(new(zone()) HOsrEntry(osr_entry_id)); AddInstruction(new(zone()) HOsrEntry(osr_entry_id));
HContext* context = new(zone()) HContext;
AddInstruction(context);
environment()->BindContext(context);
current_block()->Goto(loop_predecessor); current_block()->Goto(loop_predecessor);
loop_predecessor->SetJoinId(statement->EntryId()); loop_predecessor->SetJoinId(statement->EntryId());
set_current_block(loop_predecessor); set_current_block(loop_predecessor);
...@@ -2894,12 +2886,12 @@ HGraphBuilder::GlobalPropertyAccess HGraphBuilder::LookupGlobalProperty( ...@@ -2894,12 +2886,12 @@ HGraphBuilder::GlobalPropertyAccess HGraphBuilder::LookupGlobalProperty(
HValue* HGraphBuilder::BuildContextChainWalk(Variable* var) { HValue* HGraphBuilder::BuildContextChainWalk(Variable* var) {
ASSERT(var->IsContextSlot()); ASSERT(var->IsContextSlot());
HValue* context = environment()->LookupContext(); HInstruction* context = new(zone()) HContext;
AddInstruction(context);
int length = info()->scope()->ContextChainLength(var->scope()); int length = info()->scope()->ContextChainLength(var->scope());
while (length-- > 0) { while (length-- > 0) {
HInstruction* context_instruction = new(zone()) HOuterContext(context); context = new(zone()) HOuterContext(context);
AddInstruction(context_instruction); AddInstruction(context);
context = context_instruction;
} }
return context; return context;
} }
...@@ -2938,7 +2930,8 @@ void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) { ...@@ -2938,7 +2930,8 @@ void HGraphBuilder::VisitVariableProxy(VariableProxy* expr) {
HLoadGlobalCell* instr = new(zone()) HLoadGlobalCell(cell, check_hole); HLoadGlobalCell* instr = new(zone()) HLoadGlobalCell(cell, check_hole);
ast_context()->ReturnInstruction(instr, expr->id()); ast_context()->ReturnInstruction(instr, expr->id());
} else { } else {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HGlobalObject* global_object = new(zone()) HGlobalObject(context); HGlobalObject* global_object = new(zone()) HGlobalObject(context);
AddInstruction(global_object); AddInstruction(global_object);
HLoadGlobalGeneric* instr = HLoadGlobalGeneric* instr =
...@@ -2981,7 +2974,8 @@ void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { ...@@ -2981,7 +2974,8 @@ void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) {
ASSERT(!HasStackOverflow()); ASSERT(!HasStackOverflow());
ASSERT(current_block() != NULL); ASSERT(current_block() != NULL);
ASSERT(current_block()->HasPredecessor()); ASSERT(current_block()->HasPredecessor());
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HObjectLiteral* literal = HObjectLiteral* literal =
new(zone()) HObjectLiteral(context, new(zone()) HObjectLiteral(context,
expr->constant_properties(), expr->constant_properties(),
...@@ -3163,7 +3157,8 @@ HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object, ...@@ -3163,7 +3157,8 @@ HInstruction* HGraphBuilder::BuildStoreNamedField(HValue* object,
HInstruction* HGraphBuilder::BuildStoreNamedGeneric(HValue* object, HInstruction* HGraphBuilder::BuildStoreNamedGeneric(HValue* object,
Handle<String> name, Handle<String> name,
HValue* value) { HValue* value) {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
return new(zone()) HStoreNamedGeneric( return new(zone()) HStoreNamedGeneric(
context, context,
object, object,
...@@ -3339,7 +3334,8 @@ void HGraphBuilder::HandleGlobalVariableAssignment(Variable* var, ...@@ -3339,7 +3334,8 @@ void HGraphBuilder::HandleGlobalVariableAssignment(Variable* var,
AddInstruction(instr); AddInstruction(instr);
if (instr->HasSideEffects()) AddSimulate(ast_id); if (instr->HasSideEffects()) AddSimulate(ast_id);
} else { } else {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HGlobalObject* global_object = new(zone()) HGlobalObject(context); HGlobalObject* global_object = new(zone()) HGlobalObject(context);
AddInstruction(global_object); AddInstruction(global_object);
HStoreGlobalGeneric* instr = HStoreGlobalGeneric* instr =
...@@ -3564,7 +3560,8 @@ HInstruction* HGraphBuilder::BuildLoadNamedGeneric(HValue* obj, ...@@ -3564,7 +3560,8 @@ HInstruction* HGraphBuilder::BuildLoadNamedGeneric(HValue* obj,
Property* expr) { Property* expr) {
ASSERT(expr->key()->IsPropertyName()); ASSERT(expr->key()->IsPropertyName());
Handle<Object> name = expr->key()->AsLiteral()->handle(); Handle<Object> name = expr->key()->AsLiteral()->handle();
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
return new(zone()) HLoadNamedGeneric(context, obj, name); return new(zone()) HLoadNamedGeneric(context, obj, name);
} }
...@@ -3594,7 +3591,8 @@ HInstruction* HGraphBuilder::BuildLoadNamed(HValue* obj, ...@@ -3594,7 +3591,8 @@ HInstruction* HGraphBuilder::BuildLoadNamed(HValue* obj,
HInstruction* HGraphBuilder::BuildLoadKeyedGeneric(HValue* object, HInstruction* HGraphBuilder::BuildLoadKeyedGeneric(HValue* object,
HValue* key) { HValue* key) {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
return new(zone()) HLoadKeyedGeneric(context, object, key); return new(zone()) HLoadKeyedGeneric(context, object, key);
} }
...@@ -3669,7 +3667,8 @@ HInstruction* HGraphBuilder::BuildLoadKeyed(HValue* obj, ...@@ -3669,7 +3667,8 @@ HInstruction* HGraphBuilder::BuildLoadKeyed(HValue* obj,
HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object, HInstruction* HGraphBuilder::BuildStoreKeyedGeneric(HValue* object,
HValue* key, HValue* key,
HValue* value) { HValue* value) {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
return new(zone()) HStoreKeyedGeneric( return new(zone()) HStoreKeyedGeneric(
context, context,
object, object,
...@@ -3922,7 +3921,8 @@ void HGraphBuilder::HandlePolymorphicCallNamed(Call* expr, ...@@ -3922,7 +3921,8 @@ void HGraphBuilder::HandlePolymorphicCallNamed(Call* expr,
if (count == types->length() && FLAG_deoptimize_uncommon_cases) { if (count == types->length() && FLAG_deoptimize_uncommon_cases) {
current_block()->FinishExitWithDeoptimization(); current_block()->FinishExitWithDeoptimization();
} else { } else {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallNamed* call = new(zone()) HCallNamed(context, name, argument_count); HCallNamed* call = new(zone()) HCallNamed(context, name, argument_count);
call->set_position(expr->position()); call->set_position(expr->position());
PreProcessCall(call); PreProcessCall(call);
...@@ -4349,7 +4349,8 @@ void HGraphBuilder::VisitCall(Call* expr) { ...@@ -4349,7 +4349,8 @@ void HGraphBuilder::VisitCall(Call* expr) {
CHECK_ALIVE(VisitExpressions(expr->arguments())); CHECK_ALIVE(VisitExpressions(expr->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
call = PreProcessCall( call = PreProcessCall(
new(zone()) HCallKeyed(context, key, argument_count)); new(zone()) HCallKeyed(context, key, argument_count));
call->set_position(expr->position()); call->set_position(expr->position());
...@@ -4388,7 +4389,8 @@ void HGraphBuilder::VisitCall(Call* expr) { ...@@ -4388,7 +4389,8 @@ void HGraphBuilder::VisitCall(Call* expr) {
// When the target has a custom call IC generator, use the IC, // When the target has a custom call IC generator, use the IC,
// because it is likely to generate better code. Also use the IC // because it is likely to generate better code. Also use the IC
// when a primitive receiver check is required. // when a primitive receiver check is required.
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
call = PreProcessCall( call = PreProcessCall(
new(zone()) HCallNamed(context, name, argument_count)); new(zone()) HCallNamed(context, name, argument_count));
} else { } else {
...@@ -4405,7 +4407,8 @@ void HGraphBuilder::VisitCall(Call* expr) { ...@@ -4405,7 +4407,8 @@ void HGraphBuilder::VisitCall(Call* expr) {
return; return;
} else { } else {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
call = PreProcessCall( call = PreProcessCall(
new(zone()) HCallNamed(context, name, argument_count)); new(zone()) HCallNamed(context, name, argument_count));
} }
...@@ -4434,8 +4437,9 @@ void HGraphBuilder::VisitCall(Call* expr) { ...@@ -4434,8 +4437,9 @@ void HGraphBuilder::VisitCall(Call* expr) {
if (known_global_function) { if (known_global_function) {
// Push the global object instead of the global receiver because // Push the global object instead of the global receiver because
// code generated by the full code generator expects it. // code generated by the full code generator expects it.
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
HGlobalObject* global_object = new(zone()) HGlobalObject(context); HGlobalObject* global_object = new(zone()) HGlobalObject(context);
AddInstruction(context);
PushAndAdd(global_object); PushAndAdd(global_object);
CHECK_ALIVE(VisitExpressions(expr->arguments())); CHECK_ALIVE(VisitExpressions(expr->arguments()));
...@@ -4457,7 +4461,8 @@ void HGraphBuilder::VisitCall(Call* expr) { ...@@ -4457,7 +4461,8 @@ void HGraphBuilder::VisitCall(Call* expr) {
call = PreProcessCall(new(zone()) HCallKnownGlobal(expr->target(), call = PreProcessCall(new(zone()) HCallKnownGlobal(expr->target(),
argument_count)); argument_count));
} else { } else {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
PushAndAdd(new(zone()) HGlobalObject(context)); PushAndAdd(new(zone()) HGlobalObject(context));
CHECK_ALIVE(VisitExpressions(expr->arguments())); CHECK_ALIVE(VisitExpressions(expr->arguments()));
...@@ -4467,8 +4472,9 @@ void HGraphBuilder::VisitCall(Call* expr) { ...@@ -4467,8 +4472,9 @@ void HGraphBuilder::VisitCall(Call* expr) {
} }
} else { } else {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
HGlobalObject* global_object = new(zone()) HGlobalObject(context); HGlobalObject* global_object = new(zone()) HGlobalObject(context);
AddInstruction(context);
AddInstruction(global_object); AddInstruction(global_object);
PushAndAdd(new(zone()) HGlobalReceiver(global_object)); PushAndAdd(new(zone()) HGlobalReceiver(global_object));
CHECK_ALIVE(VisitExpressions(expr->arguments())); CHECK_ALIVE(VisitExpressions(expr->arguments()));
...@@ -4491,7 +4497,8 @@ void HGraphBuilder::VisitCallNew(CallNew* expr) { ...@@ -4491,7 +4497,8 @@ void HGraphBuilder::VisitCallNew(CallNew* expr) {
CHECK_ALIVE(VisitForValue(expr->expression())); CHECK_ALIVE(VisitForValue(expr->expression()));
CHECK_ALIVE(VisitExpressions(expr->arguments())); CHECK_ALIVE(VisitExpressions(expr->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
// The constructor is both an operand to the instruction and an argument // The constructor is both an operand to the instruction and an argument
// to the construct call. // to the construct call.
...@@ -5114,7 +5121,8 @@ void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) { ...@@ -5114,7 +5121,8 @@ void HGraphBuilder::VisitCompareOperation(CompareOperation* expr) {
// If the target is not null we have found a known global function that is // If the target is not null we have found a known global function that is
// assumed to stay the same for this instanceof. // assumed to stay the same for this instanceof.
if (target.is_null()) { if (target.is_null()) {
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
instr = new(zone()) HInstanceOf(context, left, right); instr = new(zone()) HInstanceOf(context, left, right);
} else { } else {
AddInstruction(new(zone()) HCheckFunction(right, target)); AddInstruction(new(zone()) HCheckFunction(right, target));
...@@ -5390,7 +5398,8 @@ void HGraphBuilder::GenerateRandomHeapNumber(CallRuntime* call) { ...@@ -5390,7 +5398,8 @@ void HGraphBuilder::GenerateRandomHeapNumber(CallRuntime* call) {
void HGraphBuilder::GenerateStringAdd(CallRuntime* call) { void HGraphBuilder::GenerateStringAdd(CallRuntime* call) {
ASSERT_EQ(2, call->arguments()->length()); ASSERT_EQ(2, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = new(zone()) HCallStub(context, CodeStub::StringAdd, 2); HCallStub* result = new(zone()) HCallStub(context, CodeStub::StringAdd, 2);
Drop(2); Drop(2);
ast_context()->ReturnInstruction(result, call->id()); ast_context()->ReturnInstruction(result, call->id());
...@@ -5401,7 +5410,8 @@ void HGraphBuilder::GenerateStringAdd(CallRuntime* call) { ...@@ -5401,7 +5410,8 @@ void HGraphBuilder::GenerateStringAdd(CallRuntime* call) {
void HGraphBuilder::GenerateSubString(CallRuntime* call) { void HGraphBuilder::GenerateSubString(CallRuntime* call) {
ASSERT_EQ(3, call->arguments()->length()); ASSERT_EQ(3, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = new(zone()) HCallStub(context, CodeStub::SubString, 3); HCallStub* result = new(zone()) HCallStub(context, CodeStub::SubString, 3);
Drop(3); Drop(3);
ast_context()->ReturnInstruction(result, call->id()); ast_context()->ReturnInstruction(result, call->id());
...@@ -5412,7 +5422,8 @@ void HGraphBuilder::GenerateSubString(CallRuntime* call) { ...@@ -5412,7 +5422,8 @@ void HGraphBuilder::GenerateSubString(CallRuntime* call) {
void HGraphBuilder::GenerateStringCompare(CallRuntime* call) { void HGraphBuilder::GenerateStringCompare(CallRuntime* call) {
ASSERT_EQ(2, call->arguments()->length()); ASSERT_EQ(2, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = HCallStub* result =
new(zone()) HCallStub(context, CodeStub::StringCompare, 2); new(zone()) HCallStub(context, CodeStub::StringCompare, 2);
Drop(2); Drop(2);
...@@ -5424,7 +5435,8 @@ void HGraphBuilder::GenerateStringCompare(CallRuntime* call) { ...@@ -5424,7 +5435,8 @@ void HGraphBuilder::GenerateStringCompare(CallRuntime* call) {
void HGraphBuilder::GenerateRegExpExec(CallRuntime* call) { void HGraphBuilder::GenerateRegExpExec(CallRuntime* call) {
ASSERT_EQ(4, call->arguments()->length()); ASSERT_EQ(4, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = new(zone()) HCallStub(context, CodeStub::RegExpExec, 4); HCallStub* result = new(zone()) HCallStub(context, CodeStub::RegExpExec, 4);
Drop(4); Drop(4);
ast_context()->ReturnInstruction(result, call->id()); ast_context()->ReturnInstruction(result, call->id());
...@@ -5435,7 +5447,8 @@ void HGraphBuilder::GenerateRegExpExec(CallRuntime* call) { ...@@ -5435,7 +5447,8 @@ void HGraphBuilder::GenerateRegExpExec(CallRuntime* call) {
void HGraphBuilder::GenerateRegExpConstructResult(CallRuntime* call) { void HGraphBuilder::GenerateRegExpConstructResult(CallRuntime* call) {
ASSERT_EQ(3, call->arguments()->length()); ASSERT_EQ(3, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = HCallStub* result =
new(zone()) HCallStub(context, CodeStub::RegExpConstructResult, 3); new(zone()) HCallStub(context, CodeStub::RegExpConstructResult, 3);
Drop(3); Drop(3);
...@@ -5453,7 +5466,8 @@ void HGraphBuilder::GenerateGetFromCache(CallRuntime* call) { ...@@ -5453,7 +5466,8 @@ void HGraphBuilder::GenerateGetFromCache(CallRuntime* call) {
void HGraphBuilder::GenerateNumberToString(CallRuntime* call) { void HGraphBuilder::GenerateNumberToString(CallRuntime* call) {
ASSERT_EQ(1, call->arguments()->length()); ASSERT_EQ(1, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = HCallStub* result =
new(zone()) HCallStub(context, CodeStub::NumberToString, 1); new(zone()) HCallStub(context, CodeStub::NumberToString, 1);
Drop(1); Drop(1);
...@@ -5480,7 +5494,8 @@ void HGraphBuilder::GenerateCallFunction(CallRuntime* call) { ...@@ -5480,7 +5494,8 @@ void HGraphBuilder::GenerateCallFunction(CallRuntime* call) {
} }
CHECK_ALIVE(VisitForValue(call->arguments()->last())); CHECK_ALIVE(VisitForValue(call->arguments()->last()));
HValue* function = Pop(); HValue* function = Pop();
HValue* context = environment()->LookupContext(); HContext* context = new HContext;
AddInstruction(context);
HInvokeFunction* result = HInvokeFunction* result =
new(zone()) HInvokeFunction(context, function, arg_count); new(zone()) HInvokeFunction(context, function, arg_count);
Drop(arg_count); Drop(arg_count);
...@@ -5503,7 +5518,8 @@ void HGraphBuilder::GenerateMathPow(CallRuntime* call) { ...@@ -5503,7 +5518,8 @@ void HGraphBuilder::GenerateMathPow(CallRuntime* call) {
void HGraphBuilder::GenerateMathSin(CallRuntime* call) { void HGraphBuilder::GenerateMathSin(CallRuntime* call) {
ASSERT_EQ(1, call->arguments()->length()); ASSERT_EQ(1, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = HCallStub* result =
new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1); new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1);
result->set_transcendental_type(TranscendentalCache::SIN); result->set_transcendental_type(TranscendentalCache::SIN);
...@@ -5515,7 +5531,8 @@ void HGraphBuilder::GenerateMathSin(CallRuntime* call) { ...@@ -5515,7 +5531,8 @@ void HGraphBuilder::GenerateMathSin(CallRuntime* call) {
void HGraphBuilder::GenerateMathCos(CallRuntime* call) { void HGraphBuilder::GenerateMathCos(CallRuntime* call) {
ASSERT_EQ(1, call->arguments()->length()); ASSERT_EQ(1, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = HCallStub* result =
new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1); new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1);
result->set_transcendental_type(TranscendentalCache::COS); result->set_transcendental_type(TranscendentalCache::COS);
...@@ -5527,7 +5544,8 @@ void HGraphBuilder::GenerateMathCos(CallRuntime* call) { ...@@ -5527,7 +5544,8 @@ void HGraphBuilder::GenerateMathCos(CallRuntime* call) {
void HGraphBuilder::GenerateMathLog(CallRuntime* call) { void HGraphBuilder::GenerateMathLog(CallRuntime* call) {
ASSERT_EQ(1, call->arguments()->length()); ASSERT_EQ(1, call->arguments()->length());
CHECK_ALIVE(VisitArgumentList(call->arguments())); CHECK_ALIVE(VisitArgumentList(call->arguments()));
HValue* context = environment()->LookupContext(); HContext* context = new(zone()) HContext;
AddInstruction(context);
HCallStub* result = HCallStub* result =
new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1); new(zone()) HCallStub(context, CodeStub::TranscendentalCache, 1);
result->set_transcendental_type(TranscendentalCache::LOG); result->set_transcendental_type(TranscendentalCache::LOG);
...@@ -5572,7 +5590,6 @@ HEnvironment::HEnvironment(HEnvironment* outer, ...@@ -5572,7 +5590,6 @@ HEnvironment::HEnvironment(HEnvironment* outer,
values_(0), values_(0),
assigned_variables_(4), assigned_variables_(4),
parameter_count_(0), parameter_count_(0),
specials_count_(1),
local_count_(0), local_count_(0),
outer_(outer), outer_(outer),
pop_count_(0), pop_count_(0),
...@@ -5586,7 +5603,6 @@ HEnvironment::HEnvironment(const HEnvironment* other) ...@@ -5586,7 +5603,6 @@ HEnvironment::HEnvironment(const HEnvironment* other)
: values_(0), : values_(0),
assigned_variables_(0), assigned_variables_(0),
parameter_count_(0), parameter_count_(0),
specials_count_(1),
local_count_(0), local_count_(0),
outer_(NULL), outer_(NULL),
pop_count_(0), pop_count_(0),
...@@ -5603,7 +5619,7 @@ void HEnvironment::Initialize(int parameter_count, ...@@ -5603,7 +5619,7 @@ void HEnvironment::Initialize(int parameter_count,
local_count_ = local_count; local_count_ = local_count;
// Avoid reallocating the temporaries' backing store on the first Push. // Avoid reallocating the temporaries' backing store on the first Push.
int total = parameter_count + specials_count_ + local_count + stack_height; int total = parameter_count + local_count + stack_height;
values_.Initialize(total + 4); values_.Initialize(total + 4);
for (int i = 0; i < total; ++i) values_.Add(NULL); for (int i = 0; i < total; ++i) values_.Add(NULL);
} }
...@@ -5662,12 +5678,12 @@ void HEnvironment::Bind(int index, HValue* value) { ...@@ -5662,12 +5678,12 @@ void HEnvironment::Bind(int index, HValue* value) {
bool HEnvironment::HasExpressionAt(int index) const { bool HEnvironment::HasExpressionAt(int index) const {
return index >= parameter_count_ + specials_count_ + local_count_; return index >= parameter_count_ + local_count_;
} }
bool HEnvironment::ExpressionStackIsEmpty() const { bool HEnvironment::ExpressionStackIsEmpty() const {
int first_expression = parameter_count() + specials_count() + local_count(); int first_expression = parameter_count() + local_count();
ASSERT(length() >= first_expression); ASSERT(length() >= first_expression);
return length() == first_expression; return length() == first_expression;
} }
...@@ -5745,9 +5761,12 @@ HEnvironment* HEnvironment::CopyForInlining(Handle<JSFunction> target, ...@@ -5745,9 +5761,12 @@ HEnvironment* HEnvironment::CopyForInlining(Handle<JSFunction> target,
inner->SetValueAt(i, push); inner->SetValueAt(i, push);
} }
} }
inner->SetValueAt(arity + 1, outer->LookupContext());
for (int i = arity + 2; i < inner->length(); ++i) { // Initialize the stack-allocated locals to undefined.
inner->SetValueAt(i, undefined); int local_base = arity + 1;
int local_count = function->scope()->num_stack_slots();
for (int i = 0; i < local_count; ++i) {
inner->SetValueAt(local_base + i, undefined);
} }
inner->set_ast_id(AstNode::kFunctionEntryId); inner->set_ast_id(AstNode::kFunctionEntryId);
...@@ -5758,11 +5777,8 @@ HEnvironment* HEnvironment::CopyForInlining(Handle<JSFunction> target, ...@@ -5758,11 +5777,8 @@ HEnvironment* HEnvironment::CopyForInlining(Handle<JSFunction> target,
void HEnvironment::PrintTo(StringStream* stream) { void HEnvironment::PrintTo(StringStream* stream) {
for (int i = 0; i < length(); i++) { for (int i = 0; i < length(); i++) {
if (i == 0) stream->Add("parameters\n"); if (i == 0) stream->Add("parameters\n");
if (i == parameter_count()) stream->Add("specials\n"); if (i == parameter_count()) stream->Add("locals\n");
if (i == parameter_count() + specials_count()) stream->Add("locals\n"); if (i == parameter_count() + local_count()) stream->Add("expressions");
if (i == parameter_count() + specials_count() + local_count()) {
stream->Add("expressions");
}
HValue* val = values_.at(i); HValue* val = values_.at(i);
stream->Add("%d: ", i); stream->Add("%d: ", i);
if (val != NULL) { if (val != NULL) {
......
...@@ -322,7 +322,6 @@ class HEnvironment: public ZoneObject { ...@@ -322,7 +322,6 @@ class HEnvironment: public ZoneObject {
return &assigned_variables_; return &assigned_variables_;
} }
int parameter_count() const { return parameter_count_; } int parameter_count() const { return parameter_count_; }
int specials_count() const { return specials_count_; }
int local_count() const { return local_count_; } int local_count() const { return local_count_; }
HEnvironment* outer() const { return outer_; } HEnvironment* outer() const { return outer_; }
int pop_count() const { return pop_count_; } int pop_count() const { return pop_count_; }
...@@ -332,9 +331,6 @@ class HEnvironment: public ZoneObject { ...@@ -332,9 +331,6 @@ class HEnvironment: public ZoneObject {
void set_ast_id(int id) { ast_id_ = id; } void set_ast_id(int id) { ast_id_ = id; }
int length() const { return values_.length(); } int length() const { return values_.length(); }
bool is_special_index(int i) const {
return i >= parameter_count() && i < parameter_count() + specials_count();
}
void Bind(Variable* variable, HValue* value) { void Bind(Variable* variable, HValue* value) {
Bind(IndexFor(variable), value); Bind(IndexFor(variable), value);
...@@ -342,10 +338,6 @@ class HEnvironment: public ZoneObject { ...@@ -342,10 +338,6 @@ class HEnvironment: public ZoneObject {
void Bind(int index, HValue* value); void Bind(int index, HValue* value);
void BindContext(HValue* value) {
Bind(parameter_count(), value);
}
HValue* Lookup(Variable* variable) const { HValue* Lookup(Variable* variable) const {
return Lookup(IndexFor(variable)); return Lookup(IndexFor(variable));
} }
...@@ -356,11 +348,6 @@ class HEnvironment: public ZoneObject { ...@@ -356,11 +348,6 @@ class HEnvironment: public ZoneObject {
return result; return result;
} }
HValue* LookupContext() const {
// Return first special.
return Lookup(parameter_count());
}
void Push(HValue* value) { void Push(HValue* value) {
ASSERT(value != NULL); ASSERT(value != NULL);
++push_count_; ++push_count_;
...@@ -381,8 +368,6 @@ class HEnvironment: public ZoneObject { ...@@ -381,8 +368,6 @@ class HEnvironment: public ZoneObject {
HValue* Top() const { return ExpressionStackAt(0); } HValue* Top() const { return ExpressionStackAt(0); }
bool ExpressionStackIsEmpty() const;
HValue* ExpressionStackAt(int index_from_top) const { HValue* ExpressionStackAt(int index_from_top) const {
int index = length() - index_from_top - 1; int index = length() - index_from_top - 1;
ASSERT(HasExpressionAt(index)); ASSERT(HasExpressionAt(index));
...@@ -427,6 +412,8 @@ class HEnvironment: public ZoneObject { ...@@ -427,6 +412,8 @@ class HEnvironment: public ZoneObject {
// True if index is included in the expression stack part of the environment. // True if index is included in the expression stack part of the environment.
bool HasExpressionAt(int index) const; bool HasExpressionAt(int index) const;
bool ExpressionStackIsEmpty() const;
void Initialize(int parameter_count, int local_count, int stack_height); void Initialize(int parameter_count, int local_count, int stack_height);
void Initialize(const HEnvironment* other); void Initialize(const HEnvironment* other);
...@@ -436,18 +423,15 @@ class HEnvironment: public ZoneObject { ...@@ -436,18 +423,15 @@ class HEnvironment: public ZoneObject {
int IndexFor(Variable* variable) const { int IndexFor(Variable* variable) const {
Slot* slot = variable->AsSlot(); Slot* slot = variable->AsSlot();
ASSERT(slot != NULL && slot->IsStackAllocated()); ASSERT(slot != NULL && slot->IsStackAllocated());
int shift = (slot->type() == Slot::PARAMETER) int shift = (slot->type() == Slot::PARAMETER) ? 1 : parameter_count_;
? 1
: parameter_count_ + specials_count_;
return slot->index() + shift; return slot->index() + shift;
} }
Handle<JSFunction> closure_; Handle<JSFunction> closure_;
// Value array [parameters] [specials] [locals] [temporaries]. // Value array [parameters] [locals] [temporaries].
ZoneList<HValue*> values_; ZoneList<HValue*> values_;
ZoneList<int> assigned_variables_; ZoneList<int> assigned_variables_;
int parameter_count_; int parameter_count_;
int specials_count_;
int local_count_; int local_count_;
HEnvironment* outer_; HEnvironment* outer_;
int pop_count_; int pop_count_;
......
...@@ -1010,8 +1010,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1010,8 +1010,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
outer); outer);
int argument_index = 0; int argument_index = 0;
for (int i = 0; i < value_count; ++i) { for (int i = 0; i < value_count; ++i) {
if (hydrogen_env->is_special_index(i)) continue;
HValue* value = hydrogen_env->values()->at(i); HValue* value = hydrogen_env->values()->at(i);
LOperand* op = NULL; LOperand* op = NULL;
if (value->IsArgumentsObject()) { if (value->IsArgumentsObject()) {
......
...@@ -1010,8 +1010,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) { ...@@ -1010,8 +1010,6 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
outer); outer);
int argument_index = 0; int argument_index = 0;
for (int i = 0; i < value_count; ++i) { for (int i = 0; i < value_count; ++i) {
if (hydrogen_env->is_special_index(i)) continue;
HValue* value = hydrogen_env->values()->at(i); HValue* value = hydrogen_env->values()->at(i);
LOperand* op = NULL; LOperand* op = NULL;
if (value->IsArgumentsObject()) { if (value->IsArgumentsObject()) {
......
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