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

Unified Diff: vm/object.cc

Issue 9616044: Adds new apis Dart_GetField/Dart_SetField. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « vm/object.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: vm/object.cc
===================================================================
--- vm/object.cc (revision 5108)
+++ vm/object.cc (working copy)
@@ -570,13 +570,16 @@
cls = Class::New<InternalByteArray>();
object_store->set_internal_byte_array_class(cls);
- cls.set_name(String::Handle(core_lib.PrivateName("_InternalByteArray")));
+ String& public_class_name = String::Handle();
+ public_class_name = String::New("_InternalByteArray");
+ cls.set_name(String::Handle(core_lib.PrivateName(public_class_name)));
cls.set_script(script);
core_lib.AddClass(cls);
cls = Class::New<ExternalByteArray>();
object_store->set_external_byte_array_class(cls);
- cls.set_name(String::Handle(core_lib.PrivateName("_ExternalByteArray")));
+ public_class_name = String::New("_ExternalByteArray");
+ cls.set_name(String::Handle(core_lib.PrivateName(public_class_name)));
cls.set_script(script);
core_lib.AddClass(cls);
@@ -4544,6 +4547,61 @@
}
+static bool ShouldBePrivate(const String& name) {
+ return
+ (name.Length() >= 1 &&
+ name.CharAt(0) == '_') ||
+ (name.Length() >= 5 &&
+ (name.CharAt(4) == '_' &&
+ (name.CharAt(0) == 'g' || name.CharAt(0) == 's') &&
+ name.CharAt(1) == 'e' &&
+ name.CharAt(2) == 't' &&
+ name.CharAt(3) == ':'));
+}
+
+
+RawField* Library::LookupLocalField(const String& name) const {
+ Isolate* isolate = Isolate::Current();
+ Field& field = Field::Handle(isolate, Field::null());
+ Object& obj = Object::Handle(isolate, Object::null());
+ obj = LookupLocalObject(name);
+ if (obj.IsNull() && ShouldBePrivate(name)) {
+ String& private_name = String::Handle(isolate, PrivateName(name));
+ obj = LookupLocalObject(private_name);
+ }
+ if (!obj.IsNull()) {
+ if (obj.IsField()) {
+ field ^= obj.raw();
+ return field.raw();
+ }
+ }
+
+ // No field found.
+ return Field::null();
+}
+
+
+RawFunction* Library::LookupLocalFunction(const String& name) const {
+ Isolate* isolate = Isolate::Current();
+ Function& function = Function::Handle(isolate, Function::null());
+ Object& obj = Object::Handle(isolate, Object::null());
+ obj = LookupLocalObject(name);
+ if (obj.IsNull() && ShouldBePrivate(name)) {
+ String& private_name = String::Handle(isolate, PrivateName(name));
+ obj = LookupLocalObject(private_name);
+ }
+ if (!obj.IsNull()) {
+ if (obj.IsFunction()) {
+ function ^= obj.raw();
+ return function.raw();
+ }
+ }
+
+ // No function found.
+ return Function::null();
+}
+
+
RawObject* Library::LookupObjectFiltered(const String& name,
const Library& filter_lib) const {
// First check if name is found in the local scope of the library.
@@ -4959,11 +5017,11 @@
}
-RawString* Library::PrivateName(const char* name) {
- ASSERT(name[0] == '_');
- ASSERT(strchr(name, '@') == NULL);
+RawString* Library::PrivateName(const String& name) const {
+ ASSERT(ShouldBePrivate(name));
+ // ASSERT(strchr(name, '@') == NULL);
String& str = String::Handle();
- str = String::New(name);
+ str ^= name.raw();
str = String::Concat(str, String::Handle(this->private_key()));
str = String::NewSymbol(str);
return str.raw();
« no previous file with comments | « vm/object.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698