| Index: vm/object.cc
|
| ===================================================================
|
| --- vm/object.cc (revision 6302)
|
| +++ vm/object.cc (working copy)
|
| @@ -9,6 +9,7 @@
|
| #include "vm/bigint_operations.h"
|
| #include "vm/bootstrap.h"
|
| #include "vm/code_generator.h"
|
| +#include "vm/code_index_table.h"
|
| #include "vm/code_patcher.h"
|
| #include "vm/compiler.h"
|
| #include "vm/compiler_stats.h"
|
| @@ -25,7 +26,6 @@
|
| #include "vm/parser.h"
|
| #include "vm/runtime_entry.h"
|
| #include "vm/scopes.h"
|
| -#include "vm/stack_frame.h"
|
| #include "vm/timer.h"
|
| #include "vm/unicode.h"
|
|
|
| @@ -5566,6 +5566,26 @@
|
| }
|
|
|
|
|
| +// Return the bit offset of the highest bit set.
|
| +intptr_t Stackmap::Maximum() const {
|
| + intptr_t bound = SizeInBits();
|
| + for (intptr_t i = (bound - 1); i >= 0; i--) {
|
| + if (IsObject(i)) return i;
|
| + }
|
| + return kNoMaximum;
|
| +}
|
| +
|
| +
|
| +// Return the bit offset of the lowest bit set.
|
| +intptr_t Stackmap::Minimum() const {
|
| + intptr_t bound = SizeInBits();
|
| + for (intptr_t i = 0; i < bound; i++) {
|
| + if (IsObject(i)) return i;
|
| + }
|
| + return kNoMinimum;
|
| +}
|
| +
|
| +
|
| bool Stackmap::GetBit(intptr_t bit_offset) const {
|
| ASSERT(InRange(bit_offset));
|
| int byte_offset = bit_offset >> kBitsPerByteLog2;
|
| @@ -5590,7 +5610,7 @@
|
| }
|
|
|
|
|
| -RawStackmap* Stackmap::New(uword pc_offset, BitmapBuilder* bmap) {
|
| +RawStackmap* Stackmap::New(uword pc, const Code& code, BitmapBuilder* bmap) {
|
| const Class& cls = Class::Handle(Object::stackmap_class());
|
| ASSERT(!cls.IsNull());
|
| ASSERT(bmap != NULL);
|
| @@ -5605,13 +5625,12 @@
|
| result ^= raw;
|
| result.set_bitmap_size_in_bytes(size);
|
| }
|
| - result.SetPC(pc_offset);
|
| + result.set_pc(pc);
|
| + result.set_code(code);
|
| intptr_t bound = bmap->SizeInBits();
|
| for (intptr_t i = 0; i < bound; i++) {
|
| result.SetBit(i, bmap->Get(i));
|
| }
|
| - result.SetMinBitOffset(bmap->Minimum());
|
| - result.SetMaxBitOffset(bmap->Maximum());
|
| return result.raw();
|
| }
|
|
|
| @@ -5623,18 +5642,27 @@
|
| }
|
|
|
|
|
| +void Stackmap::set_pc(uword value) const {
|
| + raw_ptr()->pc_ = value;
|
| +}
|
| +
|
| +
|
| +void Stackmap::set_code(const Code& code) const {
|
| + StorePointer(&raw_ptr()->code_, code.raw());
|
| +}
|
| +
|
| +
|
| const char* Stackmap::ToCString() const {
|
| if (IsNull()) {
|
| return "{null}";
|
| } else {
|
| intptr_t index = OS::SNPrint(NULL, 0, "0x%lx { ", PC());
|
| - intptr_t alloc_size =
|
| - index + ((MaximumBitOffset() + 1) * 2) + 2; // "{ 1 0 .... }".
|
| + intptr_t alloc_size = index + ((Maximum() + 1) * 2) + 2; // "{ 1 0 .... }".
|
| Isolate* isolate = Isolate::Current();
|
| char* chars = reinterpret_cast<char*>(
|
| isolate->current_zone()->Allocate(alloc_size));
|
| index = OS::SNPrint(chars, alloc_size, "0x%lx { ", PC());
|
| - for (intptr_t i = 0; i <= MaximumBitOffset(); i++) {
|
| + for (intptr_t i = 0; i <= Maximum(); i++) {
|
| index += OS::SNPrint((chars + index),
|
| (alloc_size - index),
|
| "%d ",
|
| @@ -5967,38 +5995,6 @@
|
| }
|
|
|
|
|
| -RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const {
|
| - // This code is used only during iterating frames during a GC and hence
|
| - // it should not in turn start a GC.
|
| - NoGCScope no_gc;
|
| - if (stackmaps() == Array::null()) {
|
| - // No stack maps are present in the code object which means this
|
| - // frame relies on tagged pointers.
|
| - return Stackmap::null();
|
| - }
|
| - // A stack map is present in the code object, use the stack map to visit
|
| - // frame slots which are marked as having objects.
|
| - RawStackmap* previous_map = Stackmap::null();
|
| - *maps = stackmaps();
|
| - *map = Stackmap::null();
|
| - for (intptr_t i = 0; i < maps->Length(); i++) {
|
| - *map ^= maps->At(i);
|
| - ASSERT(!map->IsNull());
|
| - if (map->PC() == pc) {
|
| - break; // We found a stack map for this frame.
|
| - }
|
| - if (map->PC() > pc) {
|
| - // We have not found a stackmap corresponding to the PC of this frame,
|
| - // we will use the closest previous stack map.
|
| - *map = previous_map;
|
| - break;
|
| - }
|
| - previous_map = map->raw();
|
| - }
|
| - return map->raw();
|
| -}
|
| -
|
| -
|
| RawContext* Context::New(intptr_t num_variables, Heap::Space space) {
|
| ASSERT(num_variables >= 0);
|
|
|
| @@ -8883,16 +8879,17 @@
|
|
|
| void Stacktrace::SetupStacktrace(intptr_t index,
|
| const GrowableArray<uword>& frame_pcs) const {
|
| - Isolate* isolate = Isolate::Current();
|
| - ASSERT(isolate != NULL);
|
| - Function& function = Function::Handle(isolate, Function::null());
|
| - Code& code = Code::Handle(isolate, Code::null());
|
| - Smi& pc_offset = Smi::Handle(isolate, Smi::New(0));
|
| + ASSERT(Isolate::Current() != NULL);
|
| + CodeIndexTable* code_index_table = Isolate::Current()->code_index_table();
|
| + ASSERT(code_index_table != NULL);
|
| + Function& function = Function::Handle();
|
| + Code& code = Code::Handle();
|
| + Smi& pc_offset = Smi::Handle();
|
| const Array& function_array = Array::Handle(raw_ptr()->function_array_);
|
| const Array& code_array = Array::Handle(raw_ptr()->code_array_);
|
| const Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_);
|
| for (intptr_t i = 0; i < frame_pcs.length(); i++) {
|
| - code = StackFrame::LookupCode(isolate, frame_pcs[i]);
|
| + code = code_index_table->LookupCode(frame_pcs[i]);
|
| ASSERT(!code.IsNull());
|
| function = code.function();
|
| function_array.SetAt((index + i), function);
|
|
|