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

Side by Side Diff: runtime/vm/dart_api_impl.cc

Issue 2525623002: VM: [Kernel] Split kernel API into 3 steps: ([read binary], parse-binary, bootstrap, load program) (Closed)
Patch Set: addressed comments Created 4 years 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/vm/dart.cc ('k') | runtime/vm/kernel_reader.h » ('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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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_api.h" 5 #include "include/dart_api.h"
6 #include "include/dart_mirrors_api.h" 6 #include "include/dart_mirrors_api.h"
7 #include "include/dart_native_api.h" 7 #include "include/dart_native_api.h"
8 8
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "lib/stacktrace.h" 10 #include "lib/stacktrace.h"
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after
1233 chars = reinterpret_cast<char*>(malloc(len)); 1233 chars = reinterpret_cast<char*>(malloc(len));
1234 OS::SNPrint(chars, len, "%s$%s", script_uri, main); 1234 OS::SNPrint(chars, len, "%s$%s", script_uri, main);
1235 return chars; 1235 return chars;
1236 } 1236 }
1237 1237
1238 1238
1239 static Dart_Isolate CreateIsolate(const char* script_uri, 1239 static Dart_Isolate CreateIsolate(const char* script_uri,
1240 const char* main, 1240 const char* main,
1241 const uint8_t* snapshot_buffer, 1241 const uint8_t* snapshot_buffer,
1242 intptr_t snapshot_length, 1242 intptr_t snapshot_length,
1243 bool from_kernel, 1243 kernel::Program* kernel_program,
1244 Dart_IsolateFlags* flags, 1244 Dart_IsolateFlags* flags,
1245 void* callback_data, 1245 void* callback_data,
1246 char** error) { 1246 char** error) {
1247 ASSERT(!from_kernel || (snapshot_buffer != NULL));
1248 CHECK_NO_ISOLATE(Isolate::Current()); 1247 CHECK_NO_ISOLATE(Isolate::Current());
1249 char* isolate_name = BuildIsolateName(script_uri, main); 1248 char* isolate_name = BuildIsolateName(script_uri, main);
1250 1249
1251 // Setup default flags in case none were passed. 1250 // Setup default flags in case none were passed.
1252 Dart_IsolateFlags api_flags; 1251 Dart_IsolateFlags api_flags;
1253 if (flags == NULL) { 1252 if (flags == NULL) {
1254 Isolate::FlagsInitialize(&api_flags); 1253 Isolate::FlagsInitialize(&api_flags);
1255 flags = &api_flags; 1254 flags = &api_flags;
1256 } 1255 }
1257 Isolate* I = Dart::CreateIsolate(isolate_name, *flags); 1256 Isolate* I = Dart::CreateIsolate(isolate_name, *flags);
1258 free(isolate_name); 1257 free(isolate_name);
1259 if (I == NULL) { 1258 if (I == NULL) {
1260 *error = strdup("Isolate creation failed"); 1259 *error = strdup("Isolate creation failed");
1261 return reinterpret_cast<Dart_Isolate>(NULL); 1260 return reinterpret_cast<Dart_Isolate>(NULL);
1262 } 1261 }
1263 { 1262 {
1264 Thread* T = Thread::Current(); 1263 Thread* T = Thread::Current();
1265 StackZone zone(T); 1264 StackZone zone(T);
1266 HANDLESCOPE(T); 1265 HANDLESCOPE(T);
1267 // We enter an API scope here as InitializeIsolate could compile some 1266 // We enter an API scope here as InitializeIsolate could compile some
1268 // bootstrap library files which call out to a tag handler that may create 1267 // bootstrap library files which call out to a tag handler that may create
1269 // Api Handles when an error is encountered. 1268 // Api Handles when an error is encountered.
1270 Dart_EnterScope(); 1269 Dart_EnterScope();
1271 const Error& error_obj = Error::Handle( 1270 const Error& error_obj = Error::Handle(
1272 Z, Dart::InitializeIsolate(snapshot_buffer, snapshot_length, 1271 Z, Dart::InitializeIsolate(snapshot_buffer, snapshot_length,
1273 from_kernel, callback_data)); 1272 kernel_program, callback_data));
1274 if (error_obj.IsNull()) { 1273 if (error_obj.IsNull()) {
1275 #if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT) 1274 #if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT)
1276 if (FLAG_check_function_fingerprints && !from_kernel) { 1275 if (FLAG_check_function_fingerprints && kernel_program == NULL) {
1277 Library::CheckFunctionFingerprints(); 1276 Library::CheckFunctionFingerprints();
1278 } 1277 }
1279 #endif // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT). 1278 #endif // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT).
1280 // We exit the API scope entered above. 1279 // We exit the API scope entered above.
1281 Dart_ExitScope(); 1280 Dart_ExitScope();
1282 // A Thread structure has been associated to the thread, we do the 1281 // A Thread structure has been associated to the thread, we do the
1283 // safepoint transition explicity here instead of using the 1282 // safepoint transition explicity here instead of using the
1284 // TransitionXXX scope objects as the reverse transition happens 1283 // TransitionXXX scope objects as the reverse transition happens
1285 // outside this scope in Dart_ShutdownIsolate/Dart_ExitIsolate. 1284 // outside this scope in Dart_ShutdownIsolate/Dart_ExitIsolate.
1286 T->set_execution_state(Thread::kThreadInNative); 1285 T->set_execution_state(Thread::kThreadInNative);
1287 T->EnterSafepoint(); 1286 T->EnterSafepoint();
1288 return Api::CastIsolate(I); 1287 return Api::CastIsolate(I);
1289 } 1288 }
1290 *error = strdup(error_obj.ToErrorCString()); 1289 *error = strdup(error_obj.ToErrorCString());
1291 // We exit the API scope entered above. 1290 // We exit the API scope entered above.
1292 Dart_ExitScope(); 1291 Dart_ExitScope();
1293 } 1292 }
1294 Dart::ShutdownIsolate(); 1293 Dart::ShutdownIsolate();
1295 return reinterpret_cast<Dart_Isolate>(NULL); 1294 return reinterpret_cast<Dart_Isolate>(NULL);
1296 } 1295 }
1297 1296
1298 1297
1299 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* script_uri, 1298 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* script_uri,
1300 const char* main, 1299 const char* main,
1301 const uint8_t* snapshot_buffer, 1300 const uint8_t* snapshot_buffer,
1302 Dart_IsolateFlags* flags, 1301 Dart_IsolateFlags* flags,
1303 void* callback_data, 1302 void* callback_data,
1304 char** error) { 1303 char** error) {
1305 return CreateIsolate(script_uri, main, snapshot_buffer, -1, false, flags, 1304 return CreateIsolate(script_uri, main, snapshot_buffer, -1, NULL, flags,
1306 callback_data, error); 1305 callback_data, error);
1307 } 1306 }
1308 1307
1309 1308
1310 DART_EXPORT Dart_Isolate 1309 DART_EXPORT Dart_Isolate Dart_CreateIsolateFromKernel(const char* script_uri,
1311 Dart_CreateIsolateFromKernel(const char* script_uri, 1310 const char* main,
1312 const char* main, 1311 void* kernel_program,
1313 const uint8_t* kernel_file, 1312 Dart_IsolateFlags* flags,
1314 intptr_t kernel_length, 1313 void* callback_data,
1315 Dart_IsolateFlags* flags, 1314 char** error) {
1316 void* callback_data, 1315 return CreateIsolate(script_uri, main, NULL, -1,
1317 char** error) { 1316 reinterpret_cast<kernel::Program*>(kernel_program),
1318 return CreateIsolate(script_uri, main, kernel_file, kernel_length, true,
1319 flags, callback_data, error); 1317 flags, callback_data, error);
1320 } 1318 }
1321 1319
1322 1320
1323 DART_EXPORT void Dart_ShutdownIsolate() { 1321 DART_EXPORT void Dart_ShutdownIsolate() {
1324 Thread* T = Thread::Current(); 1322 Thread* T = Thread::Current();
1325 Isolate* I = T->isolate(); 1323 Isolate* I = T->isolate();
1326 CHECK_ISOLATE(I); 1324 CHECK_ISOLATE(I);
1327 I->WaitForOutstandingSpawns(); 1325 I->WaitForOutstandingSpawns();
1328 { 1326 {
(...skipping 4014 matching lines...) Expand 10 before | Expand all | Expand 10 after
5343 I->heap()->UsedInWords(Heap::kOld) * kWordSize); 5341 I->heap()->UsedInWords(Heap::kOld) * kWordSize);
5344 } 5342 }
5345 #endif // !defined(PRODUCT) 5343 #endif // !defined(PRODUCT)
5346 library ^= tmp.raw(); 5344 library ^= tmp.raw();
5347 library.set_debuggable(true); 5345 library.set_debuggable(true);
5348 I->object_store()->set_root_library(library); 5346 I->object_store()->set_root_library(library);
5349 return Api::NewHandle(T, library.raw()); 5347 return Api::NewHandle(T, library.raw());
5350 } 5348 }
5351 5349
5352 5350
5353 DART_EXPORT Dart_Handle Dart_LoadKernel(const uint8_t* buffer, 5351 DART_EXPORT void* Dart_ReadKernelBinary(const uint8_t* buffer,
5354 intptr_t buffer_len) { 5352 intptr_t buffer_len) {
5355 API_TIMELINE_DURATION; 5353 API_TIMELINE_DURATION;
5354
5355 #if defined(DART_PRECOMPILED_RUNTIME)
5356 UNREACHABLE();
5357 return NULL;
5358 #else
5359 kernel::Program* program =
5360 ReadPrecompiledKernelFromBuffer(buffer, buffer_len);
5361 return program;
5362 #endif
5363 }
5364
5365
5366 DART_EXPORT Dart_Handle Dart_LoadKernel(void* kernel_program) {
5367 API_TIMELINE_DURATION;
5356 DARTSCOPE(Thread::Current()); 5368 DARTSCOPE(Thread::Current());
5357 StackZone zone(T); 5369 StackZone zone(T);
5358 5370
5359 #if defined(DART_PRECOMPILED_RUNTIME) 5371 #if defined(DART_PRECOMPILED_RUNTIME)
5360 return Api::NewError("%s: Can't load Kernel files from precompiled runtime.", 5372 return Api::NewError("%s: Can't load Kernel files from precompiled runtime.",
5361 CURRENT_FUNC); 5373 CURRENT_FUNC);
5362 #else 5374 #else
5363 Isolate* I = T->isolate(); 5375 Isolate* I = T->isolate();
5364 5376
5365 Library& library = Library::Handle(Z, I->object_store()->root_library()); 5377 Library& library = Library::Handle(Z, I->object_store()->root_library());
5366 if (!library.IsNull()) { 5378 if (!library.IsNull()) {
5367 const String& library_url = String::Handle(Z, library.url()); 5379 const String& library_url = String::Handle(Z, library.url());
5368 return Api::NewError("%s: A script has already been loaded from '%s'.", 5380 return Api::NewError("%s: A script has already been loaded from '%s'.",
5369 CURRENT_FUNC, library_url.ToCString()); 5381 CURRENT_FUNC, library_url.ToCString());
5370 } 5382 }
5371 CHECK_CALLBACK_STATE(T); 5383 CHECK_CALLBACK_STATE(T);
5372 CHECK_COMPILATION_ALLOWED(I); 5384 CHECK_COMPILATION_ALLOWED(I);
5373 5385
5374 // TODO(27588): Memory leak! 5386 // NOTE: Now the VM owns the [kernel_program] memory! Currently we do not
5375 kernel::KernelReader* reader = new kernel::KernelReader(buffer, buffer_len); 5387 // free it because (similar to the token stream) it will be used to repeatedly
5376 const Object& tmp = reader->ReadProgram(); 5388 // run the `kernel::FlowGraphBuilder()`.
5389 kernel::KernelReader reader(
5390 reinterpret_cast<kernel::Program*>(kernel_program));
5391 const Object& tmp = reader.ReadProgram();
5377 if (tmp.IsError()) { 5392 if (tmp.IsError()) {
5378 return Api::NewHandle(T, tmp.raw()); 5393 return Api::NewHandle(T, tmp.raw());
5379 } 5394 }
5380 library ^= tmp.raw(); 5395 library ^= tmp.raw();
5381 library.set_debuggable(false); 5396 library.set_debuggable(false);
5382 I->object_store()->set_root_library(library); 5397 I->object_store()->set_root_library(library);
5383 return Api::NewHandle(T, library.raw()); 5398 return Api::NewHandle(T, library.raw());
5384 #endif 5399 #endif
5385 } 5400 }
5386 5401
(...skipping 1263 matching lines...) Expand 10 before | Expand all | Expand 10 after
6650 6665
6651 DART_EXPORT bool Dart_IsPrecompiledRuntime() { 6666 DART_EXPORT bool Dart_IsPrecompiledRuntime() {
6652 #if defined(DART_PRECOMPILED_RUNTIME) 6667 #if defined(DART_PRECOMPILED_RUNTIME)
6653 return true; 6668 return true;
6654 #else 6669 #else
6655 return false; 6670 return false;
6656 #endif 6671 #endif
6657 } 6672 }
6658 6673
6659 } // namespace dart 6674 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart.cc ('k') | runtime/vm/kernel_reader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698