| 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 DECLARE_FLAG(bool, trace_deoptimization); | 76 DECLARE_FLAG(bool, trace_deoptimization); |
| 77 DECLARE_FLAG(bool, trace_deoptimization_verbose); | 77 DECLARE_FLAG(bool, trace_deoptimization_verbose); |
| 78 DECLARE_FLAG(bool, write_protect_code); | 78 DECLARE_FLAG(bool, write_protect_code); |
| 79 | 79 |
| 80 | 80 |
| 81 static const char* kGetterPrefix = "get:"; | 81 static const char* kGetterPrefix = "get:"; |
| 82 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix); | 82 static const intptr_t kGetterPrefixLength = strlen(kGetterPrefix); |
| 83 static const char* kSetterPrefix = "set:"; | 83 static const char* kSetterPrefix = "set:"; |
| 84 static const intptr_t kSetterPrefixLength = strlen(kSetterPrefix); | 84 static const intptr_t kSetterPrefixLength = strlen(kSetterPrefix); |
| 85 | 85 |
| 86 // A cache of VM heap allocated preinitialized empty ic data entry arrays. |
| 87 RawArray* ICData::cached_icdata_arrays_[kCachedICDataArrayCount]; |
| 88 |
| 86 cpp_vtable Object::handle_vtable_ = 0; | 89 cpp_vtable Object::handle_vtable_ = 0; |
| 87 cpp_vtable Object::builtin_vtables_[kNumPredefinedCids] = { 0 }; | 90 cpp_vtable Object::builtin_vtables_[kNumPredefinedCids] = { 0 }; |
| 88 cpp_vtable Smi::handle_vtable_ = 0; | 91 cpp_vtable Smi::handle_vtable_ = 0; |
| 89 | 92 |
| 90 // These are initialized to a value that will force a illegal memory access if | 93 // These are initialized to a value that will force a illegal memory access if |
| 91 // they are being used. | 94 // they are being used. |
| 92 #if defined(RAW_NULL) | 95 #if defined(RAW_NULL) |
| 93 #error RAW_NULL should not be defined. | 96 #error RAW_NULL should not be defined. |
| 94 #endif | 97 #endif |
| 95 #define RAW_NULL kHeapObjectTag | 98 #define RAW_NULL kHeapObjectTag |
| (...skipping 12513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12609 if (cid == kObjectCid) { | 12612 if (cid == kObjectCid) { |
| 12610 return true; | 12613 return true; |
| 12611 } | 12614 } |
| 12612 } | 12615 } |
| 12613 return false; | 12616 return false; |
| 12614 } | 12617 } |
| 12615 return true; | 12618 return true; |
| 12616 } | 12619 } |
| 12617 | 12620 |
| 12618 | 12621 |
| 12619 RawICData* ICData::New() { | 12622 void ICData::InitOnce() { |
| 12620 ICData& result = ICData::Handle(); | 12623 for (int i = 0; i < kCachedICDataArrayCount; i++) { |
| 12621 { | 12624 cached_icdata_arrays_[i] = ICData::NewNonCachedEmptyICDataArray(i); |
| 12622 // IC data objects are long living objects, allocate them in old generation. | |
| 12623 RawObject* raw = Object::Allocate(ICData::kClassId, | |
| 12624 ICData::InstanceSize(), | |
| 12625 Heap::kOld); | |
| 12626 NoSafepointScope no_safepoint; | |
| 12627 result ^= raw; | |
| 12628 } | 12625 } |
| 12629 result.set_deopt_id(Thread::kNoDeoptId); | |
| 12630 result.set_state_bits(0); | |
| 12631 return result.raw(); | |
| 12632 } | 12626 } |
| 12633 | 12627 |
| 12634 | 12628 |
| 12635 RawICData* ICData::New(const Function& owner, | 12629 RawArray* ICData::NewNonCachedEmptyICDataArray(intptr_t num_args_tested) { |
| 12636 const String& target_name, | 12630 // IC data array must be null terminated (sentinel entry). |
| 12637 const Array& arguments_descriptor, | 12631 const intptr_t len = TestEntryLengthFor(num_args_tested); |
| 12638 intptr_t deopt_id, | 12632 const Array& array = Array::Handle(Array::New(len, Heap::kOld)); |
| 12639 intptr_t num_args_tested) { | 12633 WriteSentinel(array, len); |
| 12634 array.MakeImmutable(); |
| 12635 return array.raw(); |
| 12636 } |
| 12637 |
| 12638 |
| 12639 RawArray* ICData::NewEmptyICDataArray(intptr_t num_args_tested) { |
| 12640 ASSERT(num_args_tested >= 0); |
| 12641 if (num_args_tested < kCachedICDataArrayCount) { |
| 12642 return cached_icdata_arrays_[num_args_tested]; |
| 12643 } |
| 12644 return NewNonCachedEmptyICDataArray(num_args_tested); |
| 12645 } |
| 12646 |
| 12647 |
| 12648 |
| 12649 // Does not initialize ICData array. |
| 12650 RawICData* ICData::NewDescriptor(Zone* zone, |
| 12651 const Function& owner, |
| 12652 const String& target_name, |
| 12653 const Array& arguments_descriptor, |
| 12654 intptr_t deopt_id, |
| 12655 intptr_t num_args_tested) { |
| 12640 ASSERT(!owner.IsNull()); | 12656 ASSERT(!owner.IsNull()); |
| 12641 ASSERT(!target_name.IsNull()); | 12657 ASSERT(!target_name.IsNull()); |
| 12642 ASSERT(!arguments_descriptor.IsNull()); | 12658 ASSERT(!arguments_descriptor.IsNull()); |
| 12643 ASSERT(Object::icdata_class() != Class::null()); | 12659 ASSERT(Object::icdata_class() != Class::null()); |
| 12644 ASSERT(num_args_tested >= 0); | 12660 ASSERT(num_args_tested >= 0); |
| 12645 ICData& result = ICData::Handle(); | 12661 ICData& result = ICData::Handle(zone); |
| 12646 { | 12662 { |
| 12647 // IC data objects are long living objects, allocate them in old generation. | 12663 // IC data objects are long living objects, allocate them in old generation. |
| 12648 RawObject* raw = Object::Allocate(ICData::kClassId, | 12664 RawObject* raw = Object::Allocate(ICData::kClassId, |
| 12649 ICData::InstanceSize(), | 12665 ICData::InstanceSize(), |
| 12650 Heap::kOld); | 12666 Heap::kOld); |
| 12651 NoSafepointScope no_safepoint; | 12667 NoSafepointScope no_safepoint; |
| 12652 result ^= raw; | 12668 result ^= raw; |
| 12653 } | 12669 } |
| 12654 result.set_owner(owner); | 12670 result.set_owner(owner); |
| 12655 result.set_target_name(target_name); | 12671 result.set_target_name(target_name); |
| 12656 result.set_arguments_descriptor(arguments_descriptor); | 12672 result.set_arguments_descriptor(arguments_descriptor); |
| 12657 result.set_deopt_id(deopt_id); | 12673 result.set_deopt_id(deopt_id); |
| 12658 result.set_state_bits(0); | 12674 result.set_state_bits(0); |
| 12659 result.SetNumArgsTested(num_args_tested); | 12675 result.SetNumArgsTested(num_args_tested); |
| 12660 // Number of array elements in one test entry. | |
| 12661 intptr_t len = result.TestEntryLength(); | |
| 12662 // IC data array must be null terminated (sentinel entry). | |
| 12663 const Array& ic_data = Array::Handle(Array::New(len, Heap::kOld)); | |
| 12664 WriteSentinel(ic_data, result.TestEntryLength()); | |
| 12665 result.set_ic_data_array(ic_data); | |
| 12666 return result.raw(); | 12676 return result.raw(); |
| 12667 } | 12677 } |
| 12668 | 12678 |
| 12679 |
| 12680 RawICData* ICData::New() { |
| 12681 ICData& result = ICData::Handle(); |
| 12682 { |
| 12683 // IC data objects are long living objects, allocate them in old generation. |
| 12684 RawObject* raw = Object::Allocate(ICData::kClassId, |
| 12685 ICData::InstanceSize(), |
| 12686 Heap::kOld); |
| 12687 NoSafepointScope no_safepoint; |
| 12688 result ^= raw; |
| 12689 } |
| 12690 result.set_deopt_id(Thread::kNoDeoptId); |
| 12691 result.set_state_bits(0); |
| 12692 return result.raw(); |
| 12693 } |
| 12694 |
| 12695 |
| 12696 RawICData* ICData::New(const Function& owner, |
| 12697 const String& target_name, |
| 12698 const Array& arguments_descriptor, |
| 12699 intptr_t deopt_id, |
| 12700 intptr_t num_args_tested) { |
| 12701 Zone* zone = Thread::Current()->zone(); |
| 12702 const ICData& result = ICData::Handle(zone, |
| 12703 NewDescriptor(zone, |
| 12704 owner, |
| 12705 target_name, |
| 12706 arguments_descriptor, |
| 12707 deopt_id, |
| 12708 num_args_tested)); |
| 12709 result.set_ic_data_array( |
| 12710 Array::Handle(zone, NewEmptyICDataArray(num_args_tested))); |
| 12711 return result.raw(); |
| 12712 } |
| 12713 |
| 12669 | 12714 |
| 12670 RawICData* ICData::NewFrom(const ICData& from, intptr_t num_args_tested) { | 12715 RawICData* ICData::NewFrom(const ICData& from, intptr_t num_args_tested) { |
| 12671 const ICData& result = ICData::Handle(ICData::New( | 12716 const ICData& result = ICData::Handle(ICData::New( |
| 12672 Function::Handle(from.owner()), | 12717 Function::Handle(from.owner()), |
| 12673 String::Handle(from.target_name()), | 12718 String::Handle(from.target_name()), |
| 12674 Array::Handle(from.arguments_descriptor()), | 12719 Array::Handle(from.arguments_descriptor()), |
| 12675 from.deopt_id(), | 12720 from.deopt_id(), |
| 12676 num_args_tested)); | 12721 num_args_tested)); |
| 12677 // Copy deoptimization reasons. | 12722 // Copy deoptimization reasons. |
| 12678 result.SetDeoptReasons(from.DeoptReasons()); | 12723 result.SetDeoptReasons(from.DeoptReasons()); |
| (...skipping 9103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21782 return tag_label.ToCString(); | 21827 return tag_label.ToCString(); |
| 21783 } | 21828 } |
| 21784 | 21829 |
| 21785 | 21830 |
| 21786 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21831 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
| 21787 Instance::PrintJSONImpl(stream, ref); | 21832 Instance::PrintJSONImpl(stream, ref); |
| 21788 } | 21833 } |
| 21789 | 21834 |
| 21790 | 21835 |
| 21791 } // namespace dart | 21836 } // namespace dart |
| OLD | NEW |