Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: runtime/vm/object.cc

Issue 343803002: Finishes removing intptr_t from raw object fields. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 10680 matching lines...) Expand 10 before | Expand all | Expand 10 after
10691 Stackmap::InstanceSize(length), 10691 Stackmap::InstanceSize(length),
10692 Heap::kOld); 10692 Heap::kOld);
10693 NoGCScope no_gc; 10693 NoGCScope no_gc;
10694 result ^= raw; 10694 result ^= raw;
10695 result.SetLength(length); 10695 result.SetLength(length);
10696 } 10696 }
10697 // When constructing a stackmap we store the pc offset in the stackmap's 10697 // When constructing a stackmap we store the pc offset in the stackmap's
10698 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc 10698 // PC. StackmapTableBuilder::FinalizeStackmaps will replace it with the pc
10699 // address. 10699 // address.
10700 ASSERT(pc_offset >= 0); 10700 ASSERT(pc_offset >= 0);
10701 result.SetPC(pc_offset); 10701 result.SetPcOffset(pc_offset);
10702 for (intptr_t i = 0; i < length; ++i) { 10702 for (intptr_t i = 0; i < length; ++i) {
10703 result.SetBit(i, bmap->Get(i)); 10703 result.SetBit(i, bmap->Get(i));
10704 } 10704 }
10705 result.SetRegisterBitCount(register_bit_count); 10705 result.SetRegisterBitCount(register_bit_count);
10706 return result.raw(); 10706 return result.raw();
10707 } 10707 }
10708 10708
10709 10709
10710 const char* Stackmap::ToCString() const { 10710 const char* Stackmap::ToCString() const {
10711 if (IsNull()) { 10711 if (IsNull()) {
10712 return "{null}"; 10712 return "{null}";
10713 } else { 10713 } else {
10714 const char* kFormat = "%#" Px ": "; 10714 const char* kFormat = "%#" Px ": ";
10715 intptr_t fixed_length = OS::SNPrint(NULL, 0, kFormat, PC()) + 1; 10715 intptr_t fixed_length = OS::SNPrint(NULL, 0, kFormat, PcOffset()) + 1;
10716 Isolate* isolate = Isolate::Current(); 10716 Isolate* isolate = Isolate::Current();
10717 // Guard against integer overflow in the computation of alloc_size. 10717 // Guard against integer overflow in the computation of alloc_size.
10718 // 10718 //
10719 // TODO(kmillikin): We could just truncate the string if someone 10719 // TODO(kmillikin): We could just truncate the string if someone
10720 // tries to print a 2 billion plus entry stackmap. 10720 // tries to print a 2 billion plus entry stackmap.
10721 if (Length() > (kIntptrMax - fixed_length)) { 10721 if (Length() > (kIntptrMax - fixed_length)) {
10722 FATAL1("Length() is unexpectedly large (%" Pd ")", Length()); 10722 FATAL1("Length() is unexpectedly large (%" Pd ")", Length());
10723 } 10723 }
10724 intptr_t alloc_size = fixed_length + Length(); 10724 intptr_t alloc_size = fixed_length + Length();
10725 char* chars = isolate->current_zone()->Alloc<char>(alloc_size); 10725 char* chars = isolate->current_zone()->Alloc<char>(alloc_size);
10726 intptr_t index = OS::SNPrint(chars, alloc_size, kFormat, PC()); 10726 intptr_t index = OS::SNPrint(chars, alloc_size, kFormat, PcOffset());
10727 for (intptr_t i = 0; i < Length(); i++) { 10727 for (intptr_t i = 0; i < Length(); i++) {
10728 chars[index++] = IsObject(i) ? '1' : '0'; 10728 chars[index++] = IsObject(i) ? '1' : '0';
10729 } 10729 }
10730 chars[index] = '\0'; 10730 chars[index] = '\0';
10731 return chars; 10731 return chars;
10732 } 10732 }
10733 } 10733 }
10734 10734
10735 10735
10736 void Stackmap::PrintJSONImpl(JSONStream* stream, bool ref) const { 10736 void Stackmap::PrintJSONImpl(JSONStream* stream, bool ref) const {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
10787 UNREACHABLE(); 10787 UNREACHABLE();
10788 return "Unknown"; 10788 return "Unknown";
10789 } 10789 }
10790 } 10790 }
10791 10791
10792 10792
10793 static int PrintVarInfo(char* buffer, int len, 10793 static int PrintVarInfo(char* buffer, int len,
10794 intptr_t i, 10794 intptr_t i,
10795 const String& var_name, 10795 const String& var_name,
10796 const RawLocalVarDescriptors::VarInfo& info) { 10796 const RawLocalVarDescriptors::VarInfo& info) {
10797 if (info.kind == RawLocalVarDescriptors::kContextLevel) { 10797 const int8_t kind = info.kind();
10798 const int32_t index = info.index();
10799 if (kind == RawLocalVarDescriptors::kContextLevel) {
10798 return OS::SNPrint(buffer, len, 10800 return OS::SNPrint(buffer, len,
10799 "%2" Pd " %-13s level=%-3" Pd " scope=%-3d" 10801 "%2" Pd " %-13s level=%-3d scope=%-3d"
10800 " begin=%-3" Pd " end=%" Pd "\n", 10802 " begin=%-3d end=%d\n",
10801 i, 10803 i,
10802 VarKindString(info.kind), 10804 VarKindString(kind),
10803 info.index, 10805 index,
10804 info.scope_id, 10806 info.scope_id,
10805 info.begin_pos, 10807 info.begin_pos,
10806 info.end_pos); 10808 info.end_pos);
10807 } else if (info.kind == RawLocalVarDescriptors::kContextVar) { 10809 } else if (kind == RawLocalVarDescriptors::kContextVar) {
10808 return OS::SNPrint(buffer, len, 10810 return OS::SNPrint(buffer, len,
10809 "%2" Pd " %-13s level=%-3d index=%-3" Pd "" 10811 "%2" Pd " %-13s level=%-3d index=%-3d"
10810 " begin=%-3" Pd " end=%-3" Pd " name=%s\n", 10812 " begin=%-3d end=%-3d name=%s\n",
10811 i, 10813 i,
10812 VarKindString(info.kind), 10814 VarKindString(kind),
10813 info.scope_id, 10815 info.scope_id,
10814 info.index, 10816 index,
10815 info.begin_pos, 10817 info.begin_pos,
10816 info.end_pos, 10818 info.end_pos,
10817 var_name.ToCString()); 10819 var_name.ToCString());
10818 } else { 10820 } else {
10819 return OS::SNPrint(buffer, len, 10821 return OS::SNPrint(buffer, len,
10820 "%2" Pd " %-13s scope=%-3d index=%-3" Pd "" 10822 "%2" Pd " %-13s scope=%-3d index=%-3d"
10821 " begin=%-3" Pd " end=%-3" Pd " name=%s\n", 10823 " begin=%-3d end=%-3d name=%s\n",
10822 i, 10824 i,
10823 VarKindString(info.kind), 10825 VarKindString(kind),
10824 info.scope_id, 10826 info.scope_id,
10825 info.index, 10827 index,
10826 info.begin_pos, 10828 info.begin_pos,
10827 info.end_pos, 10829 info.end_pos,
10828 var_name.ToCString()); 10830 var_name.ToCString());
10829 } 10831 }
10830 } 10832 }
10831 10833
10832 10834
10833 const char* LocalVarDescriptors::ToCString() const { 10835 const char* LocalVarDescriptors::ToCString() const {
10834 if (IsNull()) { 10836 if (IsNull()) {
10835 return "LocalVarDescriptors(NULL)"; 10837 return "LocalVarDescriptors(NULL)";
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
10879 String& var_name = String::Handle(); 10881 String& var_name = String::Handle();
10880 for (intptr_t i = 0; i < Length(); i++) { 10882 for (intptr_t i = 0; i < Length(); i++) {
10881 RawLocalVarDescriptors::VarInfo info; 10883 RawLocalVarDescriptors::VarInfo info;
10882 var_name = GetName(i); 10884 var_name = GetName(i);
10883 if (var_name.IsNull()) { 10885 if (var_name.IsNull()) {
10884 var_name = Symbols::Empty().raw(); 10886 var_name = Symbols::Empty().raw();
10885 } 10887 }
10886 GetInfo(i, &info); 10888 GetInfo(i, &info);
10887 JSONObject var(&members); 10889 JSONObject var(&members);
10888 var.AddProperty("name", var_name.ToCString()); 10890 var.AddProperty("name", var_name.ToCString());
10889 var.AddProperty("index", info.index); 10891 var.AddProperty("index", static_cast<intptr_t>(info.index()));
10890 var.AddProperty("beginPos", info.begin_pos); 10892 var.AddProperty("beginPos", static_cast<intptr_t>(info.begin_pos));
10891 var.AddProperty("endPos", info.end_pos); 10893 var.AddProperty("endPos", static_cast<intptr_t>(info.end_pos));
10892 var.AddProperty("scopeId", static_cast<intptr_t>(info.scope_id)); 10894 var.AddProperty("scopeId", static_cast<intptr_t>(info.scope_id));
10893 var.AddProperty("kind", KindToStr(info.kind)); 10895 var.AddProperty("kind", KindToStr(info.kind()));
10894 } 10896 }
10895 } 10897 }
10896 10898
10897 10899
10898 const char* LocalVarDescriptors::KindToStr(intptr_t kind) { 10900 const char* LocalVarDescriptors::KindToStr(intptr_t kind) {
10899 switch (kind) { 10901 switch (kind) {
10900 case RawLocalVarDescriptors::kStackVar: 10902 case RawLocalVarDescriptors::kStackVar:
10901 return "StackVar"; 10903 return "StackVar";
10902 case RawLocalVarDescriptors::kContextVar: 10904 case RawLocalVarDescriptors::kContextVar:
10903 return "ContextVar"; 10905 return "ContextVar";
10904 case RawLocalVarDescriptors::kContextLevel: 10906 case RawLocalVarDescriptors::kContextLevel:
10905 return "ContextLevel"; 10907 return "ContextLevel";
10906 case RawLocalVarDescriptors::kSavedEntryContext: 10908 case RawLocalVarDescriptors::kSavedEntryContext:
10907 return "SavedEntryContext"; 10909 return "SavedEntryContext";
10908 case RawLocalVarDescriptors::kSavedCurrentContext: 10910 case RawLocalVarDescriptors::kSavedCurrentContext:
10909 return "SavedCurrentContext"; 10911 return "SavedCurrentContext";
10910 default: 10912 default:
10911 UNIMPLEMENTED(); 10913 UNIMPLEMENTED();
10912 return NULL; 10914 return NULL;
10913 } 10915 }
10914 } 10916 }
10915 10917
10916 RawLocalVarDescriptors* LocalVarDescriptors::New(intptr_t num_variables) { 10918 RawLocalVarDescriptors* LocalVarDescriptors::New(intptr_t num_variables) {
10917 ASSERT(Object::var_descriptors_class() != Class::null()); 10919 ASSERT(Object::var_descriptors_class() != Class::null());
10918 if (num_variables < 0 || num_variables > kMaxElements) { 10920 if (num_variables < 0 || num_variables > kMaxElements) {
10919 // This should be caught before we reach here. 10921 // This should be caught before we reach here.
10920 FATAL1("Fatal error in LocalVarDescriptors::New: " 10922 FATAL2("Fatal error in LocalVarDescriptors::New: "
10921 "invalid num_variables %" Pd "\n", num_variables); 10923 "invalid num_variables %" Pd ". Maximum is: %d\n",
10924 num_variables, RawLocalVarDescriptors::kMaxIndex);
10922 } 10925 }
10923 LocalVarDescriptors& result = LocalVarDescriptors::Handle(); 10926 LocalVarDescriptors& result = LocalVarDescriptors::Handle();
10924 { 10927 {
10925 uword size = LocalVarDescriptors::InstanceSize(num_variables); 10928 uword size = LocalVarDescriptors::InstanceSize(num_variables);
10926 RawObject* raw = Object::Allocate(LocalVarDescriptors::kClassId, 10929 RawObject* raw = Object::Allocate(LocalVarDescriptors::kClassId,
10927 size, 10930 size,
10928 Heap::kOld); 10931 Heap::kOld);
10929 NoGCScope no_gc; 10932 NoGCScope no_gc;
10930 result ^= raw; 10933 result ^= raw;
10931 result.raw_ptr()->length_ = num_variables; 10934 result.raw_ptr()->length_ = num_variables;
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after
12387 ? EntryPoint() + patch_code_pc_offset() : 0; 12390 ? EntryPoint() + patch_code_pc_offset() : 0;
12388 } 12391 }
12389 12392
12390 12393
12391 uword Code::GetLazyDeoptPc() const { 12394 uword Code::GetLazyDeoptPc() const {
12392 return (lazy_deopt_pc_offset() != kInvalidPc) 12395 return (lazy_deopt_pc_offset() != kInvalidPc)
12393 ? EntryPoint() + lazy_deopt_pc_offset() : 0; 12396 ? EntryPoint() + lazy_deopt_pc_offset() : 0;
12394 } 12397 }
12395 12398
12396 12399
12397 RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const { 12400 RawStackmap* Code::GetStackmap(
12401 uint32_t pc_offset, Array* maps, Stackmap* map) const {
12398 // This code is used during iterating frames during a GC and hence it 12402 // This code is used during iterating frames during a GC and hence it
12399 // should not in turn start a GC. 12403 // should not in turn start a GC.
12400 NoGCScope no_gc; 12404 NoGCScope no_gc;
12401 if (stackmaps() == Array::null()) { 12405 if (stackmaps() == Array::null()) {
12402 // No stack maps are present in the code object which means this 12406 // No stack maps are present in the code object which means this
12403 // frame relies on tagged pointers. 12407 // frame relies on tagged pointers.
12404 return Stackmap::null(); 12408 return Stackmap::null();
12405 } 12409 }
12406 // A stack map is present in the code object, use the stack map to visit 12410 // A stack map is present in the code object, use the stack map to visit
12407 // frame slots which are marked as having objects. 12411 // frame slots which are marked as having objects.
12408 *maps = stackmaps(); 12412 *maps = stackmaps();
12409 *map = Stackmap::null(); 12413 *map = Stackmap::null();
12410 for (intptr_t i = 0; i < maps->Length(); i++) { 12414 for (intptr_t i = 0; i < maps->Length(); i++) {
12411 *map ^= maps->At(i); 12415 *map ^= maps->At(i);
12412 ASSERT(!map->IsNull()); 12416 ASSERT(!map->IsNull());
12413 if (map->PC() == pc) { 12417 if (map->PcOffset() == pc_offset) {
12414 return map->raw(); // We found a stack map for this frame. 12418 return map->raw(); // We found a stack map for this frame.
12415 } 12419 }
12416 } 12420 }
12417 // If the code has stackmaps, it must have them for all safepoints. 12421 // If the code has stackmaps, it must have them for all safepoints.
12418 UNREACHABLE(); 12422 UNREACHABLE();
12419 return Stackmap::null(); 12423 return Stackmap::null();
12420 } 12424 }
12421 12425
12422 12426
12423 RawContext* Context::New(intptr_t num_variables, Heap::Space space) { 12427 RawContext* Context::New(intptr_t num_variables, Heap::Space space) {
(...skipping 7031 matching lines...) Expand 10 before | Expand all | Expand 10 after
19455 19459
19456 RawJSRegExp* JSRegExp::FromDataStartAddress(void* data) { 19460 RawJSRegExp* JSRegExp::FromDataStartAddress(void* data) {
19457 JSRegExp& regexp = JSRegExp::Handle(); 19461 JSRegExp& regexp = JSRegExp::Handle();
19458 intptr_t addr = reinterpret_cast<intptr_t>(data) - sizeof(RawJSRegExp); 19462 intptr_t addr = reinterpret_cast<intptr_t>(data) - sizeof(RawJSRegExp);
19459 regexp ^= RawObject::FromAddr(addr); 19463 regexp ^= RawObject::FromAddr(addr);
19460 return regexp.raw(); 19464 return regexp.raw();
19461 } 19465 }
19462 19466
19463 19467
19464 const char* JSRegExp::Flags() const { 19468 const char* JSRegExp::Flags() const {
19465 switch (raw_ptr()->flags_) { 19469 switch (flags()) {
19466 case kGlobal | kIgnoreCase | kMultiLine : 19470 case kGlobal | kIgnoreCase | kMultiLine :
19467 case kIgnoreCase | kMultiLine : 19471 case kIgnoreCase | kMultiLine :
19468 return "im"; 19472 return "im";
19469 case kGlobal | kIgnoreCase : 19473 case kGlobal | kIgnoreCase :
19470 case kIgnoreCase: 19474 case kIgnoreCase:
19471 return "i"; 19475 return "i";
19472 case kGlobal | kMultiLine : 19476 case kGlobal | kMultiLine :
19473 case kMultiLine: 19477 case kMultiLine:
19474 return "m"; 19478 return "m";
19475 default: 19479 default:
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
19750 return tag_label.ToCString(); 19754 return tag_label.ToCString();
19751 } 19755 }
19752 19756
19753 19757
19754 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 19758 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
19755 Instance::PrintJSONImpl(stream, ref); 19759 Instance::PrintJSONImpl(stream, ref);
19756 } 19760 }
19757 19761
19758 19762
19759 } // namespace dart 19763 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698