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

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

Issue 184523002: Allocation sinking for contexts. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: added new test Created 6 years, 1 month 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
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 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 4049 matching lines...) Expand 10 before | Expand all | Expand 10 after
4060 void set_parent(const Context& parent) const { 4060 void set_parent(const Context& parent) const {
4061 StorePointer(&raw_ptr()->parent_, parent.raw()); 4061 StorePointer(&raw_ptr()->parent_, parent.raw());
4062 } 4062 }
4063 static intptr_t parent_offset() { return OFFSET_OF(RawContext, parent_); } 4063 static intptr_t parent_offset() { return OFFSET_OF(RawContext, parent_); }
4064 4064
4065 intptr_t num_variables() const { return raw_ptr()->num_variables_; } 4065 intptr_t num_variables() const { return raw_ptr()->num_variables_; }
4066 static intptr_t num_variables_offset() { 4066 static intptr_t num_variables_offset() {
4067 return OFFSET_OF(RawContext, num_variables_); 4067 return OFFSET_OF(RawContext, num_variables_);
4068 } 4068 }
4069 4069
4070 RawInstance* At(intptr_t context_index) const { 4070 RawObject* At(intptr_t context_index) const {
4071 return *InstanceAddr(context_index); 4071 return *ObjectAddr(context_index);
4072 } 4072 }
4073 inline void SetAt(intptr_t context_index, const Instance& value) const; 4073 inline void SetAt(intptr_t context_index, const Object& value) const;
4074 4074
4075 void Dump(int indent = 0) const; 4075 void Dump(int indent = 0) const;
4076 4076
4077 static const intptr_t kBytesPerElement = kWordSize; 4077 static const intptr_t kBytesPerElement = kWordSize;
4078 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement; 4078 static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
4079 4079
4080 static intptr_t variable_offset(intptr_t context_index) { 4080 static intptr_t variable_offset(intptr_t context_index) {
4081 return OFFSET_OF_RETURNED_VALUE(RawContext, data) + 4081 return OFFSET_OF_RETURNED_VALUE(RawContext, data) +
4082 (kWordSize * context_index); 4082 (kWordSize * context_index);
4083 } 4083 }
4084 4084
4085 static intptr_t InstanceSize() { 4085 static intptr_t InstanceSize() {
4086 ASSERT(sizeof(RawContext) == OFFSET_OF_RETURNED_VALUE(RawContext, data)); 4086 ASSERT(sizeof(RawContext) == OFFSET_OF_RETURNED_VALUE(RawContext, data));
4087 return 0; 4087 return 0;
4088 } 4088 }
4089 4089
4090 static intptr_t InstanceSize(intptr_t len) { 4090 static intptr_t InstanceSize(intptr_t len) {
4091 ASSERT(0 <= len && len <= kMaxElements); 4091 ASSERT(0 <= len && len <= kMaxElements);
4092 return RoundedAllocationSize(sizeof(RawContext) + (len * kBytesPerElement)); 4092 return RoundedAllocationSize(sizeof(RawContext) + (len * kBytesPerElement));
4093 } 4093 }
4094 4094
4095 static RawContext* New(intptr_t num_variables, 4095 static RawContext* New(intptr_t num_variables,
4096 Heap::Space space = Heap::kNew); 4096 Heap::Space space = Heap::kNew);
4097 4097
4098 private: 4098 private:
4099 RawInstance* const* InstanceAddr(intptr_t context_index) const { 4099 RawObject* const* ObjectAddr(intptr_t context_index) const {
4100 ASSERT((context_index >= 0) && (context_index < num_variables())); 4100 ASSERT((context_index >= 0) && (context_index < num_variables()));
4101 return &raw_ptr()->data()[context_index]; 4101 return &raw_ptr()->data()[context_index];
4102 } 4102 }
4103 4103
4104 void set_num_variables(intptr_t num_variables) const { 4104 void set_num_variables(intptr_t num_variables) const {
4105 StoreNonPointer(&raw_ptr()->num_variables_, num_variables); 4105 StoreNonPointer(&raw_ptr()->num_variables_, num_variables);
4106 } 4106 }
4107 4107
4108 FINAL_HEAP_OBJECT_IMPLEMENTATION(Context, Object); 4108 FINAL_HEAP_OBJECT_IMPLEMENTATION(Context, Object);
4109 friend class Class; 4109 friend class Class;
(...skipping 3329 matching lines...) Expand 10 before | Expand all | Expand 10 after
7439 7439
7440 7440
7441 void Field::SetOffset(intptr_t value_in_bytes) const { 7441 void Field::SetOffset(intptr_t value_in_bytes) const {
7442 ASSERT(!is_static()); // SetOffset is valid only for instance fields. 7442 ASSERT(!is_static()); // SetOffset is valid only for instance fields.
7443 ASSERT(kWordSize != 0); 7443 ASSERT(kWordSize != 0);
7444 StorePointer(&raw_ptr()->value_, 7444 StorePointer(&raw_ptr()->value_,
7445 static_cast<RawInstance*>(Smi::New(value_in_bytes / kWordSize))); 7445 static_cast<RawInstance*>(Smi::New(value_in_bytes / kWordSize)));
7446 } 7446 }
7447 7447
7448 7448
7449 void Context::SetAt(intptr_t index, const Instance& value) const { 7449 void Context::SetAt(intptr_t index, const Object& value) const {
7450 StorePointer(InstanceAddr(index), value.raw()); 7450 StorePointer(ObjectAddr(index), value.raw());
7451 } 7451 }
7452 7452
7453 7453
7454 intptr_t Instance::GetNativeField(int index) const { 7454 intptr_t Instance::GetNativeField(int index) const {
7455 ASSERT(IsValidNativeIndex(index)); 7455 ASSERT(IsValidNativeIndex(index));
7456 NoGCScope no_gc; 7456 NoGCScope no_gc;
7457 RawTypedData* native_fields = 7457 RawTypedData* native_fields =
7458 reinterpret_cast<RawTypedData*>(*NativeFieldsAddr()); 7458 reinterpret_cast<RawTypedData*>(*NativeFieldsAddr());
7459 if (native_fields == TypedData::null()) { 7459 if (native_fields == TypedData::null()) {
7460 return 0; 7460 return 0;
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
7534 7534
7535 7535
7536 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 7536 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
7537 intptr_t index) { 7537 intptr_t index) {
7538 return array.At((index * kEntryLength) + kTargetFunctionIndex); 7538 return array.At((index * kEntryLength) + kTargetFunctionIndex);
7539 } 7539 }
7540 7540
7541 } // namespace dart 7541 } // namespace dart
7542 7542
7543 #endif // VM_OBJECT_H_ 7543 #endif // VM_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698