| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #include "vm/dart_api_impl.h" |
| 6 #include "vm/dart_api_state.h" |
| 7 #include "vm/intermediate_language.h" |
| 8 #include "vm/object.h" |
| 9 #include "vm/unit_test.h" |
| 10 |
| 11 namespace dart { |
| 12 |
| 13 RawField* LookupField(Dart_Handle library, const char* class_name, |
| 14 const char* field_name) { |
| 15 RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(library)); |
| 16 Library& lib = Library::ZoneHandle(raw_library); |
| 17 const String& classname = String::Handle(Symbols::New(class_name)); |
| 18 String& ambiguity_error_msg = String::Handle(); |
| 19 Class& cls = Class::Handle(lib.LookupClass(classname, &ambiguity_error_msg)); |
| 20 EXPECT(!cls.IsNull()); // No ambiguity error expected. |
| 21 |
| 22 String& fieldname = String::Handle(String::New(field_name)); |
| 23 Field& field = Field::ZoneHandle(cls.LookupInstanceField(fieldname)); |
| 24 EXPECT(!field.IsNull()); |
| 25 return field.raw(); |
| 26 } |
| 27 |
| 28 |
| 29 TEST_CASE(GuardFieldSimpleTest) { |
| 30 const char* script_chars = |
| 31 "class A {\n" |
| 32 " var f1 = 3.0;\n" |
| 33 " var f2 = 3;\n" |
| 34 " var f3 = new List(4);\n" |
| 35 " foo() {\n" |
| 36 " f1 = f1 + f1;\n" |
| 37 " }\n" |
| 38 " bar() {\n" |
| 39 " f2 = null;\n" |
| 40 " f2 = 3.0;\n" |
| 41 " }\n" |
| 42 "}\n" |
| 43 "\n" |
| 44 "runFoo() {\n" |
| 45 " var a = new A();\n" |
| 46 " for (int i = 0; i < 2000; i++) {\n" |
| 47 " a.foo();\n" |
| 48 " }\n" |
| 49 "}\n" |
| 50 "\n" |
| 51 "runBar() {\n" |
| 52 " var a = new A();\n" |
| 53 " for (int i = 0; i < 2000; i++) {\n" |
| 54 " a.bar();\n" |
| 55 " }\n" |
| 56 "}\n" |
| 57 "main() {\n" |
| 58 " runFoo();\n" |
| 59 " runBar();\n" |
| 60 "}\n"; |
| 61 Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL); |
| 62 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 63 EXPECT_VALID(result); |
| 64 Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1")); |
| 65 Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2")); |
| 66 Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3")); |
| 67 const intptr_t no_length = Field::kNoFixedLength; |
| 68 EXPECT_EQ(no_length, f1.guarded_list_length()); |
| 69 EXPECT_EQ(kDoubleCid, f1.guarded_cid()); |
| 70 EXPECT_EQ(false, f1.is_nullable()); |
| 71 EXPECT_EQ(no_length, f2.guarded_list_length()); |
| 72 EXPECT_EQ(kDynamicCid, f2.guarded_cid()); |
| 73 EXPECT_EQ(true, f2.is_nullable()); |
| 74 EXPECT_EQ(no_length, f3.guarded_list_length()); |
| 75 } |
| 76 |
| 77 |
| 78 TEST_CASE(GuardFieldFinalListTest) { |
| 79 const char* script_chars = |
| 80 "class A {\n" |
| 81 " var f1 = 3.0;\n" |
| 82 " var f2 = 3;\n" |
| 83 " final f3 = new List(4);\n" |
| 84 " foo() {\n" |
| 85 " f1 = f1 + f1;\n" |
| 86 " }\n" |
| 87 " bar() {\n" |
| 88 " f2 = null;\n" |
| 89 " f2 = 3.0;\n" |
| 90 " }\n" |
| 91 "}\n" |
| 92 "\n" |
| 93 "runFoo() {\n" |
| 94 " var a = new A();\n" |
| 95 " for (int i = 0; i < 2000; i++) {\n" |
| 96 " a.foo();\n" |
| 97 " }\n" |
| 98 "}\n" |
| 99 "\n" |
| 100 "runBar() {\n" |
| 101 " var a = new A();\n" |
| 102 " for (int i = 0; i < 2000; i++) {\n" |
| 103 " a.bar();\n" |
| 104 " }\n" |
| 105 "}\n" |
| 106 "main() {\n" |
| 107 " runFoo();\n" |
| 108 " runBar();\n" |
| 109 "}\n"; |
| 110 Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL); |
| 111 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 112 EXPECT_VALID(result); |
| 113 Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1")); |
| 114 Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2")); |
| 115 Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3")); |
| 116 const intptr_t no_length = Field::kNoFixedLength; |
| 117 EXPECT_EQ(no_length, f1.guarded_list_length()); |
| 118 EXPECT_EQ(kDoubleCid, f1.guarded_cid()); |
| 119 EXPECT_EQ(false, f1.is_nullable()); |
| 120 EXPECT_EQ(no_length, f2.guarded_list_length()); |
| 121 EXPECT_EQ(kDynamicCid, f2.guarded_cid()); |
| 122 EXPECT_EQ(true, f2.is_nullable()); |
| 123 const intptr_t length = Smi::RawValue(4); |
| 124 EXPECT_EQ(length, f3.guarded_list_length()); |
| 125 EXPECT_EQ(kArrayCid, f3.guarded_cid()); |
| 126 EXPECT_EQ(false, f3.is_nullable()); |
| 127 } |
| 128 |
| 129 |
| 130 TEST_CASE(GuardFieldConstructorTest) { |
| 131 const char* script_chars = |
| 132 "import 'dart:typed_data';\n" |
| 133 "class A {\n" |
| 134 " var f1 = 3.0;\n" |
| 135 " var f2 = 3;\n" |
| 136 " final f3;\n" |
| 137 " A(x) : f3 = x;\n" |
| 138 " foo() {\n" |
| 139 " f1 = f1 + f1;\n" |
| 140 " }\n" |
| 141 " bar() {\n" |
| 142 " f2 = null;\n" |
| 143 " f2 = 3.0;\n" |
| 144 " }\n" |
| 145 "}\n" |
| 146 "\n" |
| 147 "runFoo() {\n" |
| 148 " var l = new Float32List(5);\n" |
| 149 " for (int i = 0; i < 2000; i++) {\n" |
| 150 " var a = new A(l);\n" |
| 151 " a.foo();\n" |
| 152 " }\n" |
| 153 "}\n" |
| 154 "\n" |
| 155 "runBar() {\n" |
| 156 " var l = new Float32List(5);\n" |
| 157 " var a = new A(l);\n" |
| 158 " for (int i = 0; i < 2000; i++) {\n" |
| 159 " a.bar();\n" |
| 160 " }\n" |
| 161 "}\n" |
| 162 "main() {\n" |
| 163 " runFoo();\n" |
| 164 " runBar();\n" |
| 165 "}\n"; |
| 166 Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL); |
| 167 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 168 EXPECT_VALID(result); |
| 169 Field& f1 = Field::ZoneHandle(LookupField(lib, "A", "f1")); |
| 170 Field& f2 = Field::ZoneHandle(LookupField(lib, "A", "f2")); |
| 171 Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3")); |
| 172 const intptr_t no_length = Field::kNoFixedLength; |
| 173 EXPECT_EQ(no_length, f1.guarded_list_length()); |
| 174 EXPECT_EQ(kDoubleCid, f1.guarded_cid()); |
| 175 EXPECT_EQ(false, f1.is_nullable()); |
| 176 EXPECT_EQ(no_length, f2.guarded_list_length()); |
| 177 EXPECT_EQ(kDynamicCid, f2.guarded_cid()); |
| 178 EXPECT_EQ(true, f2.is_nullable()); |
| 179 const intptr_t length = Smi::RawValue(5); |
| 180 EXPECT_EQ(length, f3.guarded_list_length()); |
| 181 EXPECT_EQ(kTypedDataFloat32ArrayCid, f3.guarded_cid()); |
| 182 EXPECT_EQ(false, f3.is_nullable()); |
| 183 } |
| 184 |
| 185 |
| 186 TEST_CASE(GuardFieldConstructor2Test) { |
| 187 const char* script_chars = |
| 188 "import 'dart:typed_data';\n" |
| 189 "class A {\n" |
| 190 " final f3;\n" |
| 191 " A(x) : f3 = x;\n" |
| 192 " foo() {\n" |
| 193 " }\n" |
| 194 " bar() {\n" |
| 195 " }\n" |
| 196 "}\n" |
| 197 "\n" |
| 198 "runFoo() {\n" |
| 199 " var l = new Float32List(5);\n" |
| 200 " for (int i = 0; i < 2000; i++) {\n" |
| 201 " var a = new A(l);\n" |
| 202 " }\n" |
| 203 "}\n" |
| 204 "\n" |
| 205 "runBar() {\n" |
| 206 " var l = new Float32List(99);\n" |
| 207 " var a = new A(l);\n" |
| 208 "}\n" |
| 209 "main() {\n" |
| 210 " runFoo();\n" |
| 211 " runBar();\n" |
| 212 "}\n"; |
| 213 Dart_Handle lib = TestCase::LoadTestScript(script_chars, NULL); |
| 214 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 215 EXPECT_VALID(result); |
| 216 Field& f3 = Field::ZoneHandle(LookupField(lib, "A", "f3")); |
| 217 const intptr_t no_length = Field::kNoFixedLength; |
| 218 EXPECT_EQ(no_length, f3.guarded_list_length()); |
| 219 EXPECT_EQ(kTypedDataFloat32ArrayCid, f3.guarded_cid()); |
| 220 EXPECT_EQ(false, f3.is_nullable()); |
| 221 } |
| 222 |
| 223 } // namespace dart |
| OLD | NEW |