Index: runtime/vm/dart_api_impl_test.cc |
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc |
index be2415b5f76d61f0e6ee6a21d51bbc486f8193a8..fb28bed7b872b984a0e0c4397e968d3441db6c23 100644 |
--- a/runtime/vm/dart_api_impl_test.cc |
+++ b/runtime/vm/dart_api_impl_test.cc |
@@ -23,7 +23,6 @@ namespace dart { |
DECLARE_FLAG(bool, verify_acquired_data); |
DECLARE_FLAG(bool, ignore_patch_signature_mismatch); |
-DECLARE_FLAG(bool, support_externalizable_strings); |
DECLARE_FLAG(bool, use_dart_frontend); |
#ifndef PRODUCT |
@@ -5486,9 +5485,6 @@ static Dart_NativeFunction native_args_lookup(Dart_Handle name, |
} |
TEST_CASE(DartAPI_GetNativeArguments) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
const char* kScriptChars = |
"import 'dart:nativewrappers';" |
"class MyObject extends NativeFieldWrapperClass2 {" |
@@ -5518,13 +5514,9 @@ TEST_CASE(DartAPI_GetNativeArguments) { |
kScriptChars, |
reinterpret_cast<Dart_NativeEntryResolver>(native_args_lookup)); |
- intptr_t size; |
- Dart_Handle ascii_str = NewString("string"); |
- EXPECT_VALID(ascii_str); |
- EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size)); |
- uint8_t ext_ascii_str[10]; |
- Dart_Handle extstr = Dart_MakeExternalString( |
- ascii_str, ext_ascii_str, size, |
+ const char* ascii_str = "string"; |
+ Dart_Handle extstr = Dart_NewExternalLatin1String( |
+ reinterpret_cast<const uint8_t*>(ascii_str), strlen(ascii_str), |
reinterpret_cast<void*>(&native_arg_str_peer), NULL); |
Dart_Handle args[1]; |
@@ -5532,8 +5524,6 @@ TEST_CASE(DartAPI_GetNativeArguments) { |
Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args); |
EXPECT_VALID(result); |
EXPECT(Dart_IsInteger(result)); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
} |
static void NativeArgumentCounter(Dart_NativeArguments args) { |
@@ -8314,221 +8304,6 @@ TEST_CASE(DartAPI_CollectTwoOldSpacePeers) { |
} |
} |
-// Test API call to make strings external. |
-static void MakeExternalCback(void* peer) { |
- *static_cast<int*>(peer) *= 2; |
-} |
- |
-TEST_CASE(DartAPI_MakeExternalString) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- static int peer8 = 40; |
- static int peer16 = 41; |
- static int canonical_str_peer = 42; |
- intptr_t length = 0; |
- intptr_t expected_length = 0; |
- { |
- Dart_EnterScope(); |
- |
- // First test some negative conditions. |
- uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'}; |
- const char* err = "string"; |
- Dart_Handle err_str = NewString(err); |
- Dart_Handle ext_err_str = |
- Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), NULL, NULL); |
- Dart_Handle result = Dart_MakeExternalString(Dart_Null(), data8, |
- ARRAY_SIZE(data8), NULL, NULL); |
- EXPECT(Dart_IsError(result)); // Null string object passed in. |
- result = |
- Dart_MakeExternalString(err_str, NULL, ARRAY_SIZE(data8), NULL, NULL); |
- EXPECT(Dart_IsError(result)); // Null array pointer passed in. |
- result = Dart_MakeExternalString(err_str, data8, 1, NULL, NULL); |
- EXPECT(Dart_IsError(result)); // Invalid length passed in. |
- |
- const intptr_t kLength = 10; |
- intptr_t size = 0; |
- |
- // Test with an external string. |
- result = Dart_MakeExternalString(ext_err_str, data8, ARRAY_SIZE(data8), |
- NULL, NULL); |
- EXPECT(Dart_IsString(result)); |
- EXPECT(Dart_IsExternalString(result)); |
- |
- // Test with an empty string. |
- Dart_Handle empty_str = NewString(""); |
- EXPECT(Dart_IsString(empty_str)); |
- EXPECT(!Dart_IsExternalString(empty_str)); |
- uint8_t ext_empty_str[kLength]; |
- Dart_Handle str = |
- Dart_MakeExternalString(empty_str, ext_empty_str, kLength, NULL, NULL); |
- EXPECT(Dart_IsString(str)); |
- EXPECT(Dart_IsString(empty_str)); |
- EXPECT(Dart_IsStringLatin1(str)); |
- EXPECT(Dart_IsStringLatin1(empty_str)); |
- EXPECT(Dart_IsExternalString(str)); |
- EXPECT(Dart_IsExternalString(empty_str)); |
- EXPECT_VALID(Dart_StringLength(str, &length)); |
- EXPECT_EQ(0, length); |
- |
- // Test with single character canonical string, it should not become |
- // external string but the peer should be setup for it. |
- Dart_Handle canonical_str = |
- Api::NewHandle(thread, Symbols::New(thread, "*")); |
- EXPECT(Dart_IsString(canonical_str)); |
- EXPECT(!Dart_IsExternalString(canonical_str)); |
- uint8_t ext_canonical_str[kLength]; |
- str = Dart_MakeExternalString(canonical_str, ext_canonical_str, kLength, |
- &canonical_str_peer, MakeExternalCback); |
- EXPECT(Dart_IsString(str)); |
- EXPECT(!Dart_IsExternalString(canonical_str)); |
- EXPECT_EQ(canonical_str, str); |
- EXPECT(Dart_IsString(canonical_str)); |
- EXPECT(!Dart_IsExternalString(canonical_str)); |
- void* peer; |
- EXPECT_VALID(Dart_StringGetProperties(str, &size, &length, &peer)); |
- EXPECT_EQ(1, size); |
- EXPECT_EQ(1, length); |
- EXPECT_EQ(reinterpret_cast<void*>(&canonical_str_peer), peer); |
- |
- // Test with a one byte ascii string. |
- const char* ascii = "?unseen"; |
- expected_length = strlen(ascii); |
- Dart_Handle ascii_str = NewString(ascii); |
- EXPECT_VALID(ascii_str); |
- EXPECT(Dart_IsString(ascii_str)); |
- EXPECT(Dart_IsStringLatin1(ascii_str)); |
- EXPECT(!Dart_IsExternalString(ascii_str)); |
- EXPECT_VALID(Dart_StringLength(ascii_str, &length)); |
- EXPECT_EQ(expected_length, length); |
- |
- uint8_t ext_ascii_str[kLength]; |
- EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size)); |
- str = Dart_MakeExternalString(ascii_str, ext_ascii_str, size, &peer8, |
- MakeExternalCback); |
- EXPECT(Dart_IsString(str)); |
- EXPECT(Dart_IsString(ascii_str)); |
- EXPECT(Dart_IsStringLatin1(str)); |
- EXPECT(Dart_IsStringLatin1(ascii_str)); |
- EXPECT(Dart_IsExternalString(str)); |
- EXPECT(Dart_IsExternalString(ascii_str)); |
- EXPECT_VALID(Dart_StringLength(str, &length)); |
- EXPECT_EQ(expected_length, length); |
- EXPECT_VALID(Dart_StringLength(ascii_str, &length)); |
- EXPECT_EQ(expected_length, length); |
- EXPECT(Dart_IdentityEquals(str, ascii_str)); |
- for (intptr_t i = 0; i < length; i++) { |
- EXPECT_EQ(ascii[i], ext_ascii_str[i]); |
- } |
- |
- uint8_t data[] = {0xE4, 0xBA, 0x8c}; // U+4E8C. |
- expected_length = 1; |
- Dart_Handle utf16_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data)); |
- EXPECT_VALID(utf16_str); |
- EXPECT(Dart_IsString(utf16_str)); |
- EXPECT(!Dart_IsStringLatin1(utf16_str)); |
- EXPECT(!Dart_IsExternalString(utf16_str)); |
- EXPECT_VALID(Dart_StringLength(utf16_str, &length)); |
- EXPECT_EQ(expected_length, length); |
- |
- // Test with a two byte string. |
- uint16_t ext_utf16_str[kLength]; |
- EXPECT_VALID(Dart_StringStorageSize(utf16_str, &size)); |
- str = Dart_MakeExternalString(utf16_str, ext_utf16_str, size, &peer16, |
- MakeExternalCback); |
- EXPECT(Dart_IsString(str)); |
- EXPECT(Dart_IsString(utf16_str)); |
- EXPECT(!Dart_IsStringLatin1(str)); |
- EXPECT(!Dart_IsStringLatin1(utf16_str)); |
- EXPECT(Dart_IsExternalString(str)); |
- EXPECT(Dart_IsExternalString(utf16_str)); |
- EXPECT_VALID(Dart_StringLength(str, &length)); |
- EXPECT_EQ(expected_length, length); |
- EXPECT_VALID(Dart_StringLength(utf16_str, &length)); |
- EXPECT_EQ(expected_length, length); |
- EXPECT(Dart_IdentityEquals(str, utf16_str)); |
- for (intptr_t i = 0; i < length; i++) { |
- EXPECT_EQ(0x4e8c, ext_utf16_str[i]); |
- } |
- |
- Zone* zone = thread->zone(); |
- // Test with a symbol (hash value should be preserved on externalization). |
- const char* symbol_ascii = "?unseen"; |
- expected_length = strlen(symbol_ascii); |
- Dart_Handle symbol_str = Api::NewHandle( |
- thread, Symbols::New(thread, symbol_ascii, expected_length)); |
- EXPECT_VALID(symbol_str); |
- EXPECT(Dart_IsString(symbol_str)); |
- EXPECT(Dart_IsStringLatin1(symbol_str)); |
- EXPECT(!Dart_IsExternalString(symbol_str)); |
- EXPECT_VALID(Dart_StringLength(symbol_str, &length)); |
- EXPECT_EQ(expected_length, length); |
- EXPECT(Api::UnwrapStringHandle(zone, symbol_str).HasHash()); |
- |
- uint8_t ext_symbol_ascii[kLength]; |
- EXPECT_VALID(Dart_StringStorageSize(symbol_str, &size)); |
- str = Dart_MakeExternalString(symbol_str, ext_symbol_ascii, size, &peer8, |
- MakeExternalCback); |
- EXPECT(Api::UnwrapStringHandle(zone, str).HasHash()); |
- EXPECT(Api::UnwrapStringHandle(zone, str).Hash() == |
- Api::UnwrapStringHandle(zone, symbol_str).Hash()); |
- EXPECT(Dart_IsString(str)); |
- EXPECT(Dart_IsString(symbol_str)); |
- EXPECT(Dart_IsStringLatin1(str)); |
- EXPECT(Dart_IsStringLatin1(symbol_str)); |
- EXPECT(Dart_IsExternalString(str)); |
- EXPECT(Dart_IsExternalString(symbol_str)); |
- EXPECT_VALID(Dart_StringLength(str, &length)); |
- EXPECT_EQ(expected_length, length); |
- EXPECT_VALID(Dart_StringLength(symbol_str, &length)); |
- EXPECT_EQ(expected_length, length); |
- EXPECT(Dart_IdentityEquals(str, symbol_str)); |
- for (intptr_t i = 0; i < length; i++) { |
- EXPECT_EQ(symbol_ascii[i], ext_symbol_ascii[i]); |
- } |
- |
- Dart_ExitScope(); |
- } |
- EXPECT_EQ(40, peer8); |
- EXPECT_EQ(41, peer16); |
- EXPECT_EQ(42, canonical_str_peer); |
- { |
- TransitionNativeToVM transition(thread); |
- Isolate::Current()->heap()->CollectAllGarbage(); |
- GCTestHelper::WaitForGCTasks(); |
- } |
- EXPECT_EQ(80, peer8); |
- EXPECT_EQ(82, peer16); |
- EXPECT_EQ(42, canonical_str_peer); // "*" Symbol is not removed on GC. |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalizeConstantStrings) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "String testMain() {\n" |
- " return 'constant string';\n" |
- "}\n"; |
- |
- Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
- Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); |
- const char* expected_str = "constant string"; |
- const intptr_t kExpectedLen = 15; |
- uint8_t ext_str[kExpectedLen]; |
- Dart_Handle str = |
- Dart_MakeExternalString(result, ext_str, kExpectedLen, NULL, NULL); |
- |
- EXPECT(Dart_IsExternalString(str)); |
- for (intptr_t i = 0; i < kExpectedLen; i++) { |
- EXPECT_EQ(expected_str[i], ext_str[i]); |
- } |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
TEST_CASE(DartAPI_LazyLoadDeoptimizes) { |
const char* kLoadFirst = |
"library L;\n" |
@@ -8571,318 +8346,6 @@ TEST_CASE(DartAPI_LazyLoadDeoptimizes) { |
EXPECT_VALID(result); |
} |
-// Test external strings and optimized code. |
-static void ExternalStringDeoptimize_Finalize(void* peer) { |
- delete[] reinterpret_cast<char*>(peer); |
-} |
- |
-static void A_change_str_native(Dart_NativeArguments args) { |
- Dart_EnterScope(); |
- Dart_Handle str = Dart_GetNativeArgument(args, 0); |
- EXPECT(Dart_IsString(str)); |
- void* peer; |
- Dart_Handle str_arg = Dart_GetNativeStringArgument(args, 0, &peer); |
- EXPECT(Dart_IsString(str_arg)); |
- EXPECT(!peer); |
- intptr_t size = 0; |
- EXPECT_VALID(Dart_StringStorageSize(str, &size)); |
- intptr_t arg_size = 0; |
- EXPECT_VALID(Dart_StringStorageSize(str_arg, &arg_size)); |
- EXPECT_EQ(size, arg_size); |
- char* str_data = new char[size]; |
- Dart_Handle result = Dart_MakeExternalString( |
- str, str_data, size, str_data, &ExternalStringDeoptimize_Finalize); |
- EXPECT_VALID(result); |
- EXPECT(Dart_IsExternalString(result)); |
- Dart_ExitScope(); |
-} |
- |
-static Dart_NativeFunction ExternalStringDeoptimize_native_lookup( |
- Dart_Handle name, |
- int argument_count, |
- bool* auto_setup_scope) { |
- ASSERT(auto_setup_scope != NULL); |
- *auto_setup_scope = true; |
- return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native); |
-} |
- |
-// Do not use guarding mechanism on externalizable classes, since their class |
-// can change on the fly, |
-TEST_CASE(DartAPI_GuardExternalizedString) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "main() {\n" |
- " var a = new A('hello');\n" |
- " var res = runOne(a);\n" |
- " if (res != 10640000) return -1;\n" |
- " change_str(a.f);\n" |
- " res = runOne(a);\n" |
- " return res;\n" |
- "}\n" |
- "runOne(a) {\n" |
- " var sum = 0;\n" |
- " for (int i = 0; i < 20000; i++) {\n" |
- " for (int j = 0; j < a.f.length; j++) {\n" |
- " sum += a.f.codeUnitAt(j);\n" |
- " }\n" |
- " }\n" |
- " return sum;\n" |
- "}\n" |
- "class A {\n" |
- " var f;\n" |
- " A(this.f);\n" |
- "}\n" |
- "change_str(String s) native 'A_change_str';\n" |
- ""; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- int64_t value = 0; |
- result = Dart_IntegerToInt64(result, &value); |
- EXPECT_VALID(result); |
- EXPECT_EQ(10640000, value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalStringDeoptimize) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "String str = 'A';\n" |
- "class A {\n" |
- " static change_str(String s) native 'A_change_str';\n" |
- "}\n" |
- "sum_chars(String s, bool b) {\n" |
- " var result = 0;\n" |
- " for (var i = 0; i < s.length; i++) {\n" |
- " if (b && i == 0) A.change_str(str);\n" |
- " result += s.codeUnitAt(i);" |
- " }\n" |
- " return result;\n" |
- "}\n" |
- "main() {\n" |
- " str = '$str$str';\n" |
- " for (var i = 0; i < 2000; i++) sum_chars(str, false);\n" |
- " var x = sum_chars(str, false);\n" |
- " var y = sum_chars(str, true);\n" |
- " return x + y;\n" |
- "}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- int64_t value = 0; |
- result = Dart_IntegerToInt64(result, &value); |
- EXPECT_VALID(result); |
- EXPECT_EQ(260, value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalStringPolymorphicDeoptimize) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "const strA = 'AAAA';\n" |
- "class A {\n" |
- " static change_str(String s) native 'A_change_str';\n" |
- "}\n" |
- "compare(a, b, [i = 0]) {\n" |
- " return a.codeUnitAt(i) == b.codeUnitAt(i);\n" |
- "}\n" |
- "compareA(b, [i = 0]) {\n" |
- " return compare(strA, b, i);\n" |
- "}\n" |
- "main() {\n" |
- " var externalA = 'AA' + 'AA';\n" |
- " A.change_str(externalA);\n" |
- " compare('AA' + 'AA', strA);\n" |
- " compare(externalA, strA);\n" |
- " for (var i = 0; i < 10000; i++) compareA(strA);\n" |
- " A.change_str(strA);\n" |
- " return compareA('AA' + 'AA');\n" |
- "}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- EXPECT_VALID(result); |
- bool value = false; |
- result = Dart_BooleanValue(result, &value); |
- EXPECT_VALID(result); |
- EXPECT(value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalStringLoadElimination) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "class A {\n" |
- " static change_str(String s) native 'A_change_str';\n" |
- "}\n" |
- "double_char0(str) {\n" |
- " return str.codeUnitAt(0) + str.codeUnitAt(0);\n" |
- "}\n" |
- "main() {\n" |
- " var externalA = 'AA' + 'AA';\n" |
- " A.change_str(externalA);\n" |
- " for (var i = 0; i < 10000; i++) double_char0(externalA);\n" |
- " var result = double_char0(externalA);\n" |
- " return result == 130;\n" |
- "}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- EXPECT_VALID(result); |
- bool value = false; |
- result = Dart_BooleanValue(result, &value); |
- EXPECT_VALID(result); |
- EXPECT(value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalStringGuardFieldDeoptimize) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "const strA = 'AAAA';\n" |
- "class A {\n" |
- " static change_str(String s) native 'A_change_str';\n" |
- "}\n" |
- "class G { var f = 'A'; }\n" |
- "final guard = new G();\n" |
- "var shouldExternalize = false;\n" |
- "ext() { if (shouldExternalize) A.change_str(strA); }\n" |
- "compare(a, b, [i = 0]) {\n" |
- " guard.f = a;\n" |
- " ext();" |
- " return a.codeUnitAt(i) == b.codeUnitAt(i);\n" |
- "}\n" |
- "compareA(b, [i = 0]) {\n" |
- " return compare(strA, b, i);\n" |
- "}\n" |
- "main() {\n" |
- " var externalA = 'AA' + 'AA';\n" |
- " A.change_str(externalA);\n" |
- " compare('AA' + 'AA', strA);\n" |
- " for (var i = 0; i < 10000; i++) compareA(strA);\n" |
- " shouldExternalize = true;\n" |
- " return compareA('AA' + 'AA');\n" |
- "}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- EXPECT_VALID(result); |
- bool value = false; |
- result = Dart_BooleanValue(result, &value); |
- EXPECT_VALID(result); |
- EXPECT(value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalStringStaticFieldDeoptimize) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "const strA = 'AAAA';\n" |
- "class A {\n" |
- " static change_str(String s) native 'A_change_str';\n" |
- "}\n" |
- "class G { static final f = strA; }\n" |
- "compare(a, b, [i = 0]) {\n" |
- " return a.codeUnitAt(i) == b.codeUnitAt(i);\n" |
- "}\n" |
- "compareA(b, [i = 0]) {\n" |
- " return compare(G.f, b, i);\n" |
- "}\n" |
- "main() {\n" |
- " var externalA = 'AA' + 'AA';\n" |
- " A.change_str(externalA);\n" |
- " compare('AA' + 'AA', strA);\n" |
- " for (var i = 0; i < 10000; i++) compareA(strA);\n" |
- " A.change_str(G.f);" |
- " return compareA('AA' + 'AA');\n" |
- "}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- EXPECT_VALID(result); |
- bool value = false; |
- result = Dart_BooleanValue(result, &value); |
- EXPECT_VALID(result); |
- EXPECT(value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalStringTrimDoubleParse) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "String str = 'A';\n" |
- "class A {\n" |
- " static change_str(String s) native 'A_change_str';\n" |
- "}\n" |
- "main() {\n" |
- " var externalOneByteString = ' 0.2\\xA0 ';\n;" |
- " A.change_str(externalOneByteString);\n" |
- " var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n" |
- " A.change_str(externalTwoByteString);\n" |
- " var x = double.parse(externalOneByteString);\n" |
- " var y = double.parse(externalTwoByteString);\n" |
- " return ((x + y) * 10).toInt();\n" |
- "}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- int64_t value = 0; |
- result = Dart_IntegerToInt64(result, &value); |
- EXPECT_VALID(result); |
- EXPECT_EQ(8, value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
-TEST_CASE(DartAPI_ExternalStringDoubleParse) { |
- const bool saved_flag = FLAG_support_externalizable_strings; |
- FLAG_support_externalizable_strings = true; |
- |
- const char* kScriptChars = |
- "String str = 'A';\n" |
- "class A {\n" |
- " static change_str(String s) native 'A_change_str';\n" |
- "}\n" |
- "main() {\n" |
- " var externalOneByteString = '0.2';\n;" |
- " A.change_str(externalOneByteString);\n" |
- " var externalTwoByteString = '0.6';\n" |
- " A.change_str(externalTwoByteString);\n" |
- " var x = double.parse(externalOneByteString);\n" |
- " var y = double.parse(externalTwoByteString);\n" |
- " return ((x + y) * 10).toInt();\n" |
- "}\n"; |
- Dart_Handle lib = TestCase::LoadTestScript( |
- kScriptChars, &ExternalStringDeoptimize_native_lookup); |
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
- int64_t value = 0; |
- result = Dart_IntegerToInt64(result, &value); |
- EXPECT_VALID(result); |
- EXPECT_EQ(8, value); |
- |
- FLAG_support_externalizable_strings = saved_flag; |
-} |
- |
TEST_CASE(DartAPI_ExternalStringIndexOf) { |
const char* kScriptChars = |
"main(String pattern) {\n" |