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

Side by Side Diff: vm/dart_api_impl.cc

Issue 12052033: Added macros OBJECT_IMPLEMENTATION and FINAL_OBJECT_IMPLEMENTATION (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 7 years, 11 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/dart.cc ('k') | vm/dart_api_impl_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 "include/dart_api.h" 5 #include "include/dart_api.h"
6 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/dart.h" 10 #include "vm/dart.h"
(...skipping 2716 matching lines...) Expand 10 before | Expand all | Expand 10 after
2727 Function& func = Function::Handle(); 2727 Function& func = Function::Handle();
2728 String& name = String::Handle(); 2728 String& name = String::Handle();
2729 2729
2730 if (obj.IsClass()) { 2730 if (obj.IsClass()) {
2731 const Class& cls = Class::Cast(obj); 2731 const Class& cls = Class::Cast(obj);
2732 const Array& func_array = Array::Handle(cls.functions()); 2732 const Array& func_array = Array::Handle(cls.functions());
2733 2733
2734 // Some special types like 'dynamic' have a null functions list. 2734 // Some special types like 'dynamic' have a null functions list.
2735 if (!func_array.IsNull()) { 2735 if (!func_array.IsNull()) {
2736 for (intptr_t i = 0; i < func_array.Length(); ++i) { 2736 for (intptr_t i = 0; i < func_array.Length(); ++i) {
2737 func |= func_array.At(i); 2737 func ^= func_array.At(i);
2738 2738
2739 // Skip implicit getters and setters. 2739 // Skip implicit getters and setters.
2740 if (func.kind() == RawFunction::kImplicitGetter || 2740 if (func.kind() == RawFunction::kImplicitGetter ||
2741 func.kind() == RawFunction::kImplicitSetter || 2741 func.kind() == RawFunction::kImplicitSetter ||
2742 func.kind() == RawFunction::kConstImplicitGetter || 2742 func.kind() == RawFunction::kConstImplicitGetter ||
2743 func.kind() == RawFunction::kMethodExtractor) { 2743 func.kind() == RawFunction::kMethodExtractor) {
2744 continue; 2744 continue;
2745 } 2745 }
2746 2746
2747 name = func.UserVisibleName(); 2747 name = func.UserVisibleName();
2748 names.Add(name); 2748 names.Add(name);
2749 } 2749 }
2750 } 2750 }
2751 } else if (obj.IsLibrary()) { 2751 } else if (obj.IsLibrary()) {
2752 const Library& lib = Library::Cast(obj); 2752 const Library& lib = Library::Cast(obj);
2753 DictionaryIterator it(lib); 2753 DictionaryIterator it(lib);
2754 Object& obj = Object::Handle(); 2754 Object& obj = Object::Handle();
2755 while (it.HasNext()) { 2755 while (it.HasNext()) {
2756 obj = it.GetNext(); 2756 obj = it.GetNext();
2757 if (obj.IsFunction()) { 2757 if (obj.IsFunction()) {
2758 func |= obj.raw(); 2758 func ^= obj.raw();
2759 name = func.UserVisibleName(); 2759 name = func.UserVisibleName();
2760 names.Add(name); 2760 names.Add(name);
2761 } 2761 }
2762 } 2762 }
2763 } else { 2763 } else {
2764 return Api::NewError( 2764 return Api::NewError(
2765 "%s expects argument 'target' to be a class or library.", 2765 "%s expects argument 'target' to be a class or library.",
2766 CURRENT_FUNC); 2766 CURRENT_FUNC);
2767 } 2767 }
2768 return Api::NewHandle(isolate, Array::MakeArray(names)); 2768 return Api::NewHandle(isolate, Array::MakeArray(names));
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
3071 const Class& cls = Class::Cast(obj); 3071 const Class& cls = Class::Cast(obj);
3072 const Array& field_array = Array::Handle(cls.fields()); 3072 const Array& field_array = Array::Handle(cls.fields());
3073 3073
3074 // Some special types like 'dynamic' have a null fields list. 3074 // Some special types like 'dynamic' have a null fields list.
3075 // 3075 //
3076 // TODO(turnidge): Fix 'dynamic' so that it does not have a null 3076 // TODO(turnidge): Fix 'dynamic' so that it does not have a null
3077 // fields list. This will have to wait until the empty array is 3077 // fields list. This will have to wait until the empty array is
3078 // allocated in the vm isolate. 3078 // allocated in the vm isolate.
3079 if (!field_array.IsNull()) { 3079 if (!field_array.IsNull()) {
3080 for (intptr_t i = 0; i < field_array.Length(); ++i) { 3080 for (intptr_t i = 0; i < field_array.Length(); ++i) {
3081 field |= field_array.At(i); 3081 field ^= field_array.At(i);
3082 name = field.UserVisibleName(); 3082 name = field.UserVisibleName();
3083 names.Add(name); 3083 names.Add(name);
3084 } 3084 }
3085 } 3085 }
3086 } else if (obj.IsLibrary()) { 3086 } else if (obj.IsLibrary()) {
3087 const Library& lib = Library::Cast(obj); 3087 const Library& lib = Library::Cast(obj);
3088 DictionaryIterator it(lib); 3088 DictionaryIterator it(lib);
3089 Object& obj = Object::Handle(isolate); 3089 Object& obj = Object::Handle(isolate);
3090 while (it.HasNext()) { 3090 while (it.HasNext()) {
3091 obj = it.GetNext(); 3091 obj = it.GetNext();
3092 if (obj.IsField()) { 3092 if (obj.IsField()) {
3093 field |= obj.raw(); 3093 field ^= obj.raw();
3094 name = field.UserVisibleName(); 3094 name = field.UserVisibleName();
3095 names.Add(name); 3095 names.Add(name);
3096 } 3096 }
3097 } 3097 }
3098 } else { 3098 } else {
3099 return Api::NewError( 3099 return Api::NewError(
3100 "%s expects argument 'target' to be a class or library.", 3100 "%s expects argument 'target' to be a class or library.",
3101 CURRENT_FUNC); 3101 CURRENT_FUNC);
3102 } 3102 }
3103 return Api::NewHandle(isolate, Array::MakeArray(names)); 3103 return Api::NewHandle(isolate, Array::MakeArray(names));
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
3386 3386
3387 // Resolve the constructor. 3387 // Resolve the constructor.
3388 result = ResolveConstructor( 3388 result = ResolveConstructor(
3389 "Dart_New", cls, base_constructor_name, dot_name, number_of_arguments); 3389 "Dart_New", cls, base_constructor_name, dot_name, number_of_arguments);
3390 if (result.IsError()) { 3390 if (result.IsError()) {
3391 return Api::NewHandle(isolate, result.raw()); 3391 return Api::NewHandle(isolate, result.raw());
3392 } 3392 }
3393 // TODO(turnidge): Support redirecting factories. 3393 // TODO(turnidge): Support redirecting factories.
3394 ASSERT(result.IsFunction()); 3394 ASSERT(result.IsFunction());
3395 Function& constructor = Function::Handle(isolate); 3395 Function& constructor = Function::Handle(isolate);
3396 constructor |= result.raw(); 3396 constructor ^= result.raw();
3397 3397
3398 Instance& new_object = Instance::Handle(isolate); 3398 Instance& new_object = Instance::Handle(isolate);
3399 if (constructor.IsConstructor()) { 3399 if (constructor.IsConstructor()) {
3400 // Create the new object. 3400 // Create the new object.
3401 new_object = Instance::New(cls); 3401 new_object = Instance::New(cls);
3402 } 3402 }
3403 3403
3404 // Create the argument list. 3404 // Create the argument list.
3405 intptr_t arg_index = 0; 3405 intptr_t arg_index = 0;
3406 int extra_args = (constructor.IsConstructor() ? 2 : 1); 3406 int extra_args = (constructor.IsConstructor() ? 2 : 1);
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
3799 3799
3800 } else if (obj.IsLibrary()) { 3800 } else if (obj.IsLibrary()) {
3801 // To access a top-level we may need to use the Field or the 3801 // To access a top-level we may need to use the Field or the
3802 // setter Function. The setter function may either be in the 3802 // setter Function. The setter function may either be in the
3803 // library or in the field's owner class, depending. 3803 // library or in the field's owner class, depending.
3804 const Library& lib = Library::Cast(obj); 3804 const Library& lib = Library::Cast(obj);
3805 field = lib.LookupFieldAllowPrivate(field_name); 3805 field = lib.LookupFieldAllowPrivate(field_name);
3806 if (field.IsNull()) { 3806 if (field.IsNull()) {
3807 const String& setter_name = 3807 const String& setter_name =
3808 String::Handle(isolate, Field::SetterName(field_name)); 3808 String::Handle(isolate, Field::SetterName(field_name));
3809 setter |= lib.LookupFunctionAllowPrivate(setter_name); 3809 setter ^= lib.LookupFunctionAllowPrivate(setter_name);
3810 } 3810 }
3811 3811
3812 if (!setter.IsNull()) { 3812 if (!setter.IsNull()) {
3813 // Invoke the setter and return the result. 3813 // Invoke the setter and return the result.
3814 const int kNumArgs = 1; 3814 const int kNumArgs = 1;
3815 const Array& args = Array::Handle(isolate, Array::New(kNumArgs)); 3815 const Array& args = Array::Handle(isolate, Array::New(kNumArgs));
3816 args.SetAt(0, value_instance); 3816 args.SetAt(0, value_instance);
3817 const Object& result = 3817 const Object& result =
3818 Object::Handle(isolate, DartEntry::InvokeStatic(setter, args)); 3818 Object::Handle(isolate, DartEntry::InvokeStatic(setter, args));
3819 if (result.IsError()) { 3819 if (result.IsError()) {
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
4173 } 4173 }
4174 SnapshotReader reader(snapshot->content(), 4174 SnapshotReader reader(snapshot->content(),
4175 snapshot->length(), 4175 snapshot->length(),
4176 snapshot->kind(), 4176 snapshot->kind(),
4177 isolate); 4177 isolate);
4178 const Object& tmp = Object::Handle(isolate, reader.ReadObject()); 4178 const Object& tmp = Object::Handle(isolate, reader.ReadObject());
4179 if (!tmp.IsLibrary()) { 4179 if (!tmp.IsLibrary()) {
4180 return Api::NewError("%s: Unable to deserialize snapshot correctly.", 4180 return Api::NewError("%s: Unable to deserialize snapshot correctly.",
4181 CURRENT_FUNC); 4181 CURRENT_FUNC);
4182 } 4182 }
4183 library |= tmp.raw(); 4183 library ^= tmp.raw();
4184 library.set_debuggable(true); 4184 library.set_debuggable(true);
4185 isolate->object_store()->set_root_library(library); 4185 isolate->object_store()->set_root_library(library);
4186 return Api::NewHandle(isolate, library.raw()); 4186 return Api::NewHandle(isolate, library.raw());
4187 } 4187 }
4188 4188
4189 4189
4190 DART_EXPORT Dart_Handle Dart_RootLibrary() { 4190 DART_EXPORT Dart_Handle Dart_RootLibrary() {
4191 Isolate* isolate = Isolate::Current(); 4191 Isolate* isolate = Isolate::Current();
4192 DARTSCOPE(isolate); 4192 DARTSCOPE(isolate);
4193 Library& library = 4193 Library& library =
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
4524 } 4524 }
4525 { 4525 {
4526 NoGCScope no_gc; 4526 NoGCScope no_gc;
4527 RawObject* raw_obj = obj.raw(); 4527 RawObject* raw_obj = obj.raw();
4528 isolate->heap()->SetPeer(raw_obj, peer); 4528 isolate->heap()->SetPeer(raw_obj, peer);
4529 } 4529 }
4530 return Api::Success(isolate); 4530 return Api::Success(isolate);
4531 } 4531 }
4532 4532
4533 } // namespace dart 4533 } // namespace dart
OLDNEW
« no previous file with comments | « vm/dart.cc ('k') | vm/dart_api_impl_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698