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

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

Issue 1343373003: Revert "VM: New calling convention for generated code." (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 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
« 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 3689 matching lines...) Expand 10 before | Expand all | Expand 10 after
3700 } 3700 }
3701 3701
3702 3702
3703 void Class::DisableAllocationStub() const { 3703 void Class::DisableAllocationStub() const {
3704 const Code& existing_stub = Code::Handle(allocation_stub()); 3704 const Code& existing_stub = Code::Handle(allocation_stub());
3705 if (existing_stub.IsNull()) { 3705 if (existing_stub.IsNull()) {
3706 return; 3706 return;
3707 } 3707 }
3708 ASSERT(!CodePatcher::IsEntryPatched(existing_stub)); 3708 ASSERT(!CodePatcher::IsEntryPatched(existing_stub));
3709 // Patch the stub so that the next caller will regenerate the stub. 3709 // Patch the stub so that the next caller will regenerate the stub.
3710 CodePatcher::PatchEntry( 3710 CodePatcher::PatchEntry(existing_stub);
3711 existing_stub,
3712 Code::Handle(StubCode::FixAllocationStubTarget_entry()->code()));
3713 // Disassociate the existing stub from class. 3711 // Disassociate the existing stub from class.
3714 StorePointer(&raw_ptr()->allocation_stub_, Code::null()); 3712 StorePointer(&raw_ptr()->allocation_stub_, Code::null());
3715 } 3713 }
3716 3714
3717 3715
3718 bool Class::IsFunctionClass() const { 3716 bool Class::IsFunctionClass() const {
3719 return raw() == Type::Handle(Type::Function()).type_class(); 3717 return raw() == Type::Handle(Type::Function()).type_class();
3720 } 3718 }
3721 3719
3722 3720
(...skipping 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after
5220 StorePointer(&raw_ptr()->source_class_, value.raw()); 5218 StorePointer(&raw_ptr()->source_class_, value.raw());
5221 } 5219 }
5222 5220
5223 5221
5224 bool Function::HasBreakpoint() const { 5222 bool Function::HasBreakpoint() const {
5225 return Isolate::Current()->debugger()->HasBreakpoint(*this); 5223 return Isolate::Current()->debugger()->HasBreakpoint(*this);
5226 } 5224 }
5227 5225
5228 5226
5229 void Function::SetInstructions(const Code& value) const { 5227 void Function::SetInstructions(const Code& value) const {
5230 StorePointer(&raw_ptr()->code_, value.raw()); 5228 StorePointer(&raw_ptr()->instructions_, value.instructions());
5231 StoreNonPointer(&raw_ptr()->entry_point_, value.EntryPoint()); 5229 StoreNonPointer(&raw_ptr()->entry_point_, value.EntryPoint());
5232 } 5230 }
5233 5231
5234 void Function::AttachCode(const Code& value) const { 5232 void Function::AttachCode(const Code& value) const {
5235 SetInstructions(value); 5233 SetInstructions(value);
5236 ASSERT(Function::Handle(value.function()).IsNull() || 5234 ASSERT(Function::Handle(value.function()).IsNull() ||
5237 (value.function() == this->raw())); 5235 (value.function() == this->raw()));
5238 value.set_owner(*this); 5236 value.set_owner(*this);
5239 } 5237 }
5240 5238
5241 5239
5242 bool Function::HasCode() const { 5240 bool Function::HasCode() const {
5243 ASSERT(raw_ptr()->code_ != Code::null()); 5241 ASSERT(raw_ptr()->instructions_ != Instructions::null());
5244 return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code(); 5242 return raw_ptr()->instructions_ !=
5243 StubCode::LazyCompile_entry()->code()->ptr()->instructions_;
5245 } 5244 }
5246 5245
5247 5246
5248 void Function::ClearCode() const { 5247 void Function::ClearCode() const {
5249 ASSERT((usage_counter() != 0) || (ic_data_array() == Array::null())); 5248 ASSERT((usage_counter() != 0) || (ic_data_array() == Array::null()));
5250 StorePointer(&raw_ptr()->unoptimized_code_, Code::null()); 5249 StorePointer(&raw_ptr()->unoptimized_code_, Code::null());
5251 SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code())); 5250 SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code()));
5252 } 5251 }
5253 5252
5254 5253
5255 void Function::SwitchToUnoptimizedCode() const { 5254 void Function::SwitchToUnoptimizedCode() const {
5256 ASSERT(HasOptimizedCode()); 5255 ASSERT(HasOptimizedCode());
5257 Thread* thread = Thread::Current(); 5256 Thread* thread = Thread::Current();
5258 Isolate* isolate = thread->isolate(); 5257 Isolate* isolate = thread->isolate();
5259 Zone* zone = thread->zone(); 5258 Zone* zone = thread->zone();
5260 const Code& current_code = Code::Handle(zone, CurrentCode()); 5259 const Code& current_code = Code::Handle(zone, CurrentCode());
5261 5260
5262 if (FLAG_trace_deoptimization_verbose) { 5261 if (FLAG_trace_deoptimization_verbose) {
5263 THR_Print("Disabling optimized code: '%s' entry: %#" Px "\n", 5262 THR_Print("Disabling optimized code: '%s' entry: %#" Px "\n",
5264 ToFullyQualifiedCString(), 5263 ToFullyQualifiedCString(),
5265 current_code.EntryPoint()); 5264 current_code.EntryPoint());
5266 } 5265 }
5267 // Patch entry of the optimized code. 5266 // Patch entry of the optimized code.
5268 CodePatcher::PatchEntry( 5267 CodePatcher::PatchEntry(current_code);
5269 current_code, Code::Handle(StubCode::FixCallersTarget_entry()->code()));
5270 const Error& error = Error::Handle(zone, 5268 const Error& error = Error::Handle(zone,
5271 Compiler::EnsureUnoptimizedCode(thread, *this)); 5269 Compiler::EnsureUnoptimizedCode(thread, *this));
5272 if (!error.IsNull()) { 5270 if (!error.IsNull()) {
5273 Exceptions::PropagateError(error); 5271 Exceptions::PropagateError(error);
5274 } 5272 }
5275 const Code& unopt_code = Code::Handle(zone, unoptimized_code()); 5273 const Code& unopt_code = Code::Handle(zone, unoptimized_code());
5276 AttachCode(unopt_code); 5274 AttachCode(unopt_code);
5277 CodePatcher::RestoreEntry(unopt_code); 5275 CodePatcher::RestoreEntry(unopt_code);
5278 isolate->TrackDeoptimizedCode(current_code); 5276 isolate->TrackDeoptimizedCode(current_code);
5279 } 5277 }
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after
6723 const Object& obj = Object::Handle(raw_ptr()->owner_); 6721 const Object& obj = Object::Handle(raw_ptr()->owner_);
6724 if (obj.IsClass()) { 6722 if (obj.IsClass()) {
6725 return Class::Cast(obj).script(); 6723 return Class::Cast(obj).script();
6726 } 6724 }
6727 ASSERT(obj.IsPatchClass()); 6725 ASSERT(obj.IsPatchClass());
6728 return PatchClass::Cast(obj).Script(); 6726 return PatchClass::Cast(obj).Script();
6729 } 6727 }
6730 6728
6731 6729
6732 bool Function::HasOptimizedCode() const { 6730 bool Function::HasOptimizedCode() const {
6733 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); 6731 return HasCode() && Code::Handle(Instructions::Handle(
6732 raw_ptr()->instructions_).code()).is_optimized();
6734 } 6733 }
6735 6734
6736 6735
6737 RawString* Function::PrettyName() const { 6736 RawString* Function::PrettyName() const {
6738 const String& str = String::Handle(name()); 6737 const String& str = String::Handle(name());
6739 return String::IdentifierPrettyName(str); 6738 return String::IdentifierPrettyName(str);
6740 } 6739 }
6741 6740
6742 6741
6743 const char* Function::QualifiedUserVisibleNameCString() const { 6742 const char* Function::QualifiedUserVisibleNameCString() const {
(...skipping 4170 matching lines...) Expand 10 before | Expand all | Expand 10 after
10914 10913
10915 const char* Instructions::ToCString() const { 10914 const char* Instructions::ToCString() const {
10916 return "Instructions"; 10915 return "Instructions";
10917 } 10916 }
10918 10917
10919 10918
10920 void Instructions::PrintJSONImpl(JSONStream* stream, bool ref) const { 10919 void Instructions::PrintJSONImpl(JSONStream* stream, bool ref) const {
10921 JSONObject jsobj(stream); 10920 JSONObject jsobj(stream);
10922 AddCommonObjectProperties(&jsobj, "Object", ref); 10921 AddCommonObjectProperties(&jsobj, "Object", ref);
10923 jsobj.AddServiceId(*this); 10922 jsobj.AddServiceId(*this);
10923 jsobj.AddProperty("_code", Code::Handle(code()));
10924 if (ref) { 10924 if (ref) {
10925 return; 10925 return;
10926 } 10926 }
10927 jsobj.AddProperty("_objectPool", ObjectPool::Handle(object_pool()));
10927 } 10928 }
10928 10929
10929 10930
10930 // Encode integer in SLEB128 format. 10931 // Encode integer in SLEB128 format.
10931 void PcDescriptors::EncodeInteger(GrowableArray<uint8_t>* data, 10932 void PcDescriptors::EncodeInteger(GrowableArray<uint8_t>* data,
10932 intptr_t value) { 10933 intptr_t value) {
10933 bool is_last_part = false; 10934 bool is_last_part = false;
10934 while (!is_last_part) { 10935 while (!is_last_part) {
10935 intptr_t part = value & 0x7f; 10936 intptr_t part = value & 0x7f;
10936 value >>= 7; 10937 value >>= 7;
(...skipping 1913 matching lines...) Expand 10 before | Expand all | Expand 10 after
12850 } else { 12851 } else {
12851 ASSERT(code.IsNull() || 12852 ASSERT(code.IsNull() ||
12852 (code.function() == array.At(i + kSCallTableFunctionEntry))); 12853 (code.function() == array.At(i + kSCallTableFunctionEntry)));
12853 } 12854 }
12854 #endif 12855 #endif
12855 array.SetAt(i + kSCallTableCodeEntry, code); 12856 array.SetAt(i + kSCallTableCodeEntry, code);
12856 } 12857 }
12857 12858
12858 12859
12859 void Code::Disassemble(DisassemblyFormatter* formatter) const { 12860 void Code::Disassemble(DisassemblyFormatter* formatter) const {
12861 const bool fix_patch = CodePatcher::CodeIsPatchable(*this) &&
12862 CodePatcher::IsEntryPatched(*this);
12863 if (fix_patch) {
12864 // The disassembler may choke on illegal instructions if the code has been
12865 // patched, un-patch the code before disassembling and re-patch after.
12866 CodePatcher::RestoreEntry(*this);
12867 }
12860 const Instructions& instr = Instructions::Handle(instructions()); 12868 const Instructions& instr = Instructions::Handle(instructions());
12861 uword start = instr.EntryPoint(); 12869 uword start = instr.EntryPoint();
12862 if (formatter == NULL) { 12870 if (formatter == NULL) {
12863 Disassembler::Disassemble(start, start + instr.size(), *this); 12871 Disassembler::Disassemble(start, start + instr.size(), *this);
12864 } else { 12872 } else {
12865 Disassembler::Disassemble(start, start + instr.size(), formatter, *this); 12873 Disassembler::Disassemble(start, start + instr.size(), formatter, *this);
12866 } 12874 }
12875 if (fix_patch) {
12876 // Redo the patch.
12877 CodePatcher::PatchEntry(*this);
12878 }
12867 } 12879 }
12868 12880
12869 12881
12870 const Code::Comments& Code::comments() const { 12882 const Code::Comments& Code::comments() const {
12871 Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments_)); 12883 Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments_));
12872 return *comments; 12884 return *comments;
12873 } 12885 }
12874 12886
12875 12887
12876 void Code::set_comments(const Code::Comments& comments) const { 12888 void Code::set_comments(const Code::Comments& comments) const {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
12978 { 12990 {
12979 uword size = Code::InstanceSize(pointer_offsets_length); 12991 uword size = Code::InstanceSize(pointer_offsets_length);
12980 RawObject* raw = Object::Allocate(Code::kClassId, size, Heap::kOld); 12992 RawObject* raw = Object::Allocate(Code::kClassId, size, Heap::kOld);
12981 NoSafepointScope no_safepoint; 12993 NoSafepointScope no_safepoint;
12982 result ^= raw; 12994 result ^= raw;
12983 result.set_pointer_offsets_length(pointer_offsets_length); 12995 result.set_pointer_offsets_length(pointer_offsets_length);
12984 result.set_is_optimized(false); 12996 result.set_is_optimized(false);
12985 result.set_is_alive(false); 12997 result.set_is_alive(false);
12986 result.set_comments(Comments::New(0)); 12998 result.set_comments(Comments::New(0));
12987 result.set_compile_timestamp(0); 12999 result.set_compile_timestamp(0);
13000 result.set_entry_patch_pc_offset(kInvalidPc);
13001 result.set_patch_code_pc_offset(kInvalidPc);
12988 result.set_lazy_deopt_pc_offset(kInvalidPc); 13002 result.set_lazy_deopt_pc_offset(kInvalidPc);
12989 result.set_pc_descriptors(Object::empty_descriptors()); 13003 result.set_pc_descriptors(Object::empty_descriptors());
12990 } 13004 }
12991 return result.raw(); 13005 return result.raw();
12992 } 13006 }
12993 13007
12994 13008
12995 RawCode* Code::FinalizeCode(const char* name, 13009 RawCode* Code::FinalizeCode(const char* name,
12996 Assembler* assembler, 13010 Assembler* assembler,
12997 bool optimized) { 13011 bool optimized) {
12998 Isolate* isolate = Isolate::Current(); 13012 Isolate* isolate = Isolate::Current();
12999 if (!isolate->compilation_allowed()) { 13013 if (!isolate->compilation_allowed()) {
13000 FATAL1("Precompilation missed code %s\n", name); 13014 FATAL1("Precompilation missed code %s\n", name);
13001 } 13015 }
13002 13016
13003 ASSERT(assembler != NULL); 13017 ASSERT(assembler != NULL);
13004 const ObjectPool& object_pool = 13018 const ObjectPool& object_pool =
13005 ObjectPool::Handle(assembler->object_pool_wrapper().MakeObjectPool()); 13019 ObjectPool::Handle(assembler->object_pool_wrapper().MakeObjectPool());
13006 13020
13007 // Allocate the Code and Instructions objects. Code is allocated first 13021 // Allocate the Code and Instructions objects. Code is allocated first
13008 // because a GC during allocation of the code will leave the instruction 13022 // because a GC during allocation of the code will leave the instruction
13009 // pages read-only. 13023 // pages read-only.
13010 intptr_t pointer_offset_count = assembler->CountPointerOffsets(); 13024 intptr_t pointer_offset_count = assembler->CountPointerOffsets();
13011 Code& code = Code::ZoneHandle(Code::New(pointer_offset_count)); 13025 Code& code = Code::ZoneHandle(Code::New(pointer_offset_count));
13012 #ifdef TARGET_ARCH_IA32
13013 assembler->set_code_object(code);
13014 #endif
13015 Instructions& instrs = 13026 Instructions& instrs =
13016 Instructions::ZoneHandle(Instructions::New(assembler->CodeSize())); 13027 Instructions::ZoneHandle(Instructions::New(assembler->CodeSize()));
13017 INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize()); 13028 INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize());
13018 INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize()); 13029 INC_STAT(Thread::Current(), total_code_size, assembler->CodeSize());
13019 13030
13020 // Copy the instructions into the instruction area and apply all fixups. 13031 // Copy the instructions into the instruction area and apply all fixups.
13021 // Embedded pointers are still in handles at this point. 13032 // Embedded pointers are still in handles at this point.
13022 MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()), 13033 MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()),
13023 instrs.size()); 13034 instrs.size());
13024 assembler->FinalizeInstructions(region); 13035 assembler->FinalizeInstructions(region);
(...skipping 18 matching lines...) Expand all
13043 for (intptr_t i = 0; i < pointer_offsets.length(); i++) { 13054 for (intptr_t i = 0; i < pointer_offsets.length(); i++) {
13044 intptr_t offset_in_instrs = pointer_offsets[i]; 13055 intptr_t offset_in_instrs = pointer_offsets[i];
13045 code.SetPointerOffsetAt(i, offset_in_instrs); 13056 code.SetPointerOffsetAt(i, offset_in_instrs);
13046 uword addr = region.start() + offset_in_instrs; 13057 uword addr = region.start() + offset_in_instrs;
13047 const Object* object = *reinterpret_cast<Object**>(addr); 13058 const Object* object = *reinterpret_cast<Object**>(addr);
13048 instrs.raw()->StorePointer(reinterpret_cast<RawObject**>(addr), 13059 instrs.raw()->StorePointer(reinterpret_cast<RawObject**>(addr),
13049 object->raw()); 13060 object->raw());
13050 } 13061 }
13051 13062
13052 // Hook up Code and Instructions objects. 13063 // Hook up Code and Instructions objects.
13053 code.set_active_instructions(instrs.raw()); 13064 instrs.set_code(code.raw());
13054 code.set_instructions(instrs.raw()); 13065 code.set_instructions(instrs.raw());
13055 code.set_is_alive(true); 13066 code.set_is_alive(true);
13056 13067
13057 // Set object pool in Instructions object. 13068 // Set object pool in Instructions object.
13058 INC_STAT(Thread::Current(), 13069 INC_STAT(Thread::Current(),
13059 total_code_size, object_pool.Length() * sizeof(uintptr_t)); 13070 total_code_size, object_pool.Length() * sizeof(uintptr_t));
13060 code.set_object_pool(object_pool.raw()); 13071 instrs.set_object_pool(object_pool.raw());
13061 13072
13062 if (FLAG_write_protect_code) { 13073 if (FLAG_write_protect_code) {
13063 uword address = RawObject::ToAddr(instrs.raw()); 13074 uword address = RawObject::ToAddr(instrs.raw());
13064 bool status = VirtualMemory::Protect( 13075 bool status = VirtualMemory::Protect(
13065 reinterpret_cast<void*>(address), 13076 reinterpret_cast<void*>(address),
13066 instrs.raw()->Size(), 13077 instrs.raw()->Size(),
13067 VirtualMemory::kReadExecute); 13078 VirtualMemory::kReadExecute);
13068 ASSERT(status); 13079 ASSERT(status);
13069 } 13080 }
13070 } 13081 }
(...skipping 21 matching lines...) Expand all
13092 assembler, 13103 assembler,
13093 optimized); 13104 optimized);
13094 } else { 13105 } else {
13095 return FinalizeCode("", assembler); 13106 return FinalizeCode("", assembler);
13096 } 13107 }
13097 } 13108 }
13098 13109
13099 13110
13100 // Check if object matches find condition. 13111 // Check if object matches find condition.
13101 bool Code::FindRawCodeVisitor::FindObject(RawObject* obj) const { 13112 bool Code::FindRawCodeVisitor::FindObject(RawObject* obj) const {
13102 return RawCode::ContainsPC(obj, pc_); 13113 return RawInstructions::ContainsPC(obj, pc_);
13103 } 13114 }
13104 13115
13105 13116
13106 RawCode* Code::LookupCodeInIsolate(Isolate* isolate, uword pc) { 13117 RawCode* Code::LookupCodeInIsolate(Isolate* isolate, uword pc) {
13107 ASSERT((isolate == Isolate::Current()) || (isolate == Dart::vm_isolate())); 13118 ASSERT((isolate == Isolate::Current()) || (isolate == Dart::vm_isolate()));
13108 NoSafepointScope no_safepoint; 13119 NoSafepointScope no_safepoint;
13109 FindRawCodeVisitor visitor(pc); 13120 FindRawCodeVisitor visitor(pc);
13110 RawObject* instr; 13121 RawInstructions* instr;
13111 if (isolate->heap() == NULL) { 13122 if (isolate->heap() == NULL) {
13112 return Code::null(); 13123 return Code::null();
13113 } 13124 }
13114 instr = isolate->heap()->FindOldObject(&visitor); 13125 instr = isolate->heap()->FindObjectInCodeSpace(&visitor);
13115 if (instr != Code::null()) { 13126 if (instr != Instructions::null()) {
13116 return static_cast<RawCode*>(instr); 13127 return instr->ptr()->code_;
13117 } 13128 }
13118 return Code::null(); 13129 return Code::null();
13119 } 13130 }
13120 13131
13121 13132
13122 RawCode* Code::LookupCode(uword pc) { 13133 RawCode* Code::LookupCode(uword pc) {
13123 return LookupCodeInIsolate(Isolate::Current(), pc); 13134 return LookupCodeInIsolate(Isolate::Current(), pc);
13124 } 13135 }
13125 13136
13126 13137
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
13347 while (inlining_id >= 0) { 13358 while (inlining_id >= 0) {
13348 inline_interval.AddValue(inlining_id); 13359 inline_interval.AddValue(inlining_id);
13349 inlining_id = caller_id; 13360 inlining_id = caller_id;
13350 caller_id = GetCallerId(inlining_id); 13361 caller_id = GetCallerId(inlining_id);
13351 } 13362 }
13352 } 13363 }
13353 } 13364 }
13354 } 13365 }
13355 13366
13356 13367
13368 uword Code::GetEntryPatchPc() const {
13369 return (entry_patch_pc_offset() != kInvalidPc)
13370 ? EntryPoint() + entry_patch_pc_offset() : 0;
13371 }
13372
13373
13374 uword Code::GetPatchCodePc() const {
13375 return (patch_code_pc_offset() != kInvalidPc)
13376 ? EntryPoint() + patch_code_pc_offset() : 0;
13377 }
13378
13379
13357 uword Code::GetLazyDeoptPc() const { 13380 uword Code::GetLazyDeoptPc() const {
13358 return (lazy_deopt_pc_offset() != kInvalidPc) 13381 return (lazy_deopt_pc_offset() != kInvalidPc)
13359 ? EntryPoint() + lazy_deopt_pc_offset() : 0; 13382 ? EntryPoint() + lazy_deopt_pc_offset() : 0;
13360 } 13383 }
13361 13384
13362 13385
13363 RawStackmap* Code::GetStackmap( 13386 RawStackmap* Code::GetStackmap(
13364 uint32_t pc_offset, Array* maps, Stackmap* map) const { 13387 uint32_t pc_offset, Array* maps, Stackmap* map) const {
13365 // This code is used during iterating frames during a GC and hence it 13388 // This code is used during iterating frames during a GC and hence it
13366 // should not in turn start a GC. 13389 // should not in turn start a GC.
(...skipping 8046 matching lines...) Expand 10 before | Expand all | Expand 10 after
21413 return tag_label.ToCString(); 21436 return tag_label.ToCString();
21414 } 21437 }
21415 21438
21416 21439
21417 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 21440 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
21418 Instance::PrintJSONImpl(stream, ref); 21441 Instance::PrintJSONImpl(stream, ref);
21419 } 21442 }
21420 21443
21421 21444
21422 } // namespace dart 21445 } // 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