OLD | NEW |
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 "include/dart_native_api.h" | 5 #include "include/dart_native_api.h" |
6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
7 #include "vm/bootstrap_natives.h" | 7 #include "vm/bootstrap_natives.h" |
8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
9 #include "vm/dart.h" | 9 #include "vm/dart.h" |
10 #include "vm/dart_api_impl.h" | 10 #include "vm/dart_api_impl.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "vm/symbols.h" | 23 #include "vm/symbols.h" |
24 #include "vm/unicode.h" | 24 #include "vm/unicode.h" |
25 | 25 |
26 namespace dart { | 26 namespace dart { |
27 | 27 |
28 DEFINE_FLAG(bool, | 28 DEFINE_FLAG(bool, |
29 i_like_slow_isolate_spawn, | 29 i_like_slow_isolate_spawn, |
30 false, | 30 false, |
31 "Block the parent thread when loading spawned isolates."); | 31 "Block the parent thread when loading spawned isolates."); |
32 | 32 |
33 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 33 static uint8_t* malloc_allocator(uint8_t* ptr, |
| 34 intptr_t old_size, |
| 35 intptr_t new_size) { |
34 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); | 36 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); |
35 return reinterpret_cast<uint8_t*>(new_ptr); | 37 return reinterpret_cast<uint8_t*>(new_ptr); |
36 } | 38 } |
37 | 39 |
| 40 static void malloc_deallocator(uint8_t* ptr) { |
| 41 free(reinterpret_cast<void*>(ptr)); |
| 42 } |
| 43 |
38 | 44 |
39 DEFINE_NATIVE_ENTRY(CapabilityImpl_factory, 1) { | 45 DEFINE_NATIVE_ENTRY(CapabilityImpl_factory, 1) { |
40 ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull()); | 46 ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull()); |
41 uint64_t id = isolate->random()->NextUInt64(); | 47 uint64_t id = isolate->random()->NextUInt64(); |
42 return Capability::New(id); | 48 return Capability::New(id); |
43 } | 49 } |
44 | 50 |
45 | 51 |
46 DEFINE_NATIVE_ENTRY(CapabilityImpl_equals, 2) { | 52 DEFINE_NATIVE_ENTRY(CapabilityImpl_equals, 2) { |
47 GET_NON_NULL_NATIVE_ARGUMENT(Capability, recv, arguments->NativeArgAt(0)); | 53 GET_NON_NULL_NATIVE_ARGUMENT(Capability, recv, arguments->NativeArgAt(0)); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1)); | 115 GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1)); |
110 | 116 |
111 const Dart_Port destination_port_id = port.Id(); | 117 const Dart_Port destination_port_id = port.Id(); |
112 const bool can_send_any_object = isolate->origin_id() == port.origin_id(); | 118 const bool can_send_any_object = isolate->origin_id() == port.origin_id(); |
113 | 119 |
114 if (ApiObjectConverter::CanConvert(obj.raw())) { | 120 if (ApiObjectConverter::CanConvert(obj.raw())) { |
115 PortMap::PostMessage( | 121 PortMap::PostMessage( |
116 new Message(destination_port_id, obj.raw(), Message::kNormalPriority)); | 122 new Message(destination_port_id, obj.raw(), Message::kNormalPriority)); |
117 } else { | 123 } else { |
118 uint8_t* data = NULL; | 124 uint8_t* data = NULL; |
119 MessageWriter writer(&data, &allocator, can_send_any_object); | 125 MessageWriter writer(&data, &malloc_allocator, &malloc_deallocator, |
| 126 can_send_any_object); |
120 writer.WriteMessage(obj); | 127 writer.WriteMessage(obj); |
121 | 128 |
122 // TODO(turnidge): Throw an exception when the return value is false? | 129 // TODO(turnidge): Throw an exception when the return value is false? |
123 PortMap::PostMessage(new Message(destination_port_id, data, | 130 PortMap::PostMessage(new Message(destination_port_id, data, |
124 writer.BytesWritten(), | 131 writer.BytesWritten(), |
125 Message::kNormalPriority)); | 132 Message::kNormalPriority)); |
126 } | 133 } |
127 return Object::null(); | 134 return Object::null(); |
128 } | 135 } |
129 | 136 |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 | 424 |
418 | 425 |
419 DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 2) { | 426 DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 2) { |
420 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0)); | 427 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0)); |
421 GET_NON_NULL_NATIVE_ARGUMENT(Array, msg, arguments->NativeArgAt(1)); | 428 GET_NON_NULL_NATIVE_ARGUMENT(Array, msg, arguments->NativeArgAt(1)); |
422 | 429 |
423 // Make sure to route this request to the isolate library OOB mesage handler. | 430 // Make sure to route this request to the isolate library OOB mesage handler. |
424 msg.SetAt(0, Smi::Handle(Smi::New(Message::kIsolateLibOOBMsg))); | 431 msg.SetAt(0, Smi::Handle(Smi::New(Message::kIsolateLibOOBMsg))); |
425 | 432 |
426 uint8_t* data = NULL; | 433 uint8_t* data = NULL; |
427 MessageWriter writer(&data, &allocator, false); | 434 MessageWriter writer(&data, &malloc_allocator, &malloc_deallocator, false); |
428 writer.WriteMessage(msg); | 435 writer.WriteMessage(msg); |
429 | 436 |
430 PortMap::PostMessage(new Message(port.Id(), data, writer.BytesWritten(), | 437 PortMap::PostMessage(new Message(port.Id(), data, writer.BytesWritten(), |
431 Message::kOOBPriority)); | 438 Message::kOOBPriority)); |
432 return Object::null(); | 439 return Object::null(); |
433 } | 440 } |
434 | 441 |
435 } // namespace dart | 442 } // namespace dart |
OLD | NEW |