mov(r1, Operand(ExternalReference(Runtime::kDebugBreak, isolate())));
CEntryStub ces(isolate(), 1);
DCHECK(AllowThisStubCall(&ces));
- Call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ Call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}
// We do not try to reuse pool constants.
RelocInfo rinfo(reinterpret_cast<byte*>(pc_), rmode, data, NULL);
if (((rmode >= RelocInfo::JS_RETURN) &&
- (rmode <= RelocInfo::DEBUG_BREAK_SLOT)) ||
+ (rmode <= RelocInfo::DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL)) ||
(rmode == RelocInfo::INTERNAL_REFERENCE) ||
- (rmode == RelocInfo::CONST_POOL) ||
- (rmode == RelocInfo::VENEER_POOL) ||
+ (rmode == RelocInfo::CONST_POOL) || (rmode == RelocInfo::VENEER_POOL) ||
(rmode == RelocInfo::DEOPT_REASON)) {
// Adjust code for new modes.
DCHECK(RelocInfo::IsDebugBreakSlot(rmode)
void BreakLocation::SetDebugBreakAtSlot() {
+ DCHECK(IsDebugBreakSlot());
// Patch the code emitted by DebugCodegen::GenerateSlots, changing the debug
// break slot code from
// mov x0, x0 @ nop DEBUG_BREAK_NOP
Mov(x1, ExternalReference(Runtime::kDebugBreak, isolate()));
CEntryStub ces(isolate(), 1);
DCHECK(AllowThisStubCall(&ces));
- Call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ Call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}
WriteData(rinfo->data());
} else if (RelocInfo::IsConstPool(rmode) ||
RelocInfo::IsVeneerPool(rmode) ||
- RelocInfo::IsDebugBreakSlot(rmode)) {
+ RelocInfo::IsDebugBreakSlotAtCall(rmode)) {
WriteIntData(static_cast<int>(rinfo->data()));
}
}
}
} else if (RelocInfo::IsConstPool(rmode) ||
RelocInfo::IsVeneerPool(rmode) ||
- RelocInfo::IsDebugBreakSlot(rmode)) {
+ RelocInfo::IsDebugBreakSlotAtCall(rmode)) {
if (SetMode(rmode)) {
AdvanceReadInt();
return;
return "embedded object";
case CONSTRUCT_CALL:
return "code target (js construct call)";
- case DEBUG_BREAK:
- return "debug break";
+ case DEBUGGER_STATEMENT:
+ return "debugger statement";
case CODE_TARGET:
return "code target";
case CODE_TARGET_WITH_ID:
return "constant pool";
case VENEER_POOL:
return "veneer pool";
- case DEBUG_BREAK_SLOT:
- return "debug break slot";
+ case DEBUG_BREAK_SLOT_AT_POSITION:
+ return "debug break slot at position";
+ case DEBUG_BREAK_SLOT_AT_CALL:
+ return "debug break slot at call";
+ case DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL:
+ return "debug break slot at construct call";
case CODE_AGE_SEQUENCE:
return "code_age_sequence";
case NUMBER_OF_MODES:
}
} else if (IsConstPool(rmode_)) {
os << " (size " << static_cast<int>(data_) << ")";
- } else if (IsDebugBreakSlot(rmode_)) {
- if (DebugBreakIsCall(data_)) {
- os << " (call with " << DebugBreakCallArgumentsCount(data_) << " args)";
- } else if (DebugBreakIsConstructCall(data_)) {
- os << " (construct call)";
- } else {
- os << " (slot)";
- }
}
os << "\n";
case CELL:
Object::VerifyPointer(target_cell());
break;
- case DEBUG_BREAK:
+ case DEBUGGER_STATEMENT:
case CONSTRUCT_CALL:
case CODE_TARGET_WITH_ID:
case CODE_TARGET: {
case DEOPT_REASON:
case CONST_POOL:
case VENEER_POOL:
- case DEBUG_BREAK_SLOT:
+ case DEBUG_BREAK_SLOT_AT_POSITION:
+ case DEBUG_BREAK_SLOT_AT_CALL:
+ case DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL:
case NONE32:
case NONE64:
break;
#endif // VERIFY_HEAP
-bool RelocInfo::DebugBreakIsConstructCall(intptr_t data) {
- return data == static_cast<intptr_t>(kDebugBreakConstructCallSentinel);
-}
-
-
-bool RelocInfo::DebugBreakIsCall(intptr_t data) { return data >= 0; }
-
-
int RelocInfo::DebugBreakCallArgumentsCount(intptr_t data) {
- DCHECK(DebugBreakIsCall(data));
return static_cast<int>(data);
}
void Assembler::RecordDebugBreakSlot() {
EnsureSpace ensure_space(this);
- intptr_t data = static_cast<intptr_t>(RelocInfo::kDebugBreakNonCallSentinel);
- RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data);
+ RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION);
}
void Assembler::RecordDebugBreakSlotForCall(int argc) {
EnsureSpace ensure_space(this);
intptr_t data = static_cast<intptr_t>(argc);
- RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data);
+ RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL, data);
}
void Assembler::RecordDebugBreakSlotForConstructCall() {
EnsureSpace ensure_space(this);
- intptr_t data =
- static_cast<intptr_t>(RelocInfo::kDebugBreakConstructCallSentinel);
- RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data);
+ RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL);
}
CODE_TARGET, // Code target which is not any of the above.
CODE_TARGET_WITH_ID,
CONSTRUCT_CALL, // code target that is a call to a JavaScript constructor.
- DEBUG_BREAK, // Code target for the debugger statement.
+ DEBUGGER_STATEMENT, // Code target for the debugger statement.
EMBEDDED_OBJECT,
CELL,
COMMENT,
POSITION, // See comment for kNoPosition above.
STATEMENT_POSITION, // See comment for kNoPosition above.
- DEBUG_BREAK_SLOT, // Additional code inserted for debug break slot.
+
+ // Additional code inserted for debug break slot.
+ DEBUG_BREAK_SLOT_AT_POSITION,
+ DEBUG_BREAK_SLOT_AT_CALL,
+ DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL,
+
EXTERNAL_REFERENCE, // The address of an external C++ function.
INTERNAL_REFERENCE, // An address inside the same function.
CONST_POOL,
VENEER_POOL,
- DEOPT_REASON, // Deoptimization reason index.
+ DEOPT_REASON, // Deoptimization reason index.
// This is not an actual reloc mode, but used to encode a long pc jump that
// cannot be encoded as part of another record.
FIRST_REAL_RELOC_MODE = CODE_TARGET,
LAST_REAL_RELOC_MODE = VENEER_POOL,
- LAST_CODE_ENUM = DEBUG_BREAK,
+ LAST_CODE_ENUM = DEBUGGER_STATEMENT,
LAST_GCED_ENUM = CELL,
};
+ STATIC_ASSERT(NUMBER_OF_MODES <= kBitsPerInt);
+
RelocInfo() {}
RelocInfo(byte* pc, Mode rmode, intptr_t data, Code* host)
return mode == INTERNAL_REFERENCE_ENCODED;
}
static inline bool IsDebugBreakSlot(Mode mode) {
- return mode == DEBUG_BREAK_SLOT;
+ return IsDebugBreakSlotAtPosition(mode) || IsDebugBreakSlotAtCall(mode) ||
+ IsDebugBreakSlotAtConstructCall(mode);
+ }
+ static inline bool IsDebugBreakSlotAtPosition(Mode mode) {
+ return mode == DEBUG_BREAK_SLOT_AT_POSITION;
+ }
+ static inline bool IsDebugBreakSlotAtCall(Mode mode) {
+ return mode == DEBUG_BREAK_SLOT_AT_CALL;
+ }
+ static inline bool IsDebugBreakSlotAtConstructCall(Mode mode) {
+ return mode == DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL;
}
static inline bool IsDebuggerStatement(Mode mode) {
- return mode == DEBUG_BREAK;
+ return mode == DEBUGGER_STATEMENT;
}
static inline bool IsNone(Mode mode) {
return mode == NONE32 || mode == NONE64;
// constant pool, otherwise the pointer is embedded in the instruction stream.
bool IsInConstantPool();
- static bool DebugBreakIsConstructCall(intptr_t data);
- static bool DebugBreakIsCall(intptr_t data);
static int DebugBreakCallArgumentsCount(intptr_t data);
// Read/modify the code target in the branch/call instruction
static const int kPositionMask = 1 << POSITION | 1 << STATEMENT_POSITION;
static const int kDataMask =
(1 << CODE_TARGET_WITH_ID) | kPositionMask | (1 << COMMENT);
+ static const int kDebugBreakSlotMask =
+ 1 << DEBUG_BREAK_SLOT_AT_POSITION | 1 << DEBUG_BREAK_SLOT_AT_CALL |
+ 1 << DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL;
static const int kApplyMask; // Modes affected by apply. Depends on arch.
- static const int kDebugBreakNonCallSentinel = -2;
- static const int kDebugBreakConstructCallSentinel = -1;
private:
// On ARM, note that pc_ is the address of the constant pool entry
V(StoreIC_Normal, STORE_IC)
// Define list of builtins used by the debugger implemented in assembly.
-#define BUILTIN_LIST_DEBUG_A(V) \
- V(Return_DebugBreak, BUILTIN, DEBUG_STUB, \
- DEBUG_BREAK) \
- V(Slot_DebugBreak, BUILTIN, DEBUG_STUB, \
- DEBUG_BREAK) \
- V(PlainReturn_LiveEdit, BUILTIN, DEBUG_STUB, \
- DEBUG_BREAK) \
- V(FrameDropper_LiveEdit, BUILTIN, DEBUG_STUB, \
- DEBUG_BREAK)
+#define BUILTIN_LIST_DEBUG_A(V) \
+ V(Return_DebugBreak, BUILTIN, DEBUG_STUB, kNoExtraICState) \
+ V(Slot_DebugBreak, BUILTIN, DEBUG_STUB, kNoExtraICState) \
+ V(PlainReturn_LiveEdit, BUILTIN, DEBUG_STUB, kNoExtraICState) \
+ V(FrameDropper_LiveEdit, BUILTIN, DEBUG_STUB, kNoExtraICState)
// Define list of builtins implemented in JavaScript.
#define BUILTINS_LIST_JS(V) \
BreakLocation::Iterator::Iterator(Handle<DebugInfo> debug_info,
BreakLocatorType type)
: debug_info_(debug_info),
- type_(type),
- reloc_iterator_(debug_info->code(),
- ~RelocInfo::ModeMask(RelocInfo::CODE_AGE_SEQUENCE)),
- reloc_iterator_original_(
- debug_info->original_code(),
- ~RelocInfo::ModeMask(RelocInfo::CODE_AGE_SEQUENCE)),
+ reloc_iterator_(debug_info->code(), GetModeMask(type)),
+ reloc_iterator_original_(debug_info->original_code(), GetModeMask(type)),
break_index_(-1),
position_(1),
statement_position_(1) {
- Next();
+ if (!RinfoDone()) Next();
+}
+
+
+int BreakLocation::Iterator::GetModeMask(BreakLocatorType type) {
+ int mask = 0;
+ mask |= RelocInfo::ModeMask(RelocInfo::POSITION);
+ mask |= RelocInfo::ModeMask(RelocInfo::STATEMENT_POSITION);
+ mask |= RelocInfo::ModeMask(RelocInfo::JS_RETURN);
+ mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CALL);
+ mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL);
+ if (type == ALL_BREAK_LOCATIONS) {
+ mask |= RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION);
+ mask |= RelocInfo::ModeMask(RelocInfo::DEBUGGER_STATEMENT);
+ }
+ return mask;
}
break;
}
- if (RelocInfo::IsDebugBreakSlot(rmode()) &&
- (type_ == ALL_BREAK_LOCATIONS ||
- RelocInfo::DebugBreakIsCall(rinfo()->data()))) {
- break;
- }
-
- if (RelocInfo::IsDebuggerStatement(rmode()) &&
- type_ == ALL_BREAK_LOCATIONS) {
- break;
- }
+ DCHECK(RelocInfo::IsDebugBreakSlot(rmode()) ||
+ RelocInfo::IsDebuggerStatement(rmode()));
+ break;
}
break_index_++;
}
// object.
bool Debug::IsDebugBreak(Address addr) {
Code* code = Code::GetCodeFromTargetAddress(addr);
- return code->is_debug_stub() && code->extra_ic_state() == DEBUG_BREAK;
+ return code->is_debug_stub();
}
static int ComputePcOffsetFromCodeOffset(Code *code, int code_offset) {
DCHECK_EQ(code->kind(), Code::FUNCTION);
- int mask = RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT) |
+ int mask = RelocInfo::kDebugBreakSlotMask |
RelocInfo::ModeMask(RelocInfo::CONST_POOL) |
RelocInfo::ModeMask(RelocInfo::VENEER_POOL);
int reloc = 0;
bool IsDebugBreak() const;
inline bool IsExit() const { return RelocInfo::IsJSReturn(rmode_); }
inline bool IsCall() const {
- return IsDebugBreakSlot() && RelocInfo::DebugBreakIsCall(data_);
+ return RelocInfo::IsDebugBreakSlotAtCall(rmode_);
}
inline bool IsConstructCall() const {
- return IsDebugBreakSlot() && RelocInfo::DebugBreakIsConstructCall(data_);
+ return RelocInfo::IsDebugBreakSlotAtConstructCall(rmode_);
}
inline int CallArgumentsCount() const {
DCHECK(IsCall());
inline int statement_position() const { return statement_position_; }
private:
+ static int GetModeMask(BreakLocatorType type);
+
bool RinfoDone() const;
void RinfoNext();
Handle<DebugInfo> debug_info_;
- BreakLocatorType type_;
RelocIterator reloc_iterator_;
RelocIterator reloc_iterator_original_;
int break_index_;
break;
}
case SlotsBuffer::DEBUG_TARGET_SLOT: {
- RelocInfo rinfo(addr, RelocInfo::DEBUG_BREAK_SLOT, 0, NULL);
+ RelocInfo rinfo(addr, RelocInfo::DEBUG_BREAK_SLOT_AT_POSITION, 0, NULL);
if (rinfo.IsPatchedDebugBreakSlotSequence()) rinfo.Visit(isolate, v);
break;
}
RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
RelocInfo::ModeMask(RelocInfo::JS_RETURN) |
- RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT) |
- RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
+ RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
+ RelocInfo::kDebugBreakSlotMask;
// There are two places where we iterate code bodies: here and the
// templated CodeIterateBody (below). They should be kept in sync.
RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE) |
RelocInfo::ModeMask(RelocInfo::INTERNAL_REFERENCE_ENCODED) |
RelocInfo::ModeMask(RelocInfo::JS_RETURN) |
- RelocInfo::ModeMask(RelocInfo::DEBUG_BREAK_SLOT) |
- RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
+ RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY) |
+ RelocInfo::kDebugBreakSlotMask;
// There are two places where we iterate code bodies: here and the non-
// templated CodeIterateBody (above). They should be kept in sync.
int32_t* p = reinterpret_cast<int32_t*>(pc_);
*p -= delta; // Relocate entry.
if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
- } else if (rmode_ == CODE_AGE_SEQUENCE) {
+ } else if (IsCodeAgeSequence(rmode_)) {
if (*pc_ == kCallOpcode) {
int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
*p -= delta; // Relocate entry.
if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
}
- } else if (rmode_ == JS_RETURN && IsPatchedReturnSequence()) {
+ } else if (IsJSReturn(rmode_) && IsPatchedReturnSequence()) {
// Special handling of js_return when a break point is set (call
// instruction has been inserted).
int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
*p -= delta; // Relocate entry.
if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
- } else if (rmode_ == DEBUG_BREAK_SLOT && IsPatchedDebugBreakSlotSequence()) {
+ } else if (IsDebugBreakSlot(rmode_) && IsPatchedDebugBreakSlotSequence()) {
// Special handling of a debug break slot when a break point is set (call
// instruction has been inserted).
int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
const int RelocInfo::kApplyMask =
- RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
+ RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE |
- 1 << RelocInfo::DEBUG_BREAK_SLOT | 1 << RelocInfo::CODE_AGE_SEQUENCE;
+ 1 << RelocInfo::CODE_AGE_SEQUENCE | RelocInfo::kDebugBreakSlotMask;
bool RelocInfo::IsCodedSpecially() {
Move(eax, Immediate(0));
mov(ebx, Immediate(ExternalReference(Runtime::kDebugBreak, isolate())));
CEntryStub ces(isolate(), 1);
- call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}
void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
// We do not try to reuse pool constants.
RelocInfo rinfo(pc_, rmode, data, NULL);
- if (rmode >= RelocInfo::JS_RETURN && rmode <= RelocInfo::DEBUG_BREAK_SLOT) {
+ if (rmode >= RelocInfo::JS_RETURN &&
+ rmode <= RelocInfo::DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL) {
// Adjust code for new modes.
DCHECK(RelocInfo::IsDebugBreakSlot(rmode)
|| RelocInfo::IsJSReturn(rmode)
PrepareCEntryFunction(ExternalReference(Runtime::kDebugBreak, isolate()));
CEntryStub ces(isolate(), 1);
DCHECK(AllowThisStubCall(&ces));
- Call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ Call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}
void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
// We do not try to reuse pool constants.
RelocInfo rinfo(pc_, rmode, data, NULL);
- if (rmode >= RelocInfo::JS_RETURN && rmode <= RelocInfo::DEBUG_BREAK_SLOT) {
+ if (rmode >= RelocInfo::JS_RETURN &&
+ rmode <= RelocInfo::DEBUG_BREAK_SLOT_AT_CONSTRUCT_CALL) {
// Adjust code for new modes.
DCHECK(RelocInfo::IsDebugBreakSlot(rmode)
|| RelocInfo::IsJSReturn(rmode)
PrepareCEntryFunction(ExternalReference(Runtime::kDebugBreak, isolate()));
CEntryStub ces(isolate(), 1);
DCHECK(AllowThisStubCall(&ces));
- Call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ Call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}
};
-enum DebugExtraICState {
- DEBUG_BREAK,
- DEBUG_PREPARE_STEP_IN
-};
-
-
// Indicates whether the transition is simple: the target map of the transition
// either extends the current map with a new property, or it modifies the
// property that was added last to the current map.
mov(r4, Operand(ExternalReference(Runtime::kDebugBreak, isolate())));
CEntryStub ces(isolate(), 1);
DCHECK(AllowThisStubCall(&ces));
- Call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ Call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}
LoadAddress(rbx, ExternalReference(Runtime::kDebugBreak, isolate()));
CEntryStub ces(isolate(), 1);
DCHECK(AllowThisStubCall(&ces));
- Call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ Call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}
int32_t* p = reinterpret_cast<int32_t*>(pc_);
*p -= delta; // Relocate entry.
if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
- } else if (rmode_ == CODE_AGE_SEQUENCE) {
+ } else if (IsCodeAgeSequence(rmode_)) {
if (*pc_ == kCallOpcode) {
int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
*p -= delta; // Relocate entry.
if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
}
- } else if (rmode_ == JS_RETURN && IsPatchedReturnSequence()) {
+ } else if (IsJSReturn(rmode_) && IsPatchedReturnSequence()) {
// Special handling of js_return when a break point is set (call
// instruction has been inserted).
int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
*p -= delta; // Relocate entry.
if (flush_icache) CpuFeatures::FlushICache(p, sizeof(uint32_t));
- } else if (rmode_ == DEBUG_BREAK_SLOT && IsPatchedDebugBreakSlotSequence()) {
+ } else if (IsDebugBreakSlot(rmode_) && IsPatchedDebugBreakSlotSequence()) {
// Special handling of a debug break slot when a break point is set (call
// instruction has been inserted).
int32_t* p = reinterpret_cast<int32_t*>(pc_ + 1);
const int RelocInfo::kApplyMask =
- RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
+ RelocInfo::kCodeTargetMask | 1 << RelocInfo::RUNTIME_ENTRY |
1 << RelocInfo::JS_RETURN | 1 << RelocInfo::INTERNAL_REFERENCE |
- 1 << RelocInfo::DEBUG_BREAK_SLOT | 1 << RelocInfo::CODE_AGE_SEQUENCE;
+ 1 << RelocInfo::CODE_AGE_SEQUENCE | RelocInfo::kDebugBreakSlotMask;
bool RelocInfo::IsCodedSpecially() {
Move(eax, Immediate(0));
mov(ebx, Immediate(ExternalReference(Runtime::kDebugBreak, isolate())));
CEntryStub ces(isolate(), 1);
- call(ces.GetCode(), RelocInfo::DEBUG_BREAK);
+ call(ces.GetCode(), RelocInfo::DEBUGGER_STATEMENT);
}