Index: runtime/vm/dart_entry.cc |
=================================================================== |
--- runtime/vm/dart_entry.cc (revision 5107) |
+++ runtime/vm/dart_entry.cc (working copy) |
@@ -218,4 +218,97 @@ |
return result.raw(); |
} |
+ |
+RawObject* DartLibraryCalls::HandleMirrorsMessage(Dart_Port dest_port_id, |
+ Dart_Port reply_port_id, |
+ const Instance& message) { |
+ Isolate* isolate = Isolate::Current(); |
+ // Create the reply port. |
+ const Object& reply_port = Object::Handle( |
+ DartLibraryCalls::NewSendPort(reply_port_id)); |
+ if (reply_port.IsError()) { |
+ return reply_port.raw(); |
+ } |
+ |
+ // Call _Mirrors.processCommand(message, reply_port). |
+ const Library& lib = |
+ Library::Handle(isolate->object_store()->mirrors_library()); |
+ const String& raw_class_name = |
+ String::Handle(String::NewSymbol("_Mirrors")); |
+ const String& private_key = |
+ String::Handle(lib.private_key()); |
+ const String& class_name = |
+ String::Handle(String::Concat(raw_class_name, private_key)); |
+ const String& function_name = |
+ String::Handle(String::NewSymbol("processCommand")); |
+ const int kNumArguments = 2; |
+ const Array& kNoArgumentNames = Array::Handle(); |
+ const Function& function = Function::Handle( |
+ Resolver::ResolveStatic(lib, |
+ class_name, |
+ function_name, |
+ kNumArguments, |
+ kNoArgumentNames, |
+ Resolver::kIsQualified)); |
+ ASSERT(!function.IsNull()); |
+ GrowableArray<const Object*> arguments(kNumArguments); |
+ arguments.Add(&message); |
+ arguments.Add(&reply_port); |
+ const Object& result = Object::Handle( |
+ DartEntry::InvokeStatic(function, arguments, kNoArgumentNames)); |
+ ASSERT(result.IsNull() || result.IsError()); |
+ return result.raw(); |
+} |
+ |
+ |
+RawObject* DartLibraryCalls::NewSendPort(intptr_t port_id) { |
+ Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
+ ASSERT(!isolate_lib.IsNull()); |
+ const String& class_name = |
+ String::Handle(isolate_lib.PrivateName("_SendPortImpl")); |
+ const String& function_name = String::Handle(String::NewSymbol("_create")); |
+ const int kNumArguments = 1; |
+ const Array& kNoArgumentNames = Array::Handle(); |
+ const Function& function = Function::Handle( |
+ Resolver::ResolveStatic(isolate_lib, |
+ class_name, |
+ function_name, |
+ kNumArguments, |
+ kNoArgumentNames, |
+ Resolver::kIsQualified)); |
+ GrowableArray<const Object*> arguments(kNumArguments); |
+ arguments.Add(&Integer::Handle(Integer::New(port_id))); |
+ return DartEntry::InvokeStatic(function, arguments, kNoArgumentNames); |
+} |
+ |
+ |
+RawObject* DartLibraryCalls::MapSetAt(const Instance& map, |
+ const Instance& key, |
+ const Instance& value) { |
+ String& name = String::Handle(String::New("[]=")); |
+ const Function& function = Function::Handle( |
+ Resolver::ResolveDynamic(map, name, 3, 0)); |
+ ASSERT(!function.IsNull()); |
+ GrowableArray<const Object*> args(2); |
+ args.Add(&key); |
+ args.Add(&value); |
+ const Array& kNoArgumentNames = Array::Handle(); |
+ const Object& result = Object::Handle( |
+ DartEntry::InvokeDynamic(map, function, args, kNoArgumentNames)); |
+ return result.raw(); |
+} |
+ |
+ |
+RawObject* DartLibraryCalls::PortGetId(const Instance& port) { |
+ const String& field_name = String::Handle(String::NewSymbol("_id")); |
+ const Class& cls = Class::Handle(port.clazz()); |
+ const String& func_name = String::Handle(Field::GetterName(field_name)); |
+ const Function& func = Function::Handle(cls.LookupDynamicFunction(func_name)); |
+ ASSERT(!func.IsNull()); |
+ GrowableArray<const Object*> arguments; |
+ const Array& kNoArgumentNames = Array::Handle(); |
+ return DartEntry::InvokeDynamic(port, func, arguments, kNoArgumentNames); |
+} |
+ |
+ |
} // namespace dart |