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

Side by Side Diff: runtime/lib/isolate.cc

Issue 2468093007: clang-format runtime/lib (Closed)
Patch Set: Created 4 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 unified diff | Download patch
« no previous file with comments | « runtime/lib/invocation_mirror.h ('k') | runtime/lib/libgen_in.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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"
11 #include "vm/dart_api_message.h" 11 #include "vm/dart_api_message.h"
12 #include "vm/dart_entry.h" 12 #include "vm/dart_entry.h"
13 #include "vm/exceptions.h" 13 #include "vm/exceptions.h"
14 #include "vm/lockers.h" 14 #include "vm/lockers.h"
15 #include "vm/longjump.h" 15 #include "vm/longjump.h"
16 #include "vm/message_handler.h" 16 #include "vm/message_handler.h"
17 #include "vm/object.h" 17 #include "vm/object.h"
18 #include "vm/object_store.h" 18 #include "vm/object_store.h"
19 #include "vm/port.h" 19 #include "vm/port.h"
20 #include "vm/resolver.h" 20 #include "vm/resolver.h"
21 #include "vm/service.h" 21 #include "vm/service.h"
22 #include "vm/snapshot.h" 22 #include "vm/snapshot.h"
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, i_like_slow_isolate_spawn, false, 28 DEFINE_FLAG(bool,
29 i_like_slow_isolate_spawn,
30 false,
29 "Block the parent thread when loading spawned isolates."); 31 "Block the parent thread when loading spawned isolates.");
30 32
31 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { 33 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
32 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size); 34 void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
33 return reinterpret_cast<uint8_t*>(new_ptr); 35 return reinterpret_cast<uint8_t*>(new_ptr);
34 } 36 }
35 37
36 38
37 DEFINE_NATIVE_ENTRY(CapabilityImpl_factory, 1) { 39 DEFINE_NATIVE_ENTRY(CapabilityImpl_factory, 1) {
38 ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull()); 40 ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
(...skipping 14 matching lines...) Expand all
53 int64_t id = cap.Id(); 55 int64_t id = cap.Id();
54 int32_t hi = static_cast<int32_t>(id >> 32); 56 int32_t hi = static_cast<int32_t>(id >> 32);
55 int32_t lo = static_cast<int32_t>(id); 57 int32_t lo = static_cast<int32_t>(id);
56 int32_t hash = (hi ^ lo) & kSmiMax; 58 int32_t hash = (hi ^ lo) & kSmiMax;
57 return Smi::New(hash); 59 return Smi::New(hash);
58 } 60 }
59 61
60 62
61 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 1) { 63 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 1) {
62 ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull()); 64 ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
63 Dart_Port port_id = 65 Dart_Port port_id = PortMap::CreatePort(isolate->message_handler());
64 PortMap::CreatePort(isolate->message_handler());
65 return ReceivePort::New(port_id, false /* not control port */); 66 return ReceivePort::New(port_id, false /* not control port */);
66 } 67 }
67 68
68 69
69 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 1) { 70 DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 1) {
70 GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0)); 71 GET_NON_NULL_NATIVE_ARGUMENT(ReceivePort, port, arguments->NativeArgAt(0));
71 return Integer::NewFromUint64(port.Id()); 72 return Integer::NewFromUint64(port.Id());
72 } 73 }
73 74
74 75
(...skipping 29 matching lines...) Expand all
104 105
105 DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 2) { 106 DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 2) {
106 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0)); 107 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
107 // TODO(iposva): Allow for arbitrary messages to be sent. 108 // TODO(iposva): Allow for arbitrary messages to be sent.
108 GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1)); 109 GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
109 110
110 const Dart_Port destination_port_id = port.Id(); 111 const Dart_Port destination_port_id = port.Id();
111 const bool can_send_any_object = isolate->origin_id() == port.origin_id(); 112 const bool can_send_any_object = isolate->origin_id() == port.origin_id();
112 113
113 if (ApiObjectConverter::CanConvert(obj.raw())) { 114 if (ApiObjectConverter::CanConvert(obj.raw())) {
114 PortMap::PostMessage(new Message( 115 PortMap::PostMessage(
115 destination_port_id, obj.raw(), Message::kNormalPriority)); 116 new Message(destination_port_id, obj.raw(), Message::kNormalPriority));
116 } else { 117 } else {
117 uint8_t* data = NULL; 118 uint8_t* data = NULL;
118 MessageWriter writer(&data, &allocator, can_send_any_object); 119 MessageWriter writer(&data, &allocator, can_send_any_object);
119 writer.WriteMessage(obj); 120 writer.WriteMessage(obj);
120 121
121 // TODO(turnidge): Throw an exception when the return value is false? 122 // TODO(turnidge): Throw an exception when the return value is false?
122 PortMap::PostMessage(new Message(destination_port_id, 123 PortMap::PostMessage(new Message(destination_port_id, data,
123 data, writer.BytesWritten(), 124 writer.BytesWritten(),
124 Message::kNormalPriority)); 125 Message::kNormalPriority));
125 } 126 }
126 return Object::null(); 127 return Object::null();
127 } 128 }
128 129
129 130
130 static void ThrowIsolateSpawnException(const String& message) { 131 static void ThrowIsolateSpawnException(const String& message) {
131 const Array& args = Array::Handle(Array::New(1)); 132 const Array& args = Array::Handle(Array::New(1));
132 args.SetAt(0, message); 133 args.SetAt(0, message);
133 Exceptions::ThrowByType(Exceptions::kIsolateSpawn, args); 134 Exceptions::ThrowByType(Exceptions::kIsolateSpawn, args);
(...skipping 13 matching lines...) Expand all
147 ReportError( 148 ReportError(
148 "Isolate spawn is not supported by this Dart implementation\n"); 149 "Isolate spawn is not supported by this Dart implementation\n");
149 delete state_; 150 delete state_;
150 state_ = NULL; 151 state_ = NULL;
151 return; 152 return;
152 } 153 }
153 154
154 // Make a copy of the state's isolate flags and hand it to the callback. 155 // Make a copy of the state's isolate flags and hand it to the callback.
155 Dart_IsolateFlags api_flags = *(state_->isolate_flags()); 156 Dart_IsolateFlags api_flags = *(state_->isolate_flags());
156 157
157 Isolate* isolate = reinterpret_cast<Isolate*>( 158 Isolate* isolate = reinterpret_cast<Isolate*>((callback)(
158 (callback)(state_->script_url(), 159 state_->script_url(), state_->function_name(), state_->package_root(),
159 state_->function_name(), 160 state_->package_config(), &api_flags, state_->init_data(), &error));
160 state_->package_root(),
161 state_->package_config(),
162 &api_flags,
163 state_->init_data(),
164 &error));
165 state_->DecrementSpawnCount(); 161 state_->DecrementSpawnCount();
166 if (isolate == NULL) { 162 if (isolate == NULL) {
167 ReportError(error); 163 ReportError(error);
168 delete state_; 164 delete state_;
169 state_ = NULL; 165 state_ = NULL;
170 free(error); 166 free(error);
171 return; 167 return;
172 } 168 }
173 169
174 if (state_->origin_id() != ILLEGAL_PORT) { 170 if (state_->origin_id() != ILLEGAL_PORT) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 234
239 const char* utf8_package_root = 235 const char* utf8_package_root =
240 packageRoot.IsNull() ? NULL : String2UTF8(packageRoot); 236 packageRoot.IsNull() ? NULL : String2UTF8(packageRoot);
241 const char* utf8_package_config = 237 const char* utf8_package_config =
242 packageConfig.IsNull() ? NULL : String2UTF8(packageConfig); 238 packageConfig.IsNull() ? NULL : String2UTF8(packageConfig);
243 239
244 bool fatal_errors = fatalErrors.IsNull() ? true : fatalErrors.value(); 240 bool fatal_errors = fatalErrors.IsNull() ? true : fatalErrors.value();
245 Dart_Port on_exit_port = onExit.IsNull() ? ILLEGAL_PORT : onExit.Id(); 241 Dart_Port on_exit_port = onExit.IsNull() ? ILLEGAL_PORT : onExit.Id();
246 Dart_Port on_error_port = onError.IsNull() ? ILLEGAL_PORT : onError.Id(); 242 Dart_Port on_error_port = onError.IsNull() ? ILLEGAL_PORT : onError.Id();
247 243
248 IsolateSpawnState* state = 244 IsolateSpawnState* state = new IsolateSpawnState(
249 new IsolateSpawnState(port.Id(), 245 port.Id(), isolate->origin_id(), isolate->init_callback_data(),
250 isolate->origin_id(), 246 String2UTF8(script_uri), func, message,
251 isolate->init_callback_data(), 247 isolate->spawn_count_monitor(), isolate->spawn_count(),
252 String2UTF8(script_uri), 248 utf8_package_root, utf8_package_config, paused.value(), fatal_errors,
253 func, 249 on_exit_port, on_error_port);
254 message,
255 isolate->spawn_count_monitor(),
256 isolate->spawn_count(),
257 utf8_package_root,
258 utf8_package_config,
259 paused.value(),
260 fatal_errors,
261 on_exit_port,
262 on_error_port);
263 ThreadPool::Task* spawn_task = new SpawnIsolateTask(state); 250 ThreadPool::Task* spawn_task = new SpawnIsolateTask(state);
264 251
265 isolate->IncrementSpawnCount(); 252 isolate->IncrementSpawnCount();
266 if (FLAG_i_like_slow_isolate_spawn) { 253 if (FLAG_i_like_slow_isolate_spawn) {
267 // We block the parent isolate while the child isolate loads. 254 // We block the parent isolate while the child isolate loads.
268 Isolate* saved = Isolate::Current(); 255 Isolate* saved = Isolate::Current();
269 Thread::ExitIsolate(); 256 Thread::ExitIsolate();
270 spawn_task->Run(); 257 spawn_task->Run();
271 delete spawn_task; 258 delete spawn_task;
272 spawn_task = NULL; 259 spawn_task = NULL;
(...skipping 20 matching lines...) Expand all
293 const Library& library, 280 const Library& library,
294 const String& uri, 281 const String& uri,
295 char** error) { 282 char** error) {
296 const char* result = NULL; 283 const char* result = NULL;
297 Zone* zone = thread->zone(); 284 Zone* zone = thread->zone();
298 Isolate* isolate = thread->isolate(); 285 Isolate* isolate = thread->isolate();
299 Dart_LibraryTagHandler handler = isolate->library_tag_handler(); 286 Dart_LibraryTagHandler handler = isolate->library_tag_handler();
300 if (handler != NULL) { 287 if (handler != NULL) {
301 TransitionVMToNative transition(thread); 288 TransitionVMToNative transition(thread);
302 Dart_EnterScope(); 289 Dart_EnterScope();
303 Dart_Handle handle = handler(Dart_kCanonicalizeUrl, 290 Dart_Handle handle =
304 Api::NewHandle(thread, library.raw()), 291 handler(Dart_kCanonicalizeUrl, Api::NewHandle(thread, library.raw()),
305 Api::NewHandle(thread, uri.raw())); 292 Api::NewHandle(thread, uri.raw()));
306 const Object& obj = Object::Handle(Api::UnwrapHandle(handle)); 293 const Object& obj = Object::Handle(Api::UnwrapHandle(handle));
307 if (obj.IsString()) { 294 if (obj.IsString()) {
308 result = String2UTF8(String::Cast(obj)); 295 result = String2UTF8(String::Cast(obj));
309 } else if (obj.IsError()) { 296 } else if (obj.IsError()) {
310 Error& error_obj = Error::Handle(); 297 Error& error_obj = Error::Handle();
311 error_obj ^= obj.raw(); 298 error_obj ^= obj.raw();
312 *error = zone->PrintToString("Unable to canonicalize uri '%s': %s", 299 *error = zone->PrintToString("Unable to canonicalize uri '%s': %s",
313 uri.ToCString(), error_obj.ToErrorCString()); 300 uri.ToCString(), error_obj.ToErrorCString());
314 } else { 301 } else {
315 *error = zone->PrintToString("Unable to canonicalize uri '%s': " 302 *error = zone->PrintToString(
316 "library tag handler returned wrong type", 303 "Unable to canonicalize uri '%s': "
317 uri.ToCString()); 304 "library tag handler returned wrong type",
305 uri.ToCString());
318 } 306 }
319 Dart_ExitScope(); 307 Dart_ExitScope();
320 } else { 308 } else {
321 *error = zone->PrintToString( 309 *error = zone->PrintToString(
322 "Unable to canonicalize uri '%s': no library tag handler found.", 310 "Unable to canonicalize uri '%s': no library tag handler found.",
323 uri.ToCString()); 311 uri.ToCString());
324 } 312 }
325 return result; 313 return result;
326 } 314 }
327 315
(...skipping 13 matching lines...) Expand all
341 GET_NATIVE_ARGUMENT(Bool, checked, arguments->NativeArgAt(8)); 329 GET_NATIVE_ARGUMENT(Bool, checked, arguments->NativeArgAt(8));
342 330
343 GET_NATIVE_ARGUMENT(Array, environment, arguments->NativeArgAt(9)); 331 GET_NATIVE_ARGUMENT(Array, environment, arguments->NativeArgAt(9));
344 332
345 GET_NATIVE_ARGUMENT(String, packageRoot, arguments->NativeArgAt(10)); 333 GET_NATIVE_ARGUMENT(String, packageRoot, arguments->NativeArgAt(10));
346 GET_NATIVE_ARGUMENT(String, packageConfig, arguments->NativeArgAt(11)); 334 GET_NATIVE_ARGUMENT(String, packageConfig, arguments->NativeArgAt(11));
347 335
348 if (Snapshot::IncludesCode(Dart::snapshot_kind())) { 336 if (Snapshot::IncludesCode(Dart::snapshot_kind())) {
349 const Array& args = Array::Handle(Array::New(1)); 337 const Array& args = Array::Handle(Array::New(1));
350 args.SetAt(0, String::Handle(String::New( 338 args.SetAt(0, String::Handle(String::New(
351 "Isolate.spawnUri not supported under precompilation"))); 339 "Isolate.spawnUri not supported under precompilation")));
352 Exceptions::ThrowByType(Exceptions::kUnsupported, args); 340 Exceptions::ThrowByType(Exceptions::kUnsupported, args);
353 UNREACHABLE(); 341 UNREACHABLE();
354 } 342 }
355 343
356 // Canonicalize the uri with respect to the current isolate. 344 // Canonicalize the uri with respect to the current isolate.
357 const Library& root_lib = 345 const Library& root_lib =
358 Library::Handle(isolate->object_store()->root_library()); 346 Library::Handle(isolate->object_store()->root_library());
359 char* error = NULL; 347 char* error = NULL;
360 const char* canonical_uri = CanonicalizeUri(thread, root_lib, uri, &error); 348 const char* canonical_uri = CanonicalizeUri(thread, root_lib, uri, &error);
361 if (canonical_uri == NULL) { 349 if (canonical_uri == NULL) {
362 const String& msg = String::Handle(String::New(error)); 350 const String& msg = String::Handle(String::New(error));
363 ThrowIsolateSpawnException(msg); 351 ThrowIsolateSpawnException(msg);
364 } 352 }
365 353
366 const char* utf8_package_root = 354 const char* utf8_package_root =
367 packageRoot.IsNull() ? NULL : String2UTF8(packageRoot); 355 packageRoot.IsNull() ? NULL : String2UTF8(packageRoot);
368 const char* utf8_package_config = 356 const char* utf8_package_config =
369 packageConfig.IsNull() ? NULL : String2UTF8(packageConfig); 357 packageConfig.IsNull() ? NULL : String2UTF8(packageConfig);
370 358
371 bool fatal_errors = fatalErrors.IsNull() ? true : fatalErrors.value(); 359 bool fatal_errors = fatalErrors.IsNull() ? true : fatalErrors.value();
372 Dart_Port on_exit_port = onExit.IsNull() ? ILLEGAL_PORT : onExit.Id(); 360 Dart_Port on_exit_port = onExit.IsNull() ? ILLEGAL_PORT : onExit.Id();
373 Dart_Port on_error_port = onError.IsNull() ? ILLEGAL_PORT : onError.Id(); 361 Dart_Port on_error_port = onError.IsNull() ? ILLEGAL_PORT : onError.Id();
374 362
375 IsolateSpawnState* state = 363 IsolateSpawnState* state = new IsolateSpawnState(
376 new IsolateSpawnState( 364 port.Id(), isolate->init_callback_data(), canonical_uri,
377 port.Id(), 365 utf8_package_root, utf8_package_config, args, message,
378 isolate->init_callback_data(), 366 isolate->spawn_count_monitor(), isolate->spawn_count(), paused.value(),
379 canonical_uri, 367 fatal_errors, on_exit_port, on_error_port);
380 utf8_package_root,
381 utf8_package_config,
382 args,
383 message,
384 isolate->spawn_count_monitor(),
385 isolate->spawn_count(),
386 paused.value(),
387 fatal_errors,
388 on_exit_port,
389 on_error_port);
390 368
391 // If we were passed a value then override the default flags state for 369 // If we were passed a value then override the default flags state for
392 // checked mode. 370 // checked mode.
393 if (!checked.IsNull()) { 371 if (!checked.IsNull()) {
394 bool val = checked.value(); 372 bool val = checked.value();
395 Dart_IsolateFlags* flags = state->isolate_flags(); 373 Dart_IsolateFlags* flags = state->isolate_flags();
396 flags->enable_asserts = val; 374 flags->enable_asserts = val;
397 flags->enable_type_checks = val; 375 flags->enable_type_checks = val;
398 } 376 }
399 377
(...skipping 16 matching lines...) Expand all
416 delete spawn_task; 394 delete spawn_task;
417 spawn_task = NULL; 395 spawn_task = NULL;
418 } 396 }
419 return Object::null(); 397 return Object::null();
420 } 398 }
421 399
422 400
423 DEFINE_NATIVE_ENTRY(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0) { 401 DEFINE_NATIVE_ENTRY(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0) {
424 const Array& result = Array::Handle(Array::New(3)); 402 const Array& result = Array::Handle(Array::New(3));
425 result.SetAt(0, SendPort::Handle(SendPort::New(isolate->main_port()))); 403 result.SetAt(0, SendPort::Handle(SendPort::New(isolate->main_port())));
426 result.SetAt(1, Capability::Handle( 404 result.SetAt(
427 Capability::New(isolate->pause_capability()))); 405 1, Capability::Handle(Capability::New(isolate->pause_capability())));
428 result.SetAt(2, Capability::Handle( 406 result.SetAt(
429 Capability::New(isolate->terminate_capability()))); 407 2, Capability::Handle(Capability::New(isolate->terminate_capability())));
430 return result.raw(); 408 return result.raw();
431 } 409 }
432 410
433 411
434 DEFINE_NATIVE_ENTRY(Isolate_getCurrentRootUriStr, 0) { 412 DEFINE_NATIVE_ENTRY(Isolate_getCurrentRootUriStr, 0) {
435 const Library& root_lib = Library::Handle(zone, 413 const Library& root_lib =
436 isolate->object_store()->root_library()); 414 Library::Handle(zone, isolate->object_store()->root_library());
437 return root_lib.url(); 415 return root_lib.url();
438 } 416 }
439 417
440 418
441 DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 2) { 419 DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 2) {
442 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0)); 420 GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
443 GET_NON_NULL_NATIVE_ARGUMENT(Array, msg, arguments->NativeArgAt(1)); 421 GET_NON_NULL_NATIVE_ARGUMENT(Array, msg, arguments->NativeArgAt(1));
444 422
445 // Make sure to route this request to the isolate library OOB mesage handler. 423 // Make sure to route this request to the isolate library OOB mesage handler.
446 msg.SetAt(0, Smi::Handle(Smi::New(Message::kIsolateLibOOBMsg))); 424 msg.SetAt(0, Smi::Handle(Smi::New(Message::kIsolateLibOOBMsg)));
447 425
448 uint8_t* data = NULL; 426 uint8_t* data = NULL;
449 MessageWriter writer(&data, &allocator, false); 427 MessageWriter writer(&data, &allocator, false);
450 writer.WriteMessage(msg); 428 writer.WriteMessage(msg);
451 429
452 PortMap::PostMessage(new Message(port.Id(), 430 PortMap::PostMessage(new Message(port.Id(), data, writer.BytesWritten(),
453 data, writer.BytesWritten(),
454 Message::kOOBPriority)); 431 Message::kOOBPriority));
455 return Object::null(); 432 return Object::null();
456 } 433 }
457 434
458 } // namespace dart 435 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/lib/invocation_mirror.h ('k') | runtime/lib/libgen_in.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698