| Index: src/full-codegen.cc
|
| diff --git a/src/full-codegen.cc b/src/full-codegen.cc
|
| index 0f44cf233ea9efc1497ff78c151ae08bf6b82ede..8911dcc4596a6af9b832b59b0ca855f30311515c 100644
|
| --- a/src/full-codegen.cc
|
| +++ b/src/full-codegen.cc
|
| @@ -190,9 +190,9 @@ void BreakableStatementChecker::VisitArrayLiteral(ArrayLiteral* expr) {
|
| void BreakableStatementChecker::VisitAssignment(Assignment* expr) {
|
| // If assigning to a property (including a global property) the assignment is
|
| // breakable.
|
| - Variable* var = expr->target()->AsVariableProxy()->AsVariable();
|
| + VariableProxy* proxy = expr->target()->AsVariableProxy();
|
| Property* prop = expr->target()->AsProperty();
|
| - if (prop != NULL || (var != NULL && var->is_global())) {
|
| + if (prop != NULL || (proxy != NULL && proxy->var()->IsUnallocated())) {
|
| is_breakable_ = true;
|
| return;
|
| }
|
| @@ -395,26 +395,6 @@ void FullCodeGenerator::RecordStackCheck(int ast_id) {
|
| }
|
|
|
|
|
| -int FullCodeGenerator::SlotOffset(Slot* slot) {
|
| - ASSERT(slot != NULL);
|
| - // Offset is negative because higher indexes are at lower addresses.
|
| - int offset = -slot->index() * kPointerSize;
|
| - // Adjust by a (parameter or local) base offset.
|
| - switch (slot->type()) {
|
| - case Slot::PARAMETER:
|
| - offset += (info_->scope()->num_parameters() + 1) * kPointerSize;
|
| - break;
|
| - case Slot::LOCAL:
|
| - offset += JavaScriptFrameConstants::kLocal0Offset;
|
| - break;
|
| - case Slot::CONTEXT:
|
| - case Slot::LOOKUP:
|
| - UNREACHABLE();
|
| - }
|
| - return offset;
|
| -}
|
| -
|
| -
|
| bool FullCodeGenerator::ShouldInlineSmiCase(Token::Value op) {
|
| // Inline smi case inside loops, but not division and modulo which
|
| // are too complicated and take up too much space.
|
| @@ -529,34 +509,21 @@ void FullCodeGenerator::DoTest(const TestContext* context) {
|
| void FullCodeGenerator::VisitDeclarations(
|
| ZoneList<Declaration*>* declarations) {
|
| int length = declarations->length();
|
| - int globals = 0;
|
| + int global_count = 0;
|
| for (int i = 0; i < length; i++) {
|
| Declaration* decl = declarations->at(i);
|
| - Variable* var = decl->proxy()->var();
|
| - Slot* slot = var->AsSlot();
|
| -
|
| - // If it was not possible to allocate the variable at compile
|
| - // time, we need to "declare" it at runtime to make sure it
|
| - // actually exists in the local context.
|
| - if ((slot != NULL && slot->type() == Slot::LOOKUP) || !var->is_global()) {
|
| - VisitDeclaration(decl);
|
| - } else {
|
| - // Count global variables and functions for later processing
|
| - globals++;
|
| - }
|
| + EmitDeclaration(decl->proxy(), decl->mode(), decl->fun(), &global_count);
|
| }
|
|
|
| - // Compute array of global variable and function declarations.
|
| - // Do nothing in case of no declared global functions or variables.
|
| - if (globals > 0) {
|
| + // Batch declare global functions and variables.
|
| + if (global_count > 0) {
|
| Handle<FixedArray> array =
|
| - isolate()->factory()->NewFixedArray(2 * globals, TENURED);
|
| + 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();
|
| - Slot* slot = var->AsSlot();
|
|
|
| - if ((slot == NULL || slot->type() != Slot::LOOKUP) && var->is_global()) {
|
| + if (var->IsUnallocated()) {
|
| array->set(j++, *(var->name()));
|
| if (decl->fun() == NULL) {
|
| if (var->mode() == Variable::CONST) {
|
| @@ -578,7 +545,7 @@ void FullCodeGenerator::VisitDeclarations(
|
| }
|
| }
|
| // Invoke the platform-dependent code generator to do the actual
|
| - // declaration the global variables and functions.
|
| + // declaration the global functions and variables.
|
| DeclareGlobals(array);
|
| }
|
| }
|
|
|