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

Unified Diff: runtime/vm/dart_api_impl.cc

Issue 8588040: Add a mid-sized integration test for the Dart Embedding Api which (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart_api_impl.cc
===================================================================
--- runtime/vm/dart_api_impl.cc (revision 1904)
+++ runtime/vm/dart_api_impl.cc (working copy)
@@ -85,6 +85,61 @@
}
+// NOTE: Need to pass 'result' as a parameter here in order to avoid
+// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
+// which shows up because of the use of setjmp.
+static void InvokeStatic(Isolate* isolate,
+ const Function& function,
+ GrowableArray<const Object*>& args,
+ Dart_Handle* result) {
+ ASSERT(isolate != NULL);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ const Array& kNoArgumentNames = Array::Handle();
+ const Instance& retval = Instance::Handle(
+ DartEntry::InvokeStatic(function, args, kNoArgumentNames));
+ if (retval.IsUnhandledException()) {
+ *result = Api::ErrorFromException(retval);
+ } else {
+ *result = Api::NewLocalHandle(retval);
+ }
+ } else {
+ SetupErrorResult(result);
+ }
+ isolate->set_long_jump_base(base);
+}
+
+
+// NOTE: Need to pass 'result' as a parameter here in order to avoid
+// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
+// which shows up because of the use of setjmp.
+static void InvokeDynamic(Isolate* isolate,
+ const Instance& receiver,
+ const Function& function,
+ GrowableArray<const Object*>& args,
+ Dart_Handle* result) {
+ ASSERT(isolate != NULL);
+ LongJump* base = isolate->long_jump_base();
+ LongJump jump;
+ isolate->set_long_jump_base(&jump);
+ if (setjmp(*jump.Set()) == 0) {
+ const Array& kNoArgumentNames = Array::Handle();
+ const Instance& retval = Instance::Handle(
+ DartEntry::InvokeDynamic(receiver, function, args, kNoArgumentNames));
+ if (retval.IsUnhandledException()) {
+ *result = Api::ErrorFromException(retval);
+ } else {
+ *result = Api::NewLocalHandle(retval);
+ }
+ } else {
+ SetupErrorResult(result);
+ }
+ isolate->set_long_jump_base(base);
+}
+
+
Dart_Handle Api::NewLocalHandle(const Object& object) {
Isolate* isolate = Isolate::Current();
ASSERT(isolate != NULL);
@@ -359,7 +414,7 @@
}
-// TODO(turnidge): This clonse Api::Error. I need to use va_copy to
+// TODO(turnidge): This clones Api::Error. I need to use va_copy to
// fix this but not sure if it available on all of our builds.
DART_EXPORT Dart_Handle Dart_Error(const char* format, ...) {
DARTSCOPE(Isolate::Current());
@@ -592,8 +647,8 @@
}
-DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port,
- Dart_Port reply_port,
+DART_EXPORT Dart_Handle Dart_HandleMessage(Dart_Port dest_port_id,
+ Dart_Port reply_port_id,
Dart_Message dart_message) {
DARTSCOPE(Isolate::Current());
@@ -601,7 +656,7 @@
const String& class_name =
String::Handle(String::NewSymbol("ReceivePortImpl"));
const String& function_name =
- String::Handle(String::NewSymbol("handleMessage_"));
+ String::Handle(String::NewSymbol("_handleMessage"));
const int kNumArguments = 3;
const Array& kNoArgumentNames = Array::Handle();
const Function& function = Function::Handle(
@@ -612,9 +667,10 @@
kNoArgumentNames,
Resolver::kIsQualified));
GrowableArray<const Object*> arguments(kNumArguments);
- arguments.Add(&Integer::Handle(Integer::New(dest_port)));
- arguments.Add(&Integer::Handle(Integer::New(reply_port)));
+ arguments.Add(&Integer::Handle(Integer::New(dest_port_id)));
+ arguments.Add(&Integer::Handle(Integer::New(reply_port_id)));
arguments.Add(&msg);
+ // TODO(turnidge): This call should be wrapped in a longjmp
const Object& result = Object::Handle(
DartEntry::InvokeStatic(function, arguments, kNoArgumentNames));
if (result.IsUnhandledException()) {
@@ -644,13 +700,20 @@
}
+DART_EXPORT bool Dart_HasLivePorts() {
+ Isolate* isolate = Isolate::Current();
+ ASSERT(isolate);
+ return isolate->live_ports() > 0;
+}
+
+
static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
return reinterpret_cast<uint8_t*>(new_ptr);
}
-DART_EXPORT bool Dart_PostIntArray(Dart_Port port,
+DART_EXPORT bool Dart_PostIntArray(Dart_Port port_id,
intptr_t len,
intptr_t* data) {
uint8_t* buffer = NULL;
@@ -659,21 +722,75 @@
writer.WriteMessage(len, data);
// Post the message at the given port.
- return PortMap::PostMessage(port, kNoReplyPort, buffer);
+ return PortMap::PostMessage(port_id, kNoReplyPort, buffer);
}
-DART_EXPORT bool Dart_Post(Dart_Port port, Dart_Handle handle) {
+DART_EXPORT bool Dart_Post(Dart_Port port_id, Dart_Handle handle) {
DARTSCOPE(Isolate::Current());
const Object& object = Object::Handle(Api::UnwrapHandle(handle));
uint8_t* data = NULL;
SnapshotWriter writer(false, &data, &allocator);
writer.WriteObject(object.raw());
writer.FinalizeBuffer();
- return PortMap::PostMessage(port, kNoReplyPort, data);
+ return PortMap::PostMessage(port_id, kNoReplyPort, data);
}
+DART_EXPORT Dart_Handle Dart_NewSendPort(Dart_Port port_id) {
+ Isolate* isolate = Isolate::Current();
+ DARTSCOPE(isolate);
+ const String& class_name = String::Handle(String::NewSymbol("SendPortImpl"));
+ const String& function_name = String::Handle(String::NewSymbol("_create"));
+ const int kNumArguments = 1;
+ const Array& kNoArgumentNames = Array::Handle();
+ // TODO(turnidge): Consider adding a helper function to make
+ // function resolution by class name and function name more concise.
+ const Function& function = Function::Handle(
+ Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()),
+ class_name,
+ function_name,
+ kNumArguments,
+ kNoArgumentNames,
+ Resolver::kIsQualified));
+ GrowableArray<const Object*> arguments(kNumArguments);
+ arguments.Add(&Integer::Handle(Integer::New(port_id)));
+ Dart_Handle result;
+ InvokeStatic(isolate, function, arguments, &result);
+ return result;
+}
+
+
+DART_EXPORT Dart_Handle Dart_GetReceivePort(Dart_Port port_id) {
+ Isolate* isolate = Isolate::Current();
+ DARTSCOPE(isolate);
+ const String& class_name =
+ String::Handle(String::NewSymbol("ReceivePortImpl"));
+ const String& function_name =
+ String::Handle(String::NewSymbol("_get_or_create"));
+ const int kNumArguments = 1;
+ const Array& kNoArgumentNames = Array::Handle();
+ const Function& function = Function::Handle(
+ Resolver::ResolveStatic(Library::Handle(Library::CoreLibrary()),
+ class_name,
+ function_name,
+ kNumArguments,
+ kNoArgumentNames,
+ Resolver::kIsQualified));
+ GrowableArray<const Object*> arguments(kNumArguments);
+ arguments.Add(&Integer::Handle(Integer::New(port_id)));
+ Dart_Handle result;
+ InvokeStatic(isolate, function, arguments, &result);
+ return result;
+}
+
+
+DART_EXPORT Dart_Port Dart_GetMainPortId() {
+ Isolate* isolate = Isolate::Current();
+ ASSERT(isolate);
+ return isolate->main_port();
+}
+
// --- Scopes ----
@@ -1551,61 +1668,6 @@
// --- Methods and Fields ---
-// NOTE: Need to pass 'result' as a parameter here in order to avoid
-// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
-// which shows up because of the use of setjmp.
-static void InvokeStatic(Isolate* isolate,
- const Function& function,
- GrowableArray<const Object*>& args,
- Dart_Handle* result) {
- ASSERT(isolate != NULL);
- LongJump* base = isolate->long_jump_base();
- LongJump jump;
- isolate->set_long_jump_base(&jump);
- if (setjmp(*jump.Set()) == 0) {
- const Array& kNoArgumentNames = Array::Handle();
- const Instance& retval = Instance::Handle(
- DartEntry::InvokeStatic(function, args, kNoArgumentNames));
- if (retval.IsUnhandledException()) {
- *result = Api::ErrorFromException(retval);
- } else {
- *result = Api::NewLocalHandle(retval);
- }
- } else {
- SetupErrorResult(result);
- }
- isolate->set_long_jump_base(base);
-}
-
-
-// NOTE: Need to pass 'result' as a parameter here in order to avoid
-// warning: variable 'result' might be clobbered by 'longjmp' or 'vfork'
-// which shows up because of the use of setjmp.
-static void InvokeDynamic(Isolate* isolate,
- const Instance& receiver,
- const Function& function,
- GrowableArray<const Object*>& args,
- Dart_Handle* result) {
- ASSERT(isolate != NULL);
- LongJump* base = isolate->long_jump_base();
- LongJump jump;
- isolate->set_long_jump_base(&jump);
- if (setjmp(*jump.Set()) == 0) {
- const Array& kNoArgumentNames = Array::Handle();
- const Instance& retval = Instance::Handle(
- DartEntry::InvokeDynamic(receiver, function, args, kNoArgumentNames));
- if (retval.IsUnhandledException()) {
- *result = Api::ErrorFromException(retval);
- } else {
- *result = Api::NewLocalHandle(retval);
- }
- } else {
- SetupErrorResult(result);
- }
- isolate->set_long_jump_base(base);
-}
-
-
DART_EXPORT Dart_Handle Dart_InvokeStatic(Dart_Handle library_in,
Dart_Handle class_name_in,
Dart_Handle function_name_in,
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698