| 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;
|
|
|