OLD | NEW |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 "vm/dart_entry.h" | 5 #include "vm/dart_entry.h" |
6 | 6 |
7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
8 #include "vm/code_generator.h" | 8 #include "vm/code_generator.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/debugger.h" | 10 #include "vm/debugger.h" |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 const Array& args = Array::Handle(Array::New(kNumArguments)); | 374 const Array& args = Array::Handle(Array::New(kNumArguments)); |
375 args.SetAt(0, left); | 375 args.SetAt(0, left); |
376 args.SetAt(1, right); | 376 args.SetAt(1, right); |
377 const Object& result = Object::Handle(DartEntry::InvokeFunction(function, | 377 const Object& result = Object::Handle(DartEntry::InvokeFunction(function, |
378 args)); | 378 args)); |
379 ASSERT(result.IsInstance() || result.IsError()); | 379 ASSERT(result.IsInstance() || result.IsError()); |
380 return result.raw(); | 380 return result.raw(); |
381 } | 381 } |
382 | 382 |
383 | 383 |
384 RawObject* DartLibraryCalls::LookupReceivePort(Dart_Port port_id) { | 384 RawObject* DartLibraryCalls::LookupHandler(Dart_Port port_id) { |
385 Isolate* isolate = Isolate::Current(); | 385 Isolate* isolate = Isolate::Current(); |
386 Function& function = | 386 Function& function = |
387 Function::Handle(isolate, | 387 Function::Handle(isolate, |
388 isolate->object_store()->lookup_receive_port_function()); | 388 isolate->object_store()->lookup_port_handler()); |
389 const int kNumArguments = 1; | 389 const int kNumArguments = 1; |
390 if (function.IsNull()) { | 390 if (function.IsNull()) { |
391 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | 391 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
392 ASSERT(!isolate_lib.IsNull()); | 392 ASSERT(!isolate_lib.IsNull()); |
393 const String& class_name = | 393 const String& class_name = |
394 String::Handle(isolate_lib.PrivateName(Symbols::_RawReceivePortImpl())); | 394 String::Handle(isolate_lib.PrivateName(Symbols::_RawReceivePortImpl())); |
395 const String& function_name = | 395 const String& function_name = |
396 String::Handle(isolate_lib.PrivateName(Symbols::_lookupReceivePort())); | 396 String::Handle(isolate_lib.PrivateName(Symbols::_lookupHandler())); |
397 function = Resolver::ResolveStatic(isolate_lib, | 397 function = Resolver::ResolveStatic(isolate_lib, |
398 class_name, | 398 class_name, |
399 function_name, | 399 function_name, |
400 kNumArguments, | 400 kNumArguments, |
401 Object::empty_array()); | 401 Object::empty_array()); |
402 ASSERT(!function.IsNull()); | 402 ASSERT(!function.IsNull()); |
403 isolate->object_store()->set_lookup_receive_port_function(function); | 403 isolate->object_store()->set_lookup_port_handler(function); |
404 } | 404 } |
405 const Array& args = Array::Handle(Array::New(kNumArguments)); | 405 const Array& args = Array::Handle(Array::New(kNumArguments)); |
406 args.SetAt(0, Integer::Handle(Integer::New(port_id))); | 406 args.SetAt(0, Integer::Handle(Integer::New(port_id))); |
407 const Object& result = | 407 const Object& result = |
408 Object::Handle(DartEntry::InvokeFunction(function, args)); | 408 Object::Handle(DartEntry::InvokeFunction(function, args)); |
409 return result.raw(); | 409 return result.raw(); |
410 } | 410 } |
411 | 411 |
412 | 412 |
413 RawObject* DartLibraryCalls::HandleMessage(const Object& receive_port, | 413 RawObject* DartLibraryCalls::HandleMessage(const Object& handler, |
414 const Instance& message) { | 414 const Instance& message) { |
415 Isolate* isolate = Isolate::Current(); | 415 Isolate* isolate = Isolate::Current(); |
416 Function& function = Function::Handle(isolate, | 416 Function& function = Function::Handle(isolate, |
417 isolate->object_store()->handle_message_function()); | 417 isolate->object_store()->handle_message_function()); |
418 const int kNumArguments = 2; | 418 const int kNumArguments = 2; |
419 if (function.IsNull()) { | 419 if (function.IsNull()) { |
420 Library& isolate_lib = Library::Handle(isolate, Library::IsolateLibrary()); | 420 Library& isolate_lib = Library::Handle(isolate, Library::IsolateLibrary()); |
421 ASSERT(!isolate_lib.IsNull()); | 421 ASSERT(!isolate_lib.IsNull()); |
422 const String& class_name = String::Handle(isolate, | 422 const String& class_name = String::Handle(isolate, |
423 isolate_lib.PrivateName(Symbols::_RawReceivePortImpl())); | 423 isolate_lib.PrivateName(Symbols::_RawReceivePortImpl())); |
424 const String& function_name = String::Handle(isolate, | 424 const String& function_name = String::Handle(isolate, |
425 isolate_lib.PrivateName(Symbols::_handleMessage())); | 425 isolate_lib.PrivateName(Symbols::_handleMessage())); |
426 function = Resolver::ResolveStatic(isolate_lib, | 426 function = Resolver::ResolveStatic(isolate_lib, |
427 class_name, | 427 class_name, |
428 function_name, | 428 function_name, |
429 kNumArguments, | 429 kNumArguments, |
430 Object::empty_array()); | 430 Object::empty_array()); |
431 ASSERT(!function.IsNull()); | 431 ASSERT(!function.IsNull()); |
432 isolate->object_store()->set_handle_message_function(function); | 432 isolate->object_store()->set_handle_message_function(function); |
433 } | 433 } |
434 const Array& args = Array::Handle(isolate, Array::New(kNumArguments)); | 434 const Array& args = Array::Handle(isolate, Array::New(kNumArguments)); |
435 args.SetAt(0, receive_port); | 435 args.SetAt(0, handler); |
436 args.SetAt(1, message); | 436 args.SetAt(1, message); |
437 if (isolate->debugger()->IsStepping()) { | 437 if (isolate->debugger()->IsStepping()) { |
438 // If the isolate is being debugged and the debugger was stepping | 438 // If the isolate is being debugged and the debugger was stepping |
439 // through code, enable single stepping so debugger will stop | 439 // through code, enable single stepping so debugger will stop |
440 // at the first location the user is interested in. | 440 // at the first location the user is interested in. |
441 isolate->debugger()->SetSingleStep(); | 441 isolate->debugger()->SetSingleStep(); |
442 } | 442 } |
443 const Object& result = Object::Handle(isolate, | 443 const Object& result = Object::Handle(isolate, |
444 DartEntry::InvokeFunction(function, args)); | 444 DartEntry::InvokeFunction(function, args)); |
445 ASSERT(result.IsNull() || result.IsError()); | 445 ASSERT(result.IsNull() || result.IsError()); |
446 return result.raw(); | 446 return result.raw(); |
447 } | 447 } |
448 | 448 |
449 | 449 |
450 RawObject* DartLibraryCalls::NewSendPort(Dart_Port port_id) { | |
451 Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | |
452 ASSERT(!isolate_lib.IsNull()); | |
453 const String& class_name = | |
454 String::Handle(isolate_lib.PrivateName(Symbols::_SendPortImpl())); | |
455 const int kNumArguments = 1; | |
456 const String& function_name = | |
457 String::Handle(isolate_lib.PrivateName(Symbols::_create())); | |
458 const Function& function = Function::Handle( | |
459 Resolver::ResolveStatic(isolate_lib, | |
460 class_name, | |
461 function_name, | |
462 kNumArguments, | |
463 Object::empty_array())); | |
464 ASSERT(!function.IsNull()); | |
465 const Array& args = Array::Handle(Array::New(kNumArguments)); | |
466 args.SetAt(0, Integer::Handle(Integer::New(port_id))); | |
467 return DartEntry::InvokeFunction(function, args); | |
468 } | |
469 | |
470 | |
471 RawObject* DartLibraryCalls::MapSetAt(const Instance& map, | 450 RawObject* DartLibraryCalls::MapSetAt(const Instance& map, |
472 const Instance& key, | 451 const Instance& key, |
473 const Instance& value) { | 452 const Instance& value) { |
474 const int kNumArguments = 3; | 453 const int kNumArguments = 3; |
475 ArgumentsDescriptor args_desc( | 454 ArgumentsDescriptor args_desc( |
476 Array::Handle(ArgumentsDescriptor::New(kNumArguments))); | 455 Array::Handle(ArgumentsDescriptor::New(kNumArguments))); |
477 const Function& function = Function::Handle( | 456 const Function& function = Function::Handle( |
478 Resolver::ResolveDynamic(map, | 457 Resolver::ResolveDynamic(map, |
479 Symbols::AssignIndexToken(), | 458 Symbols::AssignIndexToken(), |
480 args_desc)); | 459 args_desc)); |
481 ASSERT(!function.IsNull()); | 460 ASSERT(!function.IsNull()); |
482 const Array& args = Array::Handle(Array::New(kNumArguments)); | 461 const Array& args = Array::Handle(Array::New(kNumArguments)); |
483 args.SetAt(0, map); | 462 args.SetAt(0, map); |
484 args.SetAt(1, key); | 463 args.SetAt(1, key); |
485 args.SetAt(2, value); | 464 args.SetAt(2, value); |
486 const Object& result = Object::Handle(DartEntry::InvokeFunction(function, | 465 const Object& result = Object::Handle(DartEntry::InvokeFunction(function, |
487 args)); | 466 args)); |
488 return result.raw(); | 467 return result.raw(); |
489 } | 468 } |
490 | 469 |
491 | |
492 RawObject* DartLibraryCalls::PortGetId(const Instance& port) { | |
493 const Class& cls = Class::Handle(port.clazz()); | |
494 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | |
495 const String& func_name = | |
496 String::Handle(isolate_lib.PrivateName( | |
497 String::Handle(Field::GetterName(Symbols::_id())))); | |
498 const Function& func = Function::Handle(cls.LookupDynamicFunction(func_name)); | |
499 ASSERT(!func.IsNull()); | |
500 const Array& args = Array::Handle(Array::New(1)); | |
501 args.SetAt(0, port); | |
502 return DartEntry::InvokeFunction(func, args); | |
503 } | |
504 | |
505 | |
506 bool DartLibraryCalls::IsSendPort(const Instance& obj) { | |
507 // Get instance class. | |
508 const Class& cls = Class::Handle(obj.clazz()); | |
509 // Get send port class from isolate library. | |
510 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | |
511 const Class& send_port_cls = Class::Handle( | |
512 isolate_lib.LookupClassAllowPrivate(Symbols::_SendPortImpl())); | |
513 // Check for the same class id. | |
514 ASSERT(!send_port_cls.IsNull()); | |
515 return cls.id() == send_port_cls.id(); | |
516 } | |
517 | |
518 | |
519 bool DartLibraryCalls::IsReceivePort(const Instance& obj) { | |
520 // Get instance class. | |
521 const Class& cls = Class::Handle(obj.clazz()); | |
522 // Get send port class from isolate library. | |
523 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); | |
524 const Class& recv_port_cls = Class::Handle( | |
525 isolate_lib.LookupClassAllowPrivate(Symbols::_RawReceivePortImpl())); | |
526 // Check for the same class id. | |
527 ASSERT(!recv_port_cls.IsNull()); | |
528 return cls.id() == recv_port_cls.id(); | |
529 } | |
530 | |
531 } // namespace dart | 470 } // namespace dart |
OLD | NEW |