Index: src/hydrogen.cc |
=================================================================== |
--- src/hydrogen.cc (revision 11348) |
+++ src/hydrogen.cc (working copy) |
@@ -612,6 +612,7 @@ |
graph_(NULL), |
current_block_(NULL), |
inlined_count_(0), |
+ globals_(10), |
zone_(info->isolate()->zone()), |
inline_bailout_(false) { |
// This is not initialized in the initializer list because the |
@@ -2550,7 +2551,7 @@ |
// Handle implicit declaration of the function name in named function |
// expressions before other declarations. |
if (scope->is_function_scope() && scope->function() != NULL) { |
- HandleDeclaration(scope->function(), CONST, NULL, NULL); |
+ VisitVariableDeclaration(scope->function()); |
} |
VisitDeclarations(scope->declarations()); |
AddSimulate(AstNode::kDeclarationsId); |
@@ -2767,7 +2768,7 @@ |
ASSERT(!HasStackOverflow()); |
ASSERT(current_block() != NULL); |
ASSERT(current_block()->HasPredecessor()); |
- if (stmt->block_scope() != NULL) { |
+ if (stmt->scope() != NULL) { |
return Bailout("ScopedBlock"); |
} |
BreakAndContinueInfo break_info(stmt); |
@@ -3748,10 +3749,11 @@ |
if (boilerplate->HasFastDoubleElements()) { |
*total_size += FixedDoubleArray::SizeFor(elements->length()); |
} else if (boilerplate->HasFastElements()) { |
+ Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); |
int length = elements->length(); |
for (int i = 0; i < length; i++) { |
if ((*max_properties)-- == 0) return false; |
- Handle<Object> value = JSObject::GetElement(boilerplate, i); |
+ Handle<Object> value(fast_elements->get(i)); |
if (value->IsJSObject()) { |
Handle<JSObject> value_object = Handle<JSObject>::cast(value); |
if (!IsFastLiteral(value_object, |
@@ -7160,90 +7162,50 @@ |
void HGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) { |
- int length = declarations->length(); |
- int global_count = 0; |
- for (int i = 0; i < declarations->length(); i++) { |
- Declaration* decl = declarations->at(i); |
- FunctionDeclaration* fun_decl = decl->AsFunctionDeclaration(); |
- HandleDeclaration(decl->proxy(), |
- decl->mode(), |
- fun_decl != NULL ? fun_decl->fun() : NULL, |
- &global_count); |
- } |
- |
- // Batch declare global functions and variables. |
- if (global_count > 0) { |
+ ASSERT(globals_.is_empty()); |
+ AstVisitor::VisitDeclarations(declarations); |
+ if (!globals_.is_empty()) { |
Handle<FixedArray> array = |
- isolate()->factory()->NewFixedArray(2 * global_count, TENURED); |
- for (int j = 0, i = 0; i < length; i++) { |
- Declaration* decl = declarations->at(i); |
- Variable* var = decl->proxy()->var(); |
- |
- if (var->IsUnallocated()) { |
- array->set(j++, *(var->name())); |
- FunctionDeclaration* fun_decl = decl->AsFunctionDeclaration(); |
- if (fun_decl == NULL) { |
- if (var->binding_needs_init()) { |
- // In case this binding needs initialization use the hole. |
- array->set_the_hole(j++); |
- } else { |
- array->set_undefined(j++); |
- } |
- } else { |
- Handle<SharedFunctionInfo> function = |
- Compiler::BuildFunctionInfo(fun_decl->fun(), info()->script()); |
- // Check for stack-overflow exception. |
- if (function.is_null()) { |
- SetStackOverflow(); |
- return; |
- } |
- array->set(j++, *function); |
- } |
- } |
- } |
+ 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()); |
- HInstruction* result = |
- new(zone()) HDeclareGlobals(environment()->LookupContext(), |
- array, |
- flags); |
+ HInstruction* result = new(zone()) HDeclareGlobals( |
+ environment()->LookupContext(), array, flags); |
AddInstruction(result); |
+ globals_.Clear(); |
} |
} |
-void HGraphBuilder::HandleDeclaration(VariableProxy* proxy, |
- VariableMode mode, |
- FunctionLiteral* function, |
- int* global_count) { |
- Variable* var = proxy->var(); |
- bool binding_needs_init = |
- (mode == CONST || mode == CONST_HARMONY || mode == LET); |
- switch (var->location()) { |
+void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* declaration) { |
+ VariableProxy* proxy = declaration->proxy(); |
+ VariableMode mode = declaration->mode(); |
+ Variable* variable = proxy->var(); |
+ bool hole_init = mode == CONST || mode == CONST_HARMONY || mode == LET; |
+ switch (variable->location()) { |
case Variable::UNALLOCATED: |
- ++(*global_count); |
+ globals_.Add(variable->name()); |
+ globals_.Add(variable->binding_needs_init() |
+ ? isolate()->factory()->the_hole_value() |
+ : isolate()->factory()->undefined_value()); |
return; |
case Variable::PARAMETER: |
case Variable::LOCAL: |
+ if (hole_init) { |
+ HValue* value = graph()->GetConstantHole(); |
+ environment()->Bind(variable, value); |
+ } |
+ break; |
case Variable::CONTEXT: |
- if (binding_needs_init || function != NULL) { |
- HValue* value = NULL; |
- if (function != NULL) { |
- CHECK_ALIVE(VisitForValue(function)); |
- value = Pop(); |
- } else { |
- value = graph()->GetConstantHole(); |
- } |
- if (var->IsContextSlot()) { |
- HValue* context = environment()->LookupContext(); |
- HStoreContextSlot* store = new HStoreContextSlot( |
- context, var->index(), HStoreContextSlot::kNoCheck, value); |
- AddInstruction(store); |
- if (store->HasObservableSideEffects()) AddSimulate(proxy->id()); |
- } else { |
- environment()->Bind(var, value); |
- } |
+ if (hole_init) { |
+ HValue* value = graph()->GetConstantHole(); |
+ HValue* context = environment()->LookupContext(); |
+ HStoreContextSlot* store = new HStoreContextSlot( |
+ context, variable->index(), HStoreContextSlot::kNoCheck, value); |
+ AddInstruction(store); |
+ if (store->HasObservableSideEffects()) AddSimulate(proxy->id()); |
} |
break; |
case Variable::LOOKUP: |
@@ -7252,48 +7214,74 @@ |
} |
-void HGraphBuilder::VisitVariableDeclaration(VariableDeclaration* decl) { |
- UNREACHABLE(); |
+void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* declaration) { |
+ VariableProxy* proxy = declaration->proxy(); |
+ Variable* variable = proxy->var(); |
+ switch (variable->location()) { |
+ case Variable::UNALLOCATED: { |
+ globals_.Add(variable->name()); |
+ Handle<SharedFunctionInfo> function = |
+ Compiler::BuildFunctionInfo(declaration->fun(), info()->script()); |
+ // Check for stack-overflow exception. |
+ if (function.is_null()) return SetStackOverflow(); |
+ globals_.Add(function); |
+ return; |
+ } |
+ case Variable::PARAMETER: |
+ case Variable::LOCAL: { |
+ CHECK_ALIVE(VisitForValue(declaration->fun())); |
+ HValue* value = Pop(); |
+ environment()->Bind(variable, value); |
+ break; |
+ } |
+ case Variable::CONTEXT: { |
+ CHECK_ALIVE(VisitForValue(declaration->fun())); |
+ HValue* value = Pop(); |
+ HValue* context = environment()->LookupContext(); |
+ HStoreContextSlot* store = new HStoreContextSlot( |
+ context, variable->index(), HStoreContextSlot::kNoCheck, value); |
+ AddInstruction(store); |
+ if (store->HasObservableSideEffects()) AddSimulate(proxy->id()); |
+ break; |
+ } |
+ case Variable::LOOKUP: |
+ return Bailout("unsupported lookup slot in declaration"); |
+ } |
} |
-void HGraphBuilder::VisitFunctionDeclaration(FunctionDeclaration* decl) { |
+void HGraphBuilder::VisitModuleDeclaration(ModuleDeclaration* declaration) { |
UNREACHABLE(); |
} |
-void HGraphBuilder::VisitModuleDeclaration(ModuleDeclaration* decl) { |
+void HGraphBuilder::VisitImportDeclaration(ImportDeclaration* declaration) { |
UNREACHABLE(); |
} |
-void HGraphBuilder::VisitImportDeclaration(ImportDeclaration* decl) { |
+void HGraphBuilder::VisitExportDeclaration(ExportDeclaration* declaration) { |
UNREACHABLE(); |
} |
-void HGraphBuilder::VisitExportDeclaration(ExportDeclaration* decl) { |
+void HGraphBuilder::VisitModuleLiteral(ModuleLiteral* module) { |
UNREACHABLE(); |
} |
-void HGraphBuilder::VisitModuleLiteral(ModuleLiteral* module) { |
- // TODO(rossberg) |
-} |
- |
- |
void HGraphBuilder::VisitModuleVariable(ModuleVariable* module) { |
- // TODO(rossberg) |
+ UNREACHABLE(); |
} |
void HGraphBuilder::VisitModulePath(ModulePath* module) { |
- // TODO(rossberg) |
+ UNREACHABLE(); |
} |
void HGraphBuilder::VisitModuleUrl(ModuleUrl* module) { |
- // TODO(rossberg) |
+ UNREACHABLE(); |
} |