Chromium Code Reviews| Index: runtime/vm/object.cc |
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
| index 02084f8249123ad68c42339ec894d52fda7a33da..f74ae6a16360bbfb406d7521d80fb6aba022bc93 100644 |
| --- a/runtime/vm/object.cc |
| +++ b/runtime/vm/object.cc |
| @@ -13049,6 +13049,8 @@ RawCode* Code::FinalizeCode(const char* name, |
| INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize()); |
| INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize()); |
| + // TODO(johnmccutchan): Protect this behind precompilation flag. |
|
rmacnak
2015/09/29 16:50:12
This is safe. Reading is the problem.
|
| + instrs.set_code(code.raw()); |
| // Copy the instructions into the instruction area and apply all fixups. |
| // Embedded pointers are still in handles at this point. |
| MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()), |
| @@ -13130,8 +13132,13 @@ RawCode* Code::FinalizeCode(const Function& function, |
| // Check if object matches find condition. |
| -bool Code::FindRawCodeVisitor::FindObject(RawObject* obj) const { |
| - return RawCode::ContainsPC(obj, pc_); |
| +bool Code::FindRawCodeVisitor::FindObject(RawObject* raw_obj) const { |
| + uword tags = raw_obj->ptr()->tags_; |
| + if (RawObject::ClassIdTag::decode(tags) == kInstructionsCid) { |
| + RawInstructions* raw_insts = reinterpret_cast<RawInstructions*>(raw_obj); |
| + return RawInstructions::ContainsPC(raw_insts, pc_); |
| + } |
| + return false; |
| } |
| @@ -13139,13 +13146,13 @@ RawCode* Code::LookupCodeInIsolate(Isolate* isolate, uword pc) { |
| ASSERT((isolate == Isolate::Current()) || (isolate == Dart::vm_isolate())); |
|
rmacnak
2015/09/29 16:50:12
if (Dart::IsRunningPrecompiledCode()) {
// Fall
Cutch
2015/09/29 23:24:29
Done.
|
| NoSafepointScope no_safepoint; |
| FindRawCodeVisitor visitor(pc); |
| - RawObject* instr; |
| + RawInstructions* instr; |
| if (isolate->heap() == NULL) { |
| return Code::null(); |
| } |
| - instr = isolate->heap()->FindOldObject(&visitor); |
| - if (instr != Code::null()) { |
| - return static_cast<RawCode*>(instr); |
| + instr = isolate->heap()->FindObjectInCodeSpace(&visitor); |
| + if (instr != Instructions::null()) { |
| + return instr->ptr()->code_; |
|
rmacnak
2015/09/29 16:50:12
instr->code() for ASSERT
Cutch
2015/09/29 23:24:29
Done.
|
| } |
| return Code::null(); |
| } |