| 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 "lib/stacktrace.h" | 9 #include "lib/stacktrace.h" |
| 10 #include "platform/assert.h" | 10 #include "platform/assert.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 #if defined(DART_NO_SNAPSHOT) | 64 #if defined(DART_NO_SNAPSHOT) |
| 65 DEFINE_FLAG(bool, | 65 DEFINE_FLAG(bool, |
| 66 check_function_fingerprints, | 66 check_function_fingerprints, |
| 67 true, | 67 true, |
| 68 "Check function fingerprints"); | 68 "Check function fingerprints"); |
| 69 #endif // defined(DART_NO_SNAPSHOT). | 69 #endif // defined(DART_NO_SNAPSHOT). |
| 70 DEFINE_FLAG(bool, | 70 DEFINE_FLAG(bool, |
| 71 verify_acquired_data, | 71 verify_acquired_data, |
| 72 false, | 72 false, |
| 73 "Verify correct API acquire/release of typed data."); | 73 "Verify correct API acquire/release of typed data."); |
| 74 DEFINE_FLAG(bool, | |
| 75 support_externalizable_strings, | |
| 76 false, | |
| 77 "Support Dart_MakeExternalString."); | |
| 78 | 74 |
| 79 ThreadLocalKey Api::api_native_key_ = kUnsetThreadLocalKey; | 75 ThreadLocalKey Api::api_native_key_ = kUnsetThreadLocalKey; |
| 80 Dart_Handle Api::true_handle_ = NULL; | 76 Dart_Handle Api::true_handle_ = NULL; |
| 81 Dart_Handle Api::false_handle_ = NULL; | 77 Dart_Handle Api::false_handle_ = NULL; |
| 82 Dart_Handle Api::null_handle_ = NULL; | 78 Dart_Handle Api::null_handle_ = NULL; |
| 83 Dart_Handle Api::empty_string_handle_ = NULL; | 79 Dart_Handle Api::empty_string_handle_ = NULL; |
| 84 | 80 |
| 85 const char* CanonicalFunction(const char* func) { | 81 const char* CanonicalFunction(const char* func) { |
| 86 if (strncmp(func, "dart::", 6) == 0) { | 82 if (strncmp(func, "dart::", 6) == 0) { |
| 87 return func + 6; | 83 return func + 6; |
| (...skipping 2380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2468 if (str_obj.IsNull()) { | 2464 if (str_obj.IsNull()) { |
| 2469 RETURN_TYPE_ERROR(thread->zone(), str, String); | 2465 RETURN_TYPE_ERROR(thread->zone(), str, String); |
| 2470 } | 2466 } |
| 2471 if (size == NULL) { | 2467 if (size == NULL) { |
| 2472 RETURN_NULL_ERROR(size); | 2468 RETURN_NULL_ERROR(size); |
| 2473 } | 2469 } |
| 2474 *size = (str_obj.Length() * str_obj.CharSize()); | 2470 *size = (str_obj.Length() * str_obj.CharSize()); |
| 2475 return Api::Success(); | 2471 return Api::Success(); |
| 2476 } | 2472 } |
| 2477 | 2473 |
| 2478 DART_EXPORT Dart_Handle Dart_MakeExternalString(Dart_Handle str, | |
| 2479 void* array, | |
| 2480 intptr_t external_size, | |
| 2481 void* peer, | |
| 2482 Dart_PeerFinalizer cback) { | |
| 2483 DARTSCOPE(Thread::Current()); | |
| 2484 if (!FLAG_support_externalizable_strings) { | |
| 2485 return Api::NewError( | |
| 2486 "Dart_MakeExternalString with " | |
| 2487 "--support_externalizable_strings=false"); | |
| 2488 } | |
| 2489 const String& str_obj = Api::UnwrapStringHandle(Z, str); | |
| 2490 if (str_obj.IsExternal()) { | |
| 2491 return str; // String is already an external string. | |
| 2492 } | |
| 2493 if (str_obj.IsNull()) { | |
| 2494 RETURN_TYPE_ERROR(Z, str, String); | |
| 2495 } | |
| 2496 if (array == NULL) { | |
| 2497 RETURN_NULL_ERROR(array); | |
| 2498 } | |
| 2499 intptr_t str_size = (str_obj.Length() * str_obj.CharSize()); | |
| 2500 if ((external_size < str_size) || (external_size > String::kMaxElements)) { | |
| 2501 return Api::NewError( | |
| 2502 "Dart_MakeExternalString " | |
| 2503 "expects argument external_size to be in the range" | |
| 2504 "[%" Pd "..%" Pd "].", | |
| 2505 str_size, String::kMaxElements); | |
| 2506 } | |
| 2507 if (str_obj.InVMHeap()) { | |
| 2508 // Since the string object is read only we do not externalize | |
| 2509 // the string but instead copy the contents of the string into the | |
| 2510 // specified buffer add the specified peer/cback as a Peer object | |
| 2511 // to this string. The Api::StringGetPeerHelper function picks up | |
| 2512 // the peer from the Peer table. | |
| 2513 intptr_t copy_len = str_obj.Length(); | |
| 2514 if (str_obj.IsOneByteString()) { | |
| 2515 ASSERT(external_size >= copy_len); | |
| 2516 uint8_t* latin1_array = reinterpret_cast<uint8_t*>(array); | |
| 2517 for (intptr_t i = 0; i < copy_len; i++) { | |
| 2518 latin1_array[i] = static_cast<uint8_t>(str_obj.CharAt(i)); | |
| 2519 } | |
| 2520 OneByteString::SetPeer(str_obj, external_size, peer, cback); | |
| 2521 } else { | |
| 2522 ASSERT(str_obj.IsTwoByteString()); | |
| 2523 ASSERT(external_size >= (copy_len * str_obj.CharSize())); | |
| 2524 uint16_t* utf16_array = reinterpret_cast<uint16_t*>(array); | |
| 2525 for (intptr_t i = 0; i < copy_len; i++) { | |
| 2526 utf16_array[i] = str_obj.CharAt(i); | |
| 2527 } | |
| 2528 TwoByteString::SetPeer(str_obj, external_size, peer, cback); | |
| 2529 } | |
| 2530 return str; | |
| 2531 } | |
| 2532 return Api::NewHandle( | |
| 2533 T, str_obj.MakeExternal(array, external_size, peer, cback)); | |
| 2534 } | |
| 2535 | |
| 2536 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, | 2474 DART_EXPORT Dart_Handle Dart_StringGetProperties(Dart_Handle object, |
| 2537 intptr_t* char_size, | 2475 intptr_t* char_size, |
| 2538 intptr_t* str_len, | 2476 intptr_t* str_len, |
| 2539 void** peer) { | 2477 void** peer) { |
| 2540 Thread* thread = Thread::Current(); | 2478 Thread* thread = Thread::Current(); |
| 2541 CHECK_ISOLATE(thread->isolate()); | 2479 CHECK_ISOLATE(thread->isolate()); |
| 2542 ReusableObjectHandleScope reused_obj_handle(thread); | 2480 ReusableObjectHandleScope reused_obj_handle(thread); |
| 2543 const String& str = Api::UnwrapStringHandle(reused_obj_handle, object); | 2481 const String& str = Api::UnwrapStringHandle(reused_obj_handle, object); |
| 2544 if (str.IsNull()) { | 2482 if (str.IsNull()) { |
| 2545 RETURN_TYPE_ERROR(thread->zone(), object, String); | 2483 RETURN_TYPE_ERROR(thread->zone(), object, String); |
| (...skipping 4257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6803 #endif | 6741 #endif |
| 6804 } | 6742 } |
| 6805 | 6743 |
| 6806 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { | 6744 DART_EXPORT void Dart_DumpNativeStackTrace(void* context) { |
| 6807 #ifndef PRODUCT | 6745 #ifndef PRODUCT |
| 6808 Profiler::DumpStackTrace(context); | 6746 Profiler::DumpStackTrace(context); |
| 6809 #endif | 6747 #endif |
| 6810 } | 6748 } |
| 6811 | 6749 |
| 6812 } // namespace dart | 6750 } // namespace dart |
| OLD | NEW |