Chromium Code Reviews| 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 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 473 class_class_ = reinterpret_cast<RawClass*>(address + kHeapObjectTag); | 473 class_class_ = reinterpret_cast<RawClass*>(address + kHeapObjectTag); |
| 474 InitializeObject(address, Class::kClassId, size); | 474 InitializeObject(address, Class::kClassId, size); |
| 475 | 475 |
| 476 Class fake; | 476 Class fake; |
| 477 // Initialization from Class::New<Class>. | 477 // Initialization from Class::New<Class>. |
| 478 // Directly set raw_ to break a circular dependency: SetRaw will attempt | 478 // Directly set raw_ to break a circular dependency: SetRaw will attempt |
| 479 // to lookup class class in the class table where it is not registered yet. | 479 // to lookup class class in the class table where it is not registered yet. |
| 480 cls.raw_ = class_class_; | 480 cls.raw_ = class_class_; |
| 481 cls.set_handle_vtable(fake.vtable()); | 481 cls.set_handle_vtable(fake.vtable()); |
| 482 cls.set_instance_size(Class::InstanceSize()); | 482 cls.set_instance_size(Class::InstanceSize()); |
| 483 cls.set_next_field_offset(Class::InstanceSize()); | 483 cls.set_next_field_offset(Class::NextFieldOffset()); |
| 484 cls.set_id(Class::kClassId); | 484 cls.set_id(Class::kClassId); |
| 485 cls.set_state_bits(0); | 485 cls.set_state_bits(0); |
| 486 cls.set_is_finalized(); | 486 cls.set_is_finalized(); |
| 487 cls.set_is_type_finalized(); | 487 cls.set_is_type_finalized(); |
| 488 cls.set_type_arguments_field_offset_in_words(Class::kNoTypeArguments); | 488 cls.set_type_arguments_field_offset_in_words(Class::kNoTypeArguments); |
| 489 cls.set_num_type_arguments(0); | 489 cls.set_num_type_arguments(0); |
| 490 cls.set_num_own_type_arguments(0); | 490 cls.set_num_own_type_arguments(0); |
| 491 cls.set_num_native_fields(0); | 491 cls.set_num_native_fields(0); |
| 492 cls.InitEmptyFields(); | 492 cls.InitEmptyFields(); |
| 493 isolate->RegisterClass(cls); | 493 isolate->RegisterClass(cls); |
| (...skipping 1161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1655 { | 1655 { |
| 1656 RawObject* raw = Object::Allocate(Class::kClassId, | 1656 RawObject* raw = Object::Allocate(Class::kClassId, |
| 1657 Class::InstanceSize(), | 1657 Class::InstanceSize(), |
| 1658 Heap::kOld); | 1658 Heap::kOld); |
| 1659 NoGCScope no_gc; | 1659 NoGCScope no_gc; |
| 1660 result ^= raw; | 1660 result ^= raw; |
| 1661 } | 1661 } |
| 1662 FakeObject fake; | 1662 FakeObject fake; |
| 1663 result.set_handle_vtable(fake.vtable()); | 1663 result.set_handle_vtable(fake.vtable()); |
| 1664 result.set_instance_size(FakeObject::InstanceSize()); | 1664 result.set_instance_size(FakeObject::InstanceSize()); |
| 1665 result.set_next_field_offset(FakeObject::InstanceSize()); | 1665 result.set_next_field_offset(FakeObject::NextFieldOffset()); |
| 1666 ASSERT((FakeObject::kClassId != kInstanceCid)); | 1666 ASSERT((FakeObject::kClassId != kInstanceCid)); |
| 1667 result.set_id(FakeObject::kClassId); | 1667 result.set_id(FakeObject::kClassId); |
| 1668 result.set_state_bits(0); | 1668 result.set_state_bits(0); |
| 1669 // VM backed classes are almost ready: run checks and resolve class | 1669 // VM backed classes are almost ready: run checks and resolve class |
| 1670 // references, but do not recompute size. | 1670 // references, but do not recompute size. |
| 1671 result.set_is_prefinalized(); | 1671 result.set_is_prefinalized(); |
| 1672 result.set_type_arguments_field_offset_in_words(kNoTypeArguments); | 1672 result.set_type_arguments_field_offset_in_words(kNoTypeArguments); |
| 1673 result.set_num_type_arguments(0); | 1673 result.set_num_type_arguments(0); |
| 1674 result.set_num_own_type_arguments(0); | 1674 result.set_num_own_type_arguments(0); |
| 1675 result.set_num_native_fields(0); | 1675 result.set_num_native_fields(0); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2025 return TypeParameter::null(); | 2025 return TypeParameter::null(); |
| 2026 } | 2026 } |
| 2027 | 2027 |
| 2028 | 2028 |
| 2029 void Class::CalculateFieldOffsets() const { | 2029 void Class::CalculateFieldOffsets() const { |
| 2030 Array& flds = Array::Handle(fields()); | 2030 Array& flds = Array::Handle(fields()); |
| 2031 const Class& super = Class::Handle(SuperClass()); | 2031 const Class& super = Class::Handle(SuperClass()); |
| 2032 intptr_t offset = 0; | 2032 intptr_t offset = 0; |
| 2033 intptr_t type_args_field_offset = kNoTypeArguments; | 2033 intptr_t type_args_field_offset = kNoTypeArguments; |
| 2034 if (super.IsNull()) { | 2034 if (super.IsNull()) { |
| 2035 offset = sizeof(RawObject); | 2035 offset = Instance::NextFieldOffset(); |
| 2036 ASSERT(offset > 0); | |
| 2036 } else { | 2037 } else { |
| 2037 ASSERT(super.is_finalized() || super.is_prefinalized()); | 2038 ASSERT(super.is_finalized() || super.is_prefinalized()); |
| 2038 type_args_field_offset = super.type_arguments_field_offset(); | 2039 type_args_field_offset = super.type_arguments_field_offset(); |
| 2039 offset = super.next_field_offset(); | 2040 offset = super.next_field_offset(); |
| 2040 ASSERT(offset > 0); | 2041 ASSERT(offset > 0); |
| 2041 // We should never call CalculateFieldOffsets for native wrapper | 2042 // We should never call CalculateFieldOffsets for native wrapper |
| 2042 // classes, assert this. | 2043 // classes, assert this. |
| 2043 ASSERT(num_native_fields() == 0); | 2044 ASSERT(num_native_fields() == 0); |
| 2044 set_num_native_fields(super.num_native_fields()); | 2045 set_num_native_fields(super.num_native_fields()); |
| 2045 } | 2046 } |
| 2046 // If the super class is parameterized, use the same type_arguments field, | 2047 // If the super class is parameterized, use the same type_arguments field, |
| 2047 // otherwise, if this class is the first in the super chain to be | 2048 // otherwise, if this class is the first in the super chain to be |
| 2048 // parameterized, introduce a new type_arguments field. | 2049 // parameterized, introduce a new type_arguments field. |
| 2049 if (type_args_field_offset == kNoTypeArguments) { | 2050 if (type_args_field_offset == kNoTypeArguments) { |
| 2050 const TypeArguments& type_params = TypeArguments::Handle(type_parameters()); | 2051 const TypeArguments& type_params = TypeArguments::Handle(type_parameters()); |
| 2051 if (!type_params.IsNull()) { | 2052 if (!type_params.IsNull()) { |
| 2052 ASSERT(type_params.Length() > 0); | 2053 ASSERT(type_params.Length() > 0); |
| 2053 // The instance needs a type_arguments field. | 2054 // The instance needs a type_arguments field. |
| 2054 type_args_field_offset = offset; | 2055 type_args_field_offset = offset; |
| 2055 offset += kWordSize; | 2056 offset += kWordSize; |
| 2056 } | 2057 } |
| 2057 } | 2058 } |
| 2058 set_type_arguments_field_offset(type_args_field_offset); | 2059 set_type_arguments_field_offset(type_args_field_offset); |
| 2059 ASSERT(offset != 0); | 2060 ASSERT(offset > 0); |
| 2060 Field& field = Field::Handle(); | 2061 Field& field = Field::Handle(); |
| 2061 intptr_t len = flds.Length(); | 2062 intptr_t len = flds.Length(); |
| 2062 for (intptr_t i = 0; i < len; i++) { | 2063 for (intptr_t i = 0; i < len; i++) { |
| 2063 field ^= flds.At(i); | 2064 field ^= flds.At(i); |
| 2064 // Offset is computed only for instance fields. | 2065 // Offset is computed only for instance fields. |
| 2065 if (!field.is_static()) { | 2066 if (!field.is_static()) { |
| 2066 ASSERT(field.Offset() == 0); | 2067 ASSERT(field.Offset() == 0); |
| 2067 field.SetOffset(offset); | 2068 field.SetOffset(offset); |
| 2068 offset += kWordSize; | 2069 offset += kWordSize; |
| 2069 } | 2070 } |
| (...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2387 RawObject* raw = Object::Allocate(Class::kClassId, | 2388 RawObject* raw = Object::Allocate(Class::kClassId, |
| 2388 Class::InstanceSize(), | 2389 Class::InstanceSize(), |
| 2389 Heap::kOld); | 2390 Heap::kOld); |
| 2390 NoGCScope no_gc; | 2391 NoGCScope no_gc; |
| 2391 result ^= raw; | 2392 result ^= raw; |
| 2392 } | 2393 } |
| 2393 FakeInstance fake; | 2394 FakeInstance fake; |
| 2394 ASSERT(fake.IsInstance()); | 2395 ASSERT(fake.IsInstance()); |
| 2395 result.set_handle_vtable(fake.vtable()); | 2396 result.set_handle_vtable(fake.vtable()); |
| 2396 result.set_instance_size(FakeInstance::InstanceSize()); | 2397 result.set_instance_size(FakeInstance::InstanceSize()); |
| 2397 result.set_next_field_offset(FakeInstance::InstanceSize()); | 2398 result.set_next_field_offset(FakeInstance::NextFieldOffset()); |
| 2398 result.set_id(index); | 2399 result.set_id(index); |
| 2399 result.set_state_bits(0); | 2400 result.set_state_bits(0); |
| 2400 result.set_type_arguments_field_offset_in_words(kNoTypeArguments); | 2401 result.set_type_arguments_field_offset_in_words(kNoTypeArguments); |
| 2401 result.set_num_type_arguments(kUnknownNumTypeArguments); | 2402 result.set_num_type_arguments(kUnknownNumTypeArguments); |
| 2402 result.set_num_own_type_arguments(kUnknownNumTypeArguments); | 2403 result.set_num_own_type_arguments(kUnknownNumTypeArguments); |
| 2403 result.set_num_native_fields(0); | 2404 result.set_num_native_fields(0); |
| 2404 result.set_token_pos(Scanner::kDummyTokenIndex); | 2405 result.set_token_pos(Scanner::kDummyTokenIndex); |
| 2405 result.InitEmptyFields(); | 2406 result.InitEmptyFields(); |
| 2406 Isolate::Current()->RegisterClass(result); | 2407 Isolate::Current()->RegisterClass(result); |
| 2407 return result.raw(); | 2408 return result.raw(); |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 2419 } | 2420 } |
| 2420 | 2421 |
| 2421 | 2422 |
| 2422 RawClass* Class::NewSignatureClass(const String& name, | 2423 RawClass* Class::NewSignatureClass(const String& name, |
| 2423 const Function& signature_function, | 2424 const Function& signature_function, |
| 2424 const Script& script, | 2425 const Script& script, |
| 2425 intptr_t token_pos) { | 2426 intptr_t token_pos) { |
| 2426 const Class& result = Class::Handle(New(name, script, token_pos)); | 2427 const Class& result = Class::Handle(New(name, script, token_pos)); |
| 2427 // Instances of a signature class can only be closures. | 2428 // Instances of a signature class can only be closures. |
| 2428 result.set_instance_size(Closure::InstanceSize()); | 2429 result.set_instance_size(Closure::InstanceSize()); |
| 2429 result.set_next_field_offset(Closure::InstanceSize()); | 2430 result.set_next_field_offset(Closure::NextFieldOffset()); |
| 2430 // Signature classes extend the _FunctionImpl class. | 2431 // Signature classes extend the _FunctionImpl class. |
| 2431 result.set_super_type(Type::Handle( | 2432 result.set_super_type(Type::Handle( |
| 2432 Isolate::Current()->object_store()->function_impl_type())); | 2433 Isolate::Current()->object_store()->function_impl_type())); |
| 2433 result.set_is_synthesized_class(); | 2434 result.set_is_synthesized_class(); |
| 2434 result.set_type_arguments_field_offset(Closure::type_arguments_offset()); | 2435 result.set_type_arguments_field_offset(Closure::type_arguments_offset()); |
| 2435 if (!signature_function.IsNull()) { | 2436 if (!signature_function.IsNull()) { |
| 2436 result.PatchSignatureFunction(signature_function); | 2437 result.PatchSignatureFunction(signature_function); |
| 2437 } | 2438 } |
| 2438 return result.raw(); | 2439 return result.raw(); |
| 2439 } | 2440 } |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2491 int field_count) { | 2492 int field_count) { |
| 2492 Class& cls = Class::Handle(library.LookupClass(name)); | 2493 Class& cls = Class::Handle(library.LookupClass(name)); |
| 2493 if (cls.IsNull()) { | 2494 if (cls.IsNull()) { |
| 2494 cls = New(name, Script::Handle(), Scanner::kDummyTokenIndex); | 2495 cls = New(name, Script::Handle(), Scanner::kDummyTokenIndex); |
| 2495 cls.SetFields(Object::empty_array()); | 2496 cls.SetFields(Object::empty_array()); |
| 2496 cls.SetFunctions(Object::empty_array()); | 2497 cls.SetFunctions(Object::empty_array()); |
| 2497 // Set super class to Object. | 2498 // Set super class to Object. |
| 2498 cls.set_super_type(Type::Handle(Type::ObjectType())); | 2499 cls.set_super_type(Type::Handle(Type::ObjectType())); |
| 2499 // Compute instance size. First word contains a pointer to a properly | 2500 // Compute instance size. First word contains a pointer to a properly |
| 2500 // sized typed array once the first native field has been set. | 2501 // sized typed array once the first native field has been set. |
| 2501 intptr_t instance_size = sizeof(RawObject) + kWordSize; | 2502 intptr_t instance_size = sizeof(RawInstance) + kWordSize; |
| 2502 cls.set_instance_size(RoundedAllocationSize(instance_size)); | 2503 cls.set_instance_size(RoundedAllocationSize(instance_size)); |
| 2503 cls.set_next_field_offset(instance_size); | 2504 cls.set_next_field_offset(instance_size); |
| 2504 cls.set_num_native_fields(field_count); | 2505 cls.set_num_native_fields(field_count); |
| 2505 cls.set_is_finalized(); | 2506 cls.set_is_finalized(); |
| 2506 cls.set_is_type_finalized(); | 2507 cls.set_is_type_finalized(); |
| 2507 library.AddClass(cls); | 2508 library.AddClass(cls); |
| 2508 return cls.raw(); | 2509 return cls.raw(); |
| 2509 } else { | 2510 } else { |
| 2510 return Class::null(); | 2511 return Class::null(); |
| 2511 } | 2512 } |
| 2512 } | 2513 } |
| 2513 | 2514 |
| 2514 | 2515 |
| 2515 RawClass* Class::NewStringClass(intptr_t class_id) { | 2516 RawClass* Class::NewStringClass(intptr_t class_id) { |
| 2516 intptr_t instance_size; | 2517 intptr_t instance_size; |
| 2518 intptr_t next_field_offset; | |
| 2517 if (class_id == kOneByteStringCid) { | 2519 if (class_id == kOneByteStringCid) { |
| 2520 next_field_offset = OneByteString::NextFieldOffset(); | |
| 2518 instance_size = OneByteString::InstanceSize(); | 2521 instance_size = OneByteString::InstanceSize(); |
| 2519 } else if (class_id == kTwoByteStringCid) { | 2522 } else if (class_id == kTwoByteStringCid) { |
| 2523 next_field_offset = TwoByteString::NextFieldOffset(); | |
| 2520 instance_size = TwoByteString::InstanceSize(); | 2524 instance_size = TwoByteString::InstanceSize(); |
| 2521 } else if (class_id == kExternalOneByteStringCid) { | 2525 } else if (class_id == kExternalOneByteStringCid) { |
| 2526 next_field_offset = ExternalOneByteString::NextFieldOffset(); | |
| 2522 instance_size = ExternalOneByteString::InstanceSize(); | 2527 instance_size = ExternalOneByteString::InstanceSize(); |
| 2523 } else { | 2528 } else { |
| 2524 ASSERT(class_id == kExternalTwoByteStringCid); | 2529 ASSERT(class_id == kExternalTwoByteStringCid); |
| 2530 next_field_offset = ExternalTwoByteString::NextFieldOffset(); | |
| 2525 instance_size = ExternalTwoByteString::InstanceSize(); | 2531 instance_size = ExternalTwoByteString::InstanceSize(); |
| 2526 } | 2532 } |
| 2527 Class& result = Class::Handle(New<String>(class_id)); | 2533 Class& result = Class::Handle(New<String>(class_id)); |
| 2528 result.set_instance_size(instance_size); | 2534 result.set_instance_size(instance_size); |
| 2529 result.set_next_field_offset(instance_size); | 2535 result.set_next_field_offset(next_field_offset); |
| 2530 result.set_is_prefinalized(); | 2536 result.set_is_prefinalized(); |
| 2531 return result.raw(); | 2537 return result.raw(); |
| 2532 } | 2538 } |
| 2533 | 2539 |
| 2534 | 2540 |
| 2535 RawClass* Class::NewTypedDataClass(intptr_t class_id) { | 2541 RawClass* Class::NewTypedDataClass(intptr_t class_id) { |
| 2536 ASSERT(RawObject::IsTypedDataClassId(class_id)); | 2542 ASSERT(RawObject::IsTypedDataClassId(class_id)); |
| 2537 intptr_t instance_size = TypedData::InstanceSize(); | 2543 intptr_t instance_size = TypedData::InstanceSize(); |
| 2538 Class& result = Class::Handle(New<TypedData>(class_id)); | 2544 Class& result = Class::Handle(New<TypedData>(class_id)); |
| 2539 result.set_instance_size(instance_size); | 2545 result.set_instance_size(instance_size); |
| 2540 result.set_next_field_offset(instance_size); | 2546 result.set_next_field_offset(TypedData::NextFieldOffset()); |
| 2541 result.set_is_prefinalized(); | 2547 result.set_is_prefinalized(); |
| 2542 return result.raw(); | 2548 return result.raw(); |
| 2543 } | 2549 } |
| 2544 | 2550 |
| 2545 | 2551 |
| 2546 RawClass* Class::NewTypedDataViewClass(intptr_t class_id) { | 2552 RawClass* Class::NewTypedDataViewClass(intptr_t class_id) { |
| 2547 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); | 2553 ASSERT(RawObject::IsTypedDataViewClassId(class_id)); |
| 2548 Class& result = Class::Handle(New<Instance>(class_id)); | 2554 Class& result = Class::Handle(New<Instance>(class_id)); |
| 2549 result.set_instance_size(0); | 2555 result.set_instance_size(0); |
| 2550 result.set_next_field_offset(0); | 2556 result.set_next_field_offset(-1); |
|
Ivan Posva
2013/11/03 16:08:51
-kWordSize
siva
2013/11/04 16:05:01
Done.
| |
| 2551 return result.raw(); | 2557 return result.raw(); |
| 2552 } | 2558 } |
| 2553 | 2559 |
| 2554 | 2560 |
| 2555 RawClass* Class::NewExternalTypedDataClass(intptr_t class_id) { | 2561 RawClass* Class::NewExternalTypedDataClass(intptr_t class_id) { |
| 2556 ASSERT(RawObject::IsExternalTypedDataClassId(class_id)); | 2562 ASSERT(RawObject::IsExternalTypedDataClassId(class_id)); |
| 2557 intptr_t instance_size = ExternalTypedData::InstanceSize(); | 2563 intptr_t instance_size = ExternalTypedData::InstanceSize(); |
| 2558 Class& result = Class::Handle(New<ExternalTypedData>(class_id)); | 2564 Class& result = Class::Handle(New<ExternalTypedData>(class_id)); |
| 2559 result.set_instance_size(instance_size); | 2565 result.set_instance_size(instance_size); |
| 2560 result.set_next_field_offset(instance_size); | 2566 result.set_next_field_offset(ExternalTypedData::NextFieldOffset()); |
| 2561 result.set_is_prefinalized(); | 2567 result.set_is_prefinalized(); |
| 2562 return result.raw(); | 2568 return result.raw(); |
| 2563 } | 2569 } |
| 2564 | 2570 |
| 2565 | 2571 |
| 2566 void Class::set_name(const String& value) const { | 2572 void Class::set_name(const String& value) const { |
| 2567 ASSERT(value.IsSymbol()); | 2573 ASSERT(value.IsSymbol()); |
| 2568 StorePointer(&raw_ptr()->name_, value.raw()); | 2574 StorePointer(&raw_ptr()->name_, value.raw()); |
| 2569 } | 2575 } |
| 2570 | 2576 |
| (...skipping 8236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10807 return false; | 10813 return false; |
| 10808 } | 10814 } |
| 10809 | 10815 |
| 10810 { | 10816 { |
| 10811 NoGCScope no_gc; | 10817 NoGCScope no_gc; |
| 10812 // Raw bits compare. | 10818 // Raw bits compare. |
| 10813 const intptr_t instance_size = Class::Handle(this->clazz()).instance_size(); | 10819 const intptr_t instance_size = Class::Handle(this->clazz()).instance_size(); |
| 10814 ASSERT(instance_size != 0); | 10820 ASSERT(instance_size != 0); |
| 10815 uword this_addr = reinterpret_cast<uword>(this->raw_ptr()); | 10821 uword this_addr = reinterpret_cast<uword>(this->raw_ptr()); |
| 10816 uword other_addr = reinterpret_cast<uword>(other.raw_ptr()); | 10822 uword other_addr = reinterpret_cast<uword>(other.raw_ptr()); |
| 10817 for (intptr_t offset = sizeof(RawObject); | 10823 for (intptr_t offset = Instance::NextFieldOffset(); |
| 10818 offset < instance_size; | 10824 offset < instance_size; |
| 10819 offset += kWordSize) { | 10825 offset += kWordSize) { |
| 10820 if ((*reinterpret_cast<RawObject**>(this_addr + offset)) != | 10826 if ((*reinterpret_cast<RawObject**>(this_addr + offset)) != |
| 10821 (*reinterpret_cast<RawObject**>(other_addr + offset))) { | 10827 (*reinterpret_cast<RawObject**>(other_addr + offset))) { |
| 10822 return false; | 10828 return false; |
| 10823 } | 10829 } |
| 10824 } | 10830 } |
| 10825 } | 10831 } |
| 10826 return true; | 10832 return true; |
| 10827 } | 10833 } |
| (...skipping 4873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15701 return "_MirrorReference"; | 15707 return "_MirrorReference"; |
| 15702 } | 15708 } |
| 15703 | 15709 |
| 15704 | 15710 |
| 15705 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { | 15711 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { |
| 15706 JSONObject jsobj(stream); | 15712 JSONObject jsobj(stream); |
| 15707 } | 15713 } |
| 15708 | 15714 |
| 15709 | 15715 |
| 15710 } // namespace dart | 15716 } // namespace dart |
| OLD | NEW |