| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index b0b4f4f57626a1215ed5c10b2efe8bfe7834c7d5..e69817737dc05d81b1188c6eaacddbd454fead3b 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -12972,6 +12972,26 @@ void Code::set_static_calls_target_table(const Array& value) const {
|
| }
|
|
|
|
|
| +uword Code::EntryPoint() const {
|
| + RawObject* instr = instructions();
|
| + if (!instr->IsHeapObject()) {
|
| + return active_entry_point();
|
| + } else {
|
| + return Instructions::EntryPoint(instructions());
|
| + }
|
| +}
|
| +
|
| +
|
| +intptr_t Code::Size() const {
|
| + RawObject* instr = instructions();
|
| + if (!instr->IsHeapObject()) {
|
| + return Smi::Value(raw_ptr()->precompiled_instructions_size_);
|
| + } else {
|
| + return instructions()->ptr()->size_;
|
| + }
|
| +}
|
| +
|
| +
|
| bool Code::HasBreakpoint() const {
|
| if (!FLAG_support_debugger) {
|
| return false;
|
| @@ -13317,10 +13337,13 @@ RawCode* Code::FinalizeCode(const char* name,
|
| }
|
|
|
| // Hook up Code and Instructions objects.
|
| - code.SetActiveInstructions(instrs.raw());
|
| code.set_instructions(instrs.raw());
|
| + code.SetActiveInstructions(instrs.raw());
|
| code.set_is_alive(true);
|
|
|
| + ASSERT(code.EntryPoint() == instrs.EntryPoint());
|
| + ASSERT(code.Size() == instrs.size());
|
| +
|
| // Set object pool in Instructions object.
|
| INC_STAT(Thread::Current(),
|
| total_code_size, object_pool.Length() * sizeof(uintptr_t));
|
| @@ -13518,9 +13541,10 @@ bool Code::IsFunctionCode() const {
|
| void Code::DisableDartCode() const {
|
| DEBUG_ASSERT(IsMutatorOrAtSafepoint());
|
| ASSERT(IsFunctionCode());
|
| - ASSERT(instructions() == active_instructions());
|
| + ASSERT(!IsDisabled());
|
| const Code& new_code =
|
| Code::Handle(StubCode::FixCallersTarget_entry()->code());
|
| + ASSERT(new_code.instructions()->IsVMHeapObject());
|
| SetActiveInstructions(new_code.instructions());
|
| }
|
|
|
| @@ -13528,9 +13552,10 @@ void Code::DisableDartCode() const {
|
| void Code::DisableStubCode() const {
|
| ASSERT(Thread::Current()->IsMutatorThread());
|
| ASSERT(IsAllocationStubCode());
|
| - ASSERT(instructions() == active_instructions());
|
| + ASSERT(!IsDisabled());
|
| const Code& new_code =
|
| Code::Handle(StubCode::FixAllocationStubTarget_entry()->code());
|
| + ASSERT(new_code.instructions()->IsVMHeapObject());
|
| SetActiveInstructions(new_code.instructions());
|
| }
|
|
|
| @@ -13539,7 +13564,6 @@ void Code::SetActiveInstructions(RawInstructions* instructions) const {
|
| DEBUG_ASSERT(IsMutatorOrAtSafepoint() || !is_alive());
|
| // RawInstructions are never allocated in New space and hence a
|
| // store buffer update is not needed here.
|
| - StorePointer(&raw_ptr()->active_instructions_, instructions);
|
| StoreNonPointer(&raw_ptr()->entry_point_,
|
| reinterpret_cast<uword>(instructions->ptr()) +
|
| Instructions::HeaderSize());
|
|
|