| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "bin/builtin.h" | 5 #include "bin/builtin.h" |
| 6 #include "vm/compiler.h" | 6 #include "vm/compiler.h" |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "include/dart_mirrors_api.h" | 8 #include "include/dart_mirrors_api.h" |
| 9 #include "include/dart_native_api.h" | 9 #include "include/dart_native_api.h" |
| 10 #include "include/dart_tools_api.h" | 10 #include "include/dart_tools_api.h" |
| 11 #include "platform/assert.h" | 11 #include "platform/assert.h" |
| 12 #include "platform/text_buffer.h" | 12 #include "platform/text_buffer.h" |
| 13 #include "platform/utils.h" | 13 #include "platform/utils.h" |
| 14 #include "vm/class_finalizer.h" | 14 #include "vm/class_finalizer.h" |
| 15 #include "vm/dart_api_impl.h" | 15 #include "vm/dart_api_impl.h" |
| 16 #include "vm/dart_api_state.h" | 16 #include "vm/dart_api_state.h" |
| 17 #include "vm/lockers.h" | 17 #include "vm/lockers.h" |
| 18 #include "vm/timeline.h" | 18 #include "vm/timeline.h" |
| 19 #include "vm/unit_test.h" | 19 #include "vm/unit_test.h" |
| 20 #include "vm/verifier.h" | 20 #include "vm/verifier.h" |
| 21 | 21 |
| 22 namespace dart { | 22 namespace dart { |
| 23 | 23 |
| 24 DECLARE_FLAG(bool, verify_acquired_data); | 24 DECLARE_FLAG(bool, verify_acquired_data); |
| 25 DECLARE_FLAG(bool, ignore_patch_signature_mismatch); | 25 DECLARE_FLAG(bool, ignore_patch_signature_mismatch); |
| 26 DECLARE_FLAG(bool, support_externalizable_strings); |
| 26 | 27 |
| 27 #ifndef PRODUCT | 28 #ifndef PRODUCT |
| 28 | 29 |
| 29 TEST_CASE(ErrorHandleBasics) { | 30 TEST_CASE(ErrorHandleBasics) { |
| 30 const char* kScriptChars = | 31 const char* kScriptChars = |
| 31 "void testMain() {\n" | 32 "void testMain() {\n" |
| 32 " throw new Exception(\"bad news\");\n" | 33 " throw new Exception(\"bad news\");\n" |
| 33 "}\n"; | 34 "}\n"; |
| 34 | 35 |
| 35 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 36 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| (...skipping 5532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5568 if (!strcmp(function_name, "NativeArgument_Create")) { | 5569 if (!strcmp(function_name, "NativeArgument_Create")) { |
| 5569 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentCreate); | 5570 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentCreate); |
| 5570 } else if (!strcmp(function_name, "NativeArgument_Access")) { | 5571 } else if (!strcmp(function_name, "NativeArgument_Access")) { |
| 5571 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentAccess); | 5572 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentAccess); |
| 5572 } | 5573 } |
| 5573 return NULL; | 5574 return NULL; |
| 5574 } | 5575 } |
| 5575 | 5576 |
| 5576 | 5577 |
| 5577 TEST_CASE(GetNativeArguments) { | 5578 TEST_CASE(GetNativeArguments) { |
| 5579 const bool saved_flag = FLAG_support_externalizable_strings; |
| 5580 FLAG_support_externalizable_strings = true; |
| 5581 |
| 5578 const char* kScriptChars = | 5582 const char* kScriptChars = |
| 5579 "import 'dart:nativewrappers';" | 5583 "import 'dart:nativewrappers';" |
| 5580 "class MyObject extends NativeFieldWrapperClass2 {" | 5584 "class MyObject extends NativeFieldWrapperClass2 {" |
| 5581 " static MyObject createObject() native 'NativeArgument_Create';" | 5585 " static MyObject createObject() native 'NativeArgument_Create';" |
| 5582 " int accessFields(int arg1," | 5586 " int accessFields(int arg1," |
| 5583 " int arg2," | 5587 " int arg2," |
| 5584 " bool arg3," | 5588 " bool arg3," |
| 5585 " double arg4," | 5589 " double arg4," |
| 5586 " String arg5," | 5590 " String arg5," |
| 5587 " String arg6," | 5591 " String arg6," |
| (...skipping 26 matching lines...) Expand all Loading... |
| 5614 ext_ascii_str, | 5618 ext_ascii_str, |
| 5615 size, | 5619 size, |
| 5616 reinterpret_cast<void*>(&native_arg_str_peer), | 5620 reinterpret_cast<void*>(&native_arg_str_peer), |
| 5617 NULL); | 5621 NULL); |
| 5618 | 5622 |
| 5619 Dart_Handle args[1]; | 5623 Dart_Handle args[1]; |
| 5620 args[0] = extstr; | 5624 args[0] = extstr; |
| 5621 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args); | 5625 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args); |
| 5622 EXPECT_VALID(result); | 5626 EXPECT_VALID(result); |
| 5623 EXPECT(Dart_IsInteger(result)); | 5627 EXPECT(Dart_IsInteger(result)); |
| 5628 |
| 5629 FLAG_support_externalizable_strings = saved_flag; |
| 5624 } | 5630 } |
| 5625 | 5631 |
| 5626 | 5632 |
| 5627 static void NativeArgumentCounter(Dart_NativeArguments args) { | 5633 static void NativeArgumentCounter(Dart_NativeArguments args) { |
| 5628 Dart_EnterScope(); | 5634 Dart_EnterScope(); |
| 5629 int count = Dart_GetNativeArgumentCount(args); | 5635 int count = Dart_GetNativeArgumentCount(args); |
| 5630 Dart_SetReturnValue(args, Dart_NewInteger(count)); | 5636 Dart_SetReturnValue(args, Dart_NewInteger(count)); |
| 5631 Dart_ExitScope(); | 5637 Dart_ExitScope(); |
| 5632 } | 5638 } |
| 5633 | 5639 |
| (...skipping 2856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8490 } | 8496 } |
| 8491 | 8497 |
| 8492 | 8498 |
| 8493 // Test API call to make strings external. | 8499 // Test API call to make strings external. |
| 8494 static void MakeExternalCback(void* peer) { | 8500 static void MakeExternalCback(void* peer) { |
| 8495 *static_cast<int*>(peer) *= 2; | 8501 *static_cast<int*>(peer) *= 2; |
| 8496 } | 8502 } |
| 8497 | 8503 |
| 8498 | 8504 |
| 8499 TEST_CASE(MakeExternalString) { | 8505 TEST_CASE(MakeExternalString) { |
| 8506 const bool saved_flag = FLAG_support_externalizable_strings; |
| 8507 FLAG_support_externalizable_strings = true; |
| 8508 |
| 8500 static int peer8 = 40; | 8509 static int peer8 = 40; |
| 8501 static int peer16 = 41; | 8510 static int peer16 = 41; |
| 8502 static int canonical_str_peer = 42; | 8511 static int canonical_str_peer = 42; |
| 8503 intptr_t length = 0; | 8512 intptr_t length = 0; |
| 8504 intptr_t expected_length = 0; | 8513 intptr_t expected_length = 0; |
| 8505 { | 8514 { |
| 8506 Dart_EnterScope(); | 8515 Dart_EnterScope(); |
| 8507 | 8516 |
| 8508 // First test some negative conditions. | 8517 // First test some negative conditions. |
| 8509 uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' }; | 8518 uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' }; |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8693 EXPECT_EQ(40, peer8); | 8702 EXPECT_EQ(40, peer8); |
| 8694 EXPECT_EQ(41, peer16); | 8703 EXPECT_EQ(41, peer16); |
| 8695 EXPECT_EQ(42, canonical_str_peer); | 8704 EXPECT_EQ(42, canonical_str_peer); |
| 8696 { | 8705 { |
| 8697 TransitionNativeToVM transition(thread); | 8706 TransitionNativeToVM transition(thread); |
| 8698 Isolate::Current()->heap()->CollectAllGarbage(); | 8707 Isolate::Current()->heap()->CollectAllGarbage(); |
| 8699 } | 8708 } |
| 8700 EXPECT_EQ(80, peer8); | 8709 EXPECT_EQ(80, peer8); |
| 8701 EXPECT_EQ(82, peer16); | 8710 EXPECT_EQ(82, peer16); |
| 8702 EXPECT_EQ(42, canonical_str_peer); // "*" Symbol is not removed on GC. | 8711 EXPECT_EQ(42, canonical_str_peer); // "*" Symbol is not removed on GC. |
| 8712 |
| 8713 FLAG_support_externalizable_strings = saved_flag; |
| 8703 } | 8714 } |
| 8704 | 8715 |
| 8705 | 8716 |
| 8706 TEST_CASE(ExternalizeConstantStrings) { | 8717 TEST_CASE(ExternalizeConstantStrings) { |
| 8718 const bool saved_flag = FLAG_support_externalizable_strings; |
| 8719 FLAG_support_externalizable_strings = true; |
| 8720 |
| 8707 const char* kScriptChars = | 8721 const char* kScriptChars = |
| 8708 "String testMain() {\n" | 8722 "String testMain() {\n" |
| 8709 " return 'constant string';\n" | 8723 " return 'constant string';\n" |
| 8710 "}\n"; | 8724 "}\n"; |
| 8711 | 8725 |
| 8712 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 8726 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 8713 Dart_Handle result = Dart_Invoke(lib, | 8727 Dart_Handle result = Dart_Invoke(lib, |
| 8714 NewString("testMain"), | 8728 NewString("testMain"), |
| 8715 0, | 8729 0, |
| 8716 NULL); | 8730 NULL); |
| 8717 const char* expected_str = "constant string"; | 8731 const char* expected_str = "constant string"; |
| 8718 const intptr_t kExpectedLen = 15; | 8732 const intptr_t kExpectedLen = 15; |
| 8719 uint8_t ext_str[kExpectedLen]; | 8733 uint8_t ext_str[kExpectedLen]; |
| 8720 Dart_Handle str = Dart_MakeExternalString(result, | 8734 Dart_Handle str = Dart_MakeExternalString(result, |
| 8721 ext_str, | 8735 ext_str, |
| 8722 kExpectedLen, | 8736 kExpectedLen, |
| 8723 NULL, | 8737 NULL, |
| 8724 NULL); | 8738 NULL); |
| 8725 | 8739 |
| 8726 EXPECT(Dart_IsExternalString(str)); | 8740 EXPECT(Dart_IsExternalString(str)); |
| 8727 for (intptr_t i = 0; i < kExpectedLen; i++) { | 8741 for (intptr_t i = 0; i < kExpectedLen; i++) { |
| 8728 EXPECT_EQ(expected_str[i], ext_str[i]); | 8742 EXPECT_EQ(expected_str[i], ext_str[i]); |
| 8729 } | 8743 } |
| 8744 |
| 8745 FLAG_support_externalizable_strings = saved_flag; |
| 8730 } | 8746 } |
| 8731 | 8747 |
| 8732 | 8748 |
| 8733 TEST_CASE(LazyLoadDeoptimizes) { | 8749 TEST_CASE(LazyLoadDeoptimizes) { |
| 8734 const char* kLoadFirst = | 8750 const char* kLoadFirst = |
| 8735 "library L;\n" | 8751 "library L;\n" |
| 8736 "start(a) {\n" | 8752 "start(a) {\n" |
| 8737 " var obj = (a == 1) ? createB() : new A();\n" | 8753 " var obj = (a == 1) ? createB() : new A();\n" |
| 8738 " for (int i = 0; i < 4000; i++) {\n" | 8754 " for (int i = 0; i < 4000; i++) {\n" |
| 8739 " var res = obj.foo();\n" | 8755 " var res = obj.foo();\n" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8809 Dart_Handle name, int argument_count, bool* auto_setup_scope) { | 8825 Dart_Handle name, int argument_count, bool* auto_setup_scope) { |
| 8810 ASSERT(auto_setup_scope != NULL); | 8826 ASSERT(auto_setup_scope != NULL); |
| 8811 *auto_setup_scope = true; | 8827 *auto_setup_scope = true; |
| 8812 return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native); | 8828 return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native); |
| 8813 } | 8829 } |
| 8814 | 8830 |
| 8815 | 8831 |
| 8816 // Do not use guarding mechanism on externalizable classes, since their class | 8832 // Do not use guarding mechanism on externalizable classes, since their class |
| 8817 // can change on the fly, | 8833 // can change on the fly, |
| 8818 TEST_CASE(GuardExternalizedString) { | 8834 TEST_CASE(GuardExternalizedString) { |
| 8835 const bool saved_flag = FLAG_support_externalizable_strings; |
| 8836 FLAG_support_externalizable_strings = true; |
| 8837 |
| 8819 const char* kScriptChars = | 8838 const char* kScriptChars = |
| 8820 "main() {\n" | 8839 "main() {\n" |
| 8821 " var a = new A('hello');\n" | 8840 " var a = new A('hello');\n" |
| 8822 " var res = runOne(a);\n" | 8841 " var res = runOne(a);\n" |
| 8823 " if (res != 10640000) return -1;\n" | 8842 " if (res != 10640000) return -1;\n" |
| 8824 " change_str(a.f);\n" | 8843 " change_str(a.f);\n" |
| 8825 " res = runOne(a);\n" | 8844 " res = runOne(a);\n" |
| 8826 " return res;\n" | 8845 " return res;\n" |
| 8827 "}\n" | 8846 "}\n" |
| 8828 "runOne(a) {\n" | 8847 "runOne(a) {\n" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 8844 TestCase::LoadTestScript(kScriptChars, | 8863 TestCase::LoadTestScript(kScriptChars, |
| 8845 &ExternalStringDeoptimize_native_lookup); | 8864 &ExternalStringDeoptimize_native_lookup); |
| 8846 Dart_Handle result = Dart_Invoke(lib, | 8865 Dart_Handle result = Dart_Invoke(lib, |
| 8847 NewString("main"), | 8866 NewString("main"), |
| 8848 0, | 8867 0, |
| 8849 NULL); | 8868 NULL); |
| 8850 int64_t value = 0; | 8869 int64_t value = 0; |
| 8851 result = Dart_IntegerToInt64(result, &value); | 8870 result = Dart_IntegerToInt64(result, &value); |
| 8852 EXPECT_VALID(result); | 8871 EXPECT_VALID(result); |
| 8853 EXPECT_EQ(10640000, value); | 8872 EXPECT_EQ(10640000, value); |
| 8873 |
| 8874 FLAG_support_externalizable_strings = saved_flag; |
| 8854 } | 8875 } |
| 8855 | 8876 |
| 8856 | 8877 |
| 8857 TEST_CASE(ExternalStringDeoptimize) { | 8878 TEST_CASE(ExternalStringDeoptimize) { |
| 8879 const bool saved_flag = FLAG_support_externalizable_strings; |
| 8880 FLAG_support_externalizable_strings = true; |
| 8881 |
| 8858 const char* kScriptChars = | 8882 const char* kScriptChars = |
| 8859 "String str = 'A';\n" | 8883 "String str = 'A';\n" |
| 8860 "class A {\n" | 8884 "class A {\n" |
| 8861 " static change_str(String s) native 'A_change_str';\n" | 8885 " static change_str(String s) native 'A_change_str';\n" |
| 8862 "}\n" | 8886 "}\n" |
| 8863 "sum_chars(String s, bool b) {\n" | 8887 "sum_chars(String s, bool b) {\n" |
| 8864 " var result = 0;\n" | 8888 " var result = 0;\n" |
| 8865 " for (var i = 0; i < s.length; i++) {\n" | 8889 " for (var i = 0; i < s.length; i++) {\n" |
| 8866 " if (b && i == 0) A.change_str(str);\n" | 8890 " if (b && i == 0) A.change_str(str);\n" |
| 8867 " result += s.codeUnitAt(i);" | 8891 " result += s.codeUnitAt(i);" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 8879 TestCase::LoadTestScript(kScriptChars, | 8903 TestCase::LoadTestScript(kScriptChars, |
| 8880 &ExternalStringDeoptimize_native_lookup); | 8904 &ExternalStringDeoptimize_native_lookup); |
| 8881 Dart_Handle result = Dart_Invoke(lib, | 8905 Dart_Handle result = Dart_Invoke(lib, |
| 8882 NewString("main"), | 8906 NewString("main"), |
| 8883 0, | 8907 0, |
| 8884 NULL); | 8908 NULL); |
| 8885 int64_t value = 0; | 8909 int64_t value = 0; |
| 8886 result = Dart_IntegerToInt64(result, &value); | 8910 result = Dart_IntegerToInt64(result, &value); |
| 8887 EXPECT_VALID(result); | 8911 EXPECT_VALID(result); |
| 8888 EXPECT_EQ(260, value); | 8912 EXPECT_EQ(260, value); |
| 8913 |
| 8914 FLAG_support_externalizable_strings = saved_flag; |
| 8889 } | 8915 } |
| 8890 | 8916 |
| 8891 | 8917 |
| 8892 TEST_CASE(ExternalStringPolymorphicDeoptimize) { | 8918 TEST_CASE(ExternalStringPolymorphicDeoptimize) { |
| 8919 const bool saved_flag = FLAG_support_externalizable_strings; |
| 8920 FLAG_support_externalizable_strings = true; |
| 8921 |
| 8893 const char* kScriptChars = | 8922 const char* kScriptChars = |
| 8894 "const strA = 'AAAA';\n" | 8923 "const strA = 'AAAA';\n" |
| 8895 "class A {\n" | 8924 "class A {\n" |
| 8896 " static change_str(String s) native 'A_change_str';\n" | 8925 " static change_str(String s) native 'A_change_str';\n" |
| 8897 "}\n" | 8926 "}\n" |
| 8898 "compare(a, b, [i = 0]) {\n" | 8927 "compare(a, b, [i = 0]) {\n" |
| 8899 " return a.codeUnitAt(i) == b.codeUnitAt(i);\n" | 8928 " return a.codeUnitAt(i) == b.codeUnitAt(i);\n" |
| 8900 "}\n" | 8929 "}\n" |
| 8901 "compareA(b, [i = 0]) {\n" | 8930 "compareA(b, [i = 0]) {\n" |
| 8902 " return compare(strA, b, i);\n" | 8931 " return compare(strA, b, i);\n" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 8915 &ExternalStringDeoptimize_native_lookup); | 8944 &ExternalStringDeoptimize_native_lookup); |
| 8916 Dart_Handle result = Dart_Invoke(lib, | 8945 Dart_Handle result = Dart_Invoke(lib, |
| 8917 NewString("main"), | 8946 NewString("main"), |
| 8918 0, | 8947 0, |
| 8919 NULL); | 8948 NULL); |
| 8920 EXPECT_VALID(result); | 8949 EXPECT_VALID(result); |
| 8921 bool value = false; | 8950 bool value = false; |
| 8922 result = Dart_BooleanValue(result, &value); | 8951 result = Dart_BooleanValue(result, &value); |
| 8923 EXPECT_VALID(result); | 8952 EXPECT_VALID(result); |
| 8924 EXPECT(value); | 8953 EXPECT(value); |
| 8954 |
| 8955 FLAG_support_externalizable_strings = saved_flag; |
| 8925 } | 8956 } |
| 8926 | 8957 |
| 8927 | 8958 |
| 8928 TEST_CASE(ExternalStringGuardFieldDeoptimize) { | 8959 TEST_CASE(ExternalStringGuardFieldDeoptimize) { |
| 8960 const bool saved_flag = FLAG_support_externalizable_strings; |
| 8961 FLAG_support_externalizable_strings = true; |
| 8962 |
| 8929 const char* kScriptChars = | 8963 const char* kScriptChars = |
| 8930 "const strA = 'AAAA';\n" | 8964 "const strA = 'AAAA';\n" |
| 8931 "class A {\n" | 8965 "class A {\n" |
| 8932 " static change_str(String s) native 'A_change_str';\n" | 8966 " static change_str(String s) native 'A_change_str';\n" |
| 8933 "}\n" | 8967 "}\n" |
| 8934 "class G { var f = 'A'; }\n" | 8968 "class G { var f = 'A'; }\n" |
| 8935 "final guard = new G();\n" | 8969 "final guard = new G();\n" |
| 8936 "var shouldExternalize = false;\n" | 8970 "var shouldExternalize = false;\n" |
| 8937 "ext() { if (shouldExternalize) A.change_str(strA); }\n" | 8971 "ext() { if (shouldExternalize) A.change_str(strA); }\n" |
| 8938 "compare(a, b, [i = 0]) {\n" | 8972 "compare(a, b, [i = 0]) {\n" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 8956 &ExternalStringDeoptimize_native_lookup); | 8990 &ExternalStringDeoptimize_native_lookup); |
| 8957 Dart_Handle result = Dart_Invoke(lib, | 8991 Dart_Handle result = Dart_Invoke(lib, |
| 8958 NewString("main"), | 8992 NewString("main"), |
| 8959 0, | 8993 0, |
| 8960 NULL); | 8994 NULL); |
| 8961 EXPECT_VALID(result); | 8995 EXPECT_VALID(result); |
| 8962 bool value = false; | 8996 bool value = false; |
| 8963 result = Dart_BooleanValue(result, &value); | 8997 result = Dart_BooleanValue(result, &value); |
| 8964 EXPECT_VALID(result); | 8998 EXPECT_VALID(result); |
| 8965 EXPECT(value); | 8999 EXPECT(value); |
| 9000 |
| 9001 FLAG_support_externalizable_strings = saved_flag; |
| 8966 } | 9002 } |
| 8967 | 9003 |
| 8968 | 9004 |
| 8969 TEST_CASE(ExternalStringStaticFieldDeoptimize) { | 9005 TEST_CASE(ExternalStringStaticFieldDeoptimize) { |
| 9006 const bool saved_flag = FLAG_support_externalizable_strings; |
| 9007 FLAG_support_externalizable_strings = true; |
| 9008 |
| 8970 const char* kScriptChars = | 9009 const char* kScriptChars = |
| 8971 "const strA = 'AAAA';\n" | 9010 "const strA = 'AAAA';\n" |
| 8972 "class A {\n" | 9011 "class A {\n" |
| 8973 " static change_str(String s) native 'A_change_str';\n" | 9012 " static change_str(String s) native 'A_change_str';\n" |
| 8974 "}\n" | 9013 "}\n" |
| 8975 "class G { static final f = strA; }\n" | 9014 "class G { static final f = strA; }\n" |
| 8976 "compare(a, b, [i = 0]) {\n" | 9015 "compare(a, b, [i = 0]) {\n" |
| 8977 " return a.codeUnitAt(i) == b.codeUnitAt(i);\n" | 9016 " return a.codeUnitAt(i) == b.codeUnitAt(i);\n" |
| 8978 "}\n" | 9017 "}\n" |
| 8979 "compareA(b, [i = 0]) {\n" | 9018 "compareA(b, [i = 0]) {\n" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 8992 &ExternalStringDeoptimize_native_lookup); | 9031 &ExternalStringDeoptimize_native_lookup); |
| 8993 Dart_Handle result = Dart_Invoke(lib, | 9032 Dart_Handle result = Dart_Invoke(lib, |
| 8994 NewString("main"), | 9033 NewString("main"), |
| 8995 0, | 9034 0, |
| 8996 NULL); | 9035 NULL); |
| 8997 EXPECT_VALID(result); | 9036 EXPECT_VALID(result); |
| 8998 bool value = false; | 9037 bool value = false; |
| 8999 result = Dart_BooleanValue(result, &value); | 9038 result = Dart_BooleanValue(result, &value); |
| 9000 EXPECT_VALID(result); | 9039 EXPECT_VALID(result); |
| 9001 EXPECT(value); | 9040 EXPECT(value); |
| 9041 |
| 9042 FLAG_support_externalizable_strings = saved_flag; |
| 9002 } | 9043 } |
| 9003 | 9044 |
| 9004 | 9045 |
| 9005 TEST_CASE(ExternalStringTrimDoubleParse) { | 9046 TEST_CASE(ExternalStringTrimDoubleParse) { |
| 9047 const bool saved_flag = FLAG_support_externalizable_strings; |
| 9048 FLAG_support_externalizable_strings = true; |
| 9049 |
| 9006 const char* kScriptChars = | 9050 const char* kScriptChars = |
| 9007 "String str = 'A';\n" | 9051 "String str = 'A';\n" |
| 9008 "class A {\n" | 9052 "class A {\n" |
| 9009 " static change_str(String s) native 'A_change_str';\n" | 9053 " static change_str(String s) native 'A_change_str';\n" |
| 9010 "}\n" | 9054 "}\n" |
| 9011 "main() {\n" | 9055 "main() {\n" |
| 9012 " var externalOneByteString = ' 0.2\\xA0 ';\n;" | 9056 " var externalOneByteString = ' 0.2\\xA0 ';\n;" |
| 9013 " A.change_str(externalOneByteString);\n" | 9057 " A.change_str(externalOneByteString);\n" |
| 9014 " var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n" | 9058 " var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n" |
| 9015 " A.change_str(externalTwoByteString);\n" | 9059 " A.change_str(externalTwoByteString);\n" |
| 9016 " var x = double.parse(externalOneByteString);\n" | 9060 " var x = double.parse(externalOneByteString);\n" |
| 9017 " var y = double.parse(externalTwoByteString);\n" | 9061 " var y = double.parse(externalTwoByteString);\n" |
| 9018 " return ((x + y) * 10).toInt();\n" | 9062 " return ((x + y) * 10).toInt();\n" |
| 9019 "}\n"; | 9063 "}\n"; |
| 9020 Dart_Handle lib = | 9064 Dart_Handle lib = |
| 9021 TestCase::LoadTestScript(kScriptChars, | 9065 TestCase::LoadTestScript(kScriptChars, |
| 9022 &ExternalStringDeoptimize_native_lookup); | 9066 &ExternalStringDeoptimize_native_lookup); |
| 9023 Dart_Handle result = Dart_Invoke(lib, | 9067 Dart_Handle result = Dart_Invoke(lib, |
| 9024 NewString("main"), | 9068 NewString("main"), |
| 9025 0, | 9069 0, |
| 9026 NULL); | 9070 NULL); |
| 9027 int64_t value = 0; | 9071 int64_t value = 0; |
| 9028 result = Dart_IntegerToInt64(result, &value); | 9072 result = Dart_IntegerToInt64(result, &value); |
| 9029 EXPECT_VALID(result); | 9073 EXPECT_VALID(result); |
| 9030 EXPECT_EQ(8, value); | 9074 EXPECT_EQ(8, value); |
| 9075 |
| 9076 FLAG_support_externalizable_strings = saved_flag; |
| 9031 } | 9077 } |
| 9032 | 9078 |
| 9033 | 9079 |
| 9034 TEST_CASE(ExternalStringDoubleParse) { | 9080 TEST_CASE(ExternalStringDoubleParse) { |
| 9081 const bool saved_flag = FLAG_support_externalizable_strings; |
| 9082 FLAG_support_externalizable_strings = true; |
| 9083 |
| 9035 const char* kScriptChars = | 9084 const char* kScriptChars = |
| 9036 "String str = 'A';\n" | 9085 "String str = 'A';\n" |
| 9037 "class A {\n" | 9086 "class A {\n" |
| 9038 " static change_str(String s) native 'A_change_str';\n" | 9087 " static change_str(String s) native 'A_change_str';\n" |
| 9039 "}\n" | 9088 "}\n" |
| 9040 "main() {\n" | 9089 "main() {\n" |
| 9041 " var externalOneByteString = '0.2';\n;" | 9090 " var externalOneByteString = '0.2';\n;" |
| 9042 " A.change_str(externalOneByteString);\n" | 9091 " A.change_str(externalOneByteString);\n" |
| 9043 " var externalTwoByteString = '0.6';\n" | 9092 " var externalTwoByteString = '0.6';\n" |
| 9044 " A.change_str(externalTwoByteString);\n" | 9093 " A.change_str(externalTwoByteString);\n" |
| 9045 " var x = double.parse(externalOneByteString);\n" | 9094 " var x = double.parse(externalOneByteString);\n" |
| 9046 " var y = double.parse(externalTwoByteString);\n" | 9095 " var y = double.parse(externalTwoByteString);\n" |
| 9047 " return ((x + y) * 10).toInt();\n" | 9096 " return ((x + y) * 10).toInt();\n" |
| 9048 "}\n"; | 9097 "}\n"; |
| 9049 Dart_Handle lib = | 9098 Dart_Handle lib = |
| 9050 TestCase::LoadTestScript(kScriptChars, | 9099 TestCase::LoadTestScript(kScriptChars, |
| 9051 &ExternalStringDeoptimize_native_lookup); | 9100 &ExternalStringDeoptimize_native_lookup); |
| 9052 Dart_Handle result = Dart_Invoke(lib, | 9101 Dart_Handle result = Dart_Invoke(lib, |
| 9053 NewString("main"), | 9102 NewString("main"), |
| 9054 0, | 9103 0, |
| 9055 NULL); | 9104 NULL); |
| 9056 int64_t value = 0; | 9105 int64_t value = 0; |
| 9057 result = Dart_IntegerToInt64(result, &value); | 9106 result = Dart_IntegerToInt64(result, &value); |
| 9058 EXPECT_VALID(result); | 9107 EXPECT_VALID(result); |
| 9059 EXPECT_EQ(8, value); | 9108 EXPECT_EQ(8, value); |
| 9109 |
| 9110 FLAG_support_externalizable_strings = saved_flag; |
| 9060 } | 9111 } |
| 9061 | 9112 |
| 9062 | 9113 |
| 9063 TEST_CASE(ExternalStringIndexOf) { | 9114 TEST_CASE(ExternalStringIndexOf) { |
| 9064 const char* kScriptChars = | 9115 const char* kScriptChars = |
| 9065 "main(String pattern) {\n" | 9116 "main(String pattern) {\n" |
| 9066 " var str = 'Hello World';\n" | 9117 " var str = 'Hello World';\n" |
| 9067 " return str.indexOf(pattern);\n" | 9118 " return str.indexOf(pattern);\n" |
| 9068 "}\n"; | 9119 "}\n"; |
| 9069 Dart_Handle lib = | 9120 Dart_Handle lib = |
| 9070 TestCase::LoadTestScript(kScriptChars, NULL); | 9121 TestCase::LoadTestScript(kScriptChars, NULL); |
| 9071 | 9122 |
| 9072 uint8_t data8[] = { 'W' }; | 9123 uint8_t data8[] = { 'W' }; |
| 9073 Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), | 9124 Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), |
| 9074 data8, NULL); | 9125 data8, NULL); |
| (...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10001 result = Dart_Invoke(lib, | 10052 result = Dart_Invoke(lib, |
| 10002 NewString("foozoo"), | 10053 NewString("foozoo"), |
| 10003 0, | 10054 0, |
| 10004 NULL); | 10055 NULL); |
| 10005 EXPECT(Dart_IsError(result)); | 10056 EXPECT(Dart_IsError(result)); |
| 10006 } | 10057 } |
| 10007 | 10058 |
| 10008 #endif // !PRODUCT | 10059 #endif // !PRODUCT |
| 10009 | 10060 |
| 10010 } // namespace dart | 10061 } // namespace dart |
| OLD | NEW |