Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index b2badcdb50c9096a4e073589af604fc1959a8cb3..b3ffac7e01eaae70cdb30867ce382e90301bf9f9 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -3823,7 +3823,7 @@ void TestContext::BuildBranch(HValue* value) { |
void HOptimizedGraphBuilder::Bailout(const char* reason) { |
- info()->set_bailout_reason(reason); |
+ current_info()->set_bailout_reason(reason); |
SetStackOverflow(); |
} |
@@ -3880,11 +3880,11 @@ void HOptimizedGraphBuilder::VisitExpressions( |
bool HOptimizedGraphBuilder::BuildGraph() { |
- if (info()->function()->is_generator()) { |
+ if (current_info()->function()->is_generator()) { |
Bailout("function is a generator"); |
return false; |
} |
- Scope* scope = info()->scope(); |
+ Scope* scope = current_info()->scope(); |
if (scope->HasIllegalRedeclaration()) { |
Bailout("function with illegal redeclaration"); |
return false; |
@@ -3928,7 +3928,7 @@ bool HOptimizedGraphBuilder::BuildGraph() { |
AddInstruction( |
new(zone()) HStackCheck(context, HStackCheck::kFunctionEntry)); |
- VisitStatements(info()->function()->body()); |
+ VisitStatements(current_info()->function()->body()); |
if (HasStackOverflow()) return false; |
if (current_block() != NULL) { |
@@ -3940,7 +3940,7 @@ bool HOptimizedGraphBuilder::BuildGraph() { |
// last time this function was compiled, then this recompile is likely not |
// due to missing/inadequate type feedback, but rather too aggressive |
// optimization. Disable optimistic LICM in that case. |
- Handle<Code> unoptimized_code(info()->shared_info()->code()); |
+ Handle<Code> unoptimized_code(current_info()->shared_info()->code()); |
ASSERT(unoptimized_code->kind() == Code::FUNCTION); |
Handle<TypeFeedbackInfo> type_info( |
TypeFeedbackInfo::cast(unoptimized_code->type_feedback_info())); |
@@ -5129,7 +5129,7 @@ void HOptimizedGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { |
bool HOptimizedGraphBuilder::HasOsrEntryAt(IterationStatement* statement) { |
- return statement->OsrEntryId() == info()->osr_ast_id(); |
+ return statement->OsrEntryId() == current_info()->osr_ast_id(); |
} |
@@ -5516,9 +5516,9 @@ void HOptimizedGraphBuilder::VisitFunctionLiteral(FunctionLiteral* expr) { |
ASSERT(current_block() != NULL); |
ASSERT(current_block()->HasPredecessor()); |
Handle<SharedFunctionInfo> shared_info = |
- SearchSharedFunctionInfo(info()->shared_info()->code(), expr); |
+ SearchSharedFunctionInfo(current_info()->shared_info()->code(), expr); |
if (shared_info.is_null()) { |
- shared_info = Compiler::BuildFunctionInfo(expr, info()->script()); |
+ shared_info = Compiler::BuildFunctionInfo(expr, current_info()->script()); |
} |
// We also have a stack overflow if the recursive compilation did. |
if (HasStackOverflow()) return; |
@@ -5579,10 +5579,10 @@ void HOptimizedGraphBuilder::VisitConditional(Conditional* expr) { |
HOptimizedGraphBuilder::GlobalPropertyAccess |
HOptimizedGraphBuilder::LookupGlobalProperty( |
Variable* var, LookupResult* lookup, bool is_store) { |
- if (var->is_this() || !info()->has_global_object()) { |
+ if (var->is_this() || !current_info()->has_global_object()) { |
return kUseGeneric; |
} |
- Handle<GlobalObject> global(info()->global_object()); |
+ Handle<GlobalObject> global(current_info()->global_object()); |
global->Lookup(*var->name(), lookup); |
if (!lookup->IsNormal() || |
(is_store && lookup->IsReadOnly()) || |
@@ -5597,7 +5597,7 @@ HOptimizedGraphBuilder::GlobalPropertyAccess |
HValue* HOptimizedGraphBuilder::BuildContextChainWalk(Variable* var) { |
ASSERT(var->IsContextSlot()); |
HValue* context = environment()->LookupContext(); |
- int length = info()->scope()->ContextChainLength(var->scope()); |
+ int length = current_info()->scope()->ContextChainLength(var->scope()); |
while (length-- > 0) { |
HInstruction* context_instruction = new(zone()) HOuterContext(context); |
AddInstruction(context_instruction); |
@@ -5633,12 +5633,12 @@ void HOptimizedGraphBuilder::VisitVariableProxy(VariableProxy* expr) { |
LookupGlobalProperty(variable, &lookup, false); |
if (type == kUseCell && |
- info()->global_object()->IsAccessCheckNeeded()) { |
+ current_info()->global_object()->IsAccessCheckNeeded()) { |
type = kUseGeneric; |
} |
if (type == kUseCell) { |
- Handle<GlobalObject> global(info()->global_object()); |
+ Handle<GlobalObject> global(current_info()->global_object()); |
Handle<JSGlobalPropertyCell> cell(global->GetPropertyCell(&lookup)); |
HLoadGlobalCell* instr = |
new(zone()) HLoadGlobalCell(cell, lookup.GetPropertyDetails()); |
@@ -6229,7 +6229,8 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
AddInstruction(new(zone()) HCheckPrototypeMaps( |
Handle<JSObject>(JSObject::cast(map->prototype())), |
Handle<JSObject>(JSObject::cast(proto)), |
- zone())); |
+ zone(), |
+ top_info())); |
} |
HObjectAccess field_access = HObjectAccess::ForField(map, lookup, name); |
@@ -6265,7 +6266,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
if (transition_to_field) { |
Handle<Map> transition(lookup->GetTransitionMapFromMap(*map)); |
- instr->set_transition(transition); |
+ instr->SetTransition(transition, top_info()); |
// TODO(fschneider): Record the new map type of the object in the IR to |
// enable elimination of redundant checks after the transition store. |
instr->SetGVNFlag(kChangesMaps); |
@@ -6568,7 +6569,7 @@ void HOptimizedGraphBuilder::HandleGlobalVariableAssignment( |
LookupResult lookup(isolate()); |
GlobalPropertyAccess type = LookupGlobalProperty(var, &lookup, true); |
if (type == kUseCell) { |
- Handle<GlobalObject> global(info()->global_object()); |
+ Handle<GlobalObject> global(current_info()->global_object()); |
Handle<JSGlobalPropertyCell> cell(global->GetPropertyCell(&lookup)); |
HInstruction* instr = |
new(zone()) HStoreGlobalCell(value, cell, lookup.GetPropertyDetails()); |
@@ -6633,13 +6634,13 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { |
// Bail out if we try to mutate a parameter value in a function |
// using the arguments object. We do not (yet) correctly handle the |
// arguments property of the function. |
- if (info()->scope()->arguments() != NULL) { |
+ if (current_info()->scope()->arguments() != NULL) { |
// Parameters will be allocated to context slots. We have no |
// direct way to detect that the variable is a parameter so we do |
// a linear search of the parameter variables. |
- int count = info()->scope()->num_parameters(); |
+ int count = current_info()->scope()->num_parameters(); |
for (int i = 0; i < count; ++i) { |
- if (var == info()->scope()->parameter(i)) { |
+ if (var == current_info()->scope()->parameter(i)) { |
Bailout( |
"assignment to parameter, function uses arguments object"); |
} |
@@ -6859,12 +6860,12 @@ void HOptimizedGraphBuilder::VisitAssignment(Assignment* expr) { |
// Bail out if we try to mutate a parameter value in a function using |
// the arguments object. We do not (yet) correctly handle the |
// arguments property of the function. |
- if (info()->scope()->arguments() != NULL) { |
+ if (current_info()->scope()->arguments() != NULL) { |
// Parameters will rewrite to context slots. We have no direct way |
// to detect that the variable is a parameter. |
- int count = info()->scope()->num_parameters(); |
+ int count = current_info()->scope()->num_parameters(); |
for (int i = 0; i < count; ++i) { |
- if (var == info()->scope()->parameter(i)) { |
+ if (var == current_info()->scope()->parameter(i)) { |
return Bailout("assignment to parameter in arguments object"); |
} |
} |
@@ -7026,8 +7027,8 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic( |
Handle<JSObject> holder(lookup.holder()); |
Handle<Map> holder_map(holder->map()); |
AddCheckMap(object, map); |
- AddInstruction( |
- new(zone()) HCheckPrototypeMaps(prototype, holder, zone())); |
+ AddInstruction(new(zone()) HCheckPrototypeMaps( |
+ prototype, holder, zone(), top_info())); |
HValue* holder_value = AddInstruction(new(zone()) |
HConstant(holder, Representation::Tagged())); |
return BuildLoadNamedField(holder_value, |
@@ -7041,7 +7042,8 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadNamedMonomorphic( |
Handle<JSObject> holder(lookup.holder()); |
Handle<Map> holder_map(holder->map()); |
AddCheckMap(object, map); |
- AddInstruction(new(zone()) HCheckPrototypeMaps(prototype, holder, zone())); |
+ AddInstruction(new(zone()) HCheckPrototypeMaps( |
+ prototype, holder, zone(), top_info())); |
Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*holder_map)); |
return new(zone()) HConstant(function, Representation::Tagged()); |
} |
@@ -7078,8 +7080,8 @@ HInstruction* HOptimizedGraphBuilder::BuildMonomorphicElementAccess( |
isolate()->IsFastArrayConstructorPrototypeChainIntact()) { |
Handle<JSObject> prototype(JSObject::cast(map->prototype()), isolate()); |
Handle<JSObject> object_prototype = isolate()->initial_object_prototype(); |
- AddInstruction( |
- new(zone()) HCheckPrototypeMaps(prototype, object_prototype, zone())); |
+ AddInstruction(new(zone()) HCheckPrototypeMaps( |
+ prototype, object_prototype, zone(), top_info())); |
load_mode = ALLOW_RETURN_HOLE; |
graph()->MarkDependsOnEmptyArrayProtoElements(); |
} |
@@ -7594,8 +7596,8 @@ void HOptimizedGraphBuilder::AddCheckPrototypeMaps(Handle<JSObject> holder, |
Handle<Map> receiver_map) { |
if (!holder.is_null()) { |
Handle<JSObject> prototype(JSObject::cast(receiver_map->prototype())); |
- AddInstruction( |
- new(zone()) HCheckPrototypeMaps(prototype, holder, zone())); |
+ AddInstruction(new(zone()) HCheckPrototypeMaps( |
+ prototype, holder, zone(), top_info())); |
} |
} |
@@ -7740,7 +7742,7 @@ void HOptimizedGraphBuilder::HandlePolymorphicCallNamed( |
expr->ComputeTarget(map, name); |
AddCheckPrototypeMaps(expr->holder(), map); |
if (FLAG_trace_inlining && FLAG_polymorphic_inlining) { |
- Handle<JSFunction> caller = info()->closure(); |
+ Handle<JSFunction> caller = current_info()->closure(); |
SmartArrayPointer<char> caller_name = |
caller->shared()->DebugName()->ToCString(); |
PrintF("Trying to inline the polymorphic call to %s from %s\n", |
@@ -7824,7 +7826,7 @@ int HOptimizedGraphBuilder::InliningAstSize(Handle<JSFunction> target) { |
// Precondition: call is monomorphic and we have found a target with the |
// appropriate arity. |
- Handle<JSFunction> caller = info()->closure(); |
+ Handle<JSFunction> caller = current_info()->closure(); |
Handle<SharedFunctionInfo> target_shared(target->shared()); |
// Do a quick check on source code length to avoid parsing large |
@@ -7860,7 +7862,7 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind, |
int nodes_added = InliningAstSize(target); |
if (nodes_added == kNotInlinable) return false; |
- Handle<JSFunction> caller = info()->closure(); |
+ Handle<JSFunction> caller = current_info()->closure(); |
if (nodes_added > Min(FLAG_max_inlined_nodes, kUnlimitedMaxInlinedNodes)) { |
TraceInline(target, caller, "target AST is too large [early]"); |
@@ -7869,7 +7871,7 @@ bool HOptimizedGraphBuilder::TryInline(CallKind call_kind, |
#if !defined(V8_TARGET_ARCH_IA32) |
// Target must be able to use caller's context. |
- CompilationInfo* outer_info = info(); |
+ CompilationInfo* outer_info = current_info(); |
if (target->context() != outer_info->closure()->context() || |
outer_info->scope()->contains_with() || |
outer_info->scope()->num_heap_slots() > 0) { |
@@ -8304,7 +8306,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
Call::GetPrototypeForPrimitiveCheck(STRING_CHECK, |
expr->holder()->GetIsolate()), |
expr->holder(), |
- zone())); |
+ zone(), |
+ top_info())); |
HInstruction* char_code = |
BuildStringCharCodeAt(context, string, index); |
if (id == kStringCharCodeAt) { |
@@ -8455,7 +8458,7 @@ bool HOptimizedGraphBuilder::TryCallApply(Call* expr) { |
return false; |
} |
- if (info()->scope()->arguments() == NULL) return false; |
+ if (current_info()->scope()->arguments() == NULL) return false; |
ZoneList<Expression*>* args = expr->arguments(); |
if (args->length() != 2) return false; |
@@ -8696,8 +8699,8 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
LookupResult lookup(isolate()); |
GlobalPropertyAccess type = LookupGlobalProperty(var, &lookup, false); |
if (type == kUseCell && |
- !info()->global_object()->IsAccessCheckNeeded()) { |
- Handle<GlobalObject> global(info()->global_object()); |
+ !current_info()->global_object()->IsAccessCheckNeeded()) { |
+ Handle<GlobalObject> global(current_info()->global_object()); |
known_global_function = expr->ComputeGlobalTarget(global, &lookup); |
} |
if (known_global_function) { |
@@ -8732,7 +8735,7 @@ void HOptimizedGraphBuilder::VisitCall(Call* expr) { |
} |
if (TryInlineCall(expr)) return; |
- if (expr->target().is_identical_to(info()->closure())) { |
+ if (expr->target().is_identical_to(current_info()->closure())) { |
graph()->MarkRecursive(); |
} |
@@ -9231,13 +9234,13 @@ void HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) { |
// Bail out if we try to mutate a parameter value in a function |
// using the arguments object. We do not (yet) correctly handle the |
// arguments property of the function. |
- if (info()->scope()->arguments() != NULL) { |
+ if (current_info()->scope()->arguments() != NULL) { |
// Parameters will rewrite to context slots. We have no direct |
// way to detect that the variable is a parameter so we use a |
// linear search of the parameter list. |
- int count = info()->scope()->num_parameters(); |
+ int count = current_info()->scope()->num_parameters(); |
for (int i = 0; i < count; ++i) { |
- if (var == info()->scope()->parameter(i)) { |
+ if (var == current_info()->scope()->parameter(i)) { |
return Bailout("assignment to parameter in arguments object"); |
} |
} |
@@ -9836,10 +9839,10 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { |
VariableProxy* proxy = expr->right()->AsVariableProxy(); |
bool global_function = (proxy != NULL) && proxy->var()->IsUnallocated(); |
if (global_function && |
- info()->has_global_object() && |
- !info()->global_object()->IsAccessCheckNeeded()) { |
+ current_info()->has_global_object() && |
+ !current_info()->global_object()->IsAccessCheckNeeded()) { |
Handle<String> name = proxy->name(); |
- Handle<GlobalObject> global(info()->global_object()); |
+ Handle<GlobalObject> global(current_info()->global_object()); |
LookupResult lookup(isolate()); |
global->Lookup(*name, &lookup); |
if (lookup.IsNormal() && lookup.GetValue()->IsJSFunction()) { |
@@ -10282,9 +10285,9 @@ void HOptimizedGraphBuilder::VisitDeclarations( |
Handle<FixedArray> array = |
isolate()->factory()->NewFixedArray(globals_.length(), TENURED); |
for (int i = 0; i < globals_.length(); ++i) array->set(i, *globals_.at(i)); |
- int flags = DeclareGlobalsEvalFlag::encode(info()->is_eval()) | |
- DeclareGlobalsNativeFlag::encode(info()->is_native()) | |
- DeclareGlobalsLanguageMode::encode(info()->language_mode()); |
+ int flags = DeclareGlobalsEvalFlag::encode(current_info()->is_eval()) | |
+ DeclareGlobalsNativeFlag::encode(current_info()->is_native()) | |
+ DeclareGlobalsLanguageMode::encode(current_info()->language_mode()); |
HInstruction* result = new(zone()) HDeclareGlobals( |
environment()->LookupContext(), array, flags); |
AddInstruction(result); |
@@ -10338,8 +10341,8 @@ void HOptimizedGraphBuilder::VisitFunctionDeclaration( |
switch (variable->location()) { |
case Variable::UNALLOCATED: { |
globals_.Add(variable->name(), zone()); |
- Handle<SharedFunctionInfo> function = |
- Compiler::BuildFunctionInfo(declaration->fun(), info()->script()); |
+ Handle<SharedFunctionInfo> function = Compiler::BuildFunctionInfo( |
+ declaration->fun(), current_info()->script()); |
// Check for stack-overflow exception. |
if (function.is_null()) return SetStackOverflow(); |
globals_.Add(function, zone()); |