| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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/kernel_isolate.h" | 5 #include "vm/kernel_isolate.h" |
| 6 | 6 |
| 7 #include "bin/dartutils.h" | 7 #include "bin/dartutils.h" |
| 8 #include "include/dart_native_api.h" | 8 #include "include/dart_native_api.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart_api_impl.h" | 10 #include "vm/dart_api_impl.h" |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 | 292 |
| 293 ~KernelCompilationRequest() { | 293 ~KernelCompilationRequest() { |
| 294 UnregisterRequest(this); | 294 UnregisterRequest(this); |
| 295 Dart_CloseNativePort(port_); | 295 Dart_CloseNativePort(port_); |
| 296 delete monitor_; | 296 delete monitor_; |
| 297 } | 297 } |
| 298 | 298 |
| 299 Dart_KernelCompilationResult SendAndWaitForResponse( | 299 Dart_KernelCompilationResult SendAndWaitForResponse( |
| 300 Dart_Port kernel_port, | 300 Dart_Port kernel_port, |
| 301 const char* script_uri, | 301 const char* script_uri, |
| 302 const char* platform_kernel, |
| 302 int source_files_count, | 303 int source_files_count, |
| 303 Dart_SourceFile source_files[], | 304 Dart_SourceFile source_files[], |
| 304 bool incremental_compile) { | 305 bool incremental_compile) { |
| 305 // Build the [null, send_port, script_uri, incremental_compile, isolate_id, | 306 // Build the [null, send_port, script_uri, platform_kernel, |
| 306 // [files]] message for the Kernel isolate: null tag tells it that request | 307 // incremental_compile, isolate_id, [files]] message for the Kernel isolate. |
| 307 // came from this code, instead of Loader so that it can given a more | 308 // null tag tells it that request came from this code, instead of Loader |
| 308 // informative response. | 309 // so that it can given a more informative response. |
| 309 Dart_CObject tag; | 310 Dart_CObject tag; |
| 310 tag.type = Dart_CObject_kNull; | 311 tag.type = Dart_CObject_kNull; |
| 311 | 312 |
| 312 Dart_CObject send_port; | 313 Dart_CObject send_port; |
| 313 send_port.type = Dart_CObject_kSendPort; | 314 send_port.type = Dart_CObject_kSendPort; |
| 314 send_port.value.as_send_port.id = port_; | 315 send_port.value.as_send_port.id = port_; |
| 315 send_port.value.as_send_port.origin_id = ILLEGAL_PORT; | 316 send_port.value.as_send_port.origin_id = ILLEGAL_PORT; |
| 316 | 317 |
| 317 Dart_CObject uri; | 318 Dart_CObject uri; |
| 318 uri.type = Dart_CObject_kString; | 319 uri.type = Dart_CObject_kString; |
| 319 uri.value.as_string = const_cast<char*>(script_uri); | 320 uri.value.as_string = const_cast<char*>(script_uri); |
| 320 | 321 |
| 322 Dart_CObject dart_platform_kernel; |
| 323 if (platform_kernel != NULL) { |
| 324 dart_platform_kernel.type = Dart_CObject_kString; |
| 325 dart_platform_kernel.value.as_string = const_cast<char*>(platform_kernel); |
| 326 } else { |
| 327 dart_platform_kernel.type = Dart_CObject_kNull; |
| 328 } |
| 329 |
| 321 Dart_CObject dart_incremental; | 330 Dart_CObject dart_incremental; |
| 322 dart_incremental.type = Dart_CObject_kBool; | 331 dart_incremental.type = Dart_CObject_kBool; |
| 323 dart_incremental.value.as_bool = incremental_compile; | 332 dart_incremental.value.as_bool = incremental_compile; |
| 324 | 333 |
| 325 // TODO(aam): Assert that isolate exists once we move CompileAndReadScript | 334 // TODO(aam): Assert that isolate exists once we move CompileAndReadScript |
| 326 // compilation logic out of CreateIsolateAndSetupHelper and into | 335 // compilation logic out of CreateIsolateAndSetupHelper and into |
| 327 // IsolateSetupHelper in main.cc. | 336 // IsolateSetupHelper in main.cc. |
| 328 Isolate* isolate = | 337 Isolate* isolate = |
| 329 Thread::Current() != NULL ? Thread::Current()->isolate() : NULL; | 338 Thread::Current() != NULL ? Thread::Current()->isolate() : NULL; |
| 330 if (incremental_compile) { | 339 if (incremental_compile) { |
| 331 ASSERT(isolate != NULL); | 340 ASSERT(isolate != NULL); |
| 332 } | 341 } |
| 333 Dart_CObject isolate_id; | 342 Dart_CObject isolate_id; |
| 334 isolate_id.type = Dart_CObject_kInt64; | 343 isolate_id.type = Dart_CObject_kInt64; |
| 335 isolate_id.value.as_int64 = | 344 isolate_id.value.as_int64 = |
| 336 isolate != NULL ? static_cast<int64_t>(isolate->main_port()) : 0; | 345 isolate != NULL ? static_cast<int64_t>(isolate->main_port()) : 0; |
| 337 | 346 |
| 338 Dart_CObject message; | 347 Dart_CObject message; |
| 339 message.type = Dart_CObject_kArray; | 348 message.type = Dart_CObject_kArray; |
| 340 | 349 |
| 341 intptr_t message_len = 5; | 350 intptr_t message_len = 6; |
| 342 Dart_CObject files; | 351 Dart_CObject files; |
| 343 if (source_files_count != 0) { | 352 if (source_files_count != 0) { |
| 344 files = BuildFilesPairs(source_files_count, source_files); | 353 files = BuildFilesPairs(source_files_count, source_files); |
| 345 message_len++; | 354 message_len++; |
| 346 } | 355 } |
| 347 Dart_CObject* message_arr[] = { | 356 Dart_CObject* message_arr[] = { |
| 348 &tag, &send_port, &uri, &dart_incremental, &isolate_id, &files}; | 357 &tag, &send_port, &uri, &dart_platform_kernel, &dart_incremental, |
| 358 &isolate_id, &files}; |
| 349 message.value.as_array.values = message_arr; | 359 message.value.as_array.values = message_arr; |
| 350 message.value.as_array.length = message_len; | 360 message.value.as_array.length = message_len; |
| 351 // Send the message. | 361 // Send the message. |
| 352 Dart_PostCObject(kernel_port, &message); | 362 Dart_PostCObject(kernel_port, &message); |
| 353 | 363 |
| 354 // Wait for reply to arrive. | 364 // Wait for reply to arrive. |
| 355 MonitorLocker ml(monitor_); | 365 MonitorLocker ml(monitor_); |
| 356 while (result_.status == Dart_KernelCompilationStatus_Unknown) { | 366 while (result_.status == Dart_KernelCompilationStatus_Unknown) { |
| 357 ml.Wait(); | 367 ml.Wait(); |
| 358 } | 368 } |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 KernelCompilationRequest* prev_; | 462 KernelCompilationRequest* prev_; |
| 453 | 463 |
| 454 Dart_KernelCompilationResult result_; | 464 Dart_KernelCompilationResult result_; |
| 455 }; | 465 }; |
| 456 | 466 |
| 457 Monitor* KernelCompilationRequest::requests_monitor_ = new Monitor(); | 467 Monitor* KernelCompilationRequest::requests_monitor_ = new Monitor(); |
| 458 KernelCompilationRequest* KernelCompilationRequest::requests_ = NULL; | 468 KernelCompilationRequest* KernelCompilationRequest::requests_ = NULL; |
| 459 | 469 |
| 460 Dart_KernelCompilationResult KernelIsolate::CompileToKernel( | 470 Dart_KernelCompilationResult KernelIsolate::CompileToKernel( |
| 461 const char* script_uri, | 471 const char* script_uri, |
| 472 const char* platform_kernel, |
| 462 int source_file_count, | 473 int source_file_count, |
| 463 Dart_SourceFile source_files[], | 474 Dart_SourceFile source_files[], |
| 464 bool incremental_compile) { | 475 bool incremental_compile) { |
| 465 // This must be the main script to be loaded. Wait for Kernel isolate | 476 // This must be the main script to be loaded. Wait for Kernel isolate |
| 466 // to finish initialization. | 477 // to finish initialization. |
| 467 Dart_Port kernel_port = WaitForKernelPort(); | 478 Dart_Port kernel_port = WaitForKernelPort(); |
| 468 if (kernel_port == ILLEGAL_PORT) { | 479 if (kernel_port == ILLEGAL_PORT) { |
| 469 Dart_KernelCompilationResult result; | 480 Dart_KernelCompilationResult result; |
| 470 result.status = Dart_KernelCompilationStatus_Unknown; | 481 result.status = Dart_KernelCompilationStatus_Unknown; |
| 471 result.error = strdup("Error while initializing Kernel isolate"); | 482 result.error = strdup("Error while initializing Kernel isolate"); |
| 472 return result; | 483 return result; |
| 473 } | 484 } |
| 474 | 485 |
| 475 KernelCompilationRequest request; | 486 KernelCompilationRequest request; |
| 476 return request.SendAndWaitForResponse(kernel_port, script_uri, | 487 return request.SendAndWaitForResponse(kernel_port, script_uri, |
| 477 source_file_count, source_files, | 488 platform_kernel, source_file_count, |
| 478 incremental_compile); | 489 source_files, incremental_compile); |
| 479 } | 490 } |
| 480 | 491 |
| 481 #endif // DART_PRECOMPILED_RUNTIME | 492 #endif // DART_PRECOMPILED_RUNTIME |
| 482 | 493 |
| 483 } // namespace dart | 494 } // namespace dart |
| OLD | NEW |