| 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"
|
|
|