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

Side by Side Diff: lib/isolate.cc

Issue 10874072: Use the return value of vm native methods to set the return value, (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 3 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
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 "platform/assert.h" 5 #include "platform/assert.h"
6 #include "vm/bootstrap_natives.h" 6 #include "vm/bootstrap_natives.h"
7 #include "vm/class_finalizer.h" 7 #include "vm/class_finalizer.h"
8 #include "vm/dart.h" 8 #include "vm/dart.h"
9 #include "vm/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 113
114 114
115 DEFINE_NATIVE_ENTRY(ReceivePortImpl_factory, 1) { 115 DEFINE_NATIVE_ENTRY(ReceivePortImpl_factory, 1) {
116 ASSERT(AbstractTypeArguments::CheckedHandle(arguments->At(0)).IsNull()); 116 ASSERT(AbstractTypeArguments::CheckedHandle(arguments->At(0)).IsNull());
117 intptr_t port_id = 117 intptr_t port_id =
118 PortMap::CreatePort(arguments->isolate()->message_handler()); 118 PortMap::CreatePort(arguments->isolate()->message_handler());
119 const Object& port = Object::Handle(ReceivePortCreate(port_id)); 119 const Object& port = Object::Handle(ReceivePortCreate(port_id));
120 if (port.IsError()) { 120 if (port.IsError()) {
121 Exceptions::PropagateError(Error::Cast(port)); 121 Exceptions::PropagateError(Error::Cast(port));
122 } 122 }
123 arguments->SetReturn(port); 123 return port.raw();
124 } 124 }
125 125
126 126
127 DEFINE_NATIVE_ENTRY(ReceivePortImpl_closeInternal, 1) { 127 DEFINE_NATIVE_ENTRY(ReceivePortImpl_closeInternal, 1) {
128 GET_NATIVE_ARGUMENT(Smi, id, arguments->At(0)); 128 GET_NATIVE_ARGUMENT(Smi, id, arguments->At(0));
129 PortMap::ClosePort(id.Value()); 129 PortMap::ClosePort(id.Value());
130 return Object::null();
130 } 131 }
131 132
132 133
133 DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 3) { 134 DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 3) {
134 GET_NATIVE_ARGUMENT(Smi, send_id, arguments->At(0)); 135 GET_NATIVE_ARGUMENT(Smi, send_id, arguments->At(0));
135 GET_NATIVE_ARGUMENT(Smi, reply_id, arguments->At(1)); 136 GET_NATIVE_ARGUMENT(Smi, reply_id, arguments->At(1));
136 // TODO(iposva): Allow for arbitrary messages to be sent. 137 // TODO(iposva): Allow for arbitrary messages to be sent.
137 GET_NATIVE_ARGUMENT(Instance, obj, arguments->At(2)); 138 GET_NATIVE_ARGUMENT(Instance, obj, arguments->At(2));
138 139
139 uint8_t* data = NULL; 140 uint8_t* data = NULL;
140 MessageWriter writer(&data, &allocator); 141 MessageWriter writer(&data, &allocator);
141 writer.WriteMessage(obj); 142 writer.WriteMessage(obj);
142 143
143 // TODO(turnidge): Throw an exception when the return value is false? 144 // TODO(turnidge): Throw an exception when the return value is false?
144 PortMap::PostMessage(new Message(send_id.Value(), reply_id.Value(), 145 PortMap::PostMessage(new Message(send_id.Value(), reply_id.Value(),
145 data, writer.BytesWritten(), 146 data, writer.BytesWritten(),
146 Message::kNormalPriority)); 147 Message::kNormalPriority));
148 return Object::null();
147 } 149 }
148 150
149 151
150 static void ThrowIllegalArgException(const String& message) { 152 static void ThrowIllegalArgException(const String& message) {
151 GrowableArray<const Object*> args(1); 153 GrowableArray<const Object*> args(1);
152 args.Add(&message); 154 args.Add(&message);
153 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); 155 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
154 } 156 }
155 157
156 158
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 result = DartEntry::InvokeStatic(func, args, kNoArgNames); 361 result = DartEntry::InvokeStatic(func, args, kNoArgNames);
360 if (result.IsError()) { 362 if (result.IsError()) {
361 StoreError(isolate, result); 363 StoreError(isolate, result);
362 return false; 364 return false;
363 } 365 }
364 } 366 }
365 return true; 367 return true;
366 } 368 }
367 369
368 370
369 static void Spawn(NativeArguments* arguments, SpawnState* state) { 371 static RawObject* Spawn(NativeArguments* arguments, SpawnState* state) {
370 // Create a new isolate. 372 // Create a new isolate.
371 char* error = NULL; 373 char* error = NULL;
372 if (!CreateIsolate(state, &error)) { 374 if (!CreateIsolate(state, &error)) {
373 delete state; 375 delete state;
374 const String& msg = String::Handle(String::New(error)); 376 const String& msg = String::Handle(String::New(error));
375 free(error); 377 free(error);
376 ThrowIsolateSpawnException(msg); 378 ThrowIsolateSpawnException(msg);
377 } 379 }
378 380
379 // Try to create a SendPort for the new isolate. 381 // Try to create a SendPort for the new isolate.
380 const Object& port = Object::Handle( 382 const Object& port = Object::Handle(
381 DartLibraryCalls::NewSendPort(state->isolate()->main_port())); 383 DartLibraryCalls::NewSendPort(state->isolate()->main_port()));
382 if (port.IsError()) { 384 if (port.IsError()) {
383 state->Cleanup(); 385 state->Cleanup();
384 delete state; 386 delete state;
385 Exceptions::PropagateError(Error::Cast(port)); 387 Exceptions::PropagateError(Error::Cast(port));
386 } 388 }
387 389
388 // Start the new isolate. 390 // Start the new isolate.
389 state->isolate()->set_spawn_data(reinterpret_cast<uword>(state)); 391 state->isolate()->set_spawn_data(reinterpret_cast<uword>(state));
390 state->isolate()->message_handler()->Run( 392 state->isolate()->message_handler()->Run(
391 Dart::thread_pool(), RunIsolate, ShutdownIsolate, 393 Dart::thread_pool(), RunIsolate, ShutdownIsolate,
392 reinterpret_cast<uword>(state->isolate())); 394 reinterpret_cast<uword>(state->isolate()));
393 395
394 arguments->SetReturn(port); 396 return port.raw();
395 } 397 }
396 398
397 399
398 DEFINE_NATIVE_ENTRY(isolate_spawnFunction, 1) { 400 DEFINE_NATIVE_ENTRY(isolate_spawnFunction, 1) {
399 GET_NATIVE_ARGUMENT(Closure, closure, arguments->At(0)); 401 GET_NATIVE_ARGUMENT(Closure, closure, arguments->At(0));
400 const Function& func = Function::Handle(closure.function()); 402 const Function& func = Function::Handle(closure.function());
401 const Class& cls = Class::Handle(func.Owner()); 403 const Class& cls = Class::Handle(func.Owner());
402 if (!func.IsClosureFunction() || !func.is_static() || !cls.IsTopLevel()) { 404 if (!func.IsClosureFunction() || !func.is_static() || !cls.IsTopLevel()) {
403 const String& msg = String::Handle(String::New( 405 const String& msg = String::Handle(String::New(
404 "spawnFunction expects to be passed a closure to a top-level static " 406 "spawnFunction expects to be passed a closure to a top-level static "
405 "function")); 407 "function"));
406 ThrowIllegalArgException(msg); 408 ThrowIllegalArgException(msg);
407 } 409 }
408 410
409 #if defined(DEBUG) 411 #if defined(DEBUG)
410 const Context& ctx = Context::Handle(closure.context()); 412 const Context& ctx = Context::Handle(closure.context());
411 ASSERT(ctx.num_variables() == 0); 413 ASSERT(ctx.num_variables() == 0);
412 #endif 414 #endif
413 415
414 Spawn(arguments, new SpawnState(func)); 416 return Spawn(arguments, new SpawnState(func));
415 } 417 }
416 418
417 419
418 DEFINE_NATIVE_ENTRY(isolate_spawnUri, 1) { 420 DEFINE_NATIVE_ENTRY(isolate_spawnUri, 1) {
419 GET_NATIVE_ARGUMENT(String, uri, arguments->At(0)); 421 GET_NATIVE_ARGUMENT(String, uri, arguments->At(0));
420 422
421 // Canonicalize the uri with respect to the current isolate. 423 // Canonicalize the uri with respect to the current isolate.
422 char* error = NULL; 424 char* error = NULL;
423 char* canonical_uri = NULL; 425 char* canonical_uri = NULL;
424 const Library& root_lib = 426 const Library& root_lib =
425 Library::Handle(arguments->isolate()->object_store()->root_library()); 427 Library::Handle(arguments->isolate()->object_store()->root_library());
426 if (!CanonicalizeUri(arguments->isolate(), root_lib, uri, 428 if (!CanonicalizeUri(arguments->isolate(), root_lib, uri,
427 &canonical_uri, &error)) { 429 &canonical_uri, &error)) {
428 const String& msg = String::Handle(String::New(error)); 430 const String& msg = String::Handle(String::New(error));
429 free(error); 431 free(error);
430 ThrowIsolateSpawnException(msg); 432 ThrowIsolateSpawnException(msg);
431 } 433 }
432 434
433 Spawn(arguments, new SpawnState(canonical_uri)); 435 return Spawn(arguments, new SpawnState(canonical_uri));
434 } 436 }
435 437
436 438
437 DEFINE_NATIVE_ENTRY(isolate_getPortInternal, 0) { 439 DEFINE_NATIVE_ENTRY(isolate_getPortInternal, 0) {
438 const Object& port = Object::Handle(ReceivePortCreate(isolate->main_port())); 440 const Object& port = Object::Handle(ReceivePortCreate(isolate->main_port()));
439 if (port.IsError()) { 441 if (port.IsError()) {
440 Exceptions::PropagateError(Error::Cast(port)); 442 Exceptions::PropagateError(Error::Cast(port));
441 } 443 }
442 arguments->SetReturn(port); 444 return port.raw();
443 } 445 }
444 446
445 } // namespace dart 447 } // namespace dart
OLDNEW
« no previous file with comments | « lib/integers.cc ('k') | lib/math.cc » ('j') | vm/bootstrap_natives.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698