| 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 |