| Index: src/full-codegen/full-codegen.cc
 | 
| diff --git a/src/full-codegen/full-codegen.cc b/src/full-codegen/full-codegen.cc
 | 
| index 8da33835597efbbe60fd04c4f91f5ec7038954c8..b089ceaf09818cc41b2f65b7e3fd85a437d3d6ce 100644
 | 
| --- a/src/full-codegen/full-codegen.cc
 | 
| +++ b/src/full-codegen/full-codegen.cc
 | 
| @@ -62,7 +62,6 @@ FullCodeGenerator::FullCodeGenerator(MacroAssembler* masm,
 | 
|                             : 0,
 | 
|                         info->zone()),
 | 
|        back_edges_(2, info->zone()),
 | 
| -      handler_table_(info->zone()),
 | 
|        source_position_table_builder_(info->zone(),
 | 
|                                       info->SourcePositionRecordingMode()),
 | 
|        ic_total_count_(0) {
 | 
| @@ -115,7 +114,6 @@ bool FullCodeGenerator::MakeCode(CompilationInfo* info, uintptr_t stack_limit) {
 | 
|        CodeGenerator::MakeCodeEpilogue(&masm, nullptr, info, masm.CodeObject());
 | 
|    cgen.PopulateDeoptimizationData(code);
 | 
|    cgen.PopulateTypeFeedbackInfo(code);
 | 
| -  cgen.PopulateHandlerTable(code);
 | 
|    code->set_has_deoptimization_support(info->HasDeoptimizationSupport());
 | 
|    code->set_has_reloc_info_for_serialization(info->will_serialize());
 | 
|    code->set_allow_osr_at_loop_nesting_level(0);
 | 
| @@ -176,30 +174,6 @@ void FullCodeGenerator::PopulateTypeFeedbackInfo(Handle<Code> code) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void FullCodeGenerator::PopulateHandlerTable(Handle<Code> code) {
 | 
| -  int handler_table_size = static_cast<int>(handler_table_.size());
 | 
| -  Handle<HandlerTable> table =
 | 
| -      Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray(
 | 
| -          HandlerTable::LengthForRange(handler_table_size), TENURED));
 | 
| -  for (int i = 0; i < handler_table_size; ++i) {
 | 
| -    table->SetRangeStart(i, handler_table_[i].range_start);
 | 
| -    table->SetRangeEnd(i, handler_table_[i].range_end);
 | 
| -    table->SetRangeHandler(i, handler_table_[i].handler_offset,
 | 
| -                           handler_table_[i].catch_prediction);
 | 
| -    table->SetRangeData(i, handler_table_[i].stack_depth);
 | 
| -  }
 | 
| -  code->set_handler_table(*table);
 | 
| -}
 | 
| -
 | 
| -
 | 
| -int FullCodeGenerator::NewHandlerTableEntry() {
 | 
| -  int index = static_cast<int>(handler_table_.size());
 | 
| -  HandlerTableEntry entry = {0, 0, 0, 0, HandlerTable::UNCAUGHT};
 | 
| -  handler_table_.push_back(entry);
 | 
| -  return index;
 | 
| -}
 | 
| -
 | 
| -
 | 
|  bool FullCodeGenerator::MustCreateObjectLiteralWithRuntime(
 | 
|      ObjectLiteral* expr) const {
 | 
|    return masm()->serializer_enabled() ||
 | 
| @@ -989,19 +963,10 @@ void FullCodeGenerator::EmitContinue(Statement* target) {
 | 
|    NestedStatement* current = nesting_stack_;
 | 
|    int context_length = 0;
 | 
|    // When continuing, we clobber the unpredictable value in the accumulator
 | 
| -  // with one that's safe for GC.  If we hit an exit from the try block of
 | 
| -  // try...finally on our way out, we will unconditionally preserve the
 | 
| -  // accumulator on the stack.
 | 
| +  // with one that's safe for GC.
 | 
|    ClearAccumulator();
 | 
|    while (!current->IsContinueTarget(target)) {
 | 
|      if (HasStackOverflow()) return;
 | 
| -    if (current->IsTryFinally()) {
 | 
| -      Comment cmnt(masm(), "[ Deferred continue through finally");
 | 
| -      current->Exit(&context_length);
 | 
| -      DCHECK_EQ(-1, context_length);
 | 
| -      current->AsTryFinally()->deferred_commands()->RecordContinue(target);
 | 
| -      return;
 | 
| -    }
 | 
|      current = current->Exit(&context_length);
 | 
|    }
 | 
|    int stack_depth = current->GetStackDepthAtTarget();
 | 
| @@ -1030,19 +995,10 @@ void FullCodeGenerator::EmitBreak(Statement* target) {
 | 
|    NestedStatement* current = nesting_stack_;
 | 
|    int context_length = 0;
 | 
|    // When breaking, we clobber the unpredictable value in the accumulator
 | 
| -  // with one that's safe for GC.  If we hit an exit from the try block of
 | 
| -  // try...finally on our way out, we will unconditionally preserve the
 | 
| -  // accumulator on the stack.
 | 
| +  // with one that's safe for GC.
 | 
|    ClearAccumulator();
 | 
|    while (!current->IsBreakTarget(target)) {
 | 
|      if (HasStackOverflow()) return;
 | 
| -    if (current->IsTryFinally()) {
 | 
| -      Comment cmnt(masm(), "[ Deferred break through finally");
 | 
| -      current->Exit(&context_length);
 | 
| -      DCHECK_EQ(-1, context_length);
 | 
| -      current->AsTryFinally()->deferred_commands()->RecordBreak(target);
 | 
| -      return;
 | 
| -    }
 | 
|      current = current->Exit(&context_length);
 | 
|    }
 | 
|    int stack_depth = current->GetStackDepthAtTarget();
 | 
| @@ -1072,13 +1028,6 @@ void FullCodeGenerator::EmitUnwindAndReturn() {
 | 
|    int context_length = 0;
 | 
|    while (current != NULL) {
 | 
|      if (HasStackOverflow()) return;
 | 
| -    if (current->IsTryFinally()) {
 | 
| -      Comment cmnt(masm(), "[ Deferred return through finally");
 | 
| -      current->Exit(&context_length);
 | 
| -      DCHECK_EQ(-1, context_length);
 | 
| -      current->AsTryFinally()->deferred_commands()->RecordReturn();
 | 
| -      return;
 | 
| -    }
 | 
|      current = current->Exit(&context_length);
 | 
|    }
 | 
|    EmitReturnSequence();
 | 
| @@ -1360,127 +1309,14 @@ void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
 | 
|  }
 | 
|  
 | 
|  void FullCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) {
 | 
| -  Comment cmnt(masm_, "[ TryCatchStatement");
 | 
| -  SetStatementPosition(stmt, SKIP_BREAK);
 | 
| -
 | 
| -  // The try block adds a handler to the exception handler chain before
 | 
| -  // entering, and removes it again when exiting normally.  If an exception
 | 
| -  // is thrown during execution of the try block, the handler is consumed
 | 
| -  // and control is passed to the catch block with the exception in the
 | 
| -  // result register.
 | 
| -
 | 
| -  Label try_entry, handler_entry, exit;
 | 
| -  __ jmp(&try_entry);
 | 
| -  __ bind(&handler_entry);
 | 
| -  if (stmt->clear_pending_message()) ClearPendingMessage();
 | 
| -
 | 
| -  // Exception handler code, the exception is in the result register.
 | 
| -  // Extend the context before executing the catch block.
 | 
| -  { Comment cmnt(masm_, "[ Extend catch context");
 | 
| -    PushOperand(stmt->variable()->name());
 | 
| -    PushOperand(result_register());
 | 
| -    PushOperand(stmt->scope()->scope_info());
 | 
| -    PushFunctionArgumentForContextAllocation();
 | 
| -    CallRuntimeWithOperands(Runtime::kPushCatchContext);
 | 
| -    StoreToFrameField(StandardFrameConstants::kContextOffset,
 | 
| -                      context_register());
 | 
| -  }
 | 
| -
 | 
| -  Scope* saved_scope = scope();
 | 
| -  scope_ = stmt->scope();
 | 
| -  DCHECK(scope_->declarations()->is_empty());
 | 
| -  { WithOrCatch catch_body(this);
 | 
| -    Visit(stmt->catch_block());
 | 
| -  }
 | 
| -  // Restore the context.
 | 
| -  LoadContextField(context_register(), Context::PREVIOUS_INDEX);
 | 
| -  StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
 | 
| -  scope_ = saved_scope;
 | 
| -  __ jmp(&exit);
 | 
| -
 | 
| -  // Try block code. Sets up the exception handler chain.
 | 
| -  __ bind(&try_entry);
 | 
| -
 | 
| -  int handler_index = NewHandlerTableEntry();
 | 
| -  EnterTryBlock(handler_index, &handler_entry, stmt->catch_prediction());
 | 
| -  {
 | 
| -    Comment cmnt_try(masm(), "[ Try block");
 | 
| -    Visit(stmt->try_block());
 | 
| -  }
 | 
| -  ExitTryBlock(handler_index);
 | 
| -  __ bind(&exit);
 | 
| +  // Exception handling is not supported.
 | 
| +  UNREACHABLE();
 | 
|  }
 | 
|  
 | 
|  
 | 
|  void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
 | 
| -  Comment cmnt(masm_, "[ TryFinallyStatement");
 | 
| -  SetStatementPosition(stmt, SKIP_BREAK);
 | 
| -
 | 
| -  // Try finally is compiled by setting up a try-handler on the stack while
 | 
| -  // executing the try body, and removing it again afterwards.
 | 
| -  //
 | 
| -  // The try-finally construct can enter the finally block in three ways:
 | 
| -  // 1. By exiting the try-block normally. This exits the try block,
 | 
| -  //    pushes the continuation token and falls through to the finally
 | 
| -  //    block.
 | 
| -  // 2. By exiting the try-block with a function-local control flow transfer
 | 
| -  //    (break/continue/return). The site of the, e.g., break exits the
 | 
| -  //    try block, pushes the continuation token and jumps to the
 | 
| -  //    finally block. After the finally block executes, the execution
 | 
| -  //    continues based on the continuation token to a block that
 | 
| -  //    continues with the control flow transfer.
 | 
| -  // 3. By exiting the try-block with a thrown exception. In the handler,
 | 
| -  //    we push the exception and continuation token and jump to the
 | 
| -  //    finally block (which will again dispatch based on the token once
 | 
| -  //    it is finished).
 | 
| -
 | 
| -  Label try_entry, handler_entry, finally_entry;
 | 
| -  DeferredCommands deferred(this, &finally_entry);
 | 
| -
 | 
| -  // Jump to try-handler setup and try-block code.
 | 
| -  __ jmp(&try_entry);
 | 
| -  __ bind(&handler_entry);
 | 
| -
 | 
| -  // Exception handler code.  This code is only executed when an exception
 | 
| -  // is thrown.  Record the continuation and jump to the finally block.
 | 
| -  {
 | 
| -    Comment cmnt_handler(masm(), "[ Finally handler");
 | 
| -    deferred.RecordThrow();
 | 
| -  }
 | 
| -
 | 
| -  // Set up try handler.
 | 
| -  __ bind(&try_entry);
 | 
| -  int handler_index = NewHandlerTableEntry();
 | 
| -  EnterTryBlock(handler_index, &handler_entry, stmt->catch_prediction());
 | 
| -  {
 | 
| -    Comment cmnt_try(masm(), "[ Try block");
 | 
| -    TryFinally try_body(this, &deferred);
 | 
| -    Visit(stmt->try_block());
 | 
| -  }
 | 
| -  ExitTryBlock(handler_index);
 | 
| -  // Execute the finally block on the way out.  Clobber the unpredictable
 | 
| -  // value in the result register with one that's safe for GC because the
 | 
| -  // finally block will unconditionally preserve the result register on the
 | 
| -  // stack.
 | 
| -  ClearAccumulator();
 | 
| -  deferred.EmitFallThrough();
 | 
| -  // Fall through to the finally block.
 | 
| -
 | 
| -  // Finally block implementation.
 | 
| -  __ bind(&finally_entry);
 | 
| -  {
 | 
| -    Comment cmnt_finally(masm(), "[ Finally block");
 | 
| -    OperandStackDepthIncrement(2);  // Token and accumulator are on stack.
 | 
| -    EnterFinallyBlock();
 | 
| -    Visit(stmt->finally_block());
 | 
| -    ExitFinallyBlock();
 | 
| -    OperandStackDepthDecrement(2);  // Token and accumulator were on stack.
 | 
| -  }
 | 
| -
 | 
| -  {
 | 
| -    Comment cmnt_deferred(masm(), "[ Post-finally dispatch");
 | 
| -    deferred.EmitCommands();  // Return to the calling code.
 | 
| -  }
 | 
| +  // Exception handling is not supported.
 | 
| +  UNREACHABLE();
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1630,32 +1466,6 @@ void FullCodeGenerator::VisitThrow(Throw* expr) {
 | 
|    if (context()->IsStackValue()) OperandStackDepthIncrement(1);
 | 
|  }
 | 
|  
 | 
| -void FullCodeGenerator::EnterTryBlock(
 | 
| -    int handler_index, Label* handler,
 | 
| -    HandlerTable::CatchPrediction catch_prediction) {
 | 
| -  HandlerTableEntry* entry = &handler_table_[handler_index];
 | 
| -  entry->range_start = masm()->pc_offset();
 | 
| -  entry->handler_offset = handler->pos();
 | 
| -  entry->stack_depth = operand_stack_depth_;
 | 
| -  entry->catch_prediction = catch_prediction;
 | 
| -
 | 
| -  // We are using the operand stack depth, check for accuracy.
 | 
| -  EmitOperandStackDepthCheck();
 | 
| -
 | 
| -  // Push context onto operand stack.
 | 
| -  STATIC_ASSERT(TryBlockConstant::kElementCount == 1);
 | 
| -  PushOperand(context_register());
 | 
| -}
 | 
| -
 | 
| -
 | 
| -void FullCodeGenerator::ExitTryBlock(int handler_index) {
 | 
| -  HandlerTableEntry* entry = &handler_table_[handler_index];
 | 
| -  entry->range_end = masm()->pc_offset();
 | 
| -
 | 
| -  // Drop context from operand stack.
 | 
| -  DropOperands(TryBlockConstant::kElementCount);
 | 
| -}
 | 
| -
 | 
|  
 | 
|  void FullCodeGenerator::VisitCall(Call* expr) {
 | 
|  #ifdef DEBUG
 | 
| @@ -1776,73 +1586,6 @@ void FullCodeGenerator::VisitRewritableExpression(RewritableExpression* expr) {
 | 
|    Visit(expr->expression());
 | 
|  }
 | 
|  
 | 
| -FullCodeGenerator::NestedStatement* FullCodeGenerator::TryFinally::Exit(
 | 
| -    int* context_length) {
 | 
| -  // The macros used here must preserve the result register.
 | 
| -
 | 
| -  // Calculate how many operands to drop to get down to handler block.
 | 
| -  int stack_drop = codegen_->operand_stack_depth_ - GetStackDepthAtTarget();
 | 
| -  DCHECK_GE(stack_drop, 0);
 | 
| -
 | 
| -  // Because the handler block contains the context of the finally
 | 
| -  // code, we can restore it directly from there for the finally code
 | 
| -  // rather than iteratively unwinding contexts via their previous
 | 
| -  // links.
 | 
| -  if (*context_length > 0) {
 | 
| -    __ Drop(stack_drop);  // Down to the handler block.
 | 
| -    // Restore the context to its dedicated register and the stack.
 | 
| -    STATIC_ASSERT(TryBlockConstant::kElementCount == 1);
 | 
| -    __ Pop(codegen_->context_register());
 | 
| -    codegen_->StoreToFrameField(StandardFrameConstants::kContextOffset,
 | 
| -                                codegen_->context_register());
 | 
| -  } else {
 | 
| -    // Down to the handler block and also drop context.
 | 
| -    __ Drop(stack_drop + TryBlockConstant::kElementCount);
 | 
| -  }
 | 
| -
 | 
| -  // The caller will ignore outputs.
 | 
| -  *context_length = -1;
 | 
| -  return previous_;
 | 
| -}
 | 
| -
 | 
| -void FullCodeGenerator::DeferredCommands::RecordBreak(Statement* target) {
 | 
| -  TokenId token = dispenser_.GetBreakContinueToken();
 | 
| -  commands_.push_back({kBreak, token, target});
 | 
| -  EmitJumpToFinally(token);
 | 
| -}
 | 
| -
 | 
| -void FullCodeGenerator::DeferredCommands::RecordContinue(Statement* target) {
 | 
| -  TokenId token = dispenser_.GetBreakContinueToken();
 | 
| -  commands_.push_back({kContinue, token, target});
 | 
| -  EmitJumpToFinally(token);
 | 
| -}
 | 
| -
 | 
| -void FullCodeGenerator::DeferredCommands::RecordReturn() {
 | 
| -  if (return_token_ == TokenDispenserForFinally::kInvalidToken) {
 | 
| -    return_token_ = TokenDispenserForFinally::kReturnToken;
 | 
| -    commands_.push_back({kReturn, return_token_, nullptr});
 | 
| -  }
 | 
| -  EmitJumpToFinally(return_token_);
 | 
| -}
 | 
| -
 | 
| -void FullCodeGenerator::DeferredCommands::RecordThrow() {
 | 
| -  if (throw_token_ == TokenDispenserForFinally::kInvalidToken) {
 | 
| -    throw_token_ = TokenDispenserForFinally::kThrowToken;
 | 
| -    commands_.push_back({kThrow, throw_token_, nullptr});
 | 
| -  }
 | 
| -  EmitJumpToFinally(throw_token_);
 | 
| -}
 | 
| -
 | 
| -void FullCodeGenerator::DeferredCommands::EmitFallThrough() {
 | 
| -  __ Push(Smi::FromInt(TokenDispenserForFinally::kFallThroughToken));
 | 
| -  __ Push(result_register());
 | 
| -}
 | 
| -
 | 
| -void FullCodeGenerator::DeferredCommands::EmitJumpToFinally(TokenId token) {
 | 
| -  __ Push(Smi::FromInt(token));
 | 
| -  __ Push(result_register());
 | 
| -  __ jmp(finally_entry_);
 | 
| -}
 | 
|  
 | 
|  bool FullCodeGenerator::TryLiteralCompare(CompareOperation* expr) {
 | 
|    Expression* sub_expr;
 | 
| 
 |