| OLD | NEW |
| 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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 134 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 135 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 135 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 136 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 136 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 137 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 137 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 138 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 138 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 139 RawClass* Object::namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 139 RawClass* Object::namespace_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 140 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 140 RawClass* Object::code_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 141 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 141 RawClass* Object::instructions_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 142 RawClass* Object::object_pool_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 142 RawClass* Object::object_pool_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 143 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 143 RawClass* Object::pc_descriptors_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 144 RawClass* Object::code_source_map_class_ = |
| 145 reinterpret_cast<RawClass*>(RAW_NULL); |
| 144 RawClass* Object::stackmap_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 146 RawClass* Object::stackmap_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 145 RawClass* Object::var_descriptors_class_ = | 147 RawClass* Object::var_descriptors_class_ = |
| 146 reinterpret_cast<RawClass*>(RAW_NULL); | 148 reinterpret_cast<RawClass*>(RAW_NULL); |
| 147 RawClass* Object::exception_handlers_class_ = | 149 RawClass* Object::exception_handlers_class_ = |
| 148 reinterpret_cast<RawClass*>(RAW_NULL); | 150 reinterpret_cast<RawClass*>(RAW_NULL); |
| 149 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 151 RawClass* Object::context_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 150 RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 152 RawClass* Object::context_scope_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 151 RawClass* Object::icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 153 RawClass* Object::icdata_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
| 152 RawClass* Object::megamorphic_cache_class_ = | 154 RawClass* Object::megamorphic_cache_class_ = |
| 153 reinterpret_cast<RawClass*>(RAW_NULL); | 155 reinterpret_cast<RawClass*>(RAW_NULL); |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 | 608 |
| 607 cls = Class::New<Instructions>(); | 609 cls = Class::New<Instructions>(); |
| 608 instructions_class_ = cls.raw(); | 610 instructions_class_ = cls.raw(); |
| 609 | 611 |
| 610 cls = Class::New<ObjectPool>(); | 612 cls = Class::New<ObjectPool>(); |
| 611 object_pool_class_ = cls.raw(); | 613 object_pool_class_ = cls.raw(); |
| 612 | 614 |
| 613 cls = Class::New<PcDescriptors>(); | 615 cls = Class::New<PcDescriptors>(); |
| 614 pc_descriptors_class_ = cls.raw(); | 616 pc_descriptors_class_ = cls.raw(); |
| 615 | 617 |
| 618 cls = Class::New<CodeSourceMap>(); |
| 619 code_source_map_class_ = cls.raw(); |
| 620 |
| 616 cls = Class::New<Stackmap>(); | 621 cls = Class::New<Stackmap>(); |
| 617 stackmap_class_ = cls.raw(); | 622 stackmap_class_ = cls.raw(); |
| 618 | 623 |
| 619 cls = Class::New<LocalVarDescriptors>(); | 624 cls = Class::New<LocalVarDescriptors>(); |
| 620 var_descriptors_class_ = cls.raw(); | 625 var_descriptors_class_ = cls.raw(); |
| 621 | 626 |
| 622 cls = Class::New<ExceptionHandlers>(); | 627 cls = Class::New<ExceptionHandlers>(); |
| 623 exception_handlers_class_ = cls.raw(); | 628 exception_handlers_class_ = cls.raw(); |
| 624 | 629 |
| 625 cls = Class::New<Context>(); | 630 cls = Class::New<Context>(); |
| (...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 938 SET_CLASS_NAME(redirection_data, RedirectionData); | 943 SET_CLASS_NAME(redirection_data, RedirectionData); |
| 939 SET_CLASS_NAME(field, Field); | 944 SET_CLASS_NAME(field, Field); |
| 940 SET_CLASS_NAME(literal_token, LiteralToken); | 945 SET_CLASS_NAME(literal_token, LiteralToken); |
| 941 SET_CLASS_NAME(token_stream, TokenStream); | 946 SET_CLASS_NAME(token_stream, TokenStream); |
| 942 SET_CLASS_NAME(script, Script); | 947 SET_CLASS_NAME(script, Script); |
| 943 SET_CLASS_NAME(library, LibraryClass); | 948 SET_CLASS_NAME(library, LibraryClass); |
| 944 SET_CLASS_NAME(namespace, Namespace); | 949 SET_CLASS_NAME(namespace, Namespace); |
| 945 SET_CLASS_NAME(code, Code); | 950 SET_CLASS_NAME(code, Code); |
| 946 SET_CLASS_NAME(instructions, Instructions); | 951 SET_CLASS_NAME(instructions, Instructions); |
| 947 SET_CLASS_NAME(object_pool, ObjectPool); | 952 SET_CLASS_NAME(object_pool, ObjectPool); |
| 953 SET_CLASS_NAME(code_source_map, CodeSourceMap); |
| 948 SET_CLASS_NAME(pc_descriptors, PcDescriptors); | 954 SET_CLASS_NAME(pc_descriptors, PcDescriptors); |
| 949 SET_CLASS_NAME(stackmap, Stackmap); | 955 SET_CLASS_NAME(stackmap, Stackmap); |
| 950 SET_CLASS_NAME(var_descriptors, LocalVarDescriptors); | 956 SET_CLASS_NAME(var_descriptors, LocalVarDescriptors); |
| 951 SET_CLASS_NAME(exception_handlers, ExceptionHandlers); | 957 SET_CLASS_NAME(exception_handlers, ExceptionHandlers); |
| 952 SET_CLASS_NAME(context, Context); | 958 SET_CLASS_NAME(context, Context); |
| 953 SET_CLASS_NAME(context_scope, ContextScope); | 959 SET_CLASS_NAME(context_scope, ContextScope); |
| 954 SET_CLASS_NAME(icdata, ICData); | 960 SET_CLASS_NAME(icdata, ICData); |
| 955 SET_CLASS_NAME(megamorphic_cache, MegamorphicCache); | 961 SET_CLASS_NAME(megamorphic_cache, MegamorphicCache); |
| 956 SET_CLASS_NAME(subtypetestcache, SubtypeTestCache); | 962 SET_CLASS_NAME(subtypetestcache, SubtypeTestCache); |
| 957 SET_CLASS_NAME(api_error, ApiError); | 963 SET_CLASS_NAME(api_error, ApiError); |
| (...skipping 2285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3243 case kLibraryPrefixCid: | 3249 case kLibraryPrefixCid: |
| 3244 return Symbols::LibraryPrefix().raw(); | 3250 return Symbols::LibraryPrefix().raw(); |
| 3245 case kNamespaceCid: | 3251 case kNamespaceCid: |
| 3246 return Symbols::Namespace().raw(); | 3252 return Symbols::Namespace().raw(); |
| 3247 case kCodeCid: | 3253 case kCodeCid: |
| 3248 return Symbols::Code().raw(); | 3254 return Symbols::Code().raw(); |
| 3249 case kInstructionsCid: | 3255 case kInstructionsCid: |
| 3250 return Symbols::Instructions().raw(); | 3256 return Symbols::Instructions().raw(); |
| 3251 case kObjectPoolCid: | 3257 case kObjectPoolCid: |
| 3252 return Symbols::ObjectPool().raw(); | 3258 return Symbols::ObjectPool().raw(); |
| 3259 case kCodeSourceMapCid: |
| 3260 return Symbols::CodeSourceMap().raw(); |
| 3253 case kPcDescriptorsCid: | 3261 case kPcDescriptorsCid: |
| 3254 return Symbols::PcDescriptors().raw(); | 3262 return Symbols::PcDescriptors().raw(); |
| 3255 case kStackmapCid: | 3263 case kStackmapCid: |
| 3256 return Symbols::Stackmap().raw(); | 3264 return Symbols::Stackmap().raw(); |
| 3257 case kLocalVarDescriptorsCid: | 3265 case kLocalVarDescriptorsCid: |
| 3258 return Symbols::LocalVarDescriptors().raw(); | 3266 return Symbols::LocalVarDescriptors().raw(); |
| 3259 case kExceptionHandlersCid: | 3267 case kExceptionHandlersCid: |
| 3260 return Symbols::ExceptionHandlers().raw(); | 3268 return Symbols::ExceptionHandlers().raw(); |
| 3261 case kContextCid: | 3269 case kContextCid: |
| 3262 return Symbols::Context().raw(); | 3270 return Symbols::Context().raw(); |
| (...skipping 7888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11151 void Instructions::PrintJSONImpl(JSONStream* stream, bool ref) const { | 11159 void Instructions::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 11152 JSONObject jsobj(stream); | 11160 JSONObject jsobj(stream); |
| 11153 AddCommonObjectProperties(&jsobj, "Object", ref); | 11161 AddCommonObjectProperties(&jsobj, "Object", ref); |
| 11154 jsobj.AddServiceId(*this); | 11162 jsobj.AddServiceId(*this); |
| 11155 if (ref) { | 11163 if (ref) { |
| 11156 return; | 11164 return; |
| 11157 } | 11165 } |
| 11158 } | 11166 } |
| 11159 | 11167 |
| 11160 | 11168 |
| 11161 // Encode integer in SLEB128 format. | 11169 // Encode integer |value| in SLEB128 format and store into |data|. |
| 11162 void PcDescriptors::EncodeInteger(GrowableArray<uint8_t>* data, | 11170 static void EncodeSLEB128(GrowableArray<uint8_t>* data, |
| 11163 intptr_t value) { | 11171 intptr_t value) { |
| 11164 bool is_last_part = false; | 11172 bool is_last_part = false; |
| 11165 while (!is_last_part) { | 11173 while (!is_last_part) { |
| 11166 uint8_t part = value & 0x7f; | 11174 uint8_t part = value & 0x7f; |
| 11167 value >>= 7; | 11175 value >>= 7; |
| 11168 if ((value == 0 && (part & 0x40) == 0) || | 11176 if ((value == 0 && (part & 0x40) == 0) || |
| 11169 (value == static_cast<intptr_t>(-1) && (part & 0x40) != 0)) { | 11177 (value == static_cast<intptr_t>(-1) && (part & 0x40) != 0)) { |
| 11170 is_last_part = true; | 11178 is_last_part = true; |
| 11171 } else { | 11179 } else { |
| 11172 part |= 0x80; | 11180 part |= 0x80; |
| 11173 } | 11181 } |
| 11174 data->Add(part); | 11182 data->Add(part); |
| 11175 } | 11183 } |
| 11176 } | 11184 } |
| 11177 | 11185 |
| 11178 | 11186 |
| 11179 // Decode SLEB128 encoded integer. Update byte_index to the next integer. | 11187 // Decode integer in SLEB128 format from |data| and update |byte_index|. |
| 11180 intptr_t PcDescriptors::DecodeInteger(intptr_t* byte_index) const { | 11188 static intptr_t DecodeSLEB128(const uint8_t* data, |
| 11181 NoSafepointScope no_safepoint; | 11189 const intptr_t data_length, |
| 11182 const uint8_t* data = raw_ptr()->data(); | 11190 intptr_t* byte_index) { |
| 11183 ASSERT(*byte_index < Length()); | 11191 ASSERT(*byte_index < data_length); |
| 11184 uword shift = 0; | 11192 uword shift = 0; |
| 11185 intptr_t value = 0; | 11193 intptr_t value = 0; |
| 11186 uint8_t part = 0; | 11194 uint8_t part = 0; |
| 11187 do { | 11195 do { |
| 11188 part = data[(*byte_index)++]; | 11196 part = data[(*byte_index)++]; |
| 11189 value |= static_cast<intptr_t>(part & 0x7f) << shift; | 11197 value |= static_cast<intptr_t>(part & 0x7f) << shift; |
| 11190 shift += 7; | 11198 shift += 7; |
| 11191 } while ((part & 0x80) != 0); | 11199 } while ((part & 0x80) != 0); |
| 11192 | 11200 |
| 11193 if ((shift < (sizeof(value) * 8)) && ((part & 0x40) != 0)) { | 11201 if ((shift < (sizeof(value) * 8)) && ((part & 0x40) != 0)) { |
| 11194 value |= static_cast<intptr_t>(-1) << shift; | 11202 value |= static_cast<intptr_t>(-1) << shift; |
| 11195 } | 11203 } |
| 11196 return value; | 11204 return value; |
| 11197 } | 11205 } |
| 11198 | 11206 |
| 11199 | 11207 |
| 11208 // Encode integer in SLEB128 format. |
| 11209 void PcDescriptors::EncodeInteger(GrowableArray<uint8_t>* data, |
| 11210 intptr_t value) { |
| 11211 return EncodeSLEB128(data, value); |
| 11212 } |
| 11213 |
| 11214 |
| 11215 // Decode SLEB128 encoded integer. Update byte_index to the next integer. |
| 11216 intptr_t PcDescriptors::DecodeInteger(intptr_t* byte_index) const { |
| 11217 NoSafepointScope no_safepoint; |
| 11218 const uint8_t* data = raw_ptr()->data(); |
| 11219 return DecodeSLEB128(data, Length(), byte_index); |
| 11220 } |
| 11221 |
| 11222 |
| 11200 RawObjectPool* ObjectPool::New(intptr_t len) { | 11223 RawObjectPool* ObjectPool::New(intptr_t len) { |
| 11201 ASSERT(Object::object_pool_class() != Class::null()); | 11224 ASSERT(Object::object_pool_class() != Class::null()); |
| 11202 if (len < 0 || len > kMaxElements) { | 11225 if (len < 0 || len > kMaxElements) { |
| 11203 // This should be caught before we reach here. | 11226 // This should be caught before we reach here. |
| 11204 FATAL1("Fatal error in ObjectPool::New: invalid length %" Pd "\n", len); | 11227 FATAL1("Fatal error in ObjectPool::New: invalid length %" Pd "\n", len); |
| 11205 } | 11228 } |
| 11206 ObjectPool& result = ObjectPool::Handle(); | 11229 ObjectPool& result = ObjectPool::Handle(); |
| 11207 { | 11230 { |
| 11208 uword size = ObjectPool::InstanceSize(len); | 11231 uword size = ObjectPool::InstanceSize(len); |
| 11209 RawObject* raw = Object::Allocate(ObjectPool::kClassId, | 11232 RawObject* raw = Object::Allocate(ObjectPool::kClassId, |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11488 deopt_ids->Add(iter.DeoptId()); | 11511 deopt_ids->Add(iter.DeoptId()); |
| 11489 } else { | 11512 } else { |
| 11490 ASSERT(!iccall_ids->Contains(iter.DeoptId())); | 11513 ASSERT(!iccall_ids->Contains(iter.DeoptId())); |
| 11491 iccall_ids->Add(iter.DeoptId()); | 11514 iccall_ids->Add(iter.DeoptId()); |
| 11492 } | 11515 } |
| 11493 } | 11516 } |
| 11494 #endif // DEBUG | 11517 #endif // DEBUG |
| 11495 } | 11518 } |
| 11496 | 11519 |
| 11497 | 11520 |
| 11521 intptr_t CodeSourceMap::Length() const { |
| 11522 return raw_ptr()->length_; |
| 11523 } |
| 11524 |
| 11525 |
| 11526 void CodeSourceMap::SetLength(intptr_t value) const { |
| 11527 StoreNonPointer(&raw_ptr()->length_, value); |
| 11528 } |
| 11529 |
| 11530 |
| 11531 void CodeSourceMap::CopyData(GrowableArray<uint8_t>* delta_encoded_data) { |
| 11532 NoSafepointScope no_safepoint; |
| 11533 uint8_t* data = UnsafeMutableNonPointer(&raw_ptr()->data()[0]); |
| 11534 for (intptr_t i = 0; i < delta_encoded_data->length(); ++i) { |
| 11535 data[i] = (*delta_encoded_data)[i]; |
| 11536 } |
| 11537 } |
| 11538 |
| 11539 |
| 11540 RawCodeSourceMap* CodeSourceMap::New(GrowableArray<uint8_t>* data) { |
| 11541 ASSERT(Object::code_source_map_class() != Class::null()); |
| 11542 Thread* thread = Thread::Current(); |
| 11543 CodeSourceMap& result = CodeSourceMap::Handle(thread->zone()); |
| 11544 { |
| 11545 uword size = CodeSourceMap::InstanceSize(data->length()); |
| 11546 RawObject* raw = Object::Allocate(CodeSourceMap::kClassId, |
| 11547 size, |
| 11548 Heap::kOld); |
| 11549 NoSafepointScope no_safepoint; |
| 11550 result ^= raw; |
| 11551 result.SetLength(data->length()); |
| 11552 result.CopyData(data); |
| 11553 } |
| 11554 return result.raw(); |
| 11555 } |
| 11556 |
| 11557 |
| 11558 RawCodeSourceMap* CodeSourceMap::New(intptr_t length) { |
| 11559 ASSERT(Object::code_source_map_class() != Class::null()); |
| 11560 Thread* thread = Thread::Current(); |
| 11561 CodeSourceMap& result = CodeSourceMap::Handle(thread->zone()); |
| 11562 { |
| 11563 uword size = CodeSourceMap::InstanceSize(length); |
| 11564 RawObject* raw = Object::Allocate(CodeSourceMap::kClassId, |
| 11565 size, |
| 11566 Heap::kOld); |
| 11567 NoSafepointScope no_safepoint; |
| 11568 result ^= raw; |
| 11569 result.SetLength(length); |
| 11570 } |
| 11571 return result.raw(); |
| 11572 } |
| 11573 |
| 11574 |
| 11575 void CodeSourceMap::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 11576 Object::PrintJSONImpl(stream, ref); |
| 11577 } |
| 11578 |
| 11579 |
| 11580 const char* CodeSourceMap::ToCString() const { |
| 11581 // "*" in a printf format specifier tells it to read the field width from |
| 11582 // the printf argument list. |
| 11583 #define FORMAT "%#-*" Px "\t%" Pd "\n" |
| 11584 if (Length() == 0) { |
| 11585 return "empty CodeSourceMap\n"; |
| 11586 } |
| 11587 // 4 bits per hex digit. |
| 11588 const int addr_width = kBitsPerWord / 4; |
| 11589 // First compute the buffer size required. |
| 11590 intptr_t len = 1; // Trailing '\0'. |
| 11591 { |
| 11592 Iterator iter(*this); |
| 11593 while (iter.MoveNext()) { |
| 11594 len += OS::SNPrint(NULL, 0, FORMAT, addr_width, |
| 11595 iter.PcOffset(), |
| 11596 iter.TokenPos()); |
| 11597 } |
| 11598 } |
| 11599 // Allocate the buffer. |
| 11600 char* buffer = Thread::Current()->zone()->Alloc<char>(len); |
| 11601 // Layout the fields in the buffer. |
| 11602 intptr_t index = 0; |
| 11603 Iterator iter(*this); |
| 11604 while (iter.MoveNext()) { |
| 11605 index += OS::SNPrint((buffer + index), (len - index), FORMAT, addr_width, |
| 11606 iter.PcOffset(), |
| 11607 iter.TokenPos()); |
| 11608 } |
| 11609 return buffer; |
| 11610 #undef FORMAT |
| 11611 } |
| 11612 |
| 11613 |
| 11614 // Encode integer in SLEB128 format. |
| 11615 void CodeSourceMap::EncodeInteger(GrowableArray<uint8_t>* data, |
| 11616 intptr_t value) { |
| 11617 return EncodeSLEB128(data, value); |
| 11618 } |
| 11619 |
| 11620 |
| 11621 // Decode SLEB128 encoded integer. Update byte_index to the next integer. |
| 11622 intptr_t CodeSourceMap::DecodeInteger(intptr_t* byte_index) const { |
| 11623 NoSafepointScope no_safepoint; |
| 11624 const uint8_t* data = raw_ptr()->data(); |
| 11625 return DecodeSLEB128(data, Length(), byte_index); |
| 11626 } |
| 11627 |
| 11628 |
| 11498 bool Stackmap::GetBit(intptr_t bit_index) const { | 11629 bool Stackmap::GetBit(intptr_t bit_index) const { |
| 11499 ASSERT(InRange(bit_index)); | 11630 ASSERT(InRange(bit_index)); |
| 11500 int byte_index = bit_index >> kBitsPerByteLog2; | 11631 int byte_index = bit_index >> kBitsPerByteLog2; |
| 11501 int bit_remainder = bit_index & (kBitsPerByte - 1); | 11632 int bit_remainder = bit_index & (kBitsPerByte - 1); |
| 11502 uint8_t byte_mask = 1U << bit_remainder; | 11633 uint8_t byte_mask = 1U << bit_remainder; |
| 11503 uint8_t byte = raw_ptr()->data()[byte_index]; | 11634 uint8_t byte = raw_ptr()->data()[byte_index]; |
| 11504 return (byte & byte_mask); | 11635 return (byte & byte_mask); |
| 11505 } | 11636 } |
| 11506 | 11637 |
| 11507 | 11638 |
| (...skipping 11198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22706 return tag_label.ToCString(); | 22837 return tag_label.ToCString(); |
| 22707 } | 22838 } |
| 22708 | 22839 |
| 22709 | 22840 |
| 22710 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 22841 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 22711 Instance::PrintJSONImpl(stream, ref); | 22842 Instance::PrintJSONImpl(stream, ref); |
| 22712 } | 22843 } |
| 22713 | 22844 |
| 22714 | 22845 |
| 22715 } // namespace dart | 22846 } // namespace dart |
| OLD | NEW |