OLD | NEW |
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 1154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 "Dart_Initialize: " | 1165 "Dart_Initialize: " |
1166 "Dart_InitializeParams is null."); | 1166 "Dart_InitializeParams is null."); |
1167 } | 1167 } |
1168 | 1168 |
1169 if (params->version != DART_INITIALIZE_PARAMS_CURRENT_VERSION) { | 1169 if (params->version != DART_INITIALIZE_PARAMS_CURRENT_VERSION) { |
1170 return strdup( | 1170 return strdup( |
1171 "Dart_Initialize: " | 1171 "Dart_Initialize: " |
1172 "Invalid Dart_InitializeParams version."); | 1172 "Invalid Dart_InitializeParams version."); |
1173 } | 1173 } |
1174 | 1174 |
1175 return Dart::InitOnce(params->vm_isolate_snapshot, | 1175 return Dart::InitOnce( |
1176 params->instructions_snapshot, params->data_snapshot, | 1176 params->vm_snapshot_data, params->vm_snapshot_instructions, |
1177 params->create, params->shutdown, params->thread_exit, | 1177 params->create, params->shutdown, params->thread_exit, params->file_open, |
1178 params->file_open, params->file_read, | 1178 params->file_read, params->file_write, params->file_close, |
1179 params->file_write, params->file_close, | 1179 params->entropy_source, params->get_service_assets); |
1180 params->entropy_source, params->get_service_assets); | |
1181 } | 1180 } |
1182 | 1181 |
1183 | 1182 |
1184 DART_EXPORT char* Dart_Cleanup() { | 1183 DART_EXPORT char* Dart_Cleanup() { |
1185 CHECK_NO_ISOLATE(Isolate::Current()); | 1184 CHECK_NO_ISOLATE(Isolate::Current()); |
1186 const char* err_msg = Dart::Cleanup(); | 1185 const char* err_msg = Dart::Cleanup(); |
1187 if (err_msg != NULL) { | 1186 if (err_msg != NULL) { |
1188 return strdup(err_msg); | 1187 return strdup(err_msg); |
1189 } | 1188 } |
1190 return NULL; | 1189 return NULL; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 char* chars = NULL; | 1232 char* chars = NULL; |
1234 intptr_t len = OS::SNPrint(NULL, 0, "%s$%s", script_uri, main) + 1; | 1233 intptr_t len = OS::SNPrint(NULL, 0, "%s$%s", script_uri, main) + 1; |
1235 chars = reinterpret_cast<char*>(malloc(len)); | 1234 chars = reinterpret_cast<char*>(malloc(len)); |
1236 OS::SNPrint(chars, len, "%s$%s", script_uri, main); | 1235 OS::SNPrint(chars, len, "%s$%s", script_uri, main); |
1237 return chars; | 1236 return chars; |
1238 } | 1237 } |
1239 | 1238 |
1240 | 1239 |
1241 static Dart_Isolate CreateIsolate(const char* script_uri, | 1240 static Dart_Isolate CreateIsolate(const char* script_uri, |
1242 const char* main, | 1241 const char* main, |
1243 const uint8_t* snapshot_buffer, | 1242 const uint8_t* snapshot_data, |
| 1243 const uint8_t* snapshot_instructions, |
1244 intptr_t snapshot_length, | 1244 intptr_t snapshot_length, |
1245 kernel::Program* kernel_program, | 1245 kernel::Program* kernel_program, |
1246 Dart_IsolateFlags* flags, | 1246 Dart_IsolateFlags* flags, |
1247 void* callback_data, | 1247 void* callback_data, |
1248 char** error) { | 1248 char** error) { |
1249 CHECK_NO_ISOLATE(Isolate::Current()); | 1249 CHECK_NO_ISOLATE(Isolate::Current()); |
1250 char* isolate_name = BuildIsolateName(script_uri, main); | 1250 char* isolate_name = BuildIsolateName(script_uri, main); |
1251 | 1251 |
1252 // Setup default flags in case none were passed. | 1252 // Setup default flags in case none were passed. |
1253 Dart_IsolateFlags api_flags; | 1253 Dart_IsolateFlags api_flags; |
1254 if (flags == NULL) { | 1254 if (flags == NULL) { |
1255 Isolate::FlagsInitialize(&api_flags); | 1255 Isolate::FlagsInitialize(&api_flags); |
1256 flags = &api_flags; | 1256 flags = &api_flags; |
1257 } | 1257 } |
1258 Isolate* I = Dart::CreateIsolate(isolate_name, *flags); | 1258 Isolate* I = Dart::CreateIsolate(isolate_name, *flags); |
1259 free(isolate_name); | 1259 free(isolate_name); |
1260 if (I == NULL) { | 1260 if (I == NULL) { |
1261 *error = strdup("Isolate creation failed"); | 1261 *error = strdup("Isolate creation failed"); |
1262 return reinterpret_cast<Dart_Isolate>(NULL); | 1262 return reinterpret_cast<Dart_Isolate>(NULL); |
1263 } | 1263 } |
1264 { | 1264 { |
1265 Thread* T = Thread::Current(); | 1265 Thread* T = Thread::Current(); |
1266 StackZone zone(T); | 1266 StackZone zone(T); |
1267 HANDLESCOPE(T); | 1267 HANDLESCOPE(T); |
1268 // We enter an API scope here as InitializeIsolate could compile some | 1268 // We enter an API scope here as InitializeIsolate could compile some |
1269 // bootstrap library files which call out to a tag handler that may create | 1269 // bootstrap library files which call out to a tag handler that may create |
1270 // Api Handles when an error is encountered. | 1270 // Api Handles when an error is encountered. |
1271 Dart_EnterScope(); | 1271 Dart_EnterScope(); |
1272 const Error& error_obj = Error::Handle( | 1272 const Error& error_obj = |
1273 Z, Dart::InitializeIsolate(snapshot_buffer, snapshot_length, | 1273 Error::Handle(Z, Dart::InitializeIsolate( |
1274 kernel_program, callback_data)); | 1274 snapshot_data, snapshot_instructions, |
| 1275 snapshot_length, kernel_program, callback_data)); |
1275 if (error_obj.IsNull()) { | 1276 if (error_obj.IsNull()) { |
1276 #if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT) | 1277 #if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT) |
1277 if (FLAG_check_function_fingerprints && kernel_program == NULL) { | 1278 if (FLAG_check_function_fingerprints && kernel_program == NULL) { |
1278 Library::CheckFunctionFingerprints(); | 1279 Library::CheckFunctionFingerprints(); |
1279 } | 1280 } |
1280 #endif // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT). | 1281 #endif // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT). |
1281 // We exit the API scope entered above. | 1282 // We exit the API scope entered above. |
1282 Dart_ExitScope(); | 1283 Dart_ExitScope(); |
1283 // A Thread structure has been associated to the thread, we do the | 1284 // A Thread structure has been associated to the thread, we do the |
1284 // safepoint transition explicity here instead of using the | 1285 // safepoint transition explicity here instead of using the |
1285 // TransitionXXX scope objects as the reverse transition happens | 1286 // TransitionXXX scope objects as the reverse transition happens |
1286 // outside this scope in Dart_ShutdownIsolate/Dart_ExitIsolate. | 1287 // outside this scope in Dart_ShutdownIsolate/Dart_ExitIsolate. |
1287 T->set_execution_state(Thread::kThreadInNative); | 1288 T->set_execution_state(Thread::kThreadInNative); |
1288 T->EnterSafepoint(); | 1289 T->EnterSafepoint(); |
1289 return Api::CastIsolate(I); | 1290 return Api::CastIsolate(I); |
1290 } | 1291 } |
1291 *error = strdup(error_obj.ToErrorCString()); | 1292 *error = strdup(error_obj.ToErrorCString()); |
1292 // We exit the API scope entered above. | 1293 // We exit the API scope entered above. |
1293 Dart_ExitScope(); | 1294 Dart_ExitScope(); |
1294 } | 1295 } |
1295 Dart::ShutdownIsolate(); | 1296 Dart::ShutdownIsolate(); |
1296 return reinterpret_cast<Dart_Isolate>(NULL); | 1297 return reinterpret_cast<Dart_Isolate>(NULL); |
1297 } | 1298 } |
1298 | 1299 |
1299 | 1300 |
1300 DART_EXPORT Dart_Isolate Dart_CreateIsolate(const char* script_uri, | 1301 DART_EXPORT Dart_Isolate |
1301 const char* main, | 1302 Dart_CreateIsolate(const char* script_uri, |
1302 const uint8_t* snapshot_buffer, | 1303 const char* main, |
1303 Dart_IsolateFlags* flags, | 1304 const uint8_t* snapshot_data, |
1304 void* callback_data, | 1305 const uint8_t* snapshot_instructions, |
1305 char** error) { | 1306 Dart_IsolateFlags* flags, |
1306 return CreateIsolate(script_uri, main, snapshot_buffer, -1, NULL, flags, | 1307 void* callback_data, |
1307 callback_data, error); | 1308 char** error) { |
| 1309 return CreateIsolate(script_uri, main, snapshot_data, snapshot_instructions, |
| 1310 -1, NULL, flags, callback_data, error); |
1308 } | 1311 } |
1309 | 1312 |
1310 | 1313 |
1311 DART_EXPORT Dart_Isolate Dart_CreateIsolateFromKernel(const char* script_uri, | 1314 DART_EXPORT Dart_Isolate Dart_CreateIsolateFromKernel(const char* script_uri, |
1312 const char* main, | 1315 const char* main, |
1313 void* kernel_program, | 1316 void* kernel_program, |
1314 Dart_IsolateFlags* flags, | 1317 Dart_IsolateFlags* flags, |
1315 void* callback_data, | 1318 void* callback_data, |
1316 char** error) { | 1319 char** error) { |
1317 return CreateIsolate(script_uri, main, NULL, -1, | 1320 return CreateIsolate(script_uri, main, NULL, NULL, -1, |
1318 reinterpret_cast<kernel::Program*>(kernel_program), | 1321 reinterpret_cast<kernel::Program*>(kernel_program), |
1319 flags, callback_data, error); | 1322 flags, callback_data, error); |
1320 } | 1323 } |
1321 | 1324 |
1322 | 1325 |
1323 DART_EXPORT void Dart_ShutdownIsolate() { | 1326 DART_EXPORT void Dart_ShutdownIsolate() { |
1324 Thread* T = Thread::Current(); | 1327 Thread* T = Thread::Current(); |
1325 Isolate* I = T->isolate(); | 1328 Isolate* I = T->isolate(); |
1326 CHECK_ISOLATE(I); | 1329 CHECK_ISOLATE(I); |
1327 I->WaitForOutstandingSpawns(); | 1330 I->WaitForOutstandingSpawns(); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1537 static uint8_t* ApiReallocate(uint8_t* ptr, | 1540 static uint8_t* ApiReallocate(uint8_t* ptr, |
1538 intptr_t old_size, | 1541 intptr_t old_size, |
1539 intptr_t new_size) { | 1542 intptr_t new_size) { |
1540 return Api::TopScope(Thread::Current()) | 1543 return Api::TopScope(Thread::Current()) |
1541 ->zone() | 1544 ->zone() |
1542 ->Realloc<uint8_t>(ptr, old_size, new_size); | 1545 ->Realloc<uint8_t>(ptr, old_size, new_size); |
1543 } | 1546 } |
1544 | 1547 |
1545 | 1548 |
1546 DART_EXPORT Dart_Handle | 1549 DART_EXPORT Dart_Handle |
1547 Dart_CreateSnapshot(uint8_t** vm_isolate_snapshot_buffer, | 1550 Dart_CreateSnapshot(uint8_t** vm_snapshot_data_buffer, |
1548 intptr_t* vm_isolate_snapshot_size, | 1551 intptr_t* vm_snapshot_data_size, |
1549 uint8_t** isolate_snapshot_buffer, | 1552 uint8_t** isolate_snapshot_data_buffer, |
1550 intptr_t* isolate_snapshot_size) { | 1553 intptr_t* isolate_snapshot_data_size) { |
1551 DARTSCOPE(Thread::Current()); | 1554 DARTSCOPE(Thread::Current()); |
1552 API_TIMELINE_DURATION; | 1555 API_TIMELINE_DURATION; |
1553 Isolate* I = T->isolate(); | 1556 Isolate* I = T->isolate(); |
1554 if (!FLAG_load_deferred_eagerly) { | 1557 if (!FLAG_load_deferred_eagerly) { |
1555 return Api::NewError( | 1558 return Api::NewError( |
1556 "Creating full snapshots requires --load_deferred_eagerly"); | 1559 "Creating full snapshots requires --load_deferred_eagerly"); |
1557 } | 1560 } |
1558 if (vm_isolate_snapshot_buffer != NULL && vm_isolate_snapshot_size == NULL) { | 1561 if (vm_snapshot_data_buffer != NULL && vm_snapshot_data_size == NULL) { |
1559 RETURN_NULL_ERROR(vm_isolate_snapshot_size); | 1562 RETURN_NULL_ERROR(vm_snapshot_data_size); |
1560 } | 1563 } |
1561 if (isolate_snapshot_buffer == NULL) { | 1564 if (isolate_snapshot_data_buffer == NULL) { |
1562 RETURN_NULL_ERROR(isolate_snapshot_buffer); | 1565 RETURN_NULL_ERROR(isolate_snapshot_data_buffer); |
1563 } | 1566 } |
1564 if (isolate_snapshot_size == NULL) { | 1567 if (isolate_snapshot_data_size == NULL) { |
1565 RETURN_NULL_ERROR(isolate_snapshot_size); | 1568 RETURN_NULL_ERROR(isolate_snapshot_data_size); |
1566 } | 1569 } |
1567 // Finalize all classes if needed. | 1570 // Finalize all classes if needed. |
1568 Dart_Handle state = Api::CheckAndFinalizePendingClasses(T); | 1571 Dart_Handle state = Api::CheckAndFinalizePendingClasses(T); |
1569 if (::Dart_IsError(state)) { | 1572 if (::Dart_IsError(state)) { |
1570 return state; | 1573 return state; |
1571 } | 1574 } |
1572 I->StopBackgroundCompiler(); | 1575 I->StopBackgroundCompiler(); |
1573 | 1576 |
1574 #if defined(DEBUG) | 1577 #if defined(DEBUG) |
1575 I->heap()->CollectAllGarbage(); | 1578 I->heap()->CollectAllGarbage(); |
1576 CheckFunctionTypesVisitor check_canonical(T); | 1579 CheckFunctionTypesVisitor check_canonical(T); |
1577 I->heap()->IterateObjects(&check_canonical); | 1580 I->heap()->IterateObjects(&check_canonical); |
1578 #endif // #if defined(DEBUG) | 1581 #endif // #if defined(DEBUG) |
1579 | 1582 |
1580 FullSnapshotWriter writer(Snapshot::kCore, vm_isolate_snapshot_buffer, | 1583 FullSnapshotWriter writer(Snapshot::kCore, vm_snapshot_data_buffer, |
1581 isolate_snapshot_buffer, ApiReallocate, | 1584 isolate_snapshot_data_buffer, ApiReallocate, |
1582 NULL /* instructions_writer */); | 1585 NULL /* vm_instructions_writer */, |
| 1586 NULL /* isolate_instructions_writer */); |
1583 writer.WriteFullSnapshot(); | 1587 writer.WriteFullSnapshot(); |
1584 if (vm_isolate_snapshot_buffer != NULL) { | 1588 if (vm_snapshot_data_buffer != NULL) { |
1585 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); | 1589 *vm_snapshot_data_size = writer.VmIsolateSnapshotSize(); |
1586 } | 1590 } |
1587 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 1591 *isolate_snapshot_data_size = writer.IsolateSnapshotSize(); |
1588 return Api::Success(); | 1592 return Api::Success(); |
1589 } | 1593 } |
1590 | 1594 |
1591 | 1595 |
1592 DART_EXPORT Dart_Handle Dart_CreateScriptSnapshot(uint8_t** buffer, | 1596 DART_EXPORT Dart_Handle |
1593 intptr_t* size) { | 1597 Dart_CreateScriptSnapshot(uint8_t** script_snapshot_buffer, |
| 1598 intptr_t* script_snapshot_size) { |
1594 API_TIMELINE_DURATION; | 1599 API_TIMELINE_DURATION; |
1595 DARTSCOPE(Thread::Current()); | 1600 DARTSCOPE(Thread::Current()); |
1596 Isolate* I = T->isolate(); | 1601 Isolate* I = T->isolate(); |
1597 if (buffer == NULL) { | 1602 if (script_snapshot_buffer == NULL) { |
1598 RETURN_NULL_ERROR(buffer); | 1603 RETURN_NULL_ERROR(script_snapshot_buffer); |
1599 } | 1604 } |
1600 if (size == NULL) { | 1605 if (script_snapshot_size == NULL) { |
1601 RETURN_NULL_ERROR(size); | 1606 RETURN_NULL_ERROR(script_snapshot_size); |
1602 } | 1607 } |
1603 // Finalize all classes if needed. | 1608 // Finalize all classes if needed. |
1604 Dart_Handle state = Api::CheckAndFinalizePendingClasses(T); | 1609 Dart_Handle state = Api::CheckAndFinalizePendingClasses(T); |
1605 if (::Dart_IsError(state)) { | 1610 if (::Dart_IsError(state)) { |
1606 return state; | 1611 return state; |
1607 } | 1612 } |
1608 Library& lib = Library::Handle(Z, I->object_store()->root_library()); | 1613 Library& lib = Library::Handle(Z, I->object_store()->root_library()); |
1609 | 1614 |
1610 #if defined(DEBUG) | 1615 #if defined(DEBUG) |
1611 I->heap()->CollectAllGarbage(); | 1616 I->heap()->CollectAllGarbage(); |
1612 CheckFunctionTypesVisitor check_canonical(T); | 1617 CheckFunctionTypesVisitor check_canonical(T); |
1613 I->heap()->IterateObjects(&check_canonical); | 1618 I->heap()->IterateObjects(&check_canonical); |
1614 #endif // #if defined(DEBUG) | 1619 #endif // #if defined(DEBUG) |
1615 | 1620 |
1616 ScriptSnapshotWriter writer(buffer, ApiReallocate); | 1621 ScriptSnapshotWriter writer(script_snapshot_buffer, ApiReallocate); |
1617 writer.WriteScriptSnapshot(lib); | 1622 writer.WriteScriptSnapshot(lib); |
1618 *size = writer.BytesWritten(); | 1623 *script_snapshot_size = writer.BytesWritten(); |
1619 return Api::Success(); | 1624 return Api::Success(); |
1620 } | 1625 } |
1621 | 1626 |
1622 | 1627 |
1623 DART_EXPORT void Dart_InterruptIsolate(Dart_Isolate isolate) { | 1628 DART_EXPORT void Dart_InterruptIsolate(Dart_Isolate isolate) { |
1624 if (isolate == NULL) { | 1629 if (isolate == NULL) { |
1625 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); | 1630 FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC); |
1626 } | 1631 } |
1627 // TODO(16615): Validate isolate parameter. | 1632 // TODO(16615): Validate isolate parameter. |
1628 TransitionNativeToVM transition(Thread::Current()); | 1633 TransitionNativeToVM transition(Thread::Current()); |
(...skipping 2230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3859 redirect_type ^= redirect_type.Canonicalize(); | 3864 redirect_type ^= redirect_type.Canonicalize(); |
3860 } | 3865 } |
3861 | 3866 |
3862 type_obj = redirect_type.raw(); | 3867 type_obj = redirect_type.raw(); |
3863 type_arguments = redirect_type.arguments(); | 3868 type_arguments = redirect_type.arguments(); |
3864 | 3869 |
3865 cls = type_obj.type_class(); | 3870 cls = type_obj.type_class(); |
3866 } | 3871 } |
3867 if (constructor.IsGenerativeConstructor()) { | 3872 if (constructor.IsGenerativeConstructor()) { |
3868 #if defined(DEBUG) | 3873 #if defined(DEBUG) |
3869 if (!cls.is_allocated() && (Dart::snapshot_kind() == Snapshot::kAppAOT)) { | 3874 if (!cls.is_allocated() && |
| 3875 (Dart::vm_snapshot_kind() == Snapshot::kAppAOT)) { |
3870 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); | 3876 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); |
3871 } | 3877 } |
3872 #endif | 3878 #endif |
3873 // Create the new object. | 3879 // Create the new object. |
3874 new_object = Instance::New(cls); | 3880 new_object = Instance::New(cls); |
3875 } | 3881 } |
3876 | 3882 |
3877 // Create the argument list. | 3883 // Create the argument list. |
3878 intptr_t arg_index = 0; | 3884 intptr_t arg_index = 0; |
3879 int extra_args = 1; | 3885 int extra_args = 1; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3954 DARTSCOPE(Thread::Current()); | 3960 DARTSCOPE(Thread::Current()); |
3955 CHECK_CALLBACK_STATE(T); | 3961 CHECK_CALLBACK_STATE(T); |
3956 | 3962 |
3957 const Type& type_obj = Api::UnwrapTypeHandle(Z, type); | 3963 const Type& type_obj = Api::UnwrapTypeHandle(Z, type); |
3958 // Get the class to instantiate. | 3964 // Get the class to instantiate. |
3959 if (type_obj.IsNull()) { | 3965 if (type_obj.IsNull()) { |
3960 RETURN_TYPE_ERROR(Z, type, Type); | 3966 RETURN_TYPE_ERROR(Z, type, Type); |
3961 } | 3967 } |
3962 const Class& cls = Class::Handle(Z, type_obj.type_class()); | 3968 const Class& cls = Class::Handle(Z, type_obj.type_class()); |
3963 #if defined(DEBUG) | 3969 #if defined(DEBUG) |
3964 if (!cls.is_allocated() && (Dart::snapshot_kind() == Snapshot::kAppAOT)) { | 3970 if (!cls.is_allocated() && (Dart::vm_snapshot_kind() == Snapshot::kAppAOT)) { |
3965 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); | 3971 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); |
3966 } | 3972 } |
3967 #endif | 3973 #endif |
3968 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); | 3974 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); |
3969 if (!error.IsNull()) { | 3975 if (!error.IsNull()) { |
3970 // An error occurred, return error object. | 3976 // An error occurred, return error object. |
3971 return Api::NewHandle(T, error.raw()); | 3977 return Api::NewHandle(T, error.raw()); |
3972 } | 3978 } |
3973 return Api::NewHandle(T, AllocateObject(T, cls)); | 3979 return Api::NewHandle(T, AllocateObject(T, cls)); |
3974 } | 3980 } |
3975 | 3981 |
3976 | 3982 |
3977 DART_EXPORT Dart_Handle | 3983 DART_EXPORT Dart_Handle |
3978 Dart_AllocateWithNativeFields(Dart_Handle type, | 3984 Dart_AllocateWithNativeFields(Dart_Handle type, |
3979 intptr_t num_native_fields, | 3985 intptr_t num_native_fields, |
3980 const intptr_t* native_fields) { | 3986 const intptr_t* native_fields) { |
3981 DARTSCOPE(Thread::Current()); | 3987 DARTSCOPE(Thread::Current()); |
3982 CHECK_CALLBACK_STATE(T); | 3988 CHECK_CALLBACK_STATE(T); |
3983 | 3989 |
3984 const Type& type_obj = Api::UnwrapTypeHandle(Z, type); | 3990 const Type& type_obj = Api::UnwrapTypeHandle(Z, type); |
3985 // Get the class to instantiate. | 3991 // Get the class to instantiate. |
3986 if (type_obj.IsNull()) { | 3992 if (type_obj.IsNull()) { |
3987 RETURN_TYPE_ERROR(Z, type, Type); | 3993 RETURN_TYPE_ERROR(Z, type, Type); |
3988 } | 3994 } |
3989 if (native_fields == NULL) { | 3995 if (native_fields == NULL) { |
3990 RETURN_NULL_ERROR(native_fields); | 3996 RETURN_NULL_ERROR(native_fields); |
3991 } | 3997 } |
3992 const Class& cls = Class::Handle(Z, type_obj.type_class()); | 3998 const Class& cls = Class::Handle(Z, type_obj.type_class()); |
3993 #if defined(DEBUG) | 3999 #if defined(DEBUG) |
3994 if (!cls.is_allocated() && (Dart::snapshot_kind() == Snapshot::kAppAOT)) { | 4000 if (!cls.is_allocated() && (Dart::vm_snapshot_kind() == Snapshot::kAppAOT)) { |
3995 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); | 4001 return Api::NewError("Precompilation dropped '%s'", cls.ToCString()); |
3996 } | 4002 } |
3997 #endif | 4003 #endif |
3998 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); | 4004 const Error& error = Error::Handle(Z, cls.EnsureIsFinalized(T)); |
3999 if (!error.IsNull()) { | 4005 if (!error.IsNull()) { |
4000 // An error occurred, return error object. | 4006 // An error occurred, return error object. |
4001 return Api::NewHandle(T, error.raw()); | 4007 return Api::NewHandle(T, error.raw()); |
4002 } | 4008 } |
4003 if (num_native_fields != cls.num_native_fields()) { | 4009 if (num_native_fields != cls.num_native_fields()) { |
4004 return Api::NewError( | 4010 return Api::NewError( |
(...skipping 2624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6629 RETURN_NULL_ERROR(assembly_buffer); | 6635 RETURN_NULL_ERROR(assembly_buffer); |
6630 } | 6636 } |
6631 if (assembly_size == NULL) { | 6637 if (assembly_size == NULL) { |
6632 RETURN_NULL_ERROR(assembly_size); | 6638 RETURN_NULL_ERROR(assembly_size); |
6633 } | 6639 } |
6634 | 6640 |
6635 NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(), | 6641 NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(), |
6636 "WriteAppAOTSnapshot")); | 6642 "WriteAppAOTSnapshot")); |
6637 AssemblyInstructionsWriter instructions_writer(assembly_buffer, ApiReallocate, | 6643 AssemblyInstructionsWriter instructions_writer(assembly_buffer, ApiReallocate, |
6638 2 * MB /* initial_size */); | 6644 2 * MB /* initial_size */); |
6639 uint8_t* vm_isolate_snapshot_buffer = NULL; | 6645 uint8_t* vm_snapshot_data_buffer = NULL; |
6640 uint8_t* isolate_snapshot_buffer = NULL; | 6646 uint8_t* isolate_snapshot_data_buffer = NULL; |
6641 FullSnapshotWriter writer(Snapshot::kAppAOT, &vm_isolate_snapshot_buffer, | 6647 FullSnapshotWriter writer(Snapshot::kAppAOT, &vm_snapshot_data_buffer, |
6642 &isolate_snapshot_buffer, ApiReallocate, | 6648 &isolate_snapshot_data_buffer, ApiReallocate, |
6643 &instructions_writer); | 6649 &instructions_writer, &instructions_writer); |
6644 | 6650 |
6645 writer.WriteFullSnapshot(); | 6651 writer.WriteFullSnapshot(); |
6646 *assembly_size = instructions_writer.AssemblySize(); | 6652 *assembly_size = instructions_writer.AssemblySize(); |
6647 | 6653 |
6648 return Api::Success(); | 6654 return Api::Success(); |
6649 #endif | 6655 #endif |
6650 } | 6656 } |
6651 | 6657 |
6652 | 6658 |
6653 DART_EXPORT Dart_Handle | 6659 DART_EXPORT Dart_Handle |
6654 Dart_CreateAppAOTSnapshotAsBlobs(uint8_t** vm_isolate_snapshot_buffer, | 6660 Dart_CreateAppAOTSnapshotAsBlobs(uint8_t** vm_snapshot_data_buffer, |
6655 intptr_t* vm_isolate_snapshot_size, | 6661 intptr_t* vm_snapshot_data_size, |
6656 uint8_t** isolate_snapshot_buffer, | 6662 uint8_t** vm_snapshot_instructions_buffer, |
6657 intptr_t* isolate_snapshot_size, | 6663 intptr_t* vm_snapshot_instructions_size, |
6658 uint8_t** instructions_blob_buffer, | 6664 uint8_t** isolate_snapshot_data_buffer, |
6659 intptr_t* instructions_blob_size, | 6665 intptr_t* isolate_snapshot_data_size, |
6660 uint8_t** rodata_blob_buffer, | 6666 uint8_t** isolate_snapshot_instructions_buffer, |
6661 intptr_t* rodata_blob_size) { | 6667 intptr_t* isolate_snapshot_instructions_size) { |
6662 #if defined(TARGET_ARCH_IA32) | 6668 #if defined(TARGET_ARCH_IA32) |
6663 return Api::NewError("AOT compilation is not supported on IA32."); | 6669 return Api::NewError("AOT compilation is not supported on IA32."); |
6664 #elif defined(TARGET_ARCH_DBC) | 6670 #elif defined(TARGET_ARCH_DBC) |
6665 return Api::NewError("AOT compilation is not supported on DBC."); | 6671 return Api::NewError("AOT compilation is not supported on DBC."); |
6666 #elif !defined(DART_PRECOMPILER) | 6672 #elif !defined(DART_PRECOMPILER) |
6667 return Api::NewError( | 6673 return Api::NewError( |
6668 "This VM was built without support for AOT compilation."); | 6674 "This VM was built without support for AOT compilation."); |
6669 #else | 6675 #else |
6670 API_TIMELINE_DURATION; | 6676 API_TIMELINE_DURATION; |
6671 DARTSCOPE(Thread::Current()); | 6677 DARTSCOPE(Thread::Current()); |
6672 Isolate* I = T->isolate(); | 6678 Isolate* I = T->isolate(); |
6673 if (I->compilation_allowed()) { | 6679 if (I->compilation_allowed()) { |
6674 return Api::NewError( | 6680 return Api::NewError( |
6675 "Isolate is not precompiled. " | 6681 "Isolate is not precompiled. " |
6676 "Did you forget to call Dart_Precompile?"); | 6682 "Did you forget to call Dart_Precompile?"); |
6677 } | 6683 } |
6678 ASSERT(FLAG_load_deferred_eagerly); | 6684 ASSERT(FLAG_load_deferred_eagerly); |
6679 if (vm_isolate_snapshot_buffer == NULL) { | 6685 if (vm_snapshot_data_buffer == NULL) { |
6680 RETURN_NULL_ERROR(vm_isolate_snapshot_buffer); | 6686 RETURN_NULL_ERROR(vm_snapshot_data_buffer); |
6681 } | 6687 } |
6682 if (vm_isolate_snapshot_size == NULL) { | 6688 if (vm_snapshot_data_size == NULL) { |
6683 RETURN_NULL_ERROR(vm_isolate_snapshot_size); | 6689 RETURN_NULL_ERROR(vm_snapshot_data_size); |
6684 } | 6690 } |
6685 if (isolate_snapshot_buffer == NULL) { | 6691 if (vm_snapshot_instructions_buffer == NULL) { |
6686 RETURN_NULL_ERROR(isolate_snapshot_buffer); | 6692 RETURN_NULL_ERROR(vm_snapshot_instructions_buffer); |
6687 } | 6693 } |
6688 if (isolate_snapshot_size == NULL) { | 6694 if (vm_snapshot_instructions_size == NULL) { |
6689 RETURN_NULL_ERROR(isolate_snapshot_size); | 6695 RETURN_NULL_ERROR(vm_snapshot_instructions_size); |
6690 } | 6696 } |
6691 if (instructions_blob_buffer == NULL) { | 6697 if (isolate_snapshot_data_buffer == NULL) { |
6692 RETURN_NULL_ERROR(instructions_blob_buffer); | 6698 RETURN_NULL_ERROR(isolate_snapshot_data_buffer); |
6693 } | 6699 } |
6694 if (instructions_blob_size == NULL) { | 6700 if (isolate_snapshot_data_size == NULL) { |
6695 RETURN_NULL_ERROR(instructions_blob_size); | 6701 RETURN_NULL_ERROR(isolate_snapshot_data_size); |
6696 } | 6702 } |
6697 if (rodata_blob_buffer == NULL) { | 6703 if (isolate_snapshot_instructions_buffer == NULL) { |
6698 RETURN_NULL_ERROR(instructions_blob_buffer); | 6704 RETURN_NULL_ERROR(instructions_snapshot_blob_buffer); |
6699 } | 6705 } |
6700 if (rodata_blob_size == NULL) { | 6706 if (isolate_snapshot_instructions_buffer == NULL) { |
6701 RETURN_NULL_ERROR(instructions_blob_size); | 6707 RETURN_NULL_ERROR(instructions_snapshot_blob_size); |
6702 } | 6708 } |
6703 | 6709 |
6704 NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(), | 6710 NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(), |
6705 "WriteAppAOTSnapshot")); | 6711 "WriteAppAOTSnapshot")); |
6706 BlobInstructionsWriter instructions_writer(instructions_blob_buffer, | 6712 BlobInstructionsWriter vm_instructions_writer(vm_snapshot_instructions_buffer, |
6707 rodata_blob_buffer, ApiReallocate, | 6713 ApiReallocate, |
6708 2 * MB /* initial_size */); | 6714 2 * MB /* initial_size */); |
6709 FullSnapshotWriter writer(Snapshot::kAppAOT, vm_isolate_snapshot_buffer, | 6715 BlobInstructionsWriter isolate_instructions_writer( |
6710 isolate_snapshot_buffer, ApiReallocate, | 6716 isolate_snapshot_instructions_buffer, ApiReallocate, |
6711 &instructions_writer); | 6717 2 * MB /* initial_size */); |
| 6718 FullSnapshotWriter writer( |
| 6719 Snapshot::kAppAOT, vm_snapshot_data_buffer, isolate_snapshot_data_buffer, |
| 6720 ApiReallocate, &vm_instructions_writer, &isolate_instructions_writer); |
6712 | 6721 |
6713 writer.WriteFullSnapshot(); | 6722 writer.WriteFullSnapshot(); |
6714 *vm_isolate_snapshot_size = writer.VmIsolateSnapshotSize(); | 6723 *vm_snapshot_data_size = writer.VmIsolateSnapshotSize(); |
6715 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 6724 *vm_snapshot_instructions_size = |
6716 *instructions_blob_size = instructions_writer.InstructionsBlobSize(); | 6725 vm_instructions_writer.InstructionsBlobSize(); |
6717 *rodata_blob_size = instructions_writer.RodataBlobSize(); | 6726 *isolate_snapshot_data_size = writer.IsolateSnapshotSize(); |
| 6727 *isolate_snapshot_instructions_size = |
| 6728 isolate_instructions_writer.InstructionsBlobSize(); |
6718 | 6729 |
6719 return Api::Success(); | 6730 return Api::Success(); |
6720 #endif | 6731 #endif |
6721 } | 6732 } |
6722 | 6733 |
6723 | 6734 |
6724 DART_EXPORT Dart_Handle | 6735 DART_EXPORT Dart_Handle |
6725 Dart_CreateAppJITSnapshotAsBlobs(uint8_t** isolate_snapshot_buffer, | 6736 Dart_CreateAppJITSnapshotAsBlobs(uint8_t** isolate_snapshot_data_buffer, |
6726 intptr_t* isolate_snapshot_size, | 6737 intptr_t* isolate_snapshot_data_size, |
6727 uint8_t** instructions_blob_buffer, | 6738 uint8_t** isolate_snapshot_instructions_buffer, |
6728 intptr_t* instructions_blob_size, | 6739 intptr_t* isolate_snapshot_instructions_size) { |
6729 uint8_t** rodata_blob_buffer, | |
6730 intptr_t* rodata_blob_size) { | |
6731 #if defined(TARGET_ARCH_IA32) | 6740 #if defined(TARGET_ARCH_IA32) |
6732 return Api::NewError("Snapshots with code are not supported on IA32."); | 6741 return Api::NewError("Snapshots with code are not supported on IA32."); |
6733 #elif defined(TARGET_ARCH_DBC) | 6742 #elif defined(TARGET_ARCH_DBC) |
6734 return Api::NewError("Snapshots with code are not supported on DBC."); | 6743 return Api::NewError("Snapshots with code are not supported on DBC."); |
6735 #elif defined(DART_PRECOMPILED_RUNTIME) | 6744 #elif defined(DART_PRECOMPILED_RUNTIME) |
6736 return Api::NewError("JIT app snapshots cannot be taken from an AOT runtime"); | 6745 return Api::NewError("JIT app snapshots cannot be taken from an AOT runtime"); |
6737 #else | 6746 #else |
6738 API_TIMELINE_DURATION; | 6747 API_TIMELINE_DURATION; |
6739 DARTSCOPE(Thread::Current()); | 6748 DARTSCOPE(Thread::Current()); |
6740 Isolate* I = T->isolate(); | 6749 Isolate* I = T->isolate(); |
6741 if (!FLAG_load_deferred_eagerly) { | 6750 if (!FLAG_load_deferred_eagerly) { |
6742 return Api::NewError( | 6751 return Api::NewError( |
6743 "Creating full snapshots requires --load_deferred_eagerly"); | 6752 "Creating full snapshots requires --load_deferred_eagerly"); |
6744 } | 6753 } |
6745 if (isolate_snapshot_buffer == NULL) { | 6754 if (isolate_snapshot_data_buffer == NULL) { |
6746 RETURN_NULL_ERROR(isolate_snapshot_buffer); | 6755 RETURN_NULL_ERROR(isolate_snapshot_data_buffer); |
6747 } | 6756 } |
6748 if (isolate_snapshot_size == NULL) { | 6757 if (isolate_snapshot_data_size == NULL) { |
6749 RETURN_NULL_ERROR(isolate_snapshot_size); | 6758 RETURN_NULL_ERROR(isolate_snapshot_data_size); |
6750 } | 6759 } |
6751 if (instructions_blob_buffer == NULL) { | 6760 if (isolate_snapshot_instructions_buffer == NULL) { |
6752 RETURN_NULL_ERROR(instructions_blob_buffer); | 6761 RETURN_NULL_ERROR(instructions_snapshot_blob_buffer); |
6753 } | 6762 } |
6754 if (instructions_blob_size == NULL) { | 6763 if (isolate_snapshot_instructions_buffer == NULL) { |
6755 RETURN_NULL_ERROR(instructions_blob_size); | 6764 RETURN_NULL_ERROR(instructions_snapshot_blob_size); |
6756 } | |
6757 if (rodata_blob_buffer == NULL) { | |
6758 RETURN_NULL_ERROR(instructions_blob_buffer); | |
6759 } | |
6760 if (rodata_blob_size == NULL) { | |
6761 RETURN_NULL_ERROR(instructions_blob_size); | |
6762 } | 6765 } |
6763 // Finalize all classes if needed. | 6766 // Finalize all classes if needed. |
6764 Dart_Handle state = Api::CheckAndFinalizePendingClasses(T); | 6767 Dart_Handle state = Api::CheckAndFinalizePendingClasses(T); |
6765 if (::Dart_IsError(state)) { | 6768 if (::Dart_IsError(state)) { |
6766 return state; | 6769 return state; |
6767 } | 6770 } |
6768 I->StopBackgroundCompiler(); | 6771 I->StopBackgroundCompiler(); |
6769 | 6772 |
6770 NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(), | 6773 NOT_IN_PRODUCT(TimelineDurationScope tds2(T, Timeline::GetIsolateStream(), |
6771 "WriteAppJITSnapshot")); | 6774 "WriteAppJITSnapshot")); |
6772 BlobInstructionsWriter instructions_writer(instructions_blob_buffer, | 6775 BlobInstructionsWriter isolate_instructions_writer( |
6773 rodata_blob_buffer, ApiReallocate, | 6776 isolate_snapshot_instructions_buffer, ApiReallocate, |
6774 2 * MB /* initial_size */); | 6777 2 * MB /* initial_size */); |
6775 FullSnapshotWriter writer(Snapshot::kAppJIT, NULL, isolate_snapshot_buffer, | 6778 FullSnapshotWriter writer(Snapshot::kAppJIT, NULL, |
6776 ApiReallocate, &instructions_writer); | 6779 isolate_snapshot_data_buffer, ApiReallocate, NULL, |
| 6780 &isolate_instructions_writer); |
6777 writer.WriteFullSnapshot(); | 6781 writer.WriteFullSnapshot(); |
6778 *isolate_snapshot_size = writer.IsolateSnapshotSize(); | 6782 |
6779 *instructions_blob_size = instructions_writer.InstructionsBlobSize(); | 6783 *isolate_snapshot_data_size = writer.IsolateSnapshotSize(); |
6780 *rodata_blob_size = instructions_writer.RodataBlobSize(); | 6784 *isolate_snapshot_instructions_size = |
| 6785 isolate_instructions_writer.InstructionsBlobSize(); |
6781 | 6786 |
6782 return Api::Success(); | 6787 return Api::Success(); |
6783 #endif | 6788 #endif |
6784 } | 6789 } |
6785 | 6790 |
6786 | 6791 |
6787 DART_EXPORT bool Dart_IsPrecompiledRuntime() { | 6792 DART_EXPORT bool Dart_IsPrecompiledRuntime() { |
6788 #if defined(DART_PRECOMPILED_RUNTIME) | 6793 #if defined(DART_PRECOMPILED_RUNTIME) |
6789 return true; | 6794 return true; |
6790 #else | 6795 #else |
6791 return false; | 6796 return false; |
6792 #endif | 6797 #endif |
6793 } | 6798 } |
6794 | 6799 |
6795 | 6800 |
6796 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { | 6801 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { |
6797 #ifndef PRODUCT | 6802 #ifndef PRODUCT |
6798 Profiler::DumpStackTrace(context); | 6803 Profiler::DumpStackTrace(context); |
6799 #endif | 6804 #endif |
6800 } | 6805 } |
6801 | 6806 |
6802 } // namespace dart | 6807 } // namespace dart |
OLD | NEW |