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

Side by Side Diff: vm/object.cc

Issue 11087070: - Get rid of RawClosure class and use RawInstance for closures. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « vm/object.h ('k') | vm/object_test.cc » ('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/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 RawObject* raw = Object::Allocate(Class::kClassId, 1338 RawObject* raw = Object::Allocate(Class::kClassId,
1339 Class::InstanceSize(), 1339 Class::InstanceSize(),
1340 Heap::kOld); 1340 Heap::kOld);
1341 NoGCScope no_gc; 1341 NoGCScope no_gc;
1342 result ^= raw; 1342 result ^= raw;
1343 } 1343 }
1344 FakeObject fake; 1344 FakeObject fake;
1345 result.set_handle_vtable(fake.vtable()); 1345 result.set_handle_vtable(fake.vtable());
1346 result.set_instance_size(FakeObject::InstanceSize()); 1346 result.set_instance_size(FakeObject::InstanceSize());
1347 result.set_next_field_offset(FakeObject::InstanceSize()); 1347 result.set_next_field_offset(FakeObject::InstanceSize());
1348 ASSERT((FakeObject::kClassId != kInstanceCid) && 1348 ASSERT((FakeObject::kClassId != kInstanceCid));
1349 (FakeObject::kClassId != kClosureCid));
1350 result.set_id(FakeObject::kClassId); 1349 result.set_id(FakeObject::kClassId);
1351 result.raw_ptr()->state_bits_ = 0; 1350 result.raw_ptr()->state_bits_ = 0;
1352 // VM backed classes are almost ready: run checks and resolve class 1351 // VM backed classes are almost ready: run checks and resolve class
1353 // references, but do not recompute size. 1352 // references, but do not recompute size.
1354 result.set_is_prefinalized(); 1353 result.set_is_prefinalized();
1355 result.raw_ptr()->type_arguments_instance_field_offset_ = kNoTypeArguments; 1354 result.raw_ptr()->type_arguments_instance_field_offset_ = kNoTypeArguments;
1356 result.raw_ptr()->num_native_fields_ = 0; 1355 result.raw_ptr()->num_native_fields_ = 0;
1357 result.raw_ptr()->token_pos_ = Scanner::kDummyTokenIndex; 1356 result.raw_ptr()->token_pos_ = Scanner::kDummyTokenIndex;
1358 result.InitEmptyFields(); 1357 result.InitEmptyFields();
1359 Isolate::Current()->class_table()->Register(result); 1358 Isolate::Current()->class_table()->Register(result);
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
1771 result.raw_ptr()->state_bits_ = 0; 1770 result.raw_ptr()->state_bits_ = 0;
1772 result.raw_ptr()->type_arguments_instance_field_offset_ = kNoTypeArguments; 1771 result.raw_ptr()->type_arguments_instance_field_offset_ = kNoTypeArguments;
1773 result.raw_ptr()->num_native_fields_ = 0; 1772 result.raw_ptr()->num_native_fields_ = 0;
1774 result.raw_ptr()->token_pos_ = Scanner::kDummyTokenIndex; 1773 result.raw_ptr()->token_pos_ = Scanner::kDummyTokenIndex;
1775 result.InitEmptyFields(); 1774 result.InitEmptyFields();
1776 Isolate::Current()->class_table()->Register(result); 1775 Isolate::Current()->class_table()->Register(result);
1777 return result.raw(); 1776 return result.raw();
1778 } 1777 }
1779 1778
1780 1779
1781 // Force instantiation of template version to work around ld problems.
1782 template RawClass* Class::New<Closure>(intptr_t index);
1783
1784
1785 template <class FakeInstance> 1780 template <class FakeInstance>
1786 RawClass* Class::New(const String& name, 1781 RawClass* Class::New(const String& name,
1787 const Script& script, 1782 const Script& script,
1788 intptr_t token_pos) { 1783 intptr_t token_pos) {
1789 Class& result = Class::Handle(New<FakeInstance>(kIllegalCid)); 1784 Class& result = Class::Handle(New<FakeInstance>(kIllegalCid));
1790 result.set_name(name); 1785 result.set_name(name);
1791 result.set_script(script); 1786 result.set_script(script);
1792 result.set_token_pos(token_pos); 1787 result.set_token_pos(token_pos);
1793 return result.raw(); 1788 return result.raw();
1794 } 1789 }
(...skipping 25 matching lines...) Expand all
1820 TypeArguments& type_parameters = TypeArguments::Handle(); 1815 TypeArguments& type_parameters = TypeArguments::Handle();
1821 // A signature class extends class Instance and is parameterized in the same 1816 // A signature class extends class Instance and is parameterized in the same
1822 // way as the owner class of its non-static signature function. 1817 // way as the owner class of its non-static signature function.
1823 // It is not type parameterized if its signature function is static. 1818 // It is not type parameterized if its signature function is static.
1824 if (!signature_function.is_static() && 1819 if (!signature_function.is_static() &&
1825 (owner_class.NumTypeParameters() > 0) && 1820 (owner_class.NumTypeParameters() > 0) &&
1826 !signature_function.HasInstantiatedSignature()) { 1821 !signature_function.HasInstantiatedSignature()) {
1827 type_parameters = owner_class.type_parameters(); 1822 type_parameters = owner_class.type_parameters();
1828 } 1823 }
1829 const intptr_t token_pos = signature_function.token_pos(); 1824 const intptr_t token_pos = signature_function.token_pos();
1830 Class& result = Class::Handle(New<Closure>(name, script, token_pos)); 1825 Class& result = Class::Handle(New<Instance>(name, script, token_pos));
1831 const Type& super_type = Type::Handle(Type::ObjectType()); 1826 const Type& super_type = Type::Handle(Type::ObjectType());
1832 const Array& empty_array = Array::Handle(Object::empty_array()); 1827 const Array& empty_array = Array::Handle(Object::empty_array());
1833 ASSERT(!super_type.IsNull()); 1828 ASSERT(!super_type.IsNull());
1829 result.set_instance_size(Closure::InstanceSize());
1830 result.set_next_field_offset(Closure::InstanceSize());
1834 result.set_super_type(super_type); 1831 result.set_super_type(super_type);
1835 result.set_signature_function(signature_function); 1832 result.set_signature_function(signature_function);
1836 result.set_type_parameters(type_parameters); 1833 result.set_type_parameters(type_parameters);
1837 result.SetFields(empty_array); 1834 result.SetFields(empty_array);
1838 result.SetFunctions(empty_array); 1835 result.SetFunctions(empty_array);
1839 result.set_type_arguments_instance_field_offset( 1836 result.set_type_arguments_instance_field_offset(
1840 Closure::type_arguments_offset()); 1837 Closure::type_arguments_offset());
1841 // Implements interface "Function". 1838 // Implements interface "Function".
1842 const Type& function_type = Type::Handle(Type::Function()); 1839 const Type& function_type = Type::Handle(Type::Function());
1843 const Array& interfaces = Array::Handle(Array::New(1, Heap::kOld)); 1840 const Array& interfaces = Array::Handle(Array::New(1, Heap::kOld));
(...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after
3135 return; 3132 return;
3136 } 3133 }
3137 UNREACHABLE(); 3134 UNREACHABLE();
3138 } 3135 }
3139 3136
3140 3137
3141 bool Function::IsRedirectingFactory() const { 3138 bool Function::IsRedirectingFactory() const {
3142 if (!IsFactory() || (raw_ptr()->data_ == Object::null())) { 3139 if (!IsFactory() || (raw_ptr()->data_ == Object::null())) {
3143 return false; 3140 return false;
3144 } 3141 }
3145 ASSERT(!IsClosure()); // A factory cannot also be a closure. 3142 ASSERT(!IsClosureFunction()); // A factory cannot also be a closure.
3146 return true; 3143 return true;
3147 } 3144 }
3148 3145
3149 3146
3150 RawType* Function::RedirectionType() const { 3147 RawType* Function::RedirectionType() const {
3151 ASSERT(IsRedirectingFactory()); 3148 ASSERT(IsRedirectingFactory());
3152 const Object& obj = Object::Handle(raw_ptr()->data_); 3149 const Object& obj = Object::Handle(raw_ptr()->data_);
3153 ASSERT(!obj.IsNull()); 3150 ASSERT(!obj.IsNull());
3154 return RedirectionData::Cast(obj).type(); 3151 return RedirectionData::Cast(obj).type();
3155 } 3152 }
(...skipping 4957 matching lines...) Expand 10 before | Expand all | Expand 10 after
8113 !other_type_arguments.IsInstantiated()) { 8110 !other_type_arguments.IsInstantiated()) {
8114 other_type_arguments = 8111 other_type_arguments =
8115 other_type_arguments.InstantiateFrom(other_instantiator); 8112 other_type_arguments.InstantiateFrom(other_instantiator);
8116 } 8113 }
8117 } 8114 }
8118 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments, 8115 return cls.IsSubtypeOf(type_arguments, other_class, other_type_arguments,
8119 malformed_error); 8116 malformed_error);
8120 } 8117 }
8121 8118
8122 8119
8120 bool Instance::IsClosure() const {
8121 const Class& cls = Class::Handle(clazz());
8122 return cls.IsSignatureClass();
8123 }
8124
8125
8123 RawInstance* Instance::New(const Class& cls, Heap::Space space) { 8126 RawInstance* Instance::New(const Class& cls, Heap::Space space) {
8124 Instance& result = Instance::Handle(); 8127 Instance& result = Instance::Handle();
8125 { 8128 {
8126 intptr_t instance_size = cls.instance_size(); 8129 intptr_t instance_size = cls.instance_size();
8127 ASSERT(instance_size > 0); 8130 ASSERT(instance_size > 0);
8128 RawObject* raw = Object::Allocate(cls.id(), instance_size, space); 8131 RawObject* raw = Object::Allocate(cls.id(), instance_size, space);
8129 NoGCScope no_gc; 8132 NoGCScope no_gc;
8130 result ^= raw; 8133 result ^= raw;
8131 uword addr = reinterpret_cast<uword>(result.raw_ptr()); 8134 uword addr = reinterpret_cast<uword>(result.raw_ptr());
8132 // Initialize fields. 8135 // Initialize fields.
(...skipping 18 matching lines...) Expand all
8151 if (IsNull()) { 8154 if (IsNull()) {
8152 return "null"; 8155 return "null";
8153 } else if (raw() == Object::sentinel()) { 8156 } else if (raw() == Object::sentinel()) {
8154 return "sentinel"; 8157 return "sentinel";
8155 } else if (raw() == Object::transition_sentinel()) { 8158 } else if (raw() == Object::transition_sentinel()) {
8156 return "transition_sentinel"; 8159 return "transition_sentinel";
8157 } else if (Isolate::Current()->no_gc_scope_depth() > 0) { 8160 } else if (Isolate::Current()->no_gc_scope_depth() > 0) {
8158 // Can occur when running disassembler. 8161 // Can occur when running disassembler.
8159 return "Instance"; 8162 return "Instance";
8160 } else { 8163 } else {
8164 if (IsClosure()) {
8165 return Closure::ToCString(*this);
8166 }
8161 const char* kFormat = "Instance of '%s'"; 8167 const char* kFormat = "Instance of '%s'";
8162 Class& cls = Class::Handle(clazz()); 8168 const Class& cls = Class::Handle(clazz());
8163 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(); 8169 AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle();
8164 const intptr_t num_type_arguments = cls.NumTypeArguments(); 8170 const intptr_t num_type_arguments = cls.NumTypeArguments();
8165 if (num_type_arguments > 0) { 8171 if (num_type_arguments > 0) {
8166 type_arguments = GetTypeArguments(); 8172 type_arguments = GetTypeArguments();
8167 } 8173 }
8168 const Type& type = 8174 const Type& type =
8169 Type::Handle(Type::New(cls, type_arguments, Scanner::kDummyTokenIndex)); 8175 Type::Handle(Type::New(cls, type_arguments, Scanner::kDummyTokenIndex));
8170 const String& type_name = String::Handle(type.Name()); 8176 const String& type_name = String::Handle(type.Name());
8171 // Calculate the size of the string. 8177 // Calculate the size of the string.
8172 intptr_t len = OS::SNPrint(NULL, 0, kFormat, type_name.ToCString()) + 1; 8178 intptr_t len = OS::SNPrint(NULL, 0, kFormat, type_name.ToCString()) + 1;
(...skipping 3714 matching lines...) Expand 10 before | Expand all | Expand 10 after
11887 return NewExternalImpl<ExternalFloat64Array, RawExternalFloat64Array>( 11893 return NewExternalImpl<ExternalFloat64Array, RawExternalFloat64Array>(
11888 cls, data, len, peer, callback, space); 11894 cls, data, len, peer, callback, space);
11889 } 11895 }
11890 11896
11891 11897
11892 const char* ExternalFloat64Array::ToCString() const { 11898 const char* ExternalFloat64Array::ToCString() const {
11893 return "_ExternalFloat64Array"; 11899 return "_ExternalFloat64Array";
11894 } 11900 }
11895 11901
11896 11902
11897 11903 const char* Closure::ToCString(const Instance& closure) {
11898 RawClosure* Closure::New(const Function& function, 11904 const Function& fun = Function::Handle(Closure::function(closure));
11899 const Context& context,
11900 Heap::Space space) {
11901 Isolate* isolate = Isolate::Current();
11902 ASSERT(context.isolate() == isolate);
11903
11904 const Class& cls = Class::Handle(function.signature_class());
11905 Closure& result = Closure::Handle();
11906 {
11907 RawObject* raw = Object::Allocate(cls.id(), Closure::InstanceSize(), space);
11908 NoGCScope no_gc;
11909 result ^= raw;
11910 }
11911 result.set_function(function);
11912 result.set_context(context);
11913 return result.raw();
11914 }
11915
11916
11917 void Closure::set_context(const Context& value) const {
11918 StorePointer(&raw_ptr()->context_, value.raw());
11919 }
11920
11921
11922 void Closure::set_function(const Function& value) const {
11923 StorePointer(&raw_ptr()->function_, value.raw());
11924 }
11925
11926
11927 const char* DartFunction::ToCString() const {
11928 return "Function type class";
11929 }
11930
11931
11932 const char* Closure::ToCString() const {
11933 const Function& fun = Function::Handle(function());
11934 const bool is_implicit_closure = fun.IsImplicitClosureFunction(); 11905 const bool is_implicit_closure = fun.IsImplicitClosureFunction();
11935 const char* fun_sig = String::Handle(fun.Signature()).ToCString(); 11906 const char* fun_sig = String::Handle(fun.Signature()).ToCString();
11936 const char* from = is_implicit_closure ? " from " : ""; 11907 const char* from = is_implicit_closure ? " from " : "";
11937 const char* fun_desc = is_implicit_closure ? fun.ToCString() : ""; 11908 const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
11938 const char* format = "Closure: %s%s%s"; 11909 const char* format = "Closure: %s%s%s";
11939 intptr_t len = OS::SNPrint(NULL, 0, format, fun_sig, from, fun_desc) + 1; 11910 intptr_t len = OS::SNPrint(NULL, 0, format, fun_sig, from, fun_desc) + 1;
11940 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 11911 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
11941 OS::SNPrint(chars, len, format, fun_sig, from, fun_desc); 11912 OS::SNPrint(chars, len, format, fun_sig, from, fun_desc);
11942 return chars; 11913 return chars;
11943 } 11914 }
11944 11915
11945 11916
11917 RawInstance* Closure::New(const Function& function,
11918 const Context& context,
11919 Heap::Space space) {
11920 Isolate* isolate = Isolate::Current();
11921 ASSERT(context.isolate() == isolate);
11922
11923 const Class& cls = Class::Handle(function.signature_class());
11924 ASSERT(cls.instance_size() == Closure::InstanceSize());
11925 Instance& result = Instance::Handle();
11926 {
11927 RawObject* raw = Object::Allocate(cls.id(), Closure::InstanceSize(), space);
11928 NoGCScope no_gc;
11929 result ^= raw;
11930 }
11931 Closure::set_function(result, function);
11932 Closure::set_context(result, context);
11933 return result.raw();
11934 }
11935
11936
11937 const char* DartFunction::ToCString() const {
11938 return "Function type class";
11939 }
11940
11941
11946 intptr_t Stacktrace::Length() const { 11942 intptr_t Stacktrace::Length() const {
11947 const Array& code_array = Array::Handle(raw_ptr()->code_array_); 11943 const Array& code_array = Array::Handle(raw_ptr()->code_array_);
11948 return code_array.Length(); 11944 return code_array.Length();
11949 } 11945 }
11950 11946
11951 11947
11952 RawFunction* Stacktrace::FunctionAtFrame(intptr_t frame_index) const { 11948 RawFunction* Stacktrace::FunctionAtFrame(intptr_t frame_index) const {
11953 const Array& function_array = Array::Handle(raw_ptr()->function_array_); 11949 const Array& function_array = Array::Handle(raw_ptr()->function_array_);
11954 return reinterpret_cast<RawFunction*>(function_array.At(frame_index)); 11950 return reinterpret_cast<RawFunction*>(function_array.At(frame_index));
11955 } 11951 }
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
12205 } 12201 }
12206 return result.raw(); 12202 return result.raw();
12207 } 12203 }
12208 12204
12209 12205
12210 const char* WeakProperty::ToCString() const { 12206 const char* WeakProperty::ToCString() const {
12211 return "_WeakProperty"; 12207 return "_WeakProperty";
12212 } 12208 }
12213 12209
12214 } // namespace dart 12210 } // namespace dart
OLDNEW
« no previous file with comments | « vm/object.h ('k') | vm/object_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698