Index: src/interpreter/bytecode-array-builder.cc |
diff --git a/src/interpreter/bytecode-array-builder.cc b/src/interpreter/bytecode-array-builder.cc |
index b8e0c605e4e754ae7ea820764800ccf7274a1caf..fa57c16c7cca85c9faa418815cddf63dd0620b3e 100644 |
--- a/src/interpreter/bytecode-array-builder.cc |
+++ b/src/interpreter/bytecode-array-builder.cc |
@@ -6,6 +6,7 @@ |
#include "src/compiler.h" |
#include "src/interpreter/bytecode-array-writer.h" |
+#include "src/interpreter/bytecode-label.h" |
#include "src/interpreter/bytecode-peephole-optimizer.h" |
#include "src/interpreter/bytecode-register-optimizer.h" |
#include "src/interpreter/interpreter-intrinsics.h" |
@@ -23,14 +24,12 @@ BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone, |
bytecode_generated_(false), |
constant_array_builder_(isolate, zone), |
handler_table_builder_(isolate, zone), |
- source_position_table_builder_(isolate, zone), |
return_seen_in_block_(false), |
- unbound_jumps_(0), |
parameter_count_(parameter_count), |
local_register_count_(locals_count), |
context_register_count_(context_count), |
temporary_allocator_(zone, fixed_register_count()), |
- bytecode_array_writer_(zone, &source_position_table_builder_), |
+ bytecode_array_writer_(isolate, zone, &constant_array_builder_), |
pipeline_(&bytecode_array_writer_) { |
DCHECK_GE(parameter_count_, 0); |
DCHECK_GE(context_register_count_, 0); |
@@ -49,8 +48,6 @@ BytecodeArrayBuilder::BytecodeArrayBuilder(Isolate* isolate, Zone* zone, |
return_position_ = |
literal ? std::max(literal->start_position(), literal->end_position() - 1) |
: RelocInfo::kNoPosition; |
- LOG_CODE_EVENT(isolate_, CodeStartLinePosInfoRecordEvent( |
- source_position_table_builder())); |
} |
Register BytecodeArrayBuilder::first_context_register() const { |
@@ -58,55 +55,28 @@ Register BytecodeArrayBuilder::first_context_register() const { |
return Register(local_register_count_); |
} |
- |
Register BytecodeArrayBuilder::last_context_register() const { |
DCHECK_GT(context_register_count_, 0); |
return Register(local_register_count_ + context_register_count_ - 1); |
} |
- |
Register BytecodeArrayBuilder::Parameter(int parameter_index) const { |
DCHECK_GE(parameter_index, 0); |
return Register::FromParameterIndex(parameter_index, parameter_count()); |
} |
- |
bool BytecodeArrayBuilder::RegisterIsParameterOrLocal(Register reg) const { |
return reg.is_parameter() || reg.index() < locals_count(); |
} |
- |
Handle<BytecodeArray> BytecodeArrayBuilder::ToBytecodeArray() { |
- DCHECK_EQ(0, unbound_jumps_); |
- DCHECK_EQ(bytecode_generated_, false); |
DCHECK(return_seen_in_block_); |
+ DCHECK(!bytecode_generated_); |
+ bytecode_generated_ = true; |
- pipeline()->FlushBasicBlock(); |
- const ZoneVector<uint8_t>* bytecodes = bytecode_array_writer()->bytecodes(); |
- |
- int bytecode_size = static_cast<int>(bytecodes->size()); |
- |
- // All locals need a frame slot for the debugger, but may not be |
- // present in generated code. |
- int frame_size_for_locals = fixed_register_count() * kPointerSize; |
- int frame_size_used = bytecode_array_writer()->GetMaximumFrameSizeUsed(); |
- int frame_size = std::max(frame_size_for_locals, frame_size_used); |
- Handle<FixedArray> constant_pool = constant_array_builder()->ToFixedArray(); |
Handle<FixedArray> handler_table = handler_table_builder()->ToHandlerTable(); |
- Handle<ByteArray> source_position_table = |
- source_position_table_builder()->ToSourcePositionTable(); |
- Handle<BytecodeArray> bytecode_array = isolate_->factory()->NewBytecodeArray( |
- bytecode_size, &bytecodes->front(), frame_size, parameter_count(), |
- constant_pool); |
- bytecode_array->set_handler_table(*handler_table); |
- bytecode_array->set_source_position_table(*source_position_table); |
- |
- void* line_info = source_position_table_builder()->DetachJITHandlerData(); |
- LOG_CODE_EVENT(isolate_, CodeEndLinePosInfoRecordEvent( |
- AbstractCode::cast(*bytecode_array), line_info)); |
- |
- bytecode_generated_ = true; |
- return bytecode_array; |
+ return pipeline_->ToBytecodeArray(fixed_register_count(), parameter_count(), |
+ handler_table); |
} |
void BytecodeArrayBuilder::AttachSourceInfo(BytecodeNode* node) { |
@@ -181,7 +151,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { |
Output(Bytecode::kToBooleanLogicalNot); |
return *this; |
@@ -202,7 +171,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( |
v8::internal::Smi* smi) { |
int32_t raw_smi = smi->value(); |
@@ -217,7 +185,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { |
size_t entry = GetConstantPoolEntry(object); |
OperandScale operand_scale = |
@@ -226,31 +193,26 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() { |
Output(Bytecode::kLdaUndefined); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() { |
Output(Bytecode::kLdaNull); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadTheHole() { |
Output(Bytecode::kLdaTheHole); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadTrue() { |
Output(Bytecode::kLdaTrue); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { |
Output(Bytecode::kLdaFalse); |
return *this; |
@@ -264,7 +226,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( |
Register reg) { |
OperandScale operand_scale = |
@@ -273,7 +234,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, |
Register to) { |
DCHECK(from != to); |
@@ -310,7 +270,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, |
int slot_index) { |
OperandScale operand_scale = Bytecodes::OperandSizesToScale( |
@@ -320,7 +279,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, |
int slot_index) { |
OperandScale operand_scale = Bytecodes::OperandSizesToScale( |
@@ -386,7 +344,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( |
Register object, Register key, int feedback_slot, |
LanguageMode language_mode) { |
@@ -399,7 +356,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( |
Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { |
size_t entry = GetConstantPoolEntry(shared_info); |
@@ -410,7 +366,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( |
CreateArgumentsType type) { |
// TODO(rmcilroy): Consider passing the type as a bytecode operand rather |
@@ -421,7 +376,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( |
Handle<String> pattern, int literal_index, int flags) { |
size_t pattern_entry = GetConstantPoolEntry(pattern); |
@@ -435,7 +389,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( |
Handle<FixedArray> constant_elements, int literal_index, int flags) { |
size_t constant_elements_entry = GetConstantPoolEntry(constant_elements); |
@@ -449,7 +402,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( |
Handle<FixedArray> constant_properties, int literal_index, int flags) { |
size_t constant_properties_entry = GetConstantPoolEntry(constant_properties); |
@@ -463,7 +415,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { |
OperandScale operand_scale = |
Bytecodes::OperandSizesToScale(context.SizeOfOperand()); |
@@ -471,7 +422,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { |
OperandScale operand_scale = |
Bytecodes::OperandSizesToScale(context.SizeOfOperand()); |
@@ -479,13 +429,11 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { |
Output(Bytecode::kToObject); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { |
Output(Bytecode::kToName); |
return *this; |
@@ -496,204 +444,24 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToNumber() { |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(BytecodeLabel* label) { |
- size_t current_offset = pipeline()->FlushForOffset(); |
- if (label->is_forward_target()) { |
- // An earlier jump instruction refers to this label. Update it's location. |
- PatchJump(current_offset, label->offset()); |
- // Now treat as if the label will only be back referred to. |
- } |
- label->bind_to(current_offset); |
+ pipeline_->BindLabel(label); |
LeaveBasicBlock(); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, |
BytecodeLabel* label) { |
- DCHECK(!label->is_bound()); |
- DCHECK(target.is_bound()); |
- // There is no need to flush the pipeline here, it will have been |
- // flushed when |target| was bound. |
- if (label->is_forward_target()) { |
- // An earlier jump instruction refers to this label. Update it's location. |
- PatchJump(target.offset(), label->offset()); |
- // Now treat as if the label will only be back referred to. |
- } |
- label->bind_to(target.offset()); |
+ pipeline_->BindLabel(target, label); |
LeaveBasicBlock(); |
return *this; |
} |
- |
-// static |
-Bytecode BytecodeArrayBuilder::GetJumpWithConstantOperand( |
- Bytecode jump_bytecode) { |
- switch (jump_bytecode) { |
- case Bytecode::kJump: |
- return Bytecode::kJumpConstant; |
- case Bytecode::kJumpIfTrue: |
- return Bytecode::kJumpIfTrueConstant; |
- case Bytecode::kJumpIfFalse: |
- return Bytecode::kJumpIfFalseConstant; |
- case Bytecode::kJumpIfToBooleanTrue: |
- return Bytecode::kJumpIfToBooleanTrueConstant; |
- case Bytecode::kJumpIfToBooleanFalse: |
- return Bytecode::kJumpIfToBooleanFalseConstant; |
- case Bytecode::kJumpIfNotHole: |
- return Bytecode::kJumpIfNotHoleConstant; |
- case Bytecode::kJumpIfNull: |
- return Bytecode::kJumpIfNullConstant; |
- case Bytecode::kJumpIfUndefined: |
- return Bytecode::kJumpIfUndefinedConstant; |
- default: |
- UNREACHABLE(); |
- return Bytecode::kIllegal; |
- } |
-} |
- |
-void BytecodeArrayBuilder::PatchJumpWith8BitOperand( |
- ZoneVector<uint8_t>* bytecodes, size_t jump_location, int delta) { |
- Bytecode jump_bytecode = Bytecodes::FromByte(bytecodes->at(jump_location)); |
- DCHECK(Bytecodes::IsJumpImmediate(jump_bytecode)); |
- size_t operand_location = jump_location + 1; |
- DCHECK_EQ(bytecodes->at(operand_location), 0); |
- if (Bytecodes::SizeForSignedOperand(delta) == OperandSize::kByte) { |
- // The jump fits within the range of an Imm operand, so cancel |
- // the reservation and jump directly. |
- constant_array_builder()->DiscardReservedEntry(OperandSize::kByte); |
- bytecodes->at(operand_location) = static_cast<uint8_t>(delta); |
- } else { |
- // The jump does not fit within the range of an Imm operand, so |
- // commit reservation putting the offset into the constant pool, |
- // and update the jump instruction and operand. |
- size_t entry = constant_array_builder()->CommitReservedEntry( |
- OperandSize::kByte, handle(Smi::FromInt(delta), isolate())); |
- DCHECK(Bytecodes::SizeForUnsignedOperand(entry) == OperandSize::kByte); |
- jump_bytecode = GetJumpWithConstantOperand(jump_bytecode); |
- bytecodes->at(jump_location) = Bytecodes::ToByte(jump_bytecode); |
- bytecodes->at(operand_location) = static_cast<uint8_t>(entry); |
- } |
-} |
- |
-void BytecodeArrayBuilder::PatchJumpWith16BitOperand( |
- ZoneVector<uint8_t>* bytecodes, size_t jump_location, int delta) { |
- Bytecode jump_bytecode = Bytecodes::FromByte(bytecodes->at(jump_location)); |
- DCHECK(Bytecodes::IsJumpImmediate(jump_bytecode)); |
- size_t operand_location = jump_location + 1; |
- uint8_t operand_bytes[2]; |
- if (Bytecodes::SizeForSignedOperand(delta) <= OperandSize::kShort) { |
- constant_array_builder()->DiscardReservedEntry(OperandSize::kShort); |
- WriteUnalignedUInt16(operand_bytes, static_cast<uint16_t>(delta)); |
- } else { |
- jump_bytecode = GetJumpWithConstantOperand(jump_bytecode); |
- bytecodes->at(jump_location) = Bytecodes::ToByte(jump_bytecode); |
- size_t entry = constant_array_builder()->CommitReservedEntry( |
- OperandSize::kShort, handle(Smi::FromInt(delta), isolate())); |
- WriteUnalignedUInt16(operand_bytes, static_cast<uint16_t>(entry)); |
- } |
- DCHECK(bytecodes->at(operand_location) == 0 && |
- bytecodes->at(operand_location + 1) == 0); |
- bytecodes->at(operand_location++) = operand_bytes[0]; |
- bytecodes->at(operand_location) = operand_bytes[1]; |
-} |
- |
-void BytecodeArrayBuilder::PatchJumpWith32BitOperand( |
- ZoneVector<uint8_t>* bytecodes, size_t jump_location, int delta) { |
- DCHECK(Bytecodes::IsJumpImmediate( |
- Bytecodes::FromByte(bytecodes->at(jump_location)))); |
- constant_array_builder()->DiscardReservedEntry(OperandSize::kQuad); |
- uint8_t operand_bytes[4]; |
- WriteUnalignedUInt32(operand_bytes, static_cast<uint32_t>(delta)); |
- size_t operand_location = jump_location + 1; |
- DCHECK(bytecodes->at(operand_location) == 0 && |
- bytecodes->at(operand_location + 1) == 0 && |
- bytecodes->at(operand_location + 2) == 0 && |
- bytecodes->at(operand_location + 3) == 0); |
- bytecodes->at(operand_location++) = operand_bytes[0]; |
- bytecodes->at(operand_location++) = operand_bytes[1]; |
- bytecodes->at(operand_location++) = operand_bytes[2]; |
- bytecodes->at(operand_location) = operand_bytes[3]; |
-} |
- |
-void BytecodeArrayBuilder::PatchJump(size_t jump_target, size_t jump_location) { |
- ZoneVector<uint8_t>* bytecodes = bytecode_array_writer()->bytecodes(); |
- Bytecode jump_bytecode = Bytecodes::FromByte(bytecodes->at(jump_location)); |
- int delta = static_cast<int>(jump_target - jump_location); |
- int prefix_offset = 0; |
- OperandScale operand_scale = OperandScale::kSingle; |
- if (Bytecodes::IsPrefixScalingBytecode(jump_bytecode)) { |
- // If a prefix scaling bytecode is emitted the target offset is one |
- // less than the case of no prefix scaling bytecode. |
- delta -= 1; |
- prefix_offset = 1; |
- operand_scale = Bytecodes::PrefixBytecodeToOperandScale(jump_bytecode); |
- jump_bytecode = |
- Bytecodes::FromByte(bytecodes->at(jump_location + prefix_offset)); |
- } |
- |
- DCHECK(Bytecodes::IsJump(jump_bytecode)); |
- switch (operand_scale) { |
- case OperandScale::kSingle: |
- PatchJumpWith8BitOperand(bytecodes, jump_location, delta); |
- break; |
- case OperandScale::kDouble: |
- PatchJumpWith16BitOperand(bytecodes, jump_location + prefix_offset, |
- delta); |
- break; |
- case OperandScale::kQuadruple: |
- PatchJumpWith32BitOperand(bytecodes, jump_location + prefix_offset, |
- delta); |
- break; |
- default: |
- UNREACHABLE(); |
- } |
- unbound_jumps_--; |
-} |
- |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, |
BytecodeLabel* label) { |
- if (label->is_bound()) { |
- // Label has been bound already so this is a backwards jump. |
- size_t current_offset = pipeline()->FlushForOffset(); |
- CHECK_GE(current_offset, label->offset()); |
- CHECK_LE(current_offset, static_cast<size_t>(kMaxInt)); |
- size_t abs_delta = current_offset - label->offset(); |
- int delta = -static_cast<int>(abs_delta); |
- OperandSize operand_size = Bytecodes::SizeForSignedOperand(delta); |
- if (operand_size > OperandSize::kByte) { |
- // Adjust for scaling byte prefix for wide jump offset. |
- DCHECK_LE(delta, 0); |
- delta -= 1; |
- } |
- OutputScaled(jump_bytecode, Bytecodes::OperandSizesToScale(operand_size), |
- SignedOperand(delta, operand_size)); |
- } else { |
- // The label has not yet been bound so this is a forward reference |
- // that will be patched when the label is bound. We create a |
- // reservation in the constant pool so the jump can be patched |
- // when the label is bound. The reservation means the maximum size |
- // of the operand for the constant is known and the jump can |
- // be emitted into the bytecode stream with space for the operand. |
- unbound_jumps_++; |
- OperandSize reserved_operand_size = |
- constant_array_builder()->CreateReservedEntry(); |
- OutputScaled(jump_bytecode, |
- Bytecodes::OperandSizesToScale(reserved_operand_size), 0); |
- |
- // Calculate the label position by flushing for offset after emitting the |
- // jump bytecode. |
- size_t offset = pipeline()->FlushForOffset(); |
- OperandScale operand_scale = |
- Bytecodes::OperandSizesToScale(reserved_operand_size); |
- offset -= Bytecodes::Size(jump_bytecode, operand_scale); |
- if (Bytecodes::OperandScaleRequiresPrefixBytecode(operand_scale)) { |
- offset -= 1; |
- } |
- label->set_referrer(offset); |
- } |
+ BytecodeNode node(jump_bytecode, 0, OperandScale::kSingle); |
+ AttachSourceInfo(&node); |
+ pipeline_->WriteJump(&node, label); |
LeaveBasicBlock(); |
return *this; |
} |
@@ -723,6 +491,11 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfUndefined( |
return OutputJump(Bytecode::kJumpIfUndefined, label); |
} |
+BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfNotHole( |
+ BytecodeLabel* label) { |
+ return OutputJump(Bytecode::kJumpIfNotHole, label); |
+} |
+ |
BytecodeArrayBuilder& BytecodeArrayBuilder::StackCheck(int position) { |
if (position != RelocInfo::kNoPosition) { |
// We need to attach a non-breakable source position to a stack check, |
@@ -733,23 +506,16 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::StackCheck(int position) { |
return *this; |
} |
-BytecodeArrayBuilder& BytecodeArrayBuilder::JumpIfNotHole( |
- BytecodeLabel* label) { |
- return OutputJump(Bytecode::kJumpIfNotHole, label); |
-} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::Throw() { |
Output(Bytecode::kThrow); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::ReThrow() { |
Output(Bytecode::kReThrow); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::Return() { |
Output(Bytecode::kReturn); |
return_seen_in_block_ = true; |
@@ -792,7 +558,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { |
OperandScale operand_scale = |
Bytecodes::OperandSizesToScale(index.SizeOfOperand()); |
@@ -800,7 +565,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( |
Register generator) { |
OperandScale operand_scale = |
@@ -810,7 +574,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( |
Register generator) { |
OperandScale operand_scale = |
@@ -820,37 +583,31 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, |
bool will_catch) { |
- size_t offset = pipeline()->FlushForOffset(); |
- handler_table_builder()->SetHandlerTarget(handler_id, offset); |
+ BytecodeLabel handler; |
+ Bind(&handler); |
+ handler_table_builder()->SetHandlerTarget(handler_id, handler.offset()); |
handler_table_builder()->SetPrediction(handler_id, will_catch); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::MarkTryBegin(int handler_id, |
Register context) { |
- size_t offset = pipeline()->FlushForOffset(); |
- handler_table_builder()->SetTryRegionStart(handler_id, offset); |
+ BytecodeLabel try_begin; |
+ Bind(&try_begin); |
+ handler_table_builder()->SetTryRegionStart(handler_id, try_begin.offset()); |
handler_table_builder()->SetContextRegister(handler_id, context); |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::MarkTryEnd(int handler_id) { |
- size_t offset = pipeline()->FlushForOffset(); |
- handler_table_builder()->SetTryRegionEnd(handler_id, offset); |
+ BytecodeLabel try_end; |
+ Bind(&try_end); |
+ handler_table_builder()->SetTryRegionEnd(handler_id, try_end.offset()); |
return *this; |
} |
- |
-void BytecodeArrayBuilder::LeaveBasicBlock() { |
- pipeline()->FlushBasicBlock(); |
- return_seen_in_block_ = false; |
-} |
- |
void BytecodeArrayBuilder::EnsureReturn() { |
if (!return_seen_in_block_) { |
LoadUndefined(); |
@@ -892,7 +649,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( |
Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { |
DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); |
@@ -911,7 +667,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( |
Runtime::FunctionId function_id, Register first_arg, size_t arg_count, |
Register first_return) { |
@@ -942,7 +697,6 @@ BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( |
return *this; |
} |
- |
BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, |
LanguageMode language_mode) { |
OperandScale operand_scale = |
@@ -1093,7 +847,6 @@ Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { |
} |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForCountOperation(Token::Value op) { |
switch (op) { |
@@ -1107,7 +860,6 @@ Bytecode BytecodeArrayBuilder::BytecodeForCountOperation(Token::Value op) { |
} |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForCompareOperation(Token::Value op) { |
switch (op) { |
@@ -1135,7 +887,6 @@ Bytecode BytecodeArrayBuilder::BytecodeForCompareOperation(Token::Value op) { |
} |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForStoreNamedProperty( |
LanguageMode language_mode) { |
@@ -1150,7 +901,6 @@ Bytecode BytecodeArrayBuilder::BytecodeForStoreNamedProperty( |
return Bytecode::kIllegal; |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForStoreKeyedProperty( |
LanguageMode language_mode) { |
@@ -1165,14 +915,12 @@ Bytecode BytecodeArrayBuilder::BytecodeForStoreKeyedProperty( |
return Bytecode::kIllegal; |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForLoadGlobal(TypeofMode typeof_mode) { |
return typeof_mode == INSIDE_TYPEOF ? Bytecode::kLdaGlobalInsideTypeof |
: Bytecode::kLdaGlobal; |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForStoreGlobal( |
LanguageMode language_mode) { |
@@ -1187,7 +935,6 @@ Bytecode BytecodeArrayBuilder::BytecodeForStoreGlobal( |
return Bytecode::kIllegal; |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForStoreLookupSlot( |
LanguageMode language_mode) { |
@@ -1217,7 +964,6 @@ Bytecode BytecodeArrayBuilder::BytecodeForCreateArguments( |
return Bytecode::kIllegal; |
} |
- |
// static |
Bytecode BytecodeArrayBuilder::BytecodeForDelete(LanguageMode language_mode) { |
switch (language_mode) { |