Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(798)

Side by Side Diff: runtime/vm/object_test.cc

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/object_store.cc ('k') | runtime/vm/object_x64_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "platform/globals.h" 5 #include "platform/globals.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/code_descriptors.h"
9 #include "vm/dart_api_impl.h" 10 #include "vm/dart_api_impl.h"
10 #include "vm/dart_entry.h" 11 #include "vm/dart_entry.h"
11 #include "vm/debugger.h" 12 #include "vm/debugger.h"
12 #include "vm/isolate.h" 13 #include "vm/isolate.h"
13 #include "vm/malloc_hooks.h" 14 #include "vm/malloc_hooks.h"
14 #include "vm/object.h" 15 #include "vm/object.h"
15 #include "vm/object_store.h" 16 #include "vm/object_store.h"
16 #include "vm/simulator.h" 17 #include "vm/simulator.h"
17 #include "vm/symbols.h" 18 #include "vm/symbols.h"
18 #include "vm/unit_test.h" 19 #include "vm/unit_test.h"
19 #include "vm/code_descriptors.h"
20 20
21 namespace dart { 21 namespace dart {
22 22
23 DECLARE_FLAG(bool, write_protect_code); 23 DECLARE_FLAG(bool, write_protect_code);
24 24
25
26 static RawClass* CreateDummyClass(const String& class_name, 25 static RawClass* CreateDummyClass(const String& class_name,
27 const Script& script) { 26 const Script& script) {
28 const Class& cls = Class::Handle(Class::New( 27 const Class& cls = Class::Handle(Class::New(
29 Library::Handle(), class_name, script, TokenPosition::kNoSource)); 28 Library::Handle(), class_name, script, TokenPosition::kNoSource));
30 cls.set_is_synthesized_class(); // Dummy class for testing. 29 cls.set_is_synthesized_class(); // Dummy class for testing.
31 return cls.raw(); 30 return cls.raw();
32 } 31 }
33 32
34
35 ISOLATE_UNIT_TEST_CASE(Class) { 33 ISOLATE_UNIT_TEST_CASE(Class) {
36 // Allocate the class first. 34 // Allocate the class first.
37 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 35 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
38 const Script& script = Script::Handle(); 36 const Script& script = Script::Handle();
39 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 37 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
40 38
41 // Class has no fields and no functions yet. 39 // Class has no fields and no functions yet.
42 EXPECT_EQ(Array::Handle(cls.fields()).Length(), 0); 40 EXPECT_EQ(Array::Handle(cls.fields()).Length(), 0);
43 EXPECT_EQ(Array::Handle(cls.functions()).Length(), 0); 41 EXPECT_EQ(Array::Handle(cls.functions()).Length(), 0);
44 42
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 EXPECT_EQ(0, function.num_fixed_parameters()); 130 EXPECT_EQ(0, function.num_fixed_parameters());
133 EXPECT(!function.HasOptionalParameters()); 131 EXPECT(!function.HasOptionalParameters());
134 132
135 function_name = String::New("bar"); 133 function_name = String::New("bar");
136 function = cls.LookupDynamicFunction(function_name); 134 function = cls.LookupDynamicFunction(function_name);
137 EXPECT(!function.IsNull()); 135 EXPECT(!function.IsNull());
138 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters()); 136 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters());
139 EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters()); 137 EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters());
140 } 138 }
141 139
142
143 ISOLATE_UNIT_TEST_CASE(TypeArguments) { 140 ISOLATE_UNIT_TEST_CASE(TypeArguments) {
144 const Type& type1 = Type::Handle(Type::Double()); 141 const Type& type1 = Type::Handle(Type::Double());
145 const Type& type2 = Type::Handle(Type::StringType()); 142 const Type& type2 = Type::Handle(Type::StringType());
146 const TypeArguments& type_arguments1 = 143 const TypeArguments& type_arguments1 =
147 TypeArguments::Handle(TypeArguments::New(2)); 144 TypeArguments::Handle(TypeArguments::New(2));
148 type_arguments1.SetTypeAt(0, type1); 145 type_arguments1.SetTypeAt(0, type1);
149 type_arguments1.SetTypeAt(1, type2); 146 type_arguments1.SetTypeAt(1, type2);
150 const TypeArguments& type_arguments2 = 147 const TypeArguments& type_arguments2 =
151 TypeArguments::Handle(TypeArguments::New(2)); 148 TypeArguments::Handle(TypeArguments::New(2));
152 type_arguments2.SetTypeAt(0, type1); 149 type_arguments2.SetTypeAt(0, type1);
153 type_arguments2.SetTypeAt(1, type2); 150 type_arguments2.SetTypeAt(1, type2);
154 EXPECT_NE(type_arguments1.raw(), type_arguments2.raw()); 151 EXPECT_NE(type_arguments1.raw(), type_arguments2.raw());
155 OS::Print("1: %s\n", type_arguments1.ToCString()); 152 OS::Print("1: %s\n", type_arguments1.ToCString());
156 OS::Print("2: %s\n", type_arguments2.ToCString()); 153 OS::Print("2: %s\n", type_arguments2.ToCString());
157 EXPECT(type_arguments1.Equals(type_arguments2)); 154 EXPECT(type_arguments1.Equals(type_arguments2));
158 TypeArguments& type_arguments3 = TypeArguments::Handle(); 155 TypeArguments& type_arguments3 = TypeArguments::Handle();
159 type_arguments1.Canonicalize(); 156 type_arguments1.Canonicalize();
160 type_arguments3 ^= type_arguments2.Canonicalize(); 157 type_arguments3 ^= type_arguments2.Canonicalize();
161 EXPECT_EQ(type_arguments1.raw(), type_arguments3.raw()); 158 EXPECT_EQ(type_arguments1.raw(), type_arguments3.raw());
162 } 159 }
163 160
164
165 ISOLATE_UNIT_TEST_CASE(TokenStream) { 161 ISOLATE_UNIT_TEST_CASE(TokenStream) {
166 Zone* zone = Thread::Current()->zone(); 162 Zone* zone = Thread::Current()->zone();
167 String& source = String::Handle(zone, String::New("= ( 9 , .")); 163 String& source = String::Handle(zone, String::New("= ( 9 , ."));
168 String& private_key = String::Handle(zone, String::New("")); 164 String& private_key = String::Handle(zone, String::New(""));
169 const TokenStream& token_stream = 165 const TokenStream& token_stream =
170 TokenStream::Handle(zone, TokenStream::New(source, private_key, false)); 166 TokenStream::Handle(zone, TokenStream::New(source, private_key, false));
171 TokenStream::Iterator iterator(zone, token_stream, TokenPosition::kMinSource); 167 TokenStream::Iterator iterator(zone, token_stream, TokenPosition::kMinSource);
172 iterator.Advance(); // Advance to '(' token. 168 iterator.Advance(); // Advance to '(' token.
173 EXPECT_EQ(Token::kLPAREN, iterator.CurrentTokenKind()); 169 EXPECT_EQ(Token::kLPAREN, iterator.CurrentTokenKind());
174 iterator.Advance(); 170 iterator.Advance();
175 iterator.Advance(); 171 iterator.Advance();
176 iterator.Advance(); // Advance to '.' token. 172 iterator.Advance(); // Advance to '.' token.
177 EXPECT_EQ(Token::kPERIOD, iterator.CurrentTokenKind()); 173 EXPECT_EQ(Token::kPERIOD, iterator.CurrentTokenKind());
178 iterator.Advance(); // Advance to end of stream. 174 iterator.Advance(); // Advance to end of stream.
179 EXPECT_EQ(Token::kEOS, iterator.CurrentTokenKind()); 175 EXPECT_EQ(Token::kEOS, iterator.CurrentTokenKind());
180 } 176 }
181 177
182
183 ISOLATE_UNIT_TEST_CASE(GenerateExactSource) { 178 ISOLATE_UNIT_TEST_CASE(GenerateExactSource) {
184 // Verify the exact formatting of generated sources. 179 // Verify the exact formatting of generated sources.
185 const char* kScriptChars = 180 const char* kScriptChars =
186 "\n" 181 "\n"
187 "class A {\n" 182 "class A {\n"
188 " static bar() { return 42; }\n" 183 " static bar() { return 42; }\n"
189 " static fly() { return 5; }\n" 184 " static fly() { return 5; }\n"
190 " void catcher(x) {\n" 185 " void catcher(x) {\n"
191 " try {\n" 186 " try {\n"
192 " if (x is! List) {\n" 187 " if (x is! List) {\n"
(...skipping 18 matching lines...) Expand all
211 String& url = String::Handle(String::New("dart-test:GenerateExactSource")); 206 String& url = String::Handle(String::New("dart-test:GenerateExactSource"));
212 String& source = String::Handle(String::New(kScriptChars)); 207 String& source = String::Handle(String::New(kScriptChars));
213 Script& script = 208 Script& script =
214 Script::Handle(Script::New(url, source, RawScript::kScriptTag)); 209 Script::Handle(Script::New(url, source, RawScript::kScriptTag));
215 script.Tokenize(String::Handle(String::New(""))); 210 script.Tokenize(String::Handle(String::New("")));
216 const TokenStream& tokens = TokenStream::Handle(script.tokens()); 211 const TokenStream& tokens = TokenStream::Handle(script.tokens());
217 const String& gen_source = String::Handle(tokens.GenerateSource()); 212 const String& gen_source = String::Handle(tokens.GenerateSource());
218 EXPECT_STREQ(source.ToCString(), gen_source.ToCString()); 213 EXPECT_STREQ(source.ToCString(), gen_source.ToCString());
219 } 214 }
220 215
221
222 TEST_CASE(Class_ComputeEndTokenPos) { 216 TEST_CASE(Class_ComputeEndTokenPos) {
223 const char* kScript = 217 const char* kScript =
224 "\n" 218 "\n"
225 "class A {\n" 219 "class A {\n"
226 " /**\n" 220 " /**\n"
227 " * Description of foo().\n" 221 " * Description of foo().\n"
228 " */\n" 222 " */\n"
229 " foo(a) { return '''\"}'''; }\n" 223 " foo(a) { return '''\"}'''; }\n"
230 " // }\n" 224 " // }\n"
231 " var bar = '\\'}';\n" 225 " var bar = '\\'}';\n"
232 " var baz = \"${foo('}')}\";\n" 226 " var baz = \"${foo('}')}\";\n"
233 "}\n"; 227 "}\n";
234 Dart_Handle lib_h = TestCase::LoadTestScript(kScript, NULL); 228 Dart_Handle lib_h = TestCase::LoadTestScript(kScript, NULL);
235 EXPECT_VALID(lib_h); 229 EXPECT_VALID(lib_h);
236 Library& lib = Library::Handle(); 230 Library& lib = Library::Handle();
237 lib ^= Api::UnwrapHandle(lib_h); 231 lib ^= Api::UnwrapHandle(lib_h);
238 EXPECT(!lib.IsNull()); 232 EXPECT(!lib.IsNull());
239 const Class& cls = 233 const Class& cls =
240 Class::Handle(lib.LookupClass(String::Handle(String::New("A")))); 234 Class::Handle(lib.LookupClass(String::Handle(String::New("A"))));
241 EXPECT(!cls.IsNull()); 235 EXPECT(!cls.IsNull());
242 const TokenPosition end_token_pos = cls.ComputeEndTokenPos(); 236 const TokenPosition end_token_pos = cls.ComputeEndTokenPos();
243 const Script& scr = Script::Handle(cls.script()); 237 const Script& scr = Script::Handle(cls.script());
244 intptr_t line; 238 intptr_t line;
245 intptr_t col; 239 intptr_t col;
246 scr.GetTokenLocation(end_token_pos, &line, &col); 240 scr.GetTokenLocation(end_token_pos, &line, &col);
247 EXPECT(line == 10 && col == 1); 241 EXPECT(line == 10 && col == 1);
248 } 242 }
249 243
250
251 ISOLATE_UNIT_TEST_CASE(InstanceClass) { 244 ISOLATE_UNIT_TEST_CASE(InstanceClass) {
252 // Allocate the class first. 245 // Allocate the class first.
253 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass")); 246 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass"));
254 Script& script = Script::Handle(); 247 Script& script = Script::Handle();
255 const Class& empty_class = 248 const Class& empty_class =
256 Class::Handle(CreateDummyClass(class_name, script)); 249 Class::Handle(CreateDummyClass(class_name, script));
257 250
258 // EmptyClass has no fields and no functions. 251 // EmptyClass has no fields and no functions.
259 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0); 252 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0);
260 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0); 253 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0);
(...skipping 25 matching lines...) Expand all
286 one_field_class.Finalize(); 279 one_field_class.Finalize();
287 intptr_t header_size = sizeof(RawObject); 280 intptr_t header_size = sizeof(RawObject);
288 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), 281 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
289 one_field_class.instance_size()); 282 one_field_class.instance_size());
290 EXPECT_EQ(header_size, field.Offset()); 283 EXPECT_EQ(header_size, field.Offset());
291 EXPECT(!one_field_class.is_implemented()); 284 EXPECT(!one_field_class.is_implemented());
292 one_field_class.set_is_implemented(); 285 one_field_class.set_is_implemented();
293 EXPECT(one_field_class.is_implemented()); 286 EXPECT(one_field_class.is_implemented());
294 } 287 }
295 288
296
297 ISOLATE_UNIT_TEST_CASE(Smi) { 289 ISOLATE_UNIT_TEST_CASE(Smi) {
298 const Smi& smi = Smi::Handle(Smi::New(5)); 290 const Smi& smi = Smi::Handle(Smi::New(5));
299 Object& smi_object = Object::Handle(smi.raw()); 291 Object& smi_object = Object::Handle(smi.raw());
300 EXPECT(smi.IsSmi()); 292 EXPECT(smi.IsSmi());
301 EXPECT(smi_object.IsSmi()); 293 EXPECT(smi_object.IsSmi());
302 EXPECT_EQ(5, smi.Value()); 294 EXPECT_EQ(5, smi.Value());
303 const Object& object = Object::Handle(); 295 const Object& object = Object::Handle();
304 EXPECT(!object.IsSmi()); 296 EXPECT(!object.IsSmi());
305 smi_object = Object::null(); 297 smi_object = Object::null();
306 EXPECT(!smi_object.IsSmi()); 298 EXPECT(!smi_object.IsSmi());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 339
348 Bigint& big1 = Bigint::Handle(Bigint::NewFromCString("10000000000000000000")); 340 Bigint& big1 = Bigint::Handle(Bigint::NewFromCString("10000000000000000000"));
349 Bigint& big2 = 341 Bigint& big2 =
350 Bigint::Handle(Bigint::NewFromCString("-10000000000000000000")); 342 Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
351 EXPECT_EQ(-1, a.CompareWith(big1)); 343 EXPECT_EQ(-1, a.CompareWith(big1));
352 EXPECT_EQ(1, a.CompareWith(big2)); 344 EXPECT_EQ(1, a.CompareWith(big2));
353 EXPECT_EQ(-1, c.CompareWith(big1)); 345 EXPECT_EQ(-1, c.CompareWith(big1));
354 EXPECT_EQ(1, c.CompareWith(big2)); 346 EXPECT_EQ(1, c.CompareWith(big2));
355 } 347 }
356 348
357
358 ISOLATE_UNIT_TEST_CASE(StringCompareTo) { 349 ISOLATE_UNIT_TEST_CASE(StringCompareTo) {
359 const String& abcd = String::Handle(String::New("abcd")); 350 const String& abcd = String::Handle(String::New("abcd"));
360 const String& abce = String::Handle(String::New("abce")); 351 const String& abce = String::Handle(String::New("abce"));
361 EXPECT_EQ(0, abcd.CompareTo(abcd)); 352 EXPECT_EQ(0, abcd.CompareTo(abcd));
362 EXPECT_EQ(0, abce.CompareTo(abce)); 353 EXPECT_EQ(0, abce.CompareTo(abce));
363 EXPECT(abcd.CompareTo(abce) < 0); 354 EXPECT(abcd.CompareTo(abce) < 0);
364 EXPECT(abce.CompareTo(abcd) > 0); 355 EXPECT(abce.CompareTo(abcd) > 0);
365 356
366 const int kMonkeyLen = 4; 357 const int kMonkeyLen = 4;
367 const uint8_t monkey_utf8[kMonkeyLen] = {0xf0, 0x9f, 0x90, 0xb5}; 358 const uint8_t monkey_utf8[kMonkeyLen] = {0xf0, 0x9f, 0x90, 0xb5};
(...skipping 22 matching lines...) Expand all
390 EXPECT(abcd.CompareTo(monkey_face) < 0); 381 EXPECT(abcd.CompareTo(monkey_face) < 0);
391 EXPECT(abce.CompareTo(monkey_face) < 0); 382 EXPECT(abce.CompareTo(monkey_face) < 0);
392 EXPECT(abcd.CompareTo(domino) < 0); 383 EXPECT(abcd.CompareTo(domino) < 0);
393 EXPECT(abce.CompareTo(domino) < 0); 384 EXPECT(abce.CompareTo(domino) < 0);
394 EXPECT(domino.CompareTo(abcd) > 0); 385 EXPECT(domino.CompareTo(abcd) > 0);
395 EXPECT(domino.CompareTo(abcd) > 0); 386 EXPECT(domino.CompareTo(abcd) > 0);
396 EXPECT(monkey_face.CompareTo(abce) > 0); 387 EXPECT(monkey_face.CompareTo(abce) > 0);
397 EXPECT(monkey_face.CompareTo(abce) > 0); 388 EXPECT(monkey_face.CompareTo(abce) > 0);
398 } 389 }
399 390
400
401 ISOLATE_UNIT_TEST_CASE(StringEncodeIRI) { 391 ISOLATE_UNIT_TEST_CASE(StringEncodeIRI) {
402 const char* kInput = 392 const char* kInput =
403 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart"; 393 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart";
404 const char* kOutput = 394 const char* kOutput =
405 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F" 395 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F"
406 "dart-repo%2Fdart%2Ftest.dart"; 396 "dart-repo%2Fdart%2Ftest.dart";
407 const String& input = String::Handle(String::New(kInput)); 397 const String& input = String::Handle(String::New(kInput));
408 const char* encoded = String::EncodeIRI(input); 398 const char* encoded = String::EncodeIRI(input);
409 EXPECT(strcmp(encoded, kOutput) == 0); 399 EXPECT(strcmp(encoded, kOutput) == 0);
410 } 400 }
411 401
412
413 ISOLATE_UNIT_TEST_CASE(StringDecodeIRI) { 402 ISOLATE_UNIT_TEST_CASE(StringDecodeIRI) {
414 const char* kOutput = 403 const char* kOutput =
415 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart"; 404 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart";
416 const char* kInput = 405 const char* kInput =
417 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F" 406 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F"
418 "dart-repo%2Fdart%2Ftest.dart"; 407 "dart-repo%2Fdart%2Ftest.dart";
419 const String& input = String::Handle(String::New(kInput)); 408 const String& input = String::Handle(String::New(kInput));
420 const String& output = String::Handle(String::New(kOutput)); 409 const String& output = String::Handle(String::New(kOutput));
421 const String& decoded = String::Handle(String::DecodeIRI(input)); 410 const String& decoded = String::Handle(String::DecodeIRI(input));
422 EXPECT(output.Equals(decoded)); 411 EXPECT(output.Equals(decoded));
423 } 412 }
424 413
425
426 ISOLATE_UNIT_TEST_CASE(StringDecodeIRIInvalid) { 414 ISOLATE_UNIT_TEST_CASE(StringDecodeIRIInvalid) {
427 String& input = String::Handle(); 415 String& input = String::Handle();
428 input = String::New("file%"); 416 input = String::New("file%");
429 String& decoded = String::Handle(); 417 String& decoded = String::Handle();
430 decoded = String::DecodeIRI(input); 418 decoded = String::DecodeIRI(input);
431 EXPECT(decoded.IsNull()); 419 EXPECT(decoded.IsNull());
432 input = String::New("file%3"); 420 input = String::New("file%3");
433 decoded = String::DecodeIRI(input); 421 decoded = String::DecodeIRI(input);
434 EXPECT(decoded.IsNull()); 422 EXPECT(decoded.IsNull());
435 input = String::New("file%3g"); 423 input = String::New("file%3g");
436 decoded = String::DecodeIRI(input); 424 decoded = String::DecodeIRI(input);
437 EXPECT(decoded.IsNull()); 425 EXPECT(decoded.IsNull());
438 } 426 }
439 427
440
441 ISOLATE_UNIT_TEST_CASE(StringIRITwoByte) { 428 ISOLATE_UNIT_TEST_CASE(StringIRITwoByte) {
442 const intptr_t kInputLen = 3; 429 const intptr_t kInputLen = 3;
443 const uint16_t kInput[kInputLen] = {'x', '/', 256}; 430 const uint16_t kInput[kInputLen] = {'x', '/', 256};
444 const String& input = String::Handle(String::FromUTF16(kInput, kInputLen)); 431 const String& input = String::Handle(String::FromUTF16(kInput, kInputLen));
445 const intptr_t kOutputLen = 10; 432 const intptr_t kOutputLen = 10;
446 const uint16_t kOutput[kOutputLen] = {'x', '%', '2', 'F', '%', 433 const uint16_t kOutput[kOutputLen] = {'x', '%', '2', 'F', '%',
447 'C', '4', '%', '8', '0'}; 434 'C', '4', '%', '8', '0'};
448 const String& output = String::Handle(String::FromUTF16(kOutput, kOutputLen)); 435 const String& output = String::Handle(String::FromUTF16(kOutput, kOutputLen));
449 const String& encoded = String::Handle(String::New(String::EncodeIRI(input))); 436 const String& encoded = String::Handle(String::New(String::EncodeIRI(input)));
450 EXPECT(output.Equals(encoded)); 437 EXPECT(output.Equals(encoded));
451 const String& decoded = String::Handle(String::DecodeIRI(output)); 438 const String& decoded = String::Handle(String::DecodeIRI(output));
452 EXPECT(input.Equals(decoded)); 439 EXPECT(input.Equals(decoded));
453 } 440 }
454 441
455
456 ISOLATE_UNIT_TEST_CASE(Mint) { 442 ISOLATE_UNIT_TEST_CASE(Mint) {
457 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot 443 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot
458 // be allocated if it does fit into a Smi. 444 // be allocated if it does fit into a Smi.
459 #if !defined(ARCH_IS_64_BIT) 445 #if !defined(ARCH_IS_64_BIT)
460 { 446 {
461 Mint& med = Mint::Handle(); 447 Mint& med = Mint::Handle();
462 EXPECT(med.IsNull()); 448 EXPECT(med.IsNull());
463 int64_t v = DART_2PART_UINT64_C(1, 0); 449 int64_t v = DART_2PART_UINT64_C(1, 0);
464 med ^= Integer::New(v); 450 med ^= Integer::New(v);
465 EXPECT_EQ(v, med.value()); 451 EXPECT_EQ(v, med.value());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 Mint& mint1 = Mint::Handle(); 505 Mint& mint1 = Mint::Handle();
520 mint1 ^= Integer::NewCanonical(mint_string); 506 mint1 ^= Integer::NewCanonical(mint_string);
521 Mint& mint2 = Mint::Handle(); 507 Mint& mint2 = Mint::Handle();
522 mint2 ^= Integer::NewCanonical(mint_string); 508 mint2 ^= Integer::NewCanonical(mint_string);
523 EXPECT_EQ(mint1.value(), mint_value); 509 EXPECT_EQ(mint1.value(), mint_value);
524 EXPECT_EQ(mint2.value(), mint_value); 510 EXPECT_EQ(mint2.value(), mint_value);
525 EXPECT_EQ(mint1.raw(), mint2.raw()); 511 EXPECT_EQ(mint1.raw(), mint2.raw());
526 #endif 512 #endif
527 } 513 }
528 514
529
530 ISOLATE_UNIT_TEST_CASE(Double) { 515 ISOLATE_UNIT_TEST_CASE(Double) {
531 { 516 {
532 const double dbl_const = 5.0; 517 const double dbl_const = 5.0;
533 const Double& dbl = Double::Handle(Double::New(dbl_const)); 518 const Double& dbl = Double::Handle(Double::New(dbl_const));
534 Object& dbl_object = Object::Handle(dbl.raw()); 519 Object& dbl_object = Object::Handle(dbl.raw());
535 EXPECT(dbl.IsDouble()); 520 EXPECT(dbl.IsDouble());
536 EXPECT(dbl_object.IsDouble()); 521 EXPECT(dbl_object.IsDouble());
537 EXPECT_EQ(dbl_const, dbl.value()); 522 EXPECT_EQ(dbl_const, dbl.value());
538 } 523 }
539 524
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 const Double& dbl1 = Double::Handle(Double::New(dbl_str1)); 588 const Double& dbl1 = Double::Handle(Double::New(dbl_str1));
604 EXPECT_EQ(2.0, dbl1.value()); 589 EXPECT_EQ(2.0, dbl1.value());
605 590
606 // Disallow legacy form. 591 // Disallow legacy form.
607 const String& dbl_str2 = String::Handle(String::New("2.0d")); 592 const String& dbl_str2 = String::Handle(String::New("2.0d"));
608 const Double& dbl2 = Double::Handle(Double::New(dbl_str2)); 593 const Double& dbl2 = Double::Handle(Double::New(dbl_str2));
609 EXPECT(dbl2.IsNull()); 594 EXPECT(dbl2.IsNull());
610 } 595 }
611 } 596 }
612 597
613
614 ISOLATE_UNIT_TEST_CASE(Bigint) { 598 ISOLATE_UNIT_TEST_CASE(Bigint) {
615 Bigint& b = Bigint::Handle(); 599 Bigint& b = Bigint::Handle();
616 EXPECT(b.IsNull()); 600 EXPECT(b.IsNull());
617 const char* cstr = "18446744073709551615000"; 601 const char* cstr = "18446744073709551615000";
618 const String& test = String::Handle(String::New(cstr)); 602 const String& test = String::Handle(String::New(cstr));
619 b ^= Integer::NewCanonical(test); 603 b ^= Integer::NewCanonical(test);
620 const char* str = b.ToCString(); 604 const char* str = b.ToCString();
621 EXPECT_STREQ(cstr, str); 605 EXPECT_STREQ(cstr, str);
622 606
623 int64_t t64 = DART_2PART_UINT64_C(1, 0); 607 int64_t t64 = DART_2PART_UINT64_C(1, 0);
(...skipping 18 matching lines...) Expand all
642 Smi& smi1 = Smi::Handle(Smi::New(5)); 626 Smi& smi1 = Smi::Handle(Smi::New(5));
643 Smi& smi2 = Smi::Handle(Smi::New(-2)); 627 Smi& smi2 = Smi::Handle(Smi::New(-2));
644 628
645 EXPECT_EQ(-1, smi1.CompareWith(big1)); 629 EXPECT_EQ(-1, smi1.CompareWith(big1));
646 EXPECT_EQ(-1, smi2.CompareWith(big1)); 630 EXPECT_EQ(-1, smi2.CompareWith(big1));
647 631
648 EXPECT_EQ(1, smi1.CompareWith(big3)); 632 EXPECT_EQ(1, smi1.CompareWith(big3));
649 EXPECT_EQ(1, smi2.CompareWith(big3)); 633 EXPECT_EQ(1, smi2.CompareWith(big3));
650 } 634 }
651 635
652
653 ISOLATE_UNIT_TEST_CASE(Integer) { 636 ISOLATE_UNIT_TEST_CASE(Integer) {
654 Integer& i = Integer::Handle(); 637 Integer& i = Integer::Handle();
655 i = Integer::NewCanonical(String::Handle(String::New("12"))); 638 i = Integer::NewCanonical(String::Handle(String::New("12")));
656 EXPECT(i.IsSmi()); 639 EXPECT(i.IsSmi());
657 i = Integer::NewCanonical(String::Handle(String::New("-120"))); 640 i = Integer::NewCanonical(String::Handle(String::New("-120")));
658 EXPECT(i.IsSmi()); 641 EXPECT(i.IsSmi());
659 i = Integer::NewCanonical(String::Handle(String::New("0"))); 642 i = Integer::NewCanonical(String::Handle(String::New("0")));
660 EXPECT(i.IsSmi()); 643 EXPECT(i.IsSmi());
661 i = Integer::NewCanonical( 644 i = Integer::NewCanonical(
662 String::Handle(String::New("12345678901234567890"))); 645 String::Handle(String::New("12345678901234567890")));
663 EXPECT(i.IsBigint()); 646 EXPECT(i.IsBigint());
664 i = Integer::NewCanonical( 647 i = Integer::NewCanonical(
665 String::Handle(String::New("-12345678901234567890111222"))); 648 String::Handle(String::New("-12345678901234567890111222")));
666 EXPECT(i.IsBigint()); 649 EXPECT(i.IsBigint());
667 } 650 }
668 651
669
670 ISOLATE_UNIT_TEST_CASE(String) { 652 ISOLATE_UNIT_TEST_CASE(String) {
671 const char* kHello = "Hello World!"; 653 const char* kHello = "Hello World!";
672 int32_t hello_len = strlen(kHello); 654 int32_t hello_len = strlen(kHello);
673 const String& str = String::Handle(String::New(kHello)); 655 const String& str = String::Handle(String::New(kHello));
674 EXPECT(str.IsInstance()); 656 EXPECT(str.IsInstance());
675 EXPECT(str.IsString()); 657 EXPECT(str.IsString());
676 EXPECT(str.IsOneByteString()); 658 EXPECT(str.IsOneByteString());
677 EXPECT(!str.IsTwoByteString()); 659 EXPECT(!str.IsTwoByteString());
678 EXPECT(!str.IsNumber()); 660 EXPECT(!str.IsNumber());
679 EXPECT_EQ(hello_len, str.Length()); 661 EXPECT_EQ(hello_len, str.Length());
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 const int32_t char32[] = {0, 0x7FFF, 0xFFFF}; 788 const int32_t char32[] = {0, 0x7FFF, 0xFFFF};
807 const String& str16 = String::Handle(String::FromUTF32(char32, 3)); 789 const String& str16 = String::Handle(String::FromUTF32(char32, 3));
808 EXPECT(!str16.IsOneByteString()); 790 EXPECT(!str16.IsOneByteString());
809 EXPECT(str16.IsTwoByteString()); 791 EXPECT(str16.IsTwoByteString());
810 EXPECT_EQ(0x0000, str16.CharAt(0)); 792 EXPECT_EQ(0x0000, str16.CharAt(0));
811 EXPECT_EQ(0x7FFF, str16.CharAt(1)); 793 EXPECT_EQ(0x7FFF, str16.CharAt(1));
812 EXPECT_EQ(0xFFFF, str16.CharAt(2)); 794 EXPECT_EQ(0xFFFF, str16.CharAt(2));
813 } 795 }
814 } 796 }
815 797
816
817 ISOLATE_UNIT_TEST_CASE(StringFormat) { 798 ISOLATE_UNIT_TEST_CASE(StringFormat) {
818 const char* hello_str = "Hello World!"; 799 const char* hello_str = "Hello World!";
819 const String& str = 800 const String& str =
820 String::Handle(String::NewFormatted("Hello %s!", "World")); 801 String::Handle(String::NewFormatted("Hello %s!", "World"));
821 EXPECT(str.IsInstance()); 802 EXPECT(str.IsInstance());
822 EXPECT(str.IsString()); 803 EXPECT(str.IsString());
823 EXPECT(str.IsOneByteString()); 804 EXPECT(str.IsOneByteString());
824 EXPECT(!str.IsTwoByteString()); 805 EXPECT(!str.IsTwoByteString());
825 EXPECT(!str.IsNumber()); 806 EXPECT(!str.IsNumber());
826 EXPECT(str.Equals(hello_str)); 807 EXPECT(str.Equals(hello_str));
827 } 808 }
828 809
829
830 ISOLATE_UNIT_TEST_CASE(StringConcat) { 810 ISOLATE_UNIT_TEST_CASE(StringConcat) {
831 // Create strings from concatenated 1-byte empty strings. 811 // Create strings from concatenated 1-byte empty strings.
832 { 812 {
833 const String& empty1 = String::Handle(String::New("")); 813 const String& empty1 = String::Handle(String::New(""));
834 EXPECT(empty1.IsOneByteString()); 814 EXPECT(empty1.IsOneByteString());
835 EXPECT_EQ(0, empty1.Length()); 815 EXPECT_EQ(0, empty1.Length());
836 816
837 const String& empty2 = String::Handle(String::New("")); 817 const String& empty2 = String::Handle(String::New(""));
838 EXPECT(empty2.IsOneByteString()); 818 EXPECT(empty2.IsOneByteString());
839 EXPECT_EQ(0, empty2.Length()); 819 EXPECT_EQ(0, empty2.Length());
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 EXPECT(two_one_two_str.IsTwoByteString()); 1330 EXPECT(two_one_two_str.IsTwoByteString());
1351 EXPECT_EQ(twostr.Length() * 2 + onestr.Length(), two_one_two_str.Length()); 1331 EXPECT_EQ(twostr.Length() * 2 + onestr.Length(), two_one_two_str.Length());
1352 uint16_t two_one_two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9, 'o', 1332 uint16_t two_one_two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9, 'o',
1353 'n', 'e', ' ', 'b', 'y', 't', 1333 'n', 'e', ' ', 'b', 'y', 't',
1354 'e', 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9}; 1334 'e', 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
1355 intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]); 1335 intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
1356 EXPECT(two_one_two_str.Equals(two_one_two, two_one_two_len)); 1336 EXPECT(two_one_two_str.Equals(two_one_two, two_one_two_len));
1357 } 1337 }
1358 } 1338 }
1359 1339
1360
1361 ISOLATE_UNIT_TEST_CASE(StringHashConcat) { 1340 ISOLATE_UNIT_TEST_CASE(StringHashConcat) {
1362 EXPECT_EQ(String::Handle(String::New("onebyte")).Hash(), 1341 EXPECT_EQ(String::Handle(String::New("onebyte")).Hash(),
1363 String::HashConcat(String::Handle(String::New("one")), 1342 String::HashConcat(String::Handle(String::New("one")),
1364 String::Handle(String::New("byte")))); 1343 String::Handle(String::New("byte"))));
1365 uint16_t clef_utf16[] = {0xD834, 0xDD1E}; 1344 uint16_t clef_utf16[] = {0xD834, 0xDD1E};
1366 const String& clef = String::Handle(String::FromUTF16(clef_utf16, 2)); 1345 const String& clef = String::Handle(String::FromUTF16(clef_utf16, 2));
1367 int32_t clef_utf32[] = {0x1D11E}; 1346 int32_t clef_utf32[] = {0x1D11E};
1368 EXPECT(clef.Equals(clef_utf32, 1)); 1347 EXPECT(clef.Equals(clef_utf32, 1));
1369 intptr_t hash32 = String::Hash(clef_utf32, 1); 1348 intptr_t hash32 = String::Hash(clef_utf32, 1);
1370 EXPECT_EQ(hash32, clef.Hash()); 1349 EXPECT_EQ(hash32, clef.Hash());
1371 EXPECT_EQ(hash32, String::HashConcat( 1350 EXPECT_EQ(hash32, String::HashConcat(
1372 String::Handle(String::FromUTF16(clef_utf16, 1)), 1351 String::Handle(String::FromUTF16(clef_utf16, 1)),
1373 String::Handle(String::FromUTF16(clef_utf16 + 1, 1)))); 1352 String::Handle(String::FromUTF16(clef_utf16 + 1, 1))));
1374 } 1353 }
1375 1354
1376
1377 ISOLATE_UNIT_TEST_CASE(StringSubStringDifferentWidth) { 1355 ISOLATE_UNIT_TEST_CASE(StringSubStringDifferentWidth) {
1378 // Create 1-byte substring from a 1-byte source string. 1356 // Create 1-byte substring from a 1-byte source string.
1379 const char* onechars = "\xC3\xB6\xC3\xB1\xC3\xA9"; 1357 const char* onechars = "\xC3\xB6\xC3\xB1\xC3\xA9";
1380 1358
1381 const String& onestr = String::Handle(String::New(onechars)); 1359 const String& onestr = String::Handle(String::New(onechars));
1382 EXPECT(!onestr.IsNull()); 1360 EXPECT(!onestr.IsNull());
1383 EXPECT(onestr.IsOneByteString()); 1361 EXPECT(onestr.IsOneByteString());
1384 EXPECT(!onestr.IsTwoByteString()); 1362 EXPECT(!onestr.IsTwoByteString());
1385 1363
1386 const String& onesub = String::Handle(String::SubString(onestr, 0)); 1364 const String& onesub = String::Handle(String::SubString(onestr, 0));
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1427 EXPECT(!foursub2.IsNull()); 1405 EXPECT(!foursub2.IsNull());
1428 EXPECT(foursub2.IsTwoByteString()); 1406 EXPECT(foursub2.IsTwoByteString());
1429 EXPECT_EQ(foursub2.Length(), 3); 1407 EXPECT_EQ(foursub2.Length(), 3);
1430 1408
1431 const String& foursub4 = String::Handle(String::SubString(fourstr, 6)); 1409 const String& foursub4 = String::Handle(String::SubString(fourstr, 6));
1432 EXPECT_EQ(foursub4.Length(), 8); 1410 EXPECT_EQ(foursub4.Length(), 8);
1433 EXPECT(!foursub4.IsNull()); 1411 EXPECT(!foursub4.IsNull());
1434 EXPECT(foursub4.IsTwoByteString()); 1412 EXPECT(foursub4.IsTwoByteString());
1435 } 1413 }
1436 1414
1437
1438 ISOLATE_UNIT_TEST_CASE(StringFromUtf8Literal) { 1415 ISOLATE_UNIT_TEST_CASE(StringFromUtf8Literal) {
1439 // Create a 1-byte string from a UTF-8 encoded string literal. 1416 // Create a 1-byte string from a UTF-8 encoded string literal.
1440 { 1417 {
1441 const char* src = 1418 const char* src =
1442 "\xC2\xA0\xC2\xA1\xC2\xA2\xC2\xA3" 1419 "\xC2\xA0\xC2\xA1\xC2\xA2\xC2\xA3"
1443 "\xC2\xA4\xC2\xA5\xC2\xA6\xC2\xA7" 1420 "\xC2\xA4\xC2\xA5\xC2\xA6\xC2\xA7"
1444 "\xC2\xA8\xC2\xA9\xC2\xAA\xC2\xAB" 1421 "\xC2\xA8\xC2\xA9\xC2\xAA\xC2\xAB"
1445 "\xC2\xAC\xC2\xAD\xC2\xAE\xC2\xAF" 1422 "\xC2\xAC\xC2\xAD\xC2\xAE\xC2\xAF"
1446 "\xC2\xB0\xC2\xB1\xC2\xB2\xC2\xB3" 1423 "\xC2\xB0\xC2\xB1\xC2\xB2\xC2\xB3"
1447 "\xC2\xB4\xC2\xB5\xC2\xB6\xC2\xB7" 1424 "\xC2\xB4\xC2\xB5\xC2\xB6\xC2\xB7"
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1587 const String& str = String::Handle(String::New(src)); 1564 const String& str = String::Handle(String::New(src));
1588 EXPECT(str.IsTwoByteString()); 1565 EXPECT(str.IsTwoByteString());
1589 intptr_t expected_size = sizeof(expected) / sizeof(expected[0]); 1566 intptr_t expected_size = sizeof(expected) / sizeof(expected[0]);
1590 EXPECT_EQ(expected_size, str.Length()); 1567 EXPECT_EQ(expected_size, str.Length());
1591 for (int i = 0; i < str.Length(); ++i) { 1568 for (int i = 0; i < str.Length(); ++i) {
1592 EXPECT_EQ(expected[i], str.CharAt(i)); 1569 EXPECT_EQ(expected[i], str.CharAt(i));
1593 } 1570 }
1594 } 1571 }
1595 } 1572 }
1596 1573
1597
1598 ISOLATE_UNIT_TEST_CASE(StringEqualsUtf8) { 1574 ISOLATE_UNIT_TEST_CASE(StringEqualsUtf8) {
1599 const char* onesrc = "abc"; 1575 const char* onesrc = "abc";
1600 const String& onestr = String::Handle(String::New(onesrc)); 1576 const String& onestr = String::Handle(String::New(onesrc));
1601 EXPECT(onestr.IsOneByteString()); 1577 EXPECT(onestr.IsOneByteString());
1602 EXPECT(!onestr.Equals("")); 1578 EXPECT(!onestr.Equals(""));
1603 EXPECT(!onestr.Equals("a")); 1579 EXPECT(!onestr.Equals("a"));
1604 EXPECT(!onestr.Equals("ab")); 1580 EXPECT(!onestr.Equals("ab"));
1605 EXPECT(onestr.Equals("abc")); 1581 EXPECT(onestr.Equals("abc"));
1606 EXPECT(!onestr.Equals("abcd")); 1582 EXPECT(!onestr.Equals("abcd"));
1607 1583
(...skipping 11 matching lines...) Expand all
1619 EXPECT(fourstr.IsTwoByteString()); 1595 EXPECT(fourstr.IsTwoByteString());
1620 EXPECT(!fourstr.Equals("")); 1596 EXPECT(!fourstr.Equals(""));
1621 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0")); 1597 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0"));
1622 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1")); 1598 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"));
1623 EXPECT(fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1\xF0\x90\x8E\xA2")); 1599 EXPECT(fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1\xF0\x90\x8E\xA2"));
1624 EXPECT( 1600 EXPECT(
1625 !fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1" 1601 !fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"
1626 "\xF0\x90\x8E\xA2\xF0\x90\x8E\xA3")); 1602 "\xF0\x90\x8E\xA2\xF0\x90\x8E\xA3"));
1627 } 1603 }
1628 1604
1629
1630 ISOLATE_UNIT_TEST_CASE(StringEqualsUTF32) { 1605 ISOLATE_UNIT_TEST_CASE(StringEqualsUTF32) {
1631 const String& empty = String::Handle(String::New("")); 1606 const String& empty = String::Handle(String::New(""));
1632 const String& t_str = String::Handle(String::New("t")); 1607 const String& t_str = String::Handle(String::New("t"));
1633 const String& th_str = String::Handle(String::New("th")); 1608 const String& th_str = String::Handle(String::New("th"));
1634 const int32_t chars[] = {'t', 'h', 'i', 's'}; 1609 const int32_t chars[] = {'t', 'h', 'i', 's'};
1635 EXPECT(!empty.Equals(chars, -1)); 1610 EXPECT(!empty.Equals(chars, -1));
1636 EXPECT(empty.Equals(chars, 0)); 1611 EXPECT(empty.Equals(chars, 0));
1637 EXPECT(!empty.Equals(chars, 1)); 1612 EXPECT(!empty.Equals(chars, 1));
1638 EXPECT(!t_str.Equals(chars, 0)); 1613 EXPECT(!t_str.Equals(chars, 0));
1639 EXPECT(t_str.Equals(chars, 1)); 1614 EXPECT(t_str.Equals(chars, 1));
1640 EXPECT(!t_str.Equals(chars, 2)); 1615 EXPECT(!t_str.Equals(chars, 2));
1641 EXPECT(!th_str.Equals(chars, 1)); 1616 EXPECT(!th_str.Equals(chars, 1));
1642 EXPECT(th_str.Equals(chars, 2)); 1617 EXPECT(th_str.Equals(chars, 2));
1643 EXPECT(!th_str.Equals(chars, 3)); 1618 EXPECT(!th_str.Equals(chars, 3));
1644 } 1619 }
1645 1620
1646
1647 ISOLATE_UNIT_TEST_CASE(ExternalOneByteString) { 1621 ISOLATE_UNIT_TEST_CASE(ExternalOneByteString) {
1648 uint8_t characters[] = {0xF6, 0xF1, 0xE9}; 1622 uint8_t characters[] = {0xF6, 0xF1, 0xE9};
1649 intptr_t len = ARRAY_SIZE(characters); 1623 intptr_t len = ARRAY_SIZE(characters);
1650 1624
1651 const String& str = String::Handle( 1625 const String& str = String::Handle(
1652 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1626 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
1653 EXPECT(!str.IsOneByteString()); 1627 EXPECT(!str.IsOneByteString());
1654 EXPECT(str.IsExternalOneByteString()); 1628 EXPECT(str.IsExternalOneByteString());
1655 EXPECT_EQ(str.Length(), len); 1629 EXPECT_EQ(str.Length(), len);
1656 EXPECT(str.Equals("\xC3\xB6\xC3\xB1\xC3\xA9")); 1630 EXPECT(str.Equals("\xC3\xB6\xC3\xB1\xC3\xA9"));
(...skipping 10 matching lines...) Expand all
1667 EXPECT_EQ(len * 2, concat.Length()); 1641 EXPECT_EQ(len * 2, concat.Length());
1668 EXPECT(concat.Equals("\xC3\xB6\xC3\xB1\xC3\xA9\xC3\xB6\xC3\xB1\xC3\xA9")); 1642 EXPECT(concat.Equals("\xC3\xB6\xC3\xB1\xC3\xA9\xC3\xB6\xC3\xB1\xC3\xA9"));
1669 1643
1670 const String& substr = String::Handle(String::SubString(str, 1, 1)); 1644 const String& substr = String::Handle(String::SubString(str, 1, 1));
1671 EXPECT(!substr.IsExternalOneByteString()); 1645 EXPECT(!substr.IsExternalOneByteString());
1672 EXPECT(substr.IsOneByteString()); 1646 EXPECT(substr.IsOneByteString());
1673 EXPECT_EQ(1, substr.Length()); 1647 EXPECT_EQ(1, substr.Length());
1674 EXPECT(substr.Equals("\xC3\xB1")); 1648 EXPECT(substr.Equals("\xC3\xB1"));
1675 } 1649 }
1676 1650
1677
1678 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersOneByteString) { 1651 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersOneByteString) {
1679 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t', 1652 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t',
1680 '\v', '\r', '\\', '$', 'z'}; 1653 '\v', '\r', '\\', '$', 'z'};
1681 intptr_t len = ARRAY_SIZE(characters); 1654 intptr_t len = ARRAY_SIZE(characters);
1682 1655
1683 const String& str = 1656 const String& str =
1684 String::Handle(OneByteString::New(characters, len, Heap::kNew)); 1657 String::Handle(OneByteString::New(characters, len, Heap::kNew));
1685 EXPECT(str.IsOneByteString()); 1658 EXPECT(str.IsOneByteString());
1686 EXPECT_EQ(str.Length(), len); 1659 EXPECT_EQ(str.Length(), len);
1687 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z")); 1660 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
1688 const String& escaped_str = 1661 const String& escaped_str =
1689 String::Handle(String::EscapeSpecialCharacters(str)); 1662 String::Handle(String::EscapeSpecialCharacters(str));
1690 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z")); 1663 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
1691 1664
1692 const String& escaped_empty_str = 1665 const String& escaped_empty_str =
1693 String::Handle(String::EscapeSpecialCharacters(Symbols::Empty())); 1666 String::Handle(String::EscapeSpecialCharacters(Symbols::Empty()));
1694 EXPECT_EQ(escaped_empty_str.Length(), 0); 1667 EXPECT_EQ(escaped_empty_str.Length(), 0);
1695 } 1668 }
1696 1669
1697
1698 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersExternalOneByteString) { 1670 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersExternalOneByteString) {
1699 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t', 1671 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t',
1700 '\v', '\r', '\\', '$', 'z'}; 1672 '\v', '\r', '\\', '$', 'z'};
1701 intptr_t len = ARRAY_SIZE(characters); 1673 intptr_t len = ARRAY_SIZE(characters);
1702 1674
1703 const String& str = String::Handle( 1675 const String& str = String::Handle(
1704 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1676 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
1705 EXPECT(!str.IsOneByteString()); 1677 EXPECT(!str.IsOneByteString());
1706 EXPECT(str.IsExternalOneByteString()); 1678 EXPECT(str.IsExternalOneByteString());
1707 EXPECT_EQ(str.Length(), len); 1679 EXPECT_EQ(str.Length(), len);
(...skipping 25 matching lines...) Expand all
1733 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z")); 1705 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
1734 1706
1735 const String& empty_str = 1707 const String& empty_str =
1736 String::Handle(TwoByteString::New(static_cast<intptr_t>(0), Heap::kNew)); 1708 String::Handle(TwoByteString::New(static_cast<intptr_t>(0), Heap::kNew));
1737 const String& escaped_empty_str = 1709 const String& escaped_empty_str =
1738 String::Handle(String::EscapeSpecialCharacters(empty_str)); 1710 String::Handle(String::EscapeSpecialCharacters(empty_str));
1739 EXPECT_EQ(empty_str.Length(), 0); 1711 EXPECT_EQ(empty_str.Length(), 0);
1740 EXPECT_EQ(escaped_empty_str.Length(), 0); 1712 EXPECT_EQ(escaped_empty_str.Length(), 0);
1741 } 1713 }
1742 1714
1743
1744 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersExternalTwoByteString) { 1715 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersExternalTwoByteString) {
1745 uint16_t characters[] = {'a', '\n', '\f', '\b', '\t', 1716 uint16_t characters[] = {'a', '\n', '\f', '\b', '\t',
1746 '\v', '\r', '\\', '$', 'z'}; 1717 '\v', '\r', '\\', '$', 'z'};
1747 intptr_t len = ARRAY_SIZE(characters); 1718 intptr_t len = ARRAY_SIZE(characters);
1748 1719
1749 const String& str = String::Handle( 1720 const String& str = String::Handle(
1750 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1721 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
1751 EXPECT(str.IsExternalTwoByteString()); 1722 EXPECT(str.IsExternalTwoByteString());
1752 EXPECT_EQ(str.Length(), len); 1723 EXPECT_EQ(str.Length(), len);
1753 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z")); 1724 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
1754 const String& escaped_str = 1725 const String& escaped_str =
1755 String::Handle(String::EscapeSpecialCharacters(str)); 1726 String::Handle(String::EscapeSpecialCharacters(str));
1756 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z")); 1727 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
1757 1728
1758 const String& empty_str = String::Handle( 1729 const String& empty_str = String::Handle(
1759 ExternalTwoByteString::New(characters, 0, NULL, NULL, Heap::kNew)); 1730 ExternalTwoByteString::New(characters, 0, NULL, NULL, Heap::kNew));
1760 const String& escaped_empty_str = 1731 const String& escaped_empty_str =
1761 String::Handle(String::EscapeSpecialCharacters(empty_str)); 1732 String::Handle(String::EscapeSpecialCharacters(empty_str));
1762 EXPECT_EQ(empty_str.Length(), 0); 1733 EXPECT_EQ(empty_str.Length(), 0);
1763 EXPECT_EQ(escaped_empty_str.Length(), 0); 1734 EXPECT_EQ(escaped_empty_str.Length(), 0);
1764 } 1735 }
1765 1736
1766
1767 ISOLATE_UNIT_TEST_CASE(ExternalTwoByteString) { 1737 ISOLATE_UNIT_TEST_CASE(ExternalTwoByteString) {
1768 uint16_t characters[] = {0x1E6B, 0x1E85, 0x1E53}; 1738 uint16_t characters[] = {0x1E6B, 0x1E85, 0x1E53};
1769 intptr_t len = ARRAY_SIZE(characters); 1739 intptr_t len = ARRAY_SIZE(characters);
1770 1740
1771 const String& str = String::Handle( 1741 const String& str = String::Handle(
1772 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1742 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
1773 EXPECT(!str.IsTwoByteString()); 1743 EXPECT(!str.IsTwoByteString());
1774 EXPECT(str.IsExternalTwoByteString()); 1744 EXPECT(str.IsExternalTwoByteString());
1775 EXPECT_EQ(str.Length(), len); 1745 EXPECT_EQ(str.Length(), len);
1776 EXPECT(str.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93")); 1746 EXPECT(str.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"));
(...skipping 12 matching lines...) Expand all
1789 concat.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93" 1759 concat.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"
1790 "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93")); 1760 "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"));
1791 1761
1792 const String& substr = String::Handle(String::SubString(str, 1, 1)); 1762 const String& substr = String::Handle(String::SubString(str, 1, 1));
1793 EXPECT(!substr.IsExternalTwoByteString()); 1763 EXPECT(!substr.IsExternalTwoByteString());
1794 EXPECT(substr.IsTwoByteString()); 1764 EXPECT(substr.IsTwoByteString());
1795 EXPECT_EQ(1, substr.Length()); 1765 EXPECT_EQ(1, substr.Length());
1796 EXPECT(substr.Equals("\xE1\xBA\x85")); 1766 EXPECT(substr.Equals("\xE1\xBA\x85"));
1797 } 1767 }
1798 1768
1799
1800 ISOLATE_UNIT_TEST_CASE(Symbol) { 1769 ISOLATE_UNIT_TEST_CASE(Symbol) {
1801 const String& one = String::Handle(Symbols::New(thread, "Eins")); 1770 const String& one = String::Handle(Symbols::New(thread, "Eins"));
1802 EXPECT(one.IsSymbol()); 1771 EXPECT(one.IsSymbol());
1803 const String& two = String::Handle(Symbols::New(thread, "Zwei")); 1772 const String& two = String::Handle(Symbols::New(thread, "Zwei"));
1804 const String& three = String::Handle(Symbols::New(thread, "Drei")); 1773 const String& three = String::Handle(Symbols::New(thread, "Drei"));
1805 const String& four = String::Handle(Symbols::New(thread, "Vier")); 1774 const String& four = String::Handle(Symbols::New(thread, "Vier"));
1806 const String& five = String::Handle(Symbols::New(thread, "Fuenf")); 1775 const String& five = String::Handle(Symbols::New(thread, "Fuenf"));
1807 const String& six = String::Handle(Symbols::New(thread, "Sechs")); 1776 const String& six = String::Handle(Symbols::New(thread, "Sechs"));
1808 const String& seven = String::Handle(Symbols::New(thread, "Sieben")); 1777 const String& seven = String::Handle(Symbols::New(thread, "Sieben"));
1809 const String& eight = String::Handle(Symbols::New(thread, "Acht")); 1778 const String& eight = String::Handle(Symbols::New(thread, "Acht"));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1851 uint16_t char16[] = {'E', 'l', 'f'}; 1820 uint16_t char16[] = {'E', 'l', 'f'};
1852 String& elf1 = String::Handle(Symbols::FromUTF16(thread, char16, 3)); 1821 String& elf1 = String::Handle(Symbols::FromUTF16(thread, char16, 3));
1853 int32_t char32[] = {'E', 'l', 'f'}; 1822 int32_t char32[] = {'E', 'l', 'f'};
1854 String& elf2 = String::Handle(Symbols::FromUTF32(thread, char32, 3)); 1823 String& elf2 = String::Handle(Symbols::FromUTF32(thread, char32, 3));
1855 EXPECT(elf1.IsSymbol()); 1824 EXPECT(elf1.IsSymbol());
1856 EXPECT(elf2.IsSymbol()); 1825 EXPECT(elf2.IsSymbol());
1857 EXPECT_EQ(elf1.raw(), Symbols::New(thread, "Elf")); 1826 EXPECT_EQ(elf1.raw(), Symbols::New(thread, "Elf"));
1858 EXPECT_EQ(elf2.raw(), Symbols::New(thread, "Elf")); 1827 EXPECT_EQ(elf2.raw(), Symbols::New(thread, "Elf"));
1859 } 1828 }
1860 1829
1861
1862 ISOLATE_UNIT_TEST_CASE(SymbolUnicode) { 1830 ISOLATE_UNIT_TEST_CASE(SymbolUnicode) {
1863 uint16_t monkey_utf16[] = {0xd83d, 0xdc35}; // Unicode Monkey Face. 1831 uint16_t monkey_utf16[] = {0xd83d, 0xdc35}; // Unicode Monkey Face.
1864 String& monkey = String::Handle(Symbols::FromUTF16(thread, monkey_utf16, 2)); 1832 String& monkey = String::Handle(Symbols::FromUTF16(thread, monkey_utf16, 2));
1865 EXPECT(monkey.IsSymbol()); 1833 EXPECT(monkey.IsSymbol());
1866 const char monkey_utf8[] = {'\xf0', '\x9f', '\x90', '\xb5', 0}; 1834 const char monkey_utf8[] = {'\xf0', '\x9f', '\x90', '\xb5', 0};
1867 EXPECT_EQ(monkey.raw(), Symbols::New(thread, monkey_utf8)); 1835 EXPECT_EQ(monkey.raw(), Symbols::New(thread, monkey_utf8));
1868 1836
1869 int32_t kMonkeyFace = 0x1f435; 1837 int32_t kMonkeyFace = 0x1f435;
1870 String& monkey2 = String::Handle(Symbols::FromCharCode(thread, kMonkeyFace)); 1838 String& monkey2 = String::Handle(Symbols::FromCharCode(thread, kMonkeyFace));
1871 EXPECT_EQ(monkey.raw(), monkey2.raw()); 1839 EXPECT_EQ(monkey.raw(), monkey2.raw());
1872 1840
1873 // Unicode cat face with tears of joy. 1841 // Unicode cat face with tears of joy.
1874 int32_t kCatFaceWithTearsOfJoy = 0x1f639; 1842 int32_t kCatFaceWithTearsOfJoy = 0x1f639;
1875 String& cat = 1843 String& cat =
1876 String::Handle(Symbols::FromCharCode(thread, kCatFaceWithTearsOfJoy)); 1844 String::Handle(Symbols::FromCharCode(thread, kCatFaceWithTearsOfJoy));
1877 1845
1878 uint16_t cat_utf16[] = {0xd83d, 0xde39}; 1846 uint16_t cat_utf16[] = {0xd83d, 0xde39};
1879 String& cat2 = String::Handle(Symbols::FromUTF16(thread, cat_utf16, 2)); 1847 String& cat2 = String::Handle(Symbols::FromUTF16(thread, cat_utf16, 2));
1880 EXPECT(cat2.IsSymbol()); 1848 EXPECT(cat2.IsSymbol());
1881 EXPECT_EQ(cat2.raw(), cat.raw()); 1849 EXPECT_EQ(cat2.raw(), cat.raw());
1882 } 1850 }
1883 1851
1884
1885 ISOLATE_UNIT_TEST_CASE(Bool) { 1852 ISOLATE_UNIT_TEST_CASE(Bool) {
1886 EXPECT(Bool::True().value()); 1853 EXPECT(Bool::True().value());
1887 EXPECT(!Bool::False().value()); 1854 EXPECT(!Bool::False().value());
1888 } 1855 }
1889 1856
1890
1891 ISOLATE_UNIT_TEST_CASE(Array) { 1857 ISOLATE_UNIT_TEST_CASE(Array) {
1892 const int kArrayLen = 5; 1858 const int kArrayLen = 5;
1893 const Array& array = Array::Handle(Array::New(kArrayLen)); 1859 const Array& array = Array::Handle(Array::New(kArrayLen));
1894 EXPECT_EQ(kArrayLen, array.Length()); 1860 EXPECT_EQ(kArrayLen, array.Length());
1895 Object& element = Object::Handle(array.At(0)); 1861 Object& element = Object::Handle(array.At(0));
1896 EXPECT(element.IsNull()); 1862 EXPECT(element.IsNull());
1897 element = array.At(kArrayLen - 1); 1863 element = array.At(kArrayLen - 1);
1898 EXPECT(element.IsNull()); 1864 EXPECT(element.IsNull());
1899 array.SetAt(0, array); 1865 array.SetAt(0, array);
1900 array.SetAt(2, array); 1866 array.SetAt(2, array);
(...skipping 23 matching lines...) Expand all
1924 1890
1925 EXPECT_EQ(1, Object::zero_array().Length()); 1891 EXPECT_EQ(1, Object::zero_array().Length());
1926 element = Object::zero_array().At(0); 1892 element = Object::zero_array().At(0);
1927 EXPECT(Smi::Cast(element).IsZero()); 1893 EXPECT(Smi::Cast(element).IsZero());
1928 1894
1929 array.MakeImmutable(); 1895 array.MakeImmutable();
1930 Object& obj = Object::Handle(array.raw()); 1896 Object& obj = Object::Handle(array.raw());
1931 EXPECT(obj.IsArray()); 1897 EXPECT(obj.IsArray());
1932 } 1898 }
1933 1899
1934
1935 static void TestIllegalArrayLength(intptr_t length) { 1900 static void TestIllegalArrayLength(intptr_t length) {
1936 char buffer[1024]; 1901 char buffer[1024];
1937 OS::SNPrint(buffer, sizeof(buffer), 1902 OS::SNPrint(buffer, sizeof(buffer),
1938 "main() {\n" 1903 "main() {\n"
1939 " new List(%" Pd 1904 " new List(%" Pd
1940 ");\n" 1905 ");\n"
1941 "}\n", 1906 "}\n",
1942 length); 1907 length);
1943 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL); 1908 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
1944 EXPECT_VALID(lib); 1909 EXPECT_VALID(lib);
1945 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1910 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1946 OS::SNPrint(buffer, sizeof(buffer), 1911 OS::SNPrint(buffer, sizeof(buffer),
1947 "Unhandled exception:\n" 1912 "Unhandled exception:\n"
1948 "RangeError (length): Invalid value: " 1913 "RangeError (length): Invalid value: "
1949 "Not in range 0..%" Pd ", inclusive: %" Pd, 1914 "Not in range 0..%" Pd ", inclusive: %" Pd,
1950 Array::kMaxElements, length); 1915 Array::kMaxElements, length);
1951 EXPECT_ERROR(result, buffer); 1916 EXPECT_ERROR(result, buffer);
1952 } 1917 }
1953 1918
1954
1955 TEST_CASE(ArrayLengthNegativeOne) { 1919 TEST_CASE(ArrayLengthNegativeOne) {
1956 TestIllegalArrayLength(-1); 1920 TestIllegalArrayLength(-1);
1957 } 1921 }
1958 TEST_CASE(ArrayLengthSmiMin) { 1922 TEST_CASE(ArrayLengthSmiMin) {
1959 TestIllegalArrayLength(kSmiMin); 1923 TestIllegalArrayLength(kSmiMin);
1960 } 1924 }
1961 TEST_CASE(ArrayLengthOneTooMany) { 1925 TEST_CASE(ArrayLengthOneTooMany) {
1962 const intptr_t kOneTooMany = Array::kMaxElements + 1; 1926 const intptr_t kOneTooMany = Array::kMaxElements + 1;
1963 ASSERT(kOneTooMany >= 0); 1927 ASSERT(kOneTooMany >= 0);
1964 TestIllegalArrayLength(kOneTooMany); 1928 TestIllegalArrayLength(kOneTooMany);
1965 } 1929 }
1966 1930
1967
1968 TEST_CASE(ArrayLengthMaxElements) { 1931 TEST_CASE(ArrayLengthMaxElements) {
1969 char buffer[1024]; 1932 char buffer[1024];
1970 OS::SNPrint(buffer, sizeof(buffer), 1933 OS::SNPrint(buffer, sizeof(buffer),
1971 "main() {\n" 1934 "main() {\n"
1972 " return new List(%" Pd 1935 " return new List(%" Pd
1973 ");\n" 1936 ");\n"
1974 "}\n", 1937 "}\n",
1975 Array::kMaxElements); 1938 Array::kMaxElements);
1976 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL); 1939 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
1977 EXPECT_VALID(lib); 1940 EXPECT_VALID(lib);
1978 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1941 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1979 if (Dart_IsError(result)) { 1942 if (Dart_IsError(result)) {
1980 EXPECT_ERROR(result, "Out of Memory"); 1943 EXPECT_ERROR(result, "Out of Memory");
1981 } else { 1944 } else {
1982 const intptr_t kExpected = Array::kMaxElements; 1945 const intptr_t kExpected = Array::kMaxElements;
1983 intptr_t actual = 0; 1946 intptr_t actual = 0;
1984 EXPECT_VALID(Dart_ListLength(result, &actual)); 1947 EXPECT_VALID(Dart_ListLength(result, &actual));
1985 EXPECT_EQ(kExpected, actual); 1948 EXPECT_EQ(kExpected, actual);
1986 } 1949 }
1987 } 1950 }
1988 1951
1989
1990 static void TestIllegalTypedDataLength(const char* class_name, 1952 static void TestIllegalTypedDataLength(const char* class_name,
1991 intptr_t length) { 1953 intptr_t length) {
1992 char buffer[1024]; 1954 char buffer[1024];
1993 OS::SNPrint(buffer, sizeof(buffer), 1955 OS::SNPrint(buffer, sizeof(buffer),
1994 "import 'dart:typed_data';\n" 1956 "import 'dart:typed_data';\n"
1995 "main() {\n" 1957 "main() {\n"
1996 " new %s(%" Pd 1958 " new %s(%" Pd
1997 ");\n" 1959 ");\n"
1998 "}\n", 1960 "}\n",
1999 class_name, length); 1961 class_name, length);
2000 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL); 1962 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
2001 EXPECT_VALID(lib); 1963 EXPECT_VALID(lib);
2002 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1964 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
2003 OS::SNPrint(buffer, sizeof(buffer), "%" Pd, length); 1965 OS::SNPrint(buffer, sizeof(buffer), "%" Pd, length);
2004 EXPECT_ERROR(result, "Invalid argument(s)"); 1966 EXPECT_ERROR(result, "Invalid argument(s)");
2005 EXPECT_ERROR(result, buffer); 1967 EXPECT_ERROR(result, buffer);
2006 } 1968 }
2007 1969
2008
2009 TEST_CASE(Int8ListLengthNegativeOne) { 1970 TEST_CASE(Int8ListLengthNegativeOne) {
2010 TestIllegalTypedDataLength("Int8List", -1); 1971 TestIllegalTypedDataLength("Int8List", -1);
2011 } 1972 }
2012 TEST_CASE(Int8ListLengthSmiMin) { 1973 TEST_CASE(Int8ListLengthSmiMin) {
2013 TestIllegalTypedDataLength("Int8List", kSmiMin); 1974 TestIllegalTypedDataLength("Int8List", kSmiMin);
2014 } 1975 }
2015 TEST_CASE(Int8ListLengthOneTooMany) { 1976 TEST_CASE(Int8ListLengthOneTooMany) {
2016 const intptr_t kOneTooMany = 1977 const intptr_t kOneTooMany =
2017 TypedData::MaxElements(kTypedDataInt8ArrayCid) + 1; 1978 TypedData::MaxElements(kTypedDataInt8ArrayCid) + 1;
2018 ASSERT(kOneTooMany >= 0); 1979 ASSERT(kOneTooMany >= 0);
2019 TestIllegalTypedDataLength("Int8List", kOneTooMany); 1980 TestIllegalTypedDataLength("Int8List", kOneTooMany);
2020 } 1981 }
2021 1982
2022
2023 TEST_CASE(Int8ListLengthMaxElements) { 1983 TEST_CASE(Int8ListLengthMaxElements) {
2024 const intptr_t max_elements = TypedData::MaxElements(kTypedDataInt8ArrayCid); 1984 const intptr_t max_elements = TypedData::MaxElements(kTypedDataInt8ArrayCid);
2025 char buffer[1024]; 1985 char buffer[1024];
2026 OS::SNPrint(buffer, sizeof(buffer), 1986 OS::SNPrint(buffer, sizeof(buffer),
2027 "import 'dart:typed_data';\n" 1987 "import 'dart:typed_data';\n"
2028 "main() {\n" 1988 "main() {\n"
2029 " return new Int8List(%" Pd 1989 " return new Int8List(%" Pd
2030 ");\n" 1990 ");\n"
2031 "}\n", 1991 "}\n",
2032 max_elements); 1992 max_elements);
2033 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL); 1993 Dart_Handle lib = TestCase::LoadTestScript(buffer, NULL);
2034 EXPECT_VALID(lib); 1994 EXPECT_VALID(lib);
2035 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1995 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
2036 if (Dart_IsError(result)) { 1996 if (Dart_IsError(result)) {
2037 EXPECT_ERROR(result, "Out of Memory"); 1997 EXPECT_ERROR(result, "Out of Memory");
2038 } else { 1998 } else {
2039 intptr_t actual = 0; 1999 intptr_t actual = 0;
2040 EXPECT_VALID(Dart_ListLength(result, &actual)); 2000 EXPECT_VALID(Dart_ListLength(result, &actual));
2041 EXPECT_EQ(max_elements, actual); 2001 EXPECT_EQ(max_elements, actual);
2042 } 2002 }
2043 } 2003 }
2044 2004
2045
2046 ISOLATE_UNIT_TEST_CASE(StringCodePointIterator) { 2005 ISOLATE_UNIT_TEST_CASE(StringCodePointIterator) {
2047 const String& str0 = String::Handle(String::New("")); 2006 const String& str0 = String::Handle(String::New(""));
2048 String::CodePointIterator it0(str0); 2007 String::CodePointIterator it0(str0);
2049 EXPECT(!it0.Next()); 2008 EXPECT(!it0.Next());
2050 2009
2051 const String& str1 = String::Handle(String::New(" \xc3\xa7 ")); 2010 const String& str1 = String::Handle(String::New(" \xc3\xa7 "));
2052 String::CodePointIterator it1(str1); 2011 String::CodePointIterator it1(str1);
2053 EXPECT(it1.Next()); 2012 EXPECT(it1.Next());
2054 EXPECT_EQ(' ', it1.Current()); 2013 EXPECT_EQ(' ', it1.Current());
2055 EXPECT(it1.Next()); 2014 EXPECT(it1.Next());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2092 EXPECT_EQ(0x1D460, it3.Current()); 2051 EXPECT_EQ(0x1D460, it3.Current());
2093 EXPECT(it3.Next()); 2052 EXPECT(it3.Next());
2094 EXPECT_EQ(0x1D461, it3.Current()); 2053 EXPECT_EQ(0x1D461, it3.Current());
2095 EXPECT(it3.Next()); 2054 EXPECT(it3.Next());
2096 EXPECT_EQ(0x1D462, it3.Current()); 2055 EXPECT_EQ(0x1D462, it3.Current());
2097 EXPECT(it3.Next()); 2056 EXPECT(it3.Next());
2098 EXPECT_EQ(0x1D463, it3.Current()); 2057 EXPECT_EQ(0x1D463, it3.Current());
2099 EXPECT(!it3.Next()); 2058 EXPECT(!it3.Next());
2100 } 2059 }
2101 2060
2102
2103 ISOLATE_UNIT_TEST_CASE(StringCodePointIteratorRange) { 2061 ISOLATE_UNIT_TEST_CASE(StringCodePointIteratorRange) {
2104 const String& str = String::Handle(String::New("foo bar baz")); 2062 const String& str = String::Handle(String::New("foo bar baz"));
2105 2063
2106 String::CodePointIterator it0(str, 3, 0); 2064 String::CodePointIterator it0(str, 3, 0);
2107 EXPECT(!it0.Next()); 2065 EXPECT(!it0.Next());
2108 2066
2109 String::CodePointIterator it1(str, 4, 3); 2067 String::CodePointIterator it1(str, 4, 3);
2110 EXPECT(it1.Next()); 2068 EXPECT(it1.Next());
2111 EXPECT_EQ('b', it1.Current()); 2069 EXPECT_EQ('b', it1.Current());
2112 EXPECT(it1.Next()); 2070 EXPECT(it1.Next());
2113 EXPECT_EQ('a', it1.Current()); 2071 EXPECT_EQ('a', it1.Current());
2114 EXPECT(it1.Next()); 2072 EXPECT(it1.Next());
2115 EXPECT_EQ('r', it1.Current()); 2073 EXPECT_EQ('r', it1.Current());
2116 EXPECT(!it1.Next()); 2074 EXPECT(!it1.Next());
2117 } 2075 }
2118 2076
2119
2120 ISOLATE_UNIT_TEST_CASE(GrowableObjectArray) { 2077 ISOLATE_UNIT_TEST_CASE(GrowableObjectArray) {
2121 const int kArrayLen = 5; 2078 const int kArrayLen = 5;
2122 Smi& value = Smi::Handle(); 2079 Smi& value = Smi::Handle();
2123 Smi& expected_value = Smi::Handle(); 2080 Smi& expected_value = Smi::Handle();
2124 GrowableObjectArray& array = GrowableObjectArray::Handle(); 2081 GrowableObjectArray& array = GrowableObjectArray::Handle();
2125 2082
2126 // Test basic growing functionality. 2083 // Test basic growing functionality.
2127 array = GrowableObjectArray::New(kArrayLen); 2084 array = GrowableObjectArray::New(kArrayLen);
2128 EXPECT_EQ(kArrayLen, array.Capacity()); 2085 EXPECT_EQ(kArrayLen, array.Capacity());
2129 EXPECT_EQ(0, array.Length()); 2086 EXPECT_EQ(0, array.Length());
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2231 intptr_t capacity_before = heap->CapacityInWords(Heap::kOld); 2188 intptr_t capacity_before = heap->CapacityInWords(Heap::kOld);
2232 new_array = Array::MakeFixedLength(array); 2189 new_array = Array::MakeFixedLength(array);
2233 EXPECT_EQ(1, new_array.Length()); 2190 EXPECT_EQ(1, new_array.Length());
2234 heap->CollectAllGarbage(); 2191 heap->CollectAllGarbage();
2235 intptr_t capacity_after = heap->CapacityInWords(Heap::kOld); 2192 intptr_t capacity_after = heap->CapacityInWords(Heap::kOld);
2236 // Page should shrink. 2193 // Page should shrink.
2237 EXPECT_LT(capacity_after, capacity_before); 2194 EXPECT_LT(capacity_after, capacity_before);
2238 EXPECT_EQ(1, new_array.Length()); 2195 EXPECT_EQ(1, new_array.Length());
2239 } 2196 }
2240 2197
2241
2242 ISOLATE_UNIT_TEST_CASE(InternalTypedData) { 2198 ISOLATE_UNIT_TEST_CASE(InternalTypedData) {
2243 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4}; 2199 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4};
2244 intptr_t data_length = ARRAY_SIZE(data); 2200 intptr_t data_length = ARRAY_SIZE(data);
2245 2201
2246 const TypedData& int8_array = 2202 const TypedData& int8_array =
2247 TypedData::Handle(TypedData::New(kTypedDataInt8ArrayCid, data_length)); 2203 TypedData::Handle(TypedData::New(kTypedDataInt8ArrayCid, data_length));
2248 EXPECT(!int8_array.IsNull()); 2204 EXPECT(!int8_array.IsNull());
2249 EXPECT_EQ(data_length, int8_array.Length()); 2205 EXPECT_EQ(data_length, int8_array.Length());
2250 for (intptr_t i = 0; i < data_length; ++i) { 2206 for (intptr_t i = 0; i < data_length; ++i) {
2251 int8_array.SetInt8(i, data[i]); 2207 int8_array.SetInt8(i, data[i]);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2287 EXPECT_EQ(int8_array.GetInt8(i), int8_array2.GetInt8(i)); 2243 EXPECT_EQ(int8_array.GetInt8(i), int8_array2.GetInt8(i));
2288 } 2244 }
2289 for (intptr_t i = 0; i < data_length; ++i) { 2245 for (intptr_t i = 0; i < data_length; ++i) {
2290 int8_array.SetInt8(i, 123 + i); 2246 int8_array.SetInt8(i, 123 + i);
2291 } 2247 }
2292 for (intptr_t i = 0; i < data_length; ++i) { 2248 for (intptr_t i = 0; i < data_length; ++i) {
2293 EXPECT(int8_array.GetInt8(i) != int8_array2.GetInt8(i)); 2249 EXPECT(int8_array.GetInt8(i) != int8_array2.GetInt8(i));
2294 } 2250 }
2295 } 2251 }
2296 2252
2297
2298 ISOLATE_UNIT_TEST_CASE(ExternalTypedData) { 2253 ISOLATE_UNIT_TEST_CASE(ExternalTypedData) {
2299 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4}; 2254 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4};
2300 intptr_t data_length = ARRAY_SIZE(data); 2255 intptr_t data_length = ARRAY_SIZE(data);
2301 2256
2302 const ExternalTypedData& int8_array = 2257 const ExternalTypedData& int8_array =
2303 ExternalTypedData::Handle(ExternalTypedData::New( 2258 ExternalTypedData::Handle(ExternalTypedData::New(
2304 kExternalTypedDataInt8ArrayCid, data, data_length)); 2259 kExternalTypedDataInt8ArrayCid, data, data_length));
2305 EXPECT(!int8_array.IsNull()); 2260 EXPECT(!int8_array.IsNull());
2306 EXPECT_EQ(data_length, int8_array.Length()); 2261 EXPECT_EQ(data_length, int8_array.Length());
2307 2262
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2350 for (intptr_t i = 0; i < int8_array.Length(); ++i) { 2305 for (intptr_t i = 0; i < int8_array.Length(); ++i) {
2351 EXPECT_EQ(int8_array.GetInt8(i), uint8_array.GetInt8(i)); 2306 EXPECT_EQ(int8_array.GetInt8(i), uint8_array.GetInt8(i));
2352 } 2307 }
2353 2308
2354 uint8_clamped_array.SetUint8(0, 123); 2309 uint8_clamped_array.SetUint8(0, 123);
2355 for (intptr_t i = 0; i < int8_array.Length(); ++i) { 2310 for (intptr_t i = 0; i < int8_array.Length(); ++i) {
2356 EXPECT_EQ(int8_array.GetUint8(i), uint8_clamped_array.GetUint8(i)); 2311 EXPECT_EQ(int8_array.GetUint8(i), uint8_clamped_array.GetUint8(i));
2357 } 2312 }
2358 } 2313 }
2359 2314
2360
2361 TEST_CASE(Script) { 2315 TEST_CASE(Script) {
2362 const char* url_chars = "builtin:test-case"; 2316 const char* url_chars = "builtin:test-case";
2363 const char* source_chars = "This will not compile."; 2317 const char* source_chars = "This will not compile.";
2364 const String& url = String::Handle(String::New(url_chars)); 2318 const String& url = String::Handle(String::New(url_chars));
2365 const String& source = String::Handle(String::New(source_chars)); 2319 const String& source = String::Handle(String::New(source_chars));
2366 const Script& script = 2320 const Script& script =
2367 Script::Handle(Script::New(url, source, RawScript::kScriptTag)); 2321 Script::Handle(Script::New(url, source, RawScript::kScriptTag));
2368 EXPECT(!script.IsNull()); 2322 EXPECT(!script.IsNull());
2369 EXPECT(script.IsScript()); 2323 EXPECT(script.IsScript());
2370 String& str = String::Handle(script.url()); 2324 String& str = String::Handle(script.url());
(...skipping 10 matching lines...) Expand all
2381 const char* kScript = "main() {}"; 2335 const char* kScript = "main() {}";
2382 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); 2336 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
2383 EXPECT_VALID(h_lib); 2337 EXPECT_VALID(h_lib);
2384 Library& lib = Library::Handle(); 2338 Library& lib = Library::Handle();
2385 lib ^= Api::UnwrapHandle(h_lib); 2339 lib ^= Api::UnwrapHandle(h_lib);
2386 EXPECT(!lib.IsNull()); 2340 EXPECT(!lib.IsNull());
2387 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); 2341 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
2388 EXPECT_VALID(result); 2342 EXPECT_VALID(result);
2389 } 2343 }
2390 2344
2391
2392 ISOLATE_UNIT_TEST_CASE(EmbeddedScript) { 2345 ISOLATE_UNIT_TEST_CASE(EmbeddedScript) {
2393 const char* url_chars = "builtin:test-case"; 2346 const char* url_chars = "builtin:test-case";
2394 const char* text = 2347 const char* text =
2395 /* 1 */ 2348 /* 1 */
2396 "<!DOCTYPE html>\n" 2349 "<!DOCTYPE html>\n"
2397 /* 2 */ 2350 /* 2 */
2398 " ... more junk ...\n" 2351 " ... more junk ...\n"
2399 /* 3 */ 2352 /* 3 */
2400 " <script type='application/dart'>main() {\n" 2353 " <script type='application/dart'>main() {\n"
2401 /* 4 */ 2354 /* 4 */
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2483 script.TokenRangeAtLine(6, &first_idx, &last_idx); 2436 script.TokenRangeAtLine(6, &first_idx, &last_idx);
2484 EXPECT_EQ(-1, first_idx.value()); 2437 EXPECT_EQ(-1, first_idx.value());
2485 EXPECT_EQ(-1, last_idx.value()); 2438 EXPECT_EQ(-1, last_idx.value());
2486 script.TokenRangeAtLine(1000, &first_idx, &last_idx); 2439 script.TokenRangeAtLine(1000, &first_idx, &last_idx);
2487 EXPECT_EQ(-1, first_idx.value()); 2440 EXPECT_EQ(-1, first_idx.value());
2488 EXPECT_EQ(-1, last_idx.value()); 2441 EXPECT_EQ(-1, last_idx.value());
2489 2442
2490 free(src_chars); 2443 free(src_chars);
2491 } 2444 }
2492 2445
2493
2494 ISOLATE_UNIT_TEST_CASE(Context) { 2446 ISOLATE_UNIT_TEST_CASE(Context) {
2495 const int kNumVariables = 5; 2447 const int kNumVariables = 5;
2496 const Context& parent_context = Context::Handle(Context::New(0)); 2448 const Context& parent_context = Context::Handle(Context::New(0));
2497 const Context& context = Context::Handle(Context::New(kNumVariables)); 2449 const Context& context = Context::Handle(Context::New(kNumVariables));
2498 context.set_parent(parent_context); 2450 context.set_parent(parent_context);
2499 EXPECT_EQ(kNumVariables, context.num_variables()); 2451 EXPECT_EQ(kNumVariables, context.num_variables());
2500 EXPECT(Context::Handle(context.parent()).raw() == parent_context.raw()); 2452 EXPECT(Context::Handle(context.parent()).raw() == parent_context.raw());
2501 EXPECT_EQ(0, Context::Handle(context.parent()).num_variables()); 2453 EXPECT_EQ(0, Context::Handle(context.parent()).num_variables());
2502 EXPECT(Context::Handle(Context::Handle(context.parent()).parent()).IsNull()); 2454 EXPECT(Context::Handle(Context::Handle(context.parent()).parent()).IsNull());
2503 Object& variable = Object::Handle(context.At(0)); 2455 Object& variable = Object::Handle(context.At(0));
2504 EXPECT(variable.IsNull()); 2456 EXPECT(variable.IsNull());
2505 variable = context.At(kNumVariables - 1); 2457 variable = context.At(kNumVariables - 1);
2506 EXPECT(variable.IsNull()); 2458 EXPECT(variable.IsNull());
2507 context.SetAt(0, Smi::Handle(Smi::New(2))); 2459 context.SetAt(0, Smi::Handle(Smi::New(2)));
2508 context.SetAt(2, Smi::Handle(Smi::New(3))); 2460 context.SetAt(2, Smi::Handle(Smi::New(3)));
2509 Smi& smi = Smi::Handle(); 2461 Smi& smi = Smi::Handle();
2510 smi ^= context.At(0); 2462 smi ^= context.At(0);
2511 EXPECT_EQ(2, smi.Value()); 2463 EXPECT_EQ(2, smi.Value());
2512 smi ^= context.At(2); 2464 smi ^= context.At(2);
2513 EXPECT_EQ(3, smi.Value()); 2465 EXPECT_EQ(3, smi.Value());
2514 } 2466 }
2515 2467
2516
2517 ISOLATE_UNIT_TEST_CASE(ContextScope) { 2468 ISOLATE_UNIT_TEST_CASE(ContextScope) {
2518 const intptr_t parent_scope_function_level = 0; 2469 const intptr_t parent_scope_function_level = 0;
2519 LocalScope* parent_scope = 2470 LocalScope* parent_scope =
2520 new LocalScope(NULL, parent_scope_function_level, 0); 2471 new LocalScope(NULL, parent_scope_function_level, 0);
2521 2472
2522 const intptr_t local_scope_function_level = 1; 2473 const intptr_t local_scope_function_level = 1;
2523 LocalScope* local_scope = 2474 LocalScope* local_scope =
2524 new LocalScope(parent_scope, local_scope_function_level, 0); 2475 new LocalScope(parent_scope, local_scope_function_level, 0);
2525 2476
2526 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType()); 2477 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 // var b was not captured. 2560 // var b was not captured.
2610 EXPECT(outer_scope->LocalLookupVariable(b) == NULL); 2561 EXPECT(outer_scope->LocalLookupVariable(b) == NULL);
2611 2562
2612 var_c = outer_scope->LocalLookupVariable(c); 2563 var_c = outer_scope->LocalLookupVariable(c);
2613 EXPECT(var_c->is_captured()); 2564 EXPECT(var_c->is_captured());
2614 EXPECT_EQ(2, var_c->index()); 2565 EXPECT_EQ(2, var_c->index());
2615 EXPECT_EQ(parent_scope_context_level - local_scope_context_level, 2566 EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
2616 var_c->owner()->context_level()); // Adjusted context level. 2567 var_c->owner()->context_level()); // Adjusted context level.
2617 } 2568 }
2618 2569
2619
2620 ISOLATE_UNIT_TEST_CASE(Closure) { 2570 ISOLATE_UNIT_TEST_CASE(Closure) {
2621 // Allocate the class first. 2571 // Allocate the class first.
2622 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 2572 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
2623 const Script& script = Script::Handle(); 2573 const Script& script = Script::Handle();
2624 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 2574 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
2625 const Array& functions = Array::Handle(Array::New(1)); 2575 const Array& functions = Array::Handle(Array::New(1));
2626 2576
2627 const Context& context = Context::Handle(Context::New(0)); 2577 const Context& context = Context::Handle(Context::New(0));
2628 Function& parent = Function::Handle(); 2578 Function& parent = Function::Handle();
2629 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa")); 2579 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
(...skipping 11 matching lines...) Expand all
2641 Closure::New(Object::null_type_arguments(), Object::null_type_arguments(), 2591 Closure::New(Object::null_type_arguments(), Object::null_type_arguments(),
2642 function, context)); 2592 function, context));
2643 const Class& closure_class = Class::Handle(closure.clazz()); 2593 const Class& closure_class = Class::Handle(closure.clazz());
2644 EXPECT_EQ(closure_class.id(), kClosureCid); 2594 EXPECT_EQ(closure_class.id(), kClosureCid);
2645 const Function& closure_function = Function::Handle(closure.function()); 2595 const Function& closure_function = Function::Handle(closure.function());
2646 EXPECT_EQ(closure_function.raw(), function.raw()); 2596 EXPECT_EQ(closure_function.raw(), function.raw());
2647 const Context& closure_context = Context::Handle(closure.context()); 2597 const Context& closure_context = Context::Handle(closure.context());
2648 EXPECT_EQ(closure_context.raw(), context.raw()); 2598 EXPECT_EQ(closure_context.raw(), context.raw());
2649 } 2599 }
2650 2600
2651
2652 ISOLATE_UNIT_TEST_CASE(ObjectPrinting) { 2601 ISOLATE_UNIT_TEST_CASE(ObjectPrinting) {
2653 // Simple Smis. 2602 // Simple Smis.
2654 EXPECT_STREQ("2", Smi::Handle(Smi::New(2)).ToCString()); 2603 EXPECT_STREQ("2", Smi::Handle(Smi::New(2)).ToCString());
2655 EXPECT_STREQ("-15", Smi::Handle(Smi::New(-15)).ToCString()); 2604 EXPECT_STREQ("-15", Smi::Handle(Smi::New(-15)).ToCString());
2656 2605
2657 // bool class and true/false values. 2606 // bool class and true/false values.
2658 ObjectStore* object_store = Isolate::Current()->object_store(); 2607 ObjectStore* object_store = Isolate::Current()->object_store();
2659 const Class& bool_class = Class::Handle(object_store->bool_class()); 2608 const Class& bool_class = Class::Handle(object_store->bool_class());
2660 EXPECT_STREQ("Library:'dart:core' Class: bool", bool_class.ToCString()); 2609 EXPECT_STREQ("Library:'dart:core' Class: bool", bool_class.ToCString());
2661 EXPECT_STREQ("true", Bool::True().ToCString()); 2610 EXPECT_STREQ("true", Bool::True().ToCString());
2662 EXPECT_STREQ("false", Bool::False().ToCString()); 2611 EXPECT_STREQ("false", Bool::False().ToCString());
2663 2612
2664 // Strings. 2613 // Strings.
2665 EXPECT_STREQ("Sugarbowl", 2614 EXPECT_STREQ("Sugarbowl",
2666 String::Handle(String::New("Sugarbowl")).ToCString()); 2615 String::Handle(String::New("Sugarbowl")).ToCString());
2667 } 2616 }
2668 2617
2669
2670 ISOLATE_UNIT_TEST_CASE(CheckedHandle) { 2618 ISOLATE_UNIT_TEST_CASE(CheckedHandle) {
2671 // Ensure that null handles have the correct C++ vtable setup. 2619 // Ensure that null handles have the correct C++ vtable setup.
2672 const String& str1 = String::Handle(); 2620 const String& str1 = String::Handle();
2673 EXPECT(str1.IsString()); 2621 EXPECT(str1.IsString());
2674 EXPECT(str1.IsNull()); 2622 EXPECT(str1.IsNull());
2675 const String& str2 = String::CheckedHandle(Object::null()); 2623 const String& str2 = String::CheckedHandle(Object::null());
2676 EXPECT(str2.IsString()); 2624 EXPECT(str2.IsString());
2677 EXPECT(str2.IsNull()); 2625 EXPECT(str2.IsNull());
2678 String& str3 = String::Handle(); 2626 String& str3 = String::Handle();
2679 str3 ^= Object::null(); 2627 str3 ^= Object::null();
2680 EXPECT(str3.IsString()); 2628 EXPECT(str3.IsString());
2681 EXPECT(str3.IsNull()); 2629 EXPECT(str3.IsNull());
2682 EXPECT(!str3.IsOneByteString()); 2630 EXPECT(!str3.IsOneByteString());
2683 str3 = String::New("Steep and Deep!"); 2631 str3 = String::New("Steep and Deep!");
2684 EXPECT(str3.IsString()); 2632 EXPECT(str3.IsString());
2685 EXPECT(str3.IsOneByteString()); 2633 EXPECT(str3.IsOneByteString());
2686 str3 = OneByteString::null(); 2634 str3 = OneByteString::null();
2687 EXPECT(str3.IsString()); 2635 EXPECT(str3.IsString());
2688 EXPECT(!str3.IsOneByteString()); 2636 EXPECT(!str3.IsOneByteString());
2689 } 2637 }
2690 2638
2691
2692 static RawLibrary* CreateDummyLibrary(const String& library_name) { 2639 static RawLibrary* CreateDummyLibrary(const String& library_name) {
2693 return Library::New(library_name); 2640 return Library::New(library_name);
2694 } 2641 }
2695 2642
2696
2697 static RawFunction* CreateFunction(const char* name) { 2643 static RawFunction* CreateFunction(const char* name) {
2698 Thread* thread = Thread::Current(); 2644 Thread* thread = Thread::Current();
2699 const String& class_name = String::Handle(Symbols::New(thread, "ownerClass")); 2645 const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
2700 const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary")); 2646 const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary"));
2701 const Script& script = Script::Handle(); 2647 const Script& script = Script::Handle();
2702 const Class& owner_class = 2648 const Class& owner_class =
2703 Class::Handle(CreateDummyClass(class_name, script)); 2649 Class::Handle(CreateDummyClass(class_name, script));
2704 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name)); 2650 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name));
2705 owner_class.set_library(owner_library); 2651 owner_class.set_library(owner_library);
2706 const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); 2652 const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
2707 return Function::New(function_name, RawFunction::kRegularFunction, true, 2653 return Function::New(function_name, RawFunction::kRegularFunction, true,
2708 false, false, false, false, owner_class, 2654 false, false, false, false, owner_class,
2709 TokenPosition::kMinSource); 2655 TokenPosition::kMinSource);
2710 } 2656 }
2711 2657
2712
2713 // Test for Code and Instruction object creation. 2658 // Test for Code and Instruction object creation.
2714 ISOLATE_UNIT_TEST_CASE(Code) { 2659 ISOLATE_UNIT_TEST_CASE(Code) {
2715 extern void GenerateIncrement(Assembler * assembler); 2660 extern void GenerateIncrement(Assembler * assembler);
2716 Assembler _assembler_; 2661 Assembler _assembler_;
2717 GenerateIncrement(&_assembler_); 2662 GenerateIncrement(&_assembler_);
2718 const Function& function = Function::Handle(CreateFunction("Test_Code")); 2663 const Function& function = Function::Handle(CreateFunction("Test_Code"));
2719 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2664 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2720 function.AttachCode(code); 2665 function.AttachCode(code);
2721 const Instructions& instructions = Instructions::Handle(code.instructions()); 2666 const Instructions& instructions = Instructions::Handle(code.instructions());
2722 uword payload_start = instructions.PayloadStart(); 2667 uword payload_start = instructions.PayloadStart();
2723 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start)); 2668 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start));
2724 const Object& result = 2669 const Object& result =
2725 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2670 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2726 EXPECT_EQ(1, Smi::Cast(result).Value()); 2671 EXPECT_EQ(1, Smi::Cast(result).Value());
2727 } 2672 }
2728 2673
2729
2730 // Test for immutability of generated instructions. The test crashes with a 2674 // Test for immutability of generated instructions. The test crashes with a
2731 // segmentation fault when writing into it. 2675 // segmentation fault when writing into it.
2732 ISOLATE_UNIT_TEST_CASE(CodeImmutability) { 2676 ISOLATE_UNIT_TEST_CASE(CodeImmutability) {
2733 bool stack_trace_collection_enabled = 2677 bool stack_trace_collection_enabled =
2734 MallocHooks::stack_trace_collection_enabled(); 2678 MallocHooks::stack_trace_collection_enabled();
2735 MallocHooks::set_stack_trace_collection_enabled(false); 2679 MallocHooks::set_stack_trace_collection_enabled(false);
2736 extern void GenerateIncrement(Assembler * assembler); 2680 extern void GenerateIncrement(Assembler * assembler);
2737 Assembler _assembler_; 2681 Assembler _assembler_;
2738 GenerateIncrement(&_assembler_); 2682 GenerateIncrement(&_assembler_);
2739 const Function& function = Function::Handle(CreateFunction("Test_Code")); 2683 const Function& function = Function::Handle(CreateFunction("Test_Code"));
2740 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2684 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2741 function.AttachCode(code); 2685 function.AttachCode(code);
2742 Instructions& instructions = Instructions::Handle(code.instructions()); 2686 Instructions& instructions = Instructions::Handle(code.instructions());
2743 uword payload_start = instructions.PayloadStart(); 2687 uword payload_start = instructions.PayloadStart();
2744 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start)); 2688 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start));
2745 // Try writing into the generated code, expected to crash. 2689 // Try writing into the generated code, expected to crash.
2746 *(reinterpret_cast<char*>(payload_start) + 1) = 1; 2690 *(reinterpret_cast<char*>(payload_start) + 1) = 1;
2747 if (!FLAG_write_protect_code) { 2691 if (!FLAG_write_protect_code) {
2748 // Since this test is expected to crash, crash if write protection of code 2692 // Since this test is expected to crash, crash if write protection of code
2749 // is switched off. 2693 // is switched off.
2750 // TODO(regis, fschneider): Should this be FATAL() instead? 2694 // TODO(regis, fschneider): Should this be FATAL() instead?
2751 OS::DebugBreak(); 2695 OS::DebugBreak();
2752 } 2696 }
2753 MallocHooks::set_stack_trace_collection_enabled( 2697 MallocHooks::set_stack_trace_collection_enabled(
2754 stack_trace_collection_enabled); 2698 stack_trace_collection_enabled);
2755 } 2699 }
2756 2700
2757
2758 // Test for Embedded String object in the instructions. 2701 // Test for Embedded String object in the instructions.
2759 ISOLATE_UNIT_TEST_CASE(EmbedStringInCode) { 2702 ISOLATE_UNIT_TEST_CASE(EmbedStringInCode) {
2760 extern void GenerateEmbedStringInCode(Assembler * assembler, const char* str); 2703 extern void GenerateEmbedStringInCode(Assembler * assembler, const char* str);
2761 const char* kHello = "Hello World!"; 2704 const char* kHello = "Hello World!";
2762 word expected_length = static_cast<word>(strlen(kHello)); 2705 word expected_length = static_cast<word>(strlen(kHello));
2763 Assembler _assembler_; 2706 Assembler _assembler_;
2764 GenerateEmbedStringInCode(&_assembler_, kHello); 2707 GenerateEmbedStringInCode(&_assembler_, kHello);
2765 const Function& function = 2708 const Function& function =
2766 Function::Handle(CreateFunction("Test_EmbedStringInCode")); 2709 Function::Handle(CreateFunction("Test_EmbedStringInCode"));
2767 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2710 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2768 function.AttachCode(code); 2711 function.AttachCode(code);
2769 const Object& result = 2712 const Object& result =
2770 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2713 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2771 EXPECT(result.raw()->IsHeapObject()); 2714 EXPECT(result.raw()->IsHeapObject());
2772 String& string_object = String::Handle(); 2715 String& string_object = String::Handle();
2773 string_object ^= result.raw(); 2716 string_object ^= result.raw();
2774 EXPECT(string_object.Length() == expected_length); 2717 EXPECT(string_object.Length() == expected_length);
2775 for (int i = 0; i < expected_length; i++) { 2718 for (int i = 0; i < expected_length; i++) {
2776 EXPECT(string_object.CharAt(i) == kHello[i]); 2719 EXPECT(string_object.CharAt(i) == kHello[i]);
2777 } 2720 }
2778 } 2721 }
2779 2722
2780
2781 // Test for Embedded Smi object in the instructions. 2723 // Test for Embedded Smi object in the instructions.
2782 ISOLATE_UNIT_TEST_CASE(EmbedSmiInCode) { 2724 ISOLATE_UNIT_TEST_CASE(EmbedSmiInCode) {
2783 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value); 2725 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
2784 const intptr_t kSmiTestValue = 5; 2726 const intptr_t kSmiTestValue = 5;
2785 Assembler _assembler_; 2727 Assembler _assembler_;
2786 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue); 2728 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
2787 const Function& function = 2729 const Function& function =
2788 Function::Handle(CreateFunction("Test_EmbedSmiInCode")); 2730 Function::Handle(CreateFunction("Test_EmbedSmiInCode"));
2789 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2731 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2790 function.AttachCode(code); 2732 function.AttachCode(code);
2791 const Object& result = 2733 const Object& result =
2792 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2734 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2793 EXPECT(Smi::Cast(result).Value() == kSmiTestValue); 2735 EXPECT(Smi::Cast(result).Value() == kSmiTestValue);
2794 } 2736 }
2795 2737
2796
2797 #if defined(ARCH_IS_64_BIT) 2738 #if defined(ARCH_IS_64_BIT)
2798 // Test for Embedded Smi object in the instructions. 2739 // Test for Embedded Smi object in the instructions.
2799 ISOLATE_UNIT_TEST_CASE(EmbedSmiIn64BitCode) { 2740 ISOLATE_UNIT_TEST_CASE(EmbedSmiIn64BitCode) {
2800 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value); 2741 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
2801 const intptr_t kSmiTestValue = DART_INT64_C(5) << 32; 2742 const intptr_t kSmiTestValue = DART_INT64_C(5) << 32;
2802 Assembler _assembler_; 2743 Assembler _assembler_;
2803 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue); 2744 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
2804 const Function& function = 2745 const Function& function =
2805 Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode")); 2746 Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode"));
2806 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2747 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2807 function.AttachCode(code); 2748 function.AttachCode(code);
2808 const Object& result = 2749 const Object& result =
2809 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2750 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2810 EXPECT(Smi::Cast(result).Value() == kSmiTestValue); 2751 EXPECT(Smi::Cast(result).Value() == kSmiTestValue);
2811 } 2752 }
2812 #endif // ARCH_IS_64_BIT 2753 #endif // ARCH_IS_64_BIT
2813 2754
2814
2815 ISOLATE_UNIT_TEST_CASE(ExceptionHandlers) { 2755 ISOLATE_UNIT_TEST_CASE(ExceptionHandlers) {
2816 const int kNumEntries = 4; 2756 const int kNumEntries = 4;
2817 // Add an exception handler table to the code. 2757 // Add an exception handler table to the code.
2818 ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle(); 2758 ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle();
2819 exception_handlers ^= ExceptionHandlers::New(kNumEntries); 2759 exception_handlers ^= ExceptionHandlers::New(kNumEntries);
2820 const bool kNeedsStackTrace = true; 2760 const bool kNeedsStackTrace = true;
2821 const bool kNoStackTrace = false; 2761 const bool kNoStackTrace = false;
2822 exception_handlers.SetHandlerInfo(0, -1, 20u, kNeedsStackTrace, false, 2762 exception_handlers.SetHandlerInfo(0, -1, 20u, kNeedsStackTrace, false,
2823 TokenPosition::kNoSource, true); 2763 TokenPosition::kNoSource, true);
2824 exception_handlers.SetHandlerInfo(1, 0, 30u, kNeedsStackTrace, false, 2764 exception_handlers.SetHandlerInfo(1, 0, 30u, kNeedsStackTrace, false,
(...skipping 21 matching lines...) Expand all
2846 EXPECT_EQ(20u, handlers.HandlerPCOffset(0)); 2786 EXPECT_EQ(20u, handlers.HandlerPCOffset(0));
2847 EXPECT(handlers.NeedsStackTrace(0)); 2787 EXPECT(handlers.NeedsStackTrace(0));
2848 EXPECT(!handlers.HasCatchAll(0)); 2788 EXPECT(!handlers.HasCatchAll(0));
2849 EXPECT_EQ(20u, info.handler_pc_offset); 2789 EXPECT_EQ(20u, info.handler_pc_offset);
2850 EXPECT_EQ(1, handlers.OuterTryIndex(3)); 2790 EXPECT_EQ(1, handlers.OuterTryIndex(3));
2851 EXPECT_EQ(150u, handlers.HandlerPCOffset(3)); 2791 EXPECT_EQ(150u, handlers.HandlerPCOffset(3));
2852 EXPECT(!handlers.NeedsStackTrace(3)); 2792 EXPECT(!handlers.NeedsStackTrace(3));
2853 EXPECT(handlers.HasCatchAll(3)); 2793 EXPECT(handlers.HasCatchAll(3));
2854 } 2794 }
2855 2795
2856
2857 ISOLATE_UNIT_TEST_CASE(PcDescriptors) { 2796 ISOLATE_UNIT_TEST_CASE(PcDescriptors) {
2858 DescriptorList* builder = new DescriptorList(0); 2797 DescriptorList* builder = new DescriptorList(0);
2859 2798
2860 // kind, pc_offset, deopt_id, token_pos, try_index 2799 // kind, pc_offset, deopt_id, token_pos, try_index
2861 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 1, TokenPosition(20), 1); 2800 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 1, TokenPosition(20), 1);
2862 builder->AddDescriptor(RawPcDescriptors::kDeopt, 20, 2, TokenPosition(30), 0); 2801 builder->AddDescriptor(RawPcDescriptors::kDeopt, 20, 2, TokenPosition(30), 0);
2863 builder->AddDescriptor(RawPcDescriptors::kOther, 30, 3, TokenPosition(40), 1); 2802 builder->AddDescriptor(RawPcDescriptors::kOther, 30, 3, TokenPosition(40), 1);
2864 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 4, TokenPosition(40), 2); 2803 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 4, TokenPosition(40), 2);
2865 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 5, TokenPosition(80), 3); 2804 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 5, TokenPosition(80), 3);
2866 builder->AddDescriptor(RawPcDescriptors::kOther, 80, 6, TokenPosition(150), 2805 builder->AddDescriptor(RawPcDescriptors::kOther, 80, 6, TokenPosition(150),
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2904 EXPECT_EQ(150, iter.TokenPos().value()); 2843 EXPECT_EQ(150, iter.TokenPos().value());
2905 2844
2906 EXPECT_EQ(3, iter.TryIndex()); 2845 EXPECT_EQ(3, iter.TryIndex());
2907 EXPECT_EQ(static_cast<uword>(80), iter.PcOffset()); 2846 EXPECT_EQ(static_cast<uword>(80), iter.PcOffset());
2908 EXPECT_EQ(150, iter.TokenPos().value()); 2847 EXPECT_EQ(150, iter.TokenPos().value());
2909 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); 2848 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
2910 2849
2911 EXPECT_EQ(false, iter.MoveNext()); 2850 EXPECT_EQ(false, iter.MoveNext());
2912 } 2851 }
2913 2852
2914
2915 ISOLATE_UNIT_TEST_CASE(PcDescriptorsLargeDeltas) { 2853 ISOLATE_UNIT_TEST_CASE(PcDescriptorsLargeDeltas) {
2916 DescriptorList* builder = new DescriptorList(0); 2854 DescriptorList* builder = new DescriptorList(0);
2917 2855
2918 // kind, pc_offset, deopt_id, token_pos, try_index 2856 // kind, pc_offset, deopt_id, token_pos, try_index
2919 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 1, TokenPosition(200), 2857 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 1, TokenPosition(200),
2920 1); 2858 1);
2921 builder->AddDescriptor(RawPcDescriptors::kDeopt, 200, 2, TokenPosition(300), 2859 builder->AddDescriptor(RawPcDescriptors::kDeopt, 200, 2, TokenPosition(300),
2922 0); 2860 0);
2923 builder->AddDescriptor(RawPcDescriptors::kOther, 300, 3, TokenPosition(400), 2861 builder->AddDescriptor(RawPcDescriptors::kOther, 300, 3, TokenPosition(400),
2924 1); 2862 1);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2966 EXPECT_EQ(150, iter.TokenPos().value()); 2904 EXPECT_EQ(150, iter.TokenPos().value());
2967 2905
2968 EXPECT_EQ(3, iter.TryIndex()); 2906 EXPECT_EQ(3, iter.TryIndex());
2969 EXPECT_EQ(static_cast<uword>(800), iter.PcOffset()); 2907 EXPECT_EQ(static_cast<uword>(800), iter.PcOffset());
2970 EXPECT_EQ(150, iter.TokenPos().value()); 2908 EXPECT_EQ(150, iter.TokenPos().value());
2971 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); 2909 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
2972 2910
2973 EXPECT_EQ(false, iter.MoveNext()); 2911 EXPECT_EQ(false, iter.MoveNext());
2974 } 2912 }
2975 2913
2976
2977 static RawClass* CreateTestClass(const char* name) { 2914 static RawClass* CreateTestClass(const char* name) {
2978 const String& class_name = 2915 const String& class_name =
2979 String::Handle(Symbols::New(Thread::Current(), name)); 2916 String::Handle(Symbols::New(Thread::Current(), name));
2980 const Class& cls = 2917 const Class& cls =
2981 Class::Handle(CreateDummyClass(class_name, Script::Handle())); 2918 Class::Handle(CreateDummyClass(class_name, Script::Handle()));
2982 return cls.raw(); 2919 return cls.raw();
2983 } 2920 }
2984 2921
2985
2986 static RawField* CreateTestField(const char* name) { 2922 static RawField* CreateTestField(const char* name) {
2987 const Class& cls = Class::Handle(CreateTestClass("global:")); 2923 const Class& cls = Class::Handle(CreateTestClass("global:"));
2988 const String& field_name = 2924 const String& field_name =
2989 String::Handle(Symbols::New(Thread::Current(), name)); 2925 String::Handle(Symbols::New(Thread::Current(), name));
2990 const Field& field = Field::Handle( 2926 const Field& field = Field::Handle(
2991 Field::New(field_name, true, false, false, true, cls, 2927 Field::New(field_name, true, false, false, true, cls,
2992 Object::dynamic_type(), TokenPosition::kMinSource)); 2928 Object::dynamic_type(), TokenPosition::kMinSource));
2993 return field.raw(); 2929 return field.raw();
2994 } 2930 }
2995 2931
2996
2997 ISOLATE_UNIT_TEST_CASE(ClassDictionaryIterator) { 2932 ISOLATE_UNIT_TEST_CASE(ClassDictionaryIterator) {
2998 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6")); 2933 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6"));
2999 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4")); 2934 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4"));
3000 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8")); 2935 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8"));
3001 Field& tee = Field::ZoneHandle(CreateTestField("TEE")); 2936 Field& tee = Field::ZoneHandle(CreateTestField("TEE"));
3002 String& url = String::ZoneHandle(String::New("SBB")); 2937 String& url = String::ZoneHandle(String::New("SBB"));
3003 Library& lib = Library::Handle(Library::New(url)); 2938 Library& lib = Library::Handle(Library::New(url));
3004 lib.AddClass(ae66); 2939 lib.AddClass(ae66);
3005 lib.AddObject(ce68, String::ZoneHandle(ce68.name())); 2940 lib.AddObject(ce68, String::ZoneHandle(ce68.name()));
3006 lib.AddClass(re44); 2941 lib.AddClass(re44);
3007 lib.AddObject(tee, String::ZoneHandle(tee.name())); 2942 lib.AddObject(tee, String::ZoneHandle(tee.name()));
3008 ClassDictionaryIterator iterator(lib); 2943 ClassDictionaryIterator iterator(lib);
3009 int count = 0; 2944 int count = 0;
3010 Class& cls = Class::Handle(); 2945 Class& cls = Class::Handle();
3011 while (iterator.HasNext()) { 2946 while (iterator.HasNext()) {
3012 cls = iterator.GetNextClass(); 2947 cls = iterator.GetNextClass();
3013 EXPECT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw())); 2948 EXPECT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw()));
3014 count++; 2949 count++;
3015 } 2950 }
3016 EXPECT(count == 2); 2951 EXPECT(count == 2);
3017 } 2952 }
3018 2953
3019
3020 static RawFunction* GetDummyTarget(const char* name) { 2954 static RawFunction* GetDummyTarget(const char* name) {
3021 const String& function_name = 2955 const String& function_name =
3022 String::Handle(Symbols::New(Thread::Current(), name)); 2956 String::Handle(Symbols::New(Thread::Current(), name));
3023 const Class& cls = 2957 const Class& cls =
3024 Class::Handle(CreateDummyClass(function_name, Script::Handle())); 2958 Class::Handle(CreateDummyClass(function_name, Script::Handle()));
3025 const bool is_static = false; 2959 const bool is_static = false;
3026 const bool is_const = false; 2960 const bool is_const = false;
3027 const bool is_abstract = false; 2961 const bool is_abstract = false;
3028 const bool is_external = false; 2962 const bool is_external = false;
3029 const bool is_native = false; 2963 const bool is_native = false;
3030 return Function::New(function_name, RawFunction::kRegularFunction, is_static, 2964 return Function::New(function_name, RawFunction::kRegularFunction, is_static,
3031 is_const, is_abstract, is_external, is_native, cls, 2965 is_const, is_abstract, is_external, is_native, cls,
3032 TokenPosition::kMinSource); 2966 TokenPosition::kMinSource);
3033 } 2967 }
3034 2968
3035
3036 ISOLATE_UNIT_TEST_CASE(ICData) { 2969 ISOLATE_UNIT_TEST_CASE(ICData) {
3037 Function& function = Function::Handle(GetDummyTarget("Bern")); 2970 Function& function = Function::Handle(GetDummyTarget("Bern"));
3038 const intptr_t id = 12; 2971 const intptr_t id = 12;
3039 const intptr_t num_args_tested = 1; 2972 const intptr_t num_args_tested = 1;
3040 const String& target_name = String::Handle(Symbols::New(thread, "Thun")); 2973 const String& target_name = String::Handle(Symbols::New(thread, "Thun"));
3041 const intptr_t kTypeArgsLen = 0; 2974 const intptr_t kTypeArgsLen = 0;
3042 const intptr_t kNumArgs = 1; 2975 const intptr_t kNumArgs = 1;
3043 const Array& args_descriptor = Array::Handle( 2976 const Array& args_descriptor = Array::Handle(
3044 ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs, Object::null_array())); 2977 ArgumentsDescriptor::New(kTypeArgsLen, kNumArgs, Object::null_array()));
3045 ICData& o1 = ICData::Handle(); 2978 ICData& o1 = ICData::Handle();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
3100 EXPECT_EQ(target1.raw(), test_target.raw()); 3033 EXPECT_EQ(target1.raw(), test_target.raw());
3101 3034
3102 // Check ICData for unoptimized static calls. 3035 // Check ICData for unoptimized static calls.
3103 const intptr_t kNumArgsChecked = 0; 3036 const intptr_t kNumArgsChecked = 0;
3104 const ICData& scall_icdata = ICData::Handle(ICData::New( 3037 const ICData& scall_icdata = ICData::Handle(ICData::New(
3105 function, target_name, args_descriptor, 57, kNumArgsChecked, false)); 3038 function, target_name, args_descriptor, 57, kNumArgsChecked, false));
3106 scall_icdata.AddTarget(target1); 3039 scall_icdata.AddTarget(target1);
3107 EXPECT_EQ(target1.raw(), scall_icdata.GetTargetAt(0)); 3040 EXPECT_EQ(target1.raw(), scall_icdata.GetTargetAt(0));
3108 } 3041 }
3109 3042
3110
3111 ISOLATE_UNIT_TEST_CASE(SubtypeTestCache) { 3043 ISOLATE_UNIT_TEST_CASE(SubtypeTestCache) {
3112 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass")); 3044 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass"));
3113 Script& script = Script::Handle(); 3045 Script& script = Script::Handle();
3114 const Class& empty_class = 3046 const Class& empty_class =
3115 Class::Handle(CreateDummyClass(class_name, script)); 3047 Class::Handle(CreateDummyClass(class_name, script));
3116 SubtypeTestCache& cache = SubtypeTestCache::Handle(SubtypeTestCache::New()); 3048 SubtypeTestCache& cache = SubtypeTestCache::Handle(SubtypeTestCache::New());
3117 EXPECT(!cache.IsNull()); 3049 EXPECT(!cache.IsNull());
3118 EXPECT_EQ(0, cache.NumberOfChecks()); 3050 EXPECT_EQ(0, cache.NumberOfChecks());
3119 const Object& class_id_or_fun = Object::Handle(Smi::New(empty_class.id())); 3051 const Object& class_id_or_fun = Object::Handle(Smi::New(empty_class.id()));
3120 const TypeArguments& targ_0 = TypeArguments::Handle(TypeArguments::New(2)); 3052 const TypeArguments& targ_0 = TypeArguments::Handle(TypeArguments::New(2));
3121 const TypeArguments& targ_1 = TypeArguments::Handle(TypeArguments::New(3)); 3053 const TypeArguments& targ_1 = TypeArguments::Handle(TypeArguments::New(3));
3122 const TypeArguments& targ_2 = TypeArguments::Handle(TypeArguments::New(4)); 3054 const TypeArguments& targ_2 = TypeArguments::Handle(TypeArguments::New(4));
3123 cache.AddCheck(class_id_or_fun, targ_0, targ_1, targ_2, Bool::True()); 3055 cache.AddCheck(class_id_or_fun, targ_0, targ_1, targ_2, Bool::True());
3124 EXPECT_EQ(1, cache.NumberOfChecks()); 3056 EXPECT_EQ(1, cache.NumberOfChecks());
3125 Object& test_class_id_or_fun = Object::Handle(); 3057 Object& test_class_id_or_fun = Object::Handle();
3126 TypeArguments& test_targ_0 = TypeArguments::Handle(); 3058 TypeArguments& test_targ_0 = TypeArguments::Handle();
3127 TypeArguments& test_targ_1 = TypeArguments::Handle(); 3059 TypeArguments& test_targ_1 = TypeArguments::Handle();
3128 TypeArguments& test_targ_2 = TypeArguments::Handle(); 3060 TypeArguments& test_targ_2 = TypeArguments::Handle();
3129 Bool& test_result = Bool::Handle(); 3061 Bool& test_result = Bool::Handle();
3130 cache.GetCheck(0, &test_class_id_or_fun, &test_targ_0, &test_targ_1, 3062 cache.GetCheck(0, &test_class_id_or_fun, &test_targ_0, &test_targ_1,
3131 &test_targ_2, &test_result); 3063 &test_targ_2, &test_result);
3132 EXPECT_EQ(class_id_or_fun.raw(), test_class_id_or_fun.raw()); 3064 EXPECT_EQ(class_id_or_fun.raw(), test_class_id_or_fun.raw());
3133 EXPECT_EQ(targ_0.raw(), test_targ_0.raw()); 3065 EXPECT_EQ(targ_0.raw(), test_targ_0.raw());
3134 EXPECT_EQ(targ_1.raw(), test_targ_1.raw()); 3066 EXPECT_EQ(targ_1.raw(), test_targ_1.raw());
3135 EXPECT_EQ(targ_2.raw(), test_targ_2.raw()); 3067 EXPECT_EQ(targ_2.raw(), test_targ_2.raw());
3136 EXPECT_EQ(Bool::True().raw(), test_result.raw()); 3068 EXPECT_EQ(Bool::True().raw(), test_result.raw());
3137 } 3069 }
3138 3070
3139
3140 ISOLATE_UNIT_TEST_CASE(FieldTests) { 3071 ISOLATE_UNIT_TEST_CASE(FieldTests) {
3141 const String& f = String::Handle(String::New("oneField")); 3072 const String& f = String::Handle(String::New("oneField"));
3142 const String& getter_f = String::Handle(Field::GetterName(f)); 3073 const String& getter_f = String::Handle(Field::GetterName(f));
3143 const String& setter_f = String::Handle(Field::SetterName(f)); 3074 const String& setter_f = String::Handle(Field::SetterName(f));
3144 EXPECT(!Field::IsGetterName(f)); 3075 EXPECT(!Field::IsGetterName(f));
3145 EXPECT(!Field::IsSetterName(f)); 3076 EXPECT(!Field::IsSetterName(f));
3146 EXPECT(Field::IsGetterName(getter_f)); 3077 EXPECT(Field::IsGetterName(getter_f));
3147 EXPECT(!Field::IsSetterName(getter_f)); 3078 EXPECT(!Field::IsSetterName(getter_f));
3148 EXPECT(!Field::IsGetterName(setter_f)); 3079 EXPECT(!Field::IsGetterName(setter_f));
3149 EXPECT(Field::IsSetterName(setter_f)); 3080 EXPECT(Field::IsSetterName(setter_f));
3150 EXPECT_STREQ(f.ToCString(), 3081 EXPECT_STREQ(f.ToCString(),
3151 String::Handle(Field::NameFromGetter(getter_f)).ToCString()); 3082 String::Handle(Field::NameFromGetter(getter_f)).ToCString());
3152 EXPECT_STREQ(f.ToCString(), 3083 EXPECT_STREQ(f.ToCString(),
3153 String::Handle(Field::NameFromSetter(setter_f)).ToCString()); 3084 String::Handle(Field::NameFromSetter(setter_f)).ToCString());
3154 } 3085 }
3155 3086
3156
3157 // Expose helper function from object.cc for testing. 3087 // Expose helper function from object.cc for testing.
3158 bool EqualsIgnoringPrivate(const String& name, const String& private_name); 3088 bool EqualsIgnoringPrivate(const String& name, const String& private_name);
3159 3089
3160
3161 ISOLATE_UNIT_TEST_CASE(EqualsIgnoringPrivate) { 3090 ISOLATE_UNIT_TEST_CASE(EqualsIgnoringPrivate) {
3162 String& mangled_name = String::Handle(); 3091 String& mangled_name = String::Handle();
3163 String& bare_name = String::Handle(); 3092 String& bare_name = String::Handle();
3164 3093
3165 // Simple matches. 3094 // Simple matches.
3166 mangled_name = OneByteString::New("foo"); 3095 mangled_name = OneByteString::New("foo");
3167 bare_name = OneByteString::New("foo"); 3096 bare_name = OneByteString::New("foo");
3168 EXPECT(String::EqualsIgnoringPrivateKey(mangled_name, bare_name)); 3097 EXPECT(String::EqualsIgnoringPrivateKey(mangled_name, bare_name));
3169 3098
3170 mangled_name = OneByteString::New("foo."); 3099 mangled_name = OneByteString::New("foo.");
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
3293 3222
3294 // str1 - ExternalOneByteString, str2 - OneByteString. 3223 // str1 - ExternalOneByteString, str2 - OneByteString.
3295 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, bare_name)); 3224 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, bare_name));
3296 3225
3297 // str1 - ExternalOneByteString, str2 - ExternalOneByteString. 3226 // str1 - ExternalOneByteString, str2 - ExternalOneByteString.
3298 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bare_name)); 3227 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bare_name));
3299 EXPECT( 3228 EXPECT(
3300 !String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bad_bare_name)); 3229 !String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bad_bare_name));
3301 } 3230 }
3302 3231
3303
3304 ISOLATE_UNIT_TEST_CASE(ArrayNew_Overflow_Crash) { 3232 ISOLATE_UNIT_TEST_CASE(ArrayNew_Overflow_Crash) {
3305 Array::Handle(Array::New(Array::kMaxElements + 1)); 3233 Array::Handle(Array::New(Array::kMaxElements + 1));
3306 } 3234 }
3307 3235
3308
3309 TEST_CASE(StackTraceFormat) { 3236 TEST_CASE(StackTraceFormat) {
3310 const char* kScriptChars = 3237 const char* kScriptChars =
3311 "void baz() {\n" 3238 "void baz() {\n"
3312 " throw 'MyException';\n" 3239 " throw 'MyException';\n"
3313 "}\n" 3240 "}\n"
3314 "\n" 3241 "\n"
3315 "class _OtherClass {\n" 3242 "class _OtherClass {\n"
3316 " _OtherClass._named() {\n" 3243 " _OtherClass._named() {\n"
3317 " baz();\n" 3244 " baz();\n"
3318 " }\n" 3245 " }\n"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3358 "#3 _bar (test-lib:16:3)\n" 3285 "#3 _bar (test-lib:16:3)\n"
3359 "#4 MyClass.field (test-lib:25:5)\n" 3286 "#4 MyClass.field (test-lib:25:5)\n"
3360 "#5 MyClass.foo.fooHelper (test-lib:30:7)\n" 3287 "#5 MyClass.foo.fooHelper (test-lib:30:7)\n"
3361 "#6 MyClass.foo (test-lib:32:14)\n" 3288 "#6 MyClass.foo (test-lib:32:14)\n"
3362 "#7 new MyClass.<anonymous closure> (test-lib:21:12)\n" 3289 "#7 new MyClass.<anonymous closure> (test-lib:21:12)\n"
3363 "#8 new MyClass (test-lib:21:18)\n" 3290 "#8 new MyClass (test-lib:21:18)\n"
3364 "#9 main.<anonymous closure> (test-lib:37:14)\n" 3291 "#9 main.<anonymous closure> (test-lib:37:14)\n"
3365 "#10 main (test-lib:37:24)"); 3292 "#10 main (test-lib:37:24)");
3366 } 3293 }
3367 3294
3368
3369 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveCrossGen) { 3295 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveCrossGen) {
3370 Isolate* isolate = Isolate::Current(); 3296 Isolate* isolate = Isolate::Current();
3371 WeakProperty& weak = WeakProperty::Handle(); 3297 WeakProperty& weak = WeakProperty::Handle();
3372 { 3298 {
3373 // Weak property and value in new. Key in old. 3299 // Weak property and value in new. Key in old.
3374 HANDLESCOPE(thread); 3300 HANDLESCOPE(thread);
3375 String& key = String::Handle(); 3301 String& key = String::Handle();
3376 key ^= OneByteString::New("key", Heap::kOld); 3302 key ^= OneByteString::New("key", Heap::kOld);
3377 String& value = String::Handle(); 3303 String& value = String::Handle();
3378 value ^= OneByteString::New("value", Heap::kNew); 3304 value ^= OneByteString::New("value", Heap::kNew);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
3474 value ^= OneByteString::null(); 3400 value ^= OneByteString::null();
3475 } 3401 }
3476 isolate->heap()->CollectGarbage(Heap::kNew); 3402 isolate->heap()->CollectGarbage(Heap::kNew);
3477 isolate->heap()->CollectGarbage(Heap::kOld); 3403 isolate->heap()->CollectGarbage(Heap::kOld);
3478 // Weak property key and value should survive due to cross-generation 3404 // Weak property key and value should survive due to cross-generation
3479 // pointers. 3405 // pointers.
3480 EXPECT(weak.key() != Object::null()); 3406 EXPECT(weak.key() != Object::null());
3481 EXPECT(weak.value() != Object::null()); 3407 EXPECT(weak.value() != Object::null());
3482 } 3408 }
3483 3409
3484
3485 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveRecurse) { 3410 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveRecurse) {
3486 // This used to end in an infinite recursion. Caused by scavenging the weak 3411 // This used to end in an infinite recursion. Caused by scavenging the weak
3487 // property before scavenging the key. 3412 // property before scavenging the key.
3488 Isolate* isolate = Isolate::Current(); 3413 Isolate* isolate = Isolate::Current();
3489 WeakProperty& weak = WeakProperty::Handle(); 3414 WeakProperty& weak = WeakProperty::Handle();
3490 Array& arr = Array::Handle(Array::New(1)); 3415 Array& arr = Array::Handle(Array::New(1));
3491 { 3416 {
3492 HANDLESCOPE(thread); 3417 HANDLESCOPE(thread);
3493 String& key = String::Handle(); 3418 String& key = String::Handle();
3494 key ^= OneByteString::New("key"); 3419 key ^= OneByteString::New("key");
3495 arr.SetAt(0, key); 3420 arr.SetAt(0, key);
3496 String& value = String::Handle(); 3421 String& value = String::Handle();
3497 value ^= OneByteString::New("value"); 3422 value ^= OneByteString::New("value");
3498 weak ^= WeakProperty::New(); 3423 weak ^= WeakProperty::New();
3499 weak.set_key(key); 3424 weak.set_key(key);
3500 weak.set_value(value); 3425 weak.set_value(value);
3501 } 3426 }
3502 isolate->heap()->CollectAllGarbage(); 3427 isolate->heap()->CollectAllGarbage();
3503 EXPECT(weak.key() != Object::null()); 3428 EXPECT(weak.key() != Object::null());
3504 EXPECT(weak.value() != Object::null()); 3429 EXPECT(weak.value() != Object::null());
3505 } 3430 }
3506 3431
3507
3508 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveOne_NewSpace) { 3432 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveOne_NewSpace) {
3509 Isolate* isolate = Isolate::Current(); 3433 Isolate* isolate = Isolate::Current();
3510 WeakProperty& weak = WeakProperty::Handle(); 3434 WeakProperty& weak = WeakProperty::Handle();
3511 String& key = String::Handle(); 3435 String& key = String::Handle();
3512 key ^= OneByteString::New("key"); 3436 key ^= OneByteString::New("key");
3513 { 3437 {
3514 HANDLESCOPE(thread); 3438 HANDLESCOPE(thread);
3515 String& value = String::Handle(); 3439 String& value = String::Handle();
3516 value ^= OneByteString::New("value"); 3440 value ^= OneByteString::New("value");
3517 weak ^= WeakProperty::New(); 3441 weak ^= WeakProperty::New();
3518 weak.set_key(key); 3442 weak.set_key(key);
3519 weak.set_value(value); 3443 weak.set_value(value);
3520 } 3444 }
3521 isolate->heap()->CollectAllGarbage(); 3445 isolate->heap()->CollectAllGarbage();
3522 EXPECT(weak.key() != Object::null()); 3446 EXPECT(weak.key() != Object::null());
3523 EXPECT(weak.value() != Object::null()); 3447 EXPECT(weak.value() != Object::null());
3524 } 3448 }
3525 3449
3526
3527 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwo_NewSpace) { 3450 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwo_NewSpace) {
3528 Isolate* isolate = Isolate::Current(); 3451 Isolate* isolate = Isolate::Current();
3529 WeakProperty& weak1 = WeakProperty::Handle(); 3452 WeakProperty& weak1 = WeakProperty::Handle();
3530 String& key1 = String::Handle(); 3453 String& key1 = String::Handle();
3531 key1 ^= OneByteString::New("key1"); 3454 key1 ^= OneByteString::New("key1");
3532 WeakProperty& weak2 = WeakProperty::Handle(); 3455 WeakProperty& weak2 = WeakProperty::Handle();
3533 String& key2 = String::Handle(); 3456 String& key2 = String::Handle();
3534 key2 ^= OneByteString::New("key2"); 3457 key2 ^= OneByteString::New("key2");
3535 { 3458 {
3536 HANDLESCOPE(thread); 3459 HANDLESCOPE(thread);
3537 String& value1 = String::Handle(); 3460 String& value1 = String::Handle();
3538 value1 ^= OneByteString::New("value1"); 3461 value1 ^= OneByteString::New("value1");
3539 weak1 ^= WeakProperty::New(); 3462 weak1 ^= WeakProperty::New();
3540 weak1.set_key(key1); 3463 weak1.set_key(key1);
3541 weak1.set_value(value1); 3464 weak1.set_value(value1);
3542 String& value2 = String::Handle(); 3465 String& value2 = String::Handle();
3543 value2 ^= OneByteString::New("value2"); 3466 value2 ^= OneByteString::New("value2");
3544 weak2 ^= WeakProperty::New(); 3467 weak2 ^= WeakProperty::New();
3545 weak2.set_key(key2); 3468 weak2.set_key(key2);
3546 weak2.set_value(value2); 3469 weak2.set_value(value2);
3547 } 3470 }
3548 isolate->heap()->CollectAllGarbage(); 3471 isolate->heap()->CollectAllGarbage();
3549 EXPECT(weak1.key() != Object::null()); 3472 EXPECT(weak1.key() != Object::null());
3550 EXPECT(weak1.value() != Object::null()); 3473 EXPECT(weak1.value() != Object::null());
3551 EXPECT(weak2.key() != Object::null()); 3474 EXPECT(weak2.key() != Object::null());
3552 EXPECT(weak2.value() != Object::null()); 3475 EXPECT(weak2.value() != Object::null());
3553 } 3476 }
3554 3477
3555
3556 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) { 3478 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) {
3557 Isolate* isolate = Isolate::Current(); 3479 Isolate* isolate = Isolate::Current();
3558 WeakProperty& weak1 = WeakProperty::Handle(); 3480 WeakProperty& weak1 = WeakProperty::Handle();
3559 WeakProperty& weak2 = WeakProperty::Handle(); 3481 WeakProperty& weak2 = WeakProperty::Handle();
3560 String& key = String::Handle(); 3482 String& key = String::Handle();
3561 key ^= OneByteString::New("key"); 3483 key ^= OneByteString::New("key");
3562 { 3484 {
3563 HANDLESCOPE(thread); 3485 HANDLESCOPE(thread);
3564 String& value1 = String::Handle(); 3486 String& value1 = String::Handle();
3565 value1 ^= OneByteString::New("value1"); 3487 value1 ^= OneByteString::New("value1");
3566 weak1 ^= WeakProperty::New(); 3488 weak1 ^= WeakProperty::New();
3567 weak1.set_key(key); 3489 weak1.set_key(key);
3568 weak1.set_value(value1); 3490 weak1.set_value(value1);
3569 String& value2 = String::Handle(); 3491 String& value2 = String::Handle();
3570 value2 ^= OneByteString::New("value2"); 3492 value2 ^= OneByteString::New("value2");
3571 weak2 ^= WeakProperty::New(); 3493 weak2 ^= WeakProperty::New();
3572 weak2.set_key(key); 3494 weak2.set_key(key);
3573 weak2.set_value(value2); 3495 weak2.set_value(value2);
3574 } 3496 }
3575 isolate->heap()->CollectAllGarbage(); 3497 isolate->heap()->CollectAllGarbage();
3576 EXPECT(weak1.key() != Object::null()); 3498 EXPECT(weak1.key() != Object::null());
3577 EXPECT(weak1.value() != Object::null()); 3499 EXPECT(weak1.value() != Object::null());
3578 EXPECT(weak2.key() != Object::null()); 3500 EXPECT(weak2.key() != Object::null());
3579 EXPECT(weak2.value() != Object::null()); 3501 EXPECT(weak2.value() != Object::null());
3580 } 3502 }
3581 3503
3582
3583 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveOne_OldSpace) { 3504 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveOne_OldSpace) {
3584 Isolate* isolate = Isolate::Current(); 3505 Isolate* isolate = Isolate::Current();
3585 WeakProperty& weak = WeakProperty::Handle(); 3506 WeakProperty& weak = WeakProperty::Handle();
3586 String& key = String::Handle(); 3507 String& key = String::Handle();
3587 key ^= OneByteString::New("key", Heap::kOld); 3508 key ^= OneByteString::New("key", Heap::kOld);
3588 { 3509 {
3589 HANDLESCOPE(thread); 3510 HANDLESCOPE(thread);
3590 String& value = String::Handle(); 3511 String& value = String::Handle();
3591 value ^= OneByteString::New("value", Heap::kOld); 3512 value ^= OneByteString::New("value", Heap::kOld);
3592 weak ^= WeakProperty::New(Heap::kOld); 3513 weak ^= WeakProperty::New(Heap::kOld);
3593 weak.set_key(key); 3514 weak.set_key(key);
3594 weak.set_value(value); 3515 weak.set_value(value);
3595 } 3516 }
3596 isolate->heap()->CollectAllGarbage(); 3517 isolate->heap()->CollectAllGarbage();
3597 EXPECT(weak.key() != Object::null()); 3518 EXPECT(weak.key() != Object::null());
3598 EXPECT(weak.value() != Object::null()); 3519 EXPECT(weak.value() != Object::null());
3599 } 3520 }
3600 3521
3601
3602 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwo_OldSpace) { 3522 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwo_OldSpace) {
3603 Isolate* isolate = Isolate::Current(); 3523 Isolate* isolate = Isolate::Current();
3604 WeakProperty& weak1 = WeakProperty::Handle(); 3524 WeakProperty& weak1 = WeakProperty::Handle();
3605 String& key1 = String::Handle(); 3525 String& key1 = String::Handle();
3606 key1 ^= OneByteString::New("key1", Heap::kOld); 3526 key1 ^= OneByteString::New("key1", Heap::kOld);
3607 WeakProperty& weak2 = WeakProperty::Handle(); 3527 WeakProperty& weak2 = WeakProperty::Handle();
3608 String& key2 = String::Handle(); 3528 String& key2 = String::Handle();
3609 key2 ^= OneByteString::New("key2", Heap::kOld); 3529 key2 ^= OneByteString::New("key2", Heap::kOld);
3610 { 3530 {
3611 HANDLESCOPE(thread); 3531 HANDLESCOPE(thread);
3612 String& value1 = String::Handle(); 3532 String& value1 = String::Handle();
3613 value1 ^= OneByteString::New("value1", Heap::kOld); 3533 value1 ^= OneByteString::New("value1", Heap::kOld);
3614 weak1 ^= WeakProperty::New(Heap::kOld); 3534 weak1 ^= WeakProperty::New(Heap::kOld);
3615 weak1.set_key(key1); 3535 weak1.set_key(key1);
3616 weak1.set_value(value1); 3536 weak1.set_value(value1);
3617 String& value2 = String::Handle(); 3537 String& value2 = String::Handle();
3618 value2 ^= OneByteString::New("value2", Heap::kOld); 3538 value2 ^= OneByteString::New("value2", Heap::kOld);
3619 weak2 ^= WeakProperty::New(Heap::kOld); 3539 weak2 ^= WeakProperty::New(Heap::kOld);
3620 weak2.set_key(key2); 3540 weak2.set_key(key2);
3621 weak2.set_value(value2); 3541 weak2.set_value(value2);
3622 } 3542 }
3623 isolate->heap()->CollectAllGarbage(); 3543 isolate->heap()->CollectAllGarbage();
3624 EXPECT(weak1.key() != Object::null()); 3544 EXPECT(weak1.key() != Object::null());
3625 EXPECT(weak1.value() != Object::null()); 3545 EXPECT(weak1.value() != Object::null());
3626 EXPECT(weak2.key() != Object::null()); 3546 EXPECT(weak2.key() != Object::null());
3627 EXPECT(weak2.value() != Object::null()); 3547 EXPECT(weak2.value() != Object::null());
3628 } 3548 }
3629 3549
3630
3631 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) { 3550 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) {
3632 Isolate* isolate = Isolate::Current(); 3551 Isolate* isolate = Isolate::Current();
3633 WeakProperty& weak1 = WeakProperty::Handle(); 3552 WeakProperty& weak1 = WeakProperty::Handle();
3634 WeakProperty& weak2 = WeakProperty::Handle(); 3553 WeakProperty& weak2 = WeakProperty::Handle();
3635 String& key = String::Handle(); 3554 String& key = String::Handle();
3636 key ^= OneByteString::New("key", Heap::kOld); 3555 key ^= OneByteString::New("key", Heap::kOld);
3637 { 3556 {
3638 HANDLESCOPE(thread); 3557 HANDLESCOPE(thread);
3639 String& value1 = String::Handle(); 3558 String& value1 = String::Handle();
3640 value1 ^= OneByteString::New("value1", Heap::kOld); 3559 value1 ^= OneByteString::New("value1", Heap::kOld);
3641 weak1 ^= WeakProperty::New(Heap::kOld); 3560 weak1 ^= WeakProperty::New(Heap::kOld);
3642 weak1.set_key(key); 3561 weak1.set_key(key);
3643 weak1.set_value(value1); 3562 weak1.set_value(value1);
3644 String& value2 = String::Handle(); 3563 String& value2 = String::Handle();
3645 value2 ^= OneByteString::New("value2", Heap::kOld); 3564 value2 ^= OneByteString::New("value2", Heap::kOld);
3646 weak2 ^= WeakProperty::New(Heap::kOld); 3565 weak2 ^= WeakProperty::New(Heap::kOld);
3647 weak2.set_key(key); 3566 weak2.set_key(key);
3648 weak2.set_value(value2); 3567 weak2.set_value(value2);
3649 } 3568 }
3650 isolate->heap()->CollectAllGarbage(); 3569 isolate->heap()->CollectAllGarbage();
3651 EXPECT(weak1.key() != Object::null()); 3570 EXPECT(weak1.key() != Object::null());
3652 EXPECT(weak1.value() != Object::null()); 3571 EXPECT(weak1.value() != Object::null());
3653 EXPECT(weak2.key() != Object::null()); 3572 EXPECT(weak2.key() != Object::null());
3654 EXPECT(weak2.value() != Object::null()); 3573 EXPECT(weak2.value() != Object::null());
3655 } 3574 }
3656 3575
3657
3658 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearOne_NewSpace) { 3576 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearOne_NewSpace) {
3659 Isolate* isolate = Isolate::Current(); 3577 Isolate* isolate = Isolate::Current();
3660 WeakProperty& weak = WeakProperty::Handle(); 3578 WeakProperty& weak = WeakProperty::Handle();
3661 { 3579 {
3662 HANDLESCOPE(thread); 3580 HANDLESCOPE(thread);
3663 String& key = String::Handle(); 3581 String& key = String::Handle();
3664 key ^= OneByteString::New("key"); 3582 key ^= OneByteString::New("key");
3665 String& value = String::Handle(); 3583 String& value = String::Handle();
3666 value ^= OneByteString::New("value"); 3584 value ^= OneByteString::New("value");
3667 weak ^= WeakProperty::New(); 3585 weak ^= WeakProperty::New();
3668 weak.set_key(key); 3586 weak.set_key(key);
3669 weak.set_value(value); 3587 weak.set_value(value);
3670 key ^= OneByteString::null(); 3588 key ^= OneByteString::null();
3671 value ^= OneByteString::null(); 3589 value ^= OneByteString::null();
3672 } 3590 }
3673 isolate->heap()->CollectAllGarbage(); 3591 isolate->heap()->CollectAllGarbage();
3674 EXPECT(weak.key() == Object::null()); 3592 EXPECT(weak.key() == Object::null());
3675 EXPECT(weak.value() == Object::null()); 3593 EXPECT(weak.value() == Object::null());
3676 } 3594 }
3677 3595
3678
3679 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) { 3596 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) {
3680 Isolate* isolate = Isolate::Current(); 3597 Isolate* isolate = Isolate::Current();
3681 WeakProperty& weak1 = WeakProperty::Handle(); 3598 WeakProperty& weak1 = WeakProperty::Handle();
3682 WeakProperty& weak2 = WeakProperty::Handle(); 3599 WeakProperty& weak2 = WeakProperty::Handle();
3683 { 3600 {
3684 HANDLESCOPE(thread); 3601 HANDLESCOPE(thread);
3685 String& key = String::Handle(); 3602 String& key = String::Handle();
3686 key ^= OneByteString::New("key"); 3603 key ^= OneByteString::New("key");
3687 String& value1 = String::Handle(); 3604 String& value1 = String::Handle();
3688 value1 ^= OneByteString::New("value1"); 3605 value1 ^= OneByteString::New("value1");
3689 weak1 ^= WeakProperty::New(); 3606 weak1 ^= WeakProperty::New();
3690 weak1.set_key(key); 3607 weak1.set_key(key);
3691 weak1.set_value(value1); 3608 weak1.set_value(value1);
3692 String& value2 = String::Handle(); 3609 String& value2 = String::Handle();
3693 value2 ^= OneByteString::New("value2"); 3610 value2 ^= OneByteString::New("value2");
3694 weak2 ^= WeakProperty::New(); 3611 weak2 ^= WeakProperty::New();
3695 weak2.set_key(key); 3612 weak2.set_key(key);
3696 weak2.set_value(value2); 3613 weak2.set_value(value2);
3697 } 3614 }
3698 isolate->heap()->CollectAllGarbage(); 3615 isolate->heap()->CollectAllGarbage();
3699 EXPECT(weak1.key() == Object::null()); 3616 EXPECT(weak1.key() == Object::null());
3700 EXPECT(weak1.value() == Object::null()); 3617 EXPECT(weak1.value() == Object::null());
3701 EXPECT(weak2.key() == Object::null()); 3618 EXPECT(weak2.key() == Object::null());
3702 EXPECT(weak2.value() == Object::null()); 3619 EXPECT(weak2.value() == Object::null());
3703 } 3620 }
3704 3621
3705
3706 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearOne_OldSpace) { 3622 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearOne_OldSpace) {
3707 Isolate* isolate = Isolate::Current(); 3623 Isolate* isolate = Isolate::Current();
3708 WeakProperty& weak = WeakProperty::Handle(); 3624 WeakProperty& weak = WeakProperty::Handle();
3709 { 3625 {
3710 HANDLESCOPE(thread); 3626 HANDLESCOPE(thread);
3711 String& key = String::Handle(); 3627 String& key = String::Handle();
3712 key ^= OneByteString::New("key", Heap::kOld); 3628 key ^= OneByteString::New("key", Heap::kOld);
3713 String& value = String::Handle(); 3629 String& value = String::Handle();
3714 value ^= OneByteString::New("value", Heap::kOld); 3630 value ^= OneByteString::New("value", Heap::kOld);
3715 weak ^= WeakProperty::New(Heap::kOld); 3631 weak ^= WeakProperty::New(Heap::kOld);
3716 weak.set_key(key); 3632 weak.set_key(key);
3717 weak.set_value(value); 3633 weak.set_value(value);
3718 key ^= OneByteString::null(); 3634 key ^= OneByteString::null();
3719 value ^= OneByteString::null(); 3635 value ^= OneByteString::null();
3720 } 3636 }
3721 isolate->heap()->CollectAllGarbage(); 3637 isolate->heap()->CollectAllGarbage();
3722 EXPECT(weak.key() == Object::null()); 3638 EXPECT(weak.key() == Object::null());
3723 EXPECT(weak.value() == Object::null()); 3639 EXPECT(weak.value() == Object::null());
3724 } 3640 }
3725 3641
3726
3727 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) { 3642 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) {
3728 Isolate* isolate = Isolate::Current(); 3643 Isolate* isolate = Isolate::Current();
3729 WeakProperty& weak1 = WeakProperty::Handle(); 3644 WeakProperty& weak1 = WeakProperty::Handle();
3730 WeakProperty& weak2 = WeakProperty::Handle(); 3645 WeakProperty& weak2 = WeakProperty::Handle();
3731 { 3646 {
3732 HANDLESCOPE(thread); 3647 HANDLESCOPE(thread);
3733 String& key = String::Handle(); 3648 String& key = String::Handle();
3734 key ^= OneByteString::New("key", Heap::kOld); 3649 key ^= OneByteString::New("key", Heap::kOld);
3735 String& value1 = String::Handle(); 3650 String& value1 = String::Handle();
3736 value1 ^= OneByteString::New("value1"); 3651 value1 ^= OneByteString::New("value1");
3737 weak1 ^= WeakProperty::New(Heap::kOld); 3652 weak1 ^= WeakProperty::New(Heap::kOld);
3738 weak1.set_key(key); 3653 weak1.set_key(key);
3739 weak1.set_value(value1); 3654 weak1.set_value(value1);
3740 String& value2 = String::Handle(); 3655 String& value2 = String::Handle();
3741 value2 ^= OneByteString::New("value2", Heap::kOld); 3656 value2 ^= OneByteString::New("value2", Heap::kOld);
3742 weak2 ^= WeakProperty::New(Heap::kOld); 3657 weak2 ^= WeakProperty::New(Heap::kOld);
3743 weak2.set_key(key); 3658 weak2.set_key(key);
3744 weak2.set_value(value2); 3659 weak2.set_value(value2);
3745 } 3660 }
3746 isolate->heap()->CollectAllGarbage(); 3661 isolate->heap()->CollectAllGarbage();
3747 EXPECT(weak1.key() == Object::null()); 3662 EXPECT(weak1.key() == Object::null());
3748 EXPECT(weak1.value() == Object::null()); 3663 EXPECT(weak1.value() == Object::null());
3749 EXPECT(weak2.key() == Object::null()); 3664 EXPECT(weak2.key() == Object::null());
3750 EXPECT(weak2.value() == Object::null()); 3665 EXPECT(weak2.value() == Object::null());
3751 } 3666 }
3752 3667
3753
3754 ISOLATE_UNIT_TEST_CASE(MirrorReference) { 3668 ISOLATE_UNIT_TEST_CASE(MirrorReference) {
3755 const MirrorReference& reference = 3669 const MirrorReference& reference =
3756 MirrorReference::Handle(MirrorReference::New(Object::Handle())); 3670 MirrorReference::Handle(MirrorReference::New(Object::Handle()));
3757 Object& initial_referent = Object::Handle(reference.referent()); 3671 Object& initial_referent = Object::Handle(reference.referent());
3758 EXPECT(initial_referent.IsNull()); 3672 EXPECT(initial_referent.IsNull());
3759 3673
3760 Library& library = Library::Handle(Library::CoreLibrary()); 3674 Library& library = Library::Handle(Library::CoreLibrary());
3761 EXPECT(!library.IsNull()); 3675 EXPECT(!library.IsNull());
3762 EXPECT(library.IsLibrary()); 3676 EXPECT(library.IsLibrary());
3763 reference.set_referent(library); 3677 reference.set_referent(library);
3764 const Object& returned_referent = Object::Handle(reference.referent()); 3678 const Object& returned_referent = Object::Handle(reference.referent());
3765 EXPECT(returned_referent.IsLibrary()); 3679 EXPECT(returned_referent.IsLibrary());
3766 EXPECT_EQ(returned_referent.raw(), library.raw()); 3680 EXPECT_EQ(returned_referent.raw(), library.raw());
3767 3681
3768 const MirrorReference& other_reference = 3682 const MirrorReference& other_reference =
3769 MirrorReference::Handle(MirrorReference::New(Object::Handle())); 3683 MirrorReference::Handle(MirrorReference::New(Object::Handle()));
3770 EXPECT_NE(reference.raw(), other_reference.raw()); 3684 EXPECT_NE(reference.raw(), other_reference.raw());
3771 other_reference.set_referent(library); 3685 other_reference.set_referent(library);
3772 EXPECT_NE(reference.raw(), other_reference.raw()); 3686 EXPECT_NE(reference.raw(), other_reference.raw());
3773 EXPECT_EQ(reference.referent(), other_reference.referent()); 3687 EXPECT_EQ(reference.referent(), other_reference.referent());
3774 3688
3775 Object& obj = Object::Handle(reference.raw()); 3689 Object& obj = Object::Handle(reference.raw());
3776 EXPECT(obj.IsMirrorReference()); 3690 EXPECT(obj.IsMirrorReference());
3777 } 3691 }
3778 3692
3779
3780 static RawFunction* GetFunction(const Class& cls, const char* name) { 3693 static RawFunction* GetFunction(const Class& cls, const char* name) {
3781 const Function& result = Function::Handle( 3694 const Function& result = Function::Handle(
3782 cls.LookupDynamicFunction(String::Handle(String::New(name)))); 3695 cls.LookupDynamicFunction(String::Handle(String::New(name))));
3783 EXPECT(!result.IsNull()); 3696 EXPECT(!result.IsNull());
3784 return result.raw(); 3697 return result.raw();
3785 } 3698 }
3786 3699
3787
3788 static RawFunction* GetStaticFunction(const Class& cls, const char* name) { 3700 static RawFunction* GetStaticFunction(const Class& cls, const char* name) {
3789 const Function& result = Function::Handle( 3701 const Function& result = Function::Handle(
3790 cls.LookupStaticFunction(String::Handle(String::New(name)))); 3702 cls.LookupStaticFunction(String::Handle(String::New(name))));
3791 EXPECT(!result.IsNull()); 3703 EXPECT(!result.IsNull());
3792 return result.raw(); 3704 return result.raw();
3793 } 3705 }
3794 3706
3795
3796 static RawField* GetField(const Class& cls, const char* name) { 3707 static RawField* GetField(const Class& cls, const char* name) {
3797 const Field& field = 3708 const Field& field =
3798 Field::Handle(cls.LookupField(String::Handle(String::New(name)))); 3709 Field::Handle(cls.LookupField(String::Handle(String::New(name))));
3799 EXPECT(!field.IsNull()); 3710 EXPECT(!field.IsNull());
3800 return field.raw(); 3711 return field.raw();
3801 } 3712 }
3802 3713
3803
3804 static RawClass* GetClass(const Library& lib, const char* name) { 3714 static RawClass* GetClass(const Library& lib, const char* name) {
3805 const Class& cls = Class::Handle( 3715 const Class& cls = Class::Handle(
3806 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name)))); 3716 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
3807 EXPECT(!cls.IsNull()); // No ambiguity error expected. 3717 EXPECT(!cls.IsNull()); // No ambiguity error expected.
3808 return cls.raw(); 3718 return cls.raw();
3809 } 3719 }
3810 3720
3811
3812 ISOLATE_UNIT_TEST_CASE(FindClosureIndex) { 3721 ISOLATE_UNIT_TEST_CASE(FindClosureIndex) {
3813 // Allocate the class first. 3722 // Allocate the class first.
3814 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 3723 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
3815 const Script& script = Script::Handle(); 3724 const Script& script = Script::Handle();
3816 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 3725 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
3817 const Array& functions = Array::Handle(Array::New(1)); 3726 const Array& functions = Array::Handle(Array::New(1));
3818 const Isolate* iso = Isolate::Current(); 3727 const Isolate* iso = Isolate::Current();
3819 3728
3820 Function& parent = Function::Handle(); 3729 Function& parent = Function::Handle();
3821 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa")); 3730 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
(...skipping 17 matching lines...) Expand all
3839 intptr_t bad_closure_index = iso->FindClosureIndex(parent); 3748 intptr_t bad_closure_index = iso->FindClosureIndex(parent);
3840 EXPECT_EQ(bad_closure_index, -1); 3749 EXPECT_EQ(bad_closure_index, -1);
3841 3750
3842 // Retrieve closure function via index. 3751 // Retrieve closure function via index.
3843 Function& func_from_index = Function::Handle(); 3752 Function& func_from_index = Function::Handle();
3844 func_from_index ^= iso->ClosureFunctionFromIndex(good_closure_index); 3753 func_from_index ^= iso->ClosureFunctionFromIndex(good_closure_index);
3845 // Same closure function. 3754 // Same closure function.
3846 EXPECT_EQ(func_from_index.raw(), function.raw()); 3755 EXPECT_EQ(func_from_index.raw(), function.raw());
3847 } 3756 }
3848 3757
3849
3850 ISOLATE_UNIT_TEST_CASE(FindInvocationDispatcherFunctionIndex) { 3758 ISOLATE_UNIT_TEST_CASE(FindInvocationDispatcherFunctionIndex) {
3851 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 3759 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
3852 const Script& script = Script::Handle(); 3760 const Script& script = Script::Handle();
3853 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 3761 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
3854 ClassFinalizer::FinalizeTypesInClass(cls); 3762 ClassFinalizer::FinalizeTypesInClass(cls);
3855 3763
3856 const Array& functions = Array::Handle(Array::New(1)); 3764 const Array& functions = Array::Handle(Array::New(1));
3857 Function& parent = Function::Handle(); 3765 Function& parent = Function::Handle();
3858 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa")); 3766 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
3859 parent = 3767 parent =
(...skipping 24 matching lines...) Expand all
3884 // Same function. 3792 // Same function.
3885 EXPECT_EQ(invocation_dispatcher.raw(), 3793 EXPECT_EQ(invocation_dispatcher.raw(),
3886 invocation_dispatcher_from_index.raw()); 3794 invocation_dispatcher_from_index.raw());
3887 // Test function not found case. 3795 // Test function not found case.
3888 const Function& bad_function = Function::Handle(Function::null()); 3796 const Function& bad_function = Function::Handle(Function::null());
3889 intptr_t bad_invocation_dispatcher_index = 3797 intptr_t bad_invocation_dispatcher_index =
3890 cls.FindInvocationDispatcherFunctionIndex(bad_function); 3798 cls.FindInvocationDispatcherFunctionIndex(bad_function);
3891 EXPECT_EQ(bad_invocation_dispatcher_index, -1); 3799 EXPECT_EQ(bad_invocation_dispatcher_index, -1);
3892 } 3800 }
3893 3801
3894
3895 static void PrintMetadata(const char* name, const Object& data) { 3802 static void PrintMetadata(const char* name, const Object& data) {
3896 if (data.IsError()) { 3803 if (data.IsError()) {
3897 OS::Print("Error in metadata evaluation for %s: '%s'\n", name, 3804 OS::Print("Error in metadata evaluation for %s: '%s'\n", name,
3898 Error::Cast(data).ToErrorCString()); 3805 Error::Cast(data).ToErrorCString());
3899 } 3806 }
3900 EXPECT(data.IsArray()); 3807 EXPECT(data.IsArray());
3901 const Array& metadata = Array::Cast(data); 3808 const Array& metadata = Array::Cast(data);
3902 OS::Print("Metadata for %s has %" Pd " values:\n", name, metadata.Length()); 3809 OS::Print("Metadata for %s has %" Pd " values:\n", name, metadata.Length());
3903 Object& elem = Object::Handle(); 3810 Object& elem = Object::Handle();
3904 for (int i = 0; i < metadata.Length(); i++) { 3811 for (int i = 0; i < metadata.Length(); i++) {
3905 elem = metadata.At(i); 3812 elem = metadata.At(i);
3906 OS::Print(" %d: %s\n", i, elem.ToCString()); 3813 OS::Print(" %d: %s\n", i, elem.ToCString());
3907 } 3814 }
3908 } 3815 }
3909 3816
3910
3911 TEST_CASE(Metadata) { 3817 TEST_CASE(Metadata) {
3912 const char* kScriptChars = 3818 const char* kScriptChars =
3913 "@metafoo \n" 3819 "@metafoo \n"
3914 "class Meta { \n" 3820 "class Meta { \n"
3915 " final m; \n" 3821 " final m; \n"
3916 " const Meta(this.m); \n" 3822 " const Meta(this.m); \n"
3917 "} \n" 3823 "} \n"
3918 " \n" 3824 " \n"
3919 "const metafoo = 'metafoo'; \n" 3825 "const metafoo = 'metafoo'; \n"
3920 "const metabar = 'meta' 'bar'; \n" 3826 "const metabar = 'meta' 'bar'; \n"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3974 EXPECT(!func.IsNull()); 3880 EXPECT(!func.IsNull());
3975 res = lib.GetMetadata(func); 3881 res = lib.GetMetadata(func);
3976 PrintMetadata("tlGetter", res); 3882 PrintMetadata("tlGetter", res);
3977 3883
3978 field = lib.LookupLocalField(String::Handle(Symbols::New(thread, "gVar"))); 3884 field = lib.LookupLocalField(String::Handle(Symbols::New(thread, "gVar")));
3979 EXPECT(!field.IsNull()); 3885 EXPECT(!field.IsNull());
3980 res = lib.GetMetadata(field); 3886 res = lib.GetMetadata(field);
3981 PrintMetadata("gVar", res); 3887 PrintMetadata("gVar", res);
3982 } 3888 }
3983 3889
3984
3985 TEST_CASE(FunctionSourceFingerprint) { 3890 TEST_CASE(FunctionSourceFingerprint) {
3986 const char* kScriptChars = 3891 const char* kScriptChars =
3987 "class A {\n" 3892 "class A {\n"
3988 " static void test1(int a) {\n" 3893 " static void test1(int a) {\n"
3989 " return a > 1 ? a + 1 : a;\n" 3894 " return a > 1 ? a + 1 : a;\n"
3990 " }\n" 3895 " }\n"
3991 " static void test2(a) {\n" 3896 " static void test2(a) {\n"
3992 " return a > 1 ? a + 1 : a;\n" 3897 " return a > 1 ? a + 1 : a;\n"
3993 " }\n" 3898 " }\n"
3994 " static void test3(b) {\n" 3899 " static void test3(b) {\n"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
4053 EXPECT_NE(a_test3.SourceFingerprint(), a_test4.SourceFingerprint()); 3958 EXPECT_NE(a_test3.SourceFingerprint(), a_test4.SourceFingerprint());
4054 EXPECT_NE(a_test4.SourceFingerprint(), a_test5.SourceFingerprint()); 3959 EXPECT_NE(a_test4.SourceFingerprint(), a_test5.SourceFingerprint());
4055 EXPECT_EQ(a_test5.SourceFingerprint(), b_test5.SourceFingerprint()); 3960 EXPECT_EQ(a_test5.SourceFingerprint(), b_test5.SourceFingerprint());
4056 // Although a_test6's receiver type is different than b_test6's receiver type, 3961 // Although a_test6's receiver type is different than b_test6's receiver type,
4057 // the fingerprints are identical. The token stream does not reflect the 3962 // the fingerprints are identical. The token stream does not reflect the
4058 // receiver's type. This is not a problem, since we recognize functions 3963 // receiver's type. This is not a problem, since we recognize functions
4059 // of a given class and of a given name. 3964 // of a given class and of a given name.
4060 EXPECT_EQ(a_test6.SourceFingerprint(), b_test6.SourceFingerprint()); 3965 EXPECT_EQ(a_test6.SourceFingerprint(), b_test6.SourceFingerprint());
4061 } 3966 }
4062 3967
4063
4064 TEST_CASE(FunctionWithBreakpointNotInlined) { 3968 TEST_CASE(FunctionWithBreakpointNotInlined) {
4065 if (!FLAG_support_debugger) { 3969 if (!FLAG_support_debugger) {
4066 return; 3970 return;
4067 } 3971 }
4068 const char* kScriptChars = 3972 const char* kScriptChars =
4069 "class A {\n" 3973 "class A {\n"
4070 " a() {\n" 3974 " a() {\n"
4071 " }\n" 3975 " }\n"
4072 " b() {\n" 3976 " b() {\n"
4073 " a();\n" // This is line 5. 3977 " a();\n" // This is line 5.
(...skipping 18 matching lines...) Expand all
4092 vmlib.LookupClass(String::Handle(Symbols::New(thread, "A")))); 3996 vmlib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
4093 const Function& func_b = Function::Handle(GetFunction(class_a, "b")); 3997 const Function& func_b = Function::Handle(GetFunction(class_a, "b"));
4094 EXPECT(func_b.CanBeInlined()); 3998 EXPECT(func_b.CanBeInlined());
4095 3999
4096 // After setting a breakpoint in a function A.b, it is no longer inlineable. 4000 // After setting a breakpoint in a function A.b, it is no longer inlineable.
4097 result = Dart_SetBreakpoint(NewString(TestCase::url()), kBreakpointLine); 4001 result = Dart_SetBreakpoint(NewString(TestCase::url()), kBreakpointLine);
4098 EXPECT_VALID(result); 4002 EXPECT_VALID(result);
4099 EXPECT(!func_b.CanBeInlined()); 4003 EXPECT(!func_b.CanBeInlined());
4100 } 4004 }
4101 4005
4102
4103 ISOLATE_UNIT_TEST_CASE(SpecialClassesHaveEmptyArrays) { 4006 ISOLATE_UNIT_TEST_CASE(SpecialClassesHaveEmptyArrays) {
4104 ObjectStore* object_store = Isolate::Current()->object_store(); 4007 ObjectStore* object_store = Isolate::Current()->object_store();
4105 Class& cls = Class::Handle(); 4008 Class& cls = Class::Handle();
4106 Object& array = Object::Handle(); 4009 Object& array = Object::Handle();
4107 4010
4108 cls = object_store->null_class(); 4011 cls = object_store->null_class();
4109 array = cls.fields(); 4012 array = cls.fields();
4110 EXPECT(!array.IsNull()); 4013 EXPECT(!array.IsNull());
4111 EXPECT(array.IsArray()); 4014 EXPECT(array.IsArray());
4112 array = cls.functions(); 4015 array = cls.functions();
(...skipping 10 matching lines...) Expand all
4123 4026
4124 cls = Object::dynamic_class(); 4027 cls = Object::dynamic_class();
4125 array = cls.fields(); 4028 array = cls.fields();
4126 EXPECT(!array.IsNull()); 4029 EXPECT(!array.IsNull());
4127 EXPECT(array.IsArray()); 4030 EXPECT(array.IsArray());
4128 array = cls.functions(); 4031 array = cls.functions();
4129 EXPECT(!array.IsNull()); 4032 EXPECT(!array.IsNull());
4130 EXPECT(array.IsArray()); 4033 EXPECT(array.IsArray());
4131 } 4034 }
4132 4035
4133
4134 #ifndef PRODUCT 4036 #ifndef PRODUCT
4135 4037
4136
4137 class ObjectAccumulator : public ObjectVisitor { 4038 class ObjectAccumulator : public ObjectVisitor {
4138 public: 4039 public:
4139 explicit ObjectAccumulator(GrowableArray<Object*>* objects) 4040 explicit ObjectAccumulator(GrowableArray<Object*>* objects)
4140 : objects_(objects) {} 4041 : objects_(objects) {}
4141 virtual ~ObjectAccumulator() {} 4042 virtual ~ObjectAccumulator() {}
4142 virtual void VisitObject(RawObject* obj) { 4043 virtual void VisitObject(RawObject* obj) {
4143 if (obj->IsPseudoObject()) { 4044 if (obj->IsPseudoObject()) {
4144 return; // Cannot be wrapped in handles. 4045 return; // Cannot be wrapped in handles.
4145 } 4046 }
4146 Object& handle = Object::Handle(obj); 4047 Object& handle = Object::Handle(obj);
4147 // Skip some common simple objects to run in reasonable time. 4048 // Skip some common simple objects to run in reasonable time.
4148 if (handle.IsString() || handle.IsArray() || handle.IsLiteralToken()) { 4049 if (handle.IsString() || handle.IsArray() || handle.IsLiteralToken()) {
4149 return; 4050 return;
4150 } 4051 }
4151 objects_->Add(&handle); 4052 objects_->Add(&handle);
4152 } 4053 }
4153 4054
4154 private: 4055 private:
4155 GrowableArray<Object*>* objects_; 4056 GrowableArray<Object*>* objects_;
4156 }; 4057 };
4157 4058
4158
4159 ISOLATE_UNIT_TEST_CASE(PrintJSON) { 4059 ISOLATE_UNIT_TEST_CASE(PrintJSON) {
4160 Heap* heap = Isolate::Current()->heap(); 4060 Heap* heap = Isolate::Current()->heap();
4161 heap->CollectAllGarbage(); 4061 heap->CollectAllGarbage();
4162 GrowableArray<Object*> objects; 4062 GrowableArray<Object*> objects;
4163 ObjectAccumulator acc(&objects); 4063 ObjectAccumulator acc(&objects);
4164 heap->IterateObjects(&acc); 4064 heap->IterateObjects(&acc);
4165 for (intptr_t i = 0; i < objects.length(); ++i) { 4065 for (intptr_t i = 0; i < objects.length(); ++i) {
4166 JSONStream js; 4066 JSONStream js;
4167 objects[i]->PrintJSON(&js, false); 4067 objects[i]->PrintJSON(&js, false);
4168 EXPECT_SUBSTRING("\"type\":", js.ToCString()); 4068 EXPECT_SUBSTRING("\"type\":", js.ToCString());
4169 } 4069 }
4170 } 4070 }
4171 4071
4172
4173 ISOLATE_UNIT_TEST_CASE(PrintJSONPrimitives) { 4072 ISOLATE_UNIT_TEST_CASE(PrintJSONPrimitives) {
4174 char buffer[1024]; 4073 char buffer[1024];
4175 Isolate* isolate = Isolate::Current(); 4074 Isolate* isolate = Isolate::Current();
4176 4075
4177 // Class reference 4076 // Class reference
4178 { 4077 {
4179 JSONStream js; 4078 JSONStream js;
4180 Class& cls = Class::Handle(isolate->object_store()->bool_class()); 4079 Class& cls = Class::Handle(isolate->object_store()->bool_class());
4181 cls.PrintJSON(&js, true); 4080 cls.PrintJSON(&js, true);
4182 ElideJSONSubstring("classes", js.ToCString(), buffer); 4081 ElideJSONSubstring("classes", js.ToCString(), buffer);
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
4452 JSONStream js; 4351 JSONStream js;
4453 LiteralToken& tok = LiteralToken::Handle(LiteralToken::New()); 4352 LiteralToken& tok = LiteralToken::Handle(LiteralToken::New());
4454 tok.PrintJSON(&js, true); 4353 tok.PrintJSON(&js, true);
4455 ElideJSONSubstring("objects", js.ToCString(), buffer); 4354 ElideJSONSubstring("objects", js.ToCString(), buffer);
4456 EXPECT_STREQ( 4355 EXPECT_STREQ(
4457 "{\"type\":\"@Object\",\"_vmType\":\"LiteralToken\",\"id\":\"\"}", 4356 "{\"type\":\"@Object\",\"_vmType\":\"LiteralToken\",\"id\":\"\"}",
4458 buffer); 4357 buffer);
4459 } 4358 }
4460 } 4359 }
4461 4360
4462
4463 #endif // !PRODUCT 4361 #endif // !PRODUCT
4464 4362
4465
4466 TEST_CASE(InstanceEquality) { 4363 TEST_CASE(InstanceEquality) {
4467 // Test that Instance::OperatorEquals can call a user-defined operator==. 4364 // Test that Instance::OperatorEquals can call a user-defined operator==.
4468 const char* kScript = 4365 const char* kScript =
4469 "class A {\n" 4366 "class A {\n"
4470 " bool operator==(A other) { return true; }\n" 4367 " bool operator==(A other) { return true; }\n"
4471 "}\n" 4368 "}\n"
4472 "main() {\n" 4369 "main() {\n"
4473 " A a = new A();\n" 4370 " A a = new A();\n"
4474 "}"; 4371 "}";
4475 4372
4476 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); 4373 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
4477 EXPECT_VALID(h_lib); 4374 EXPECT_VALID(h_lib);
4478 Library& lib = Library::Handle(); 4375 Library& lib = Library::Handle();
4479 lib ^= Api::UnwrapHandle(h_lib); 4376 lib ^= Api::UnwrapHandle(h_lib);
4480 EXPECT(!lib.IsNull()); 4377 EXPECT(!lib.IsNull());
4481 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); 4378 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
4482 EXPECT_VALID(result); 4379 EXPECT_VALID(result);
4483 const Class& clazz = Class::Handle(GetClass(lib, "A")); 4380 const Class& clazz = Class::Handle(GetClass(lib, "A"));
4484 EXPECT(!clazz.IsNull()); 4381 EXPECT(!clazz.IsNull());
4485 const Instance& a0 = Instance::Handle(Instance::New(clazz)); 4382 const Instance& a0 = Instance::Handle(Instance::New(clazz));
4486 const Instance& a1 = Instance::Handle(Instance::New(clazz)); 4383 const Instance& a1 = Instance::Handle(Instance::New(clazz));
4487 EXPECT(a0.raw() != a1.raw()); 4384 EXPECT(a0.raw() != a1.raw());
4488 EXPECT(a0.OperatorEquals(a0)); 4385 EXPECT(a0.OperatorEquals(a0));
4489 EXPECT(a0.OperatorEquals(a1)); 4386 EXPECT(a0.OperatorEquals(a1));
4490 EXPECT(a0.IsIdenticalTo(a0)); 4387 EXPECT(a0.IsIdenticalTo(a0));
4491 EXPECT(!a0.IsIdenticalTo(a1)); 4388 EXPECT(!a0.IsIdenticalTo(a1));
4492 } 4389 }
4493 4390
4494
4495 TEST_CASE(HashCode) { 4391 TEST_CASE(HashCode) {
4496 // Ensure C++ overrides of Instance::HashCode match the Dart implementations. 4392 // Ensure C++ overrides of Instance::HashCode match the Dart implementations.
4497 const char* kScript = 4393 const char* kScript =
4498 "foo() {\n" 4394 "foo() {\n"
4499 " return \"foo\".hashCode;\n" 4395 " return \"foo\".hashCode;\n"
4500 "}"; 4396 "}";
4501 4397
4502 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); 4398 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
4503 EXPECT_VALID(h_lib); 4399 EXPECT_VALID(h_lib);
4504 Library& lib = Library::Handle(); 4400 Library& lib = Library::Handle();
4505 lib ^= Api::UnwrapHandle(h_lib); 4401 lib ^= Api::UnwrapHandle(h_lib);
4506 EXPECT(!lib.IsNull()); 4402 EXPECT(!lib.IsNull());
4507 Dart_Handle h_result = Dart_Invoke(h_lib, NewString("foo"), 0, NULL); 4403 Dart_Handle h_result = Dart_Invoke(h_lib, NewString("foo"), 0, NULL);
4508 EXPECT_VALID(h_result); 4404 EXPECT_VALID(h_result);
4509 Integer& result = Integer::Handle(); 4405 Integer& result = Integer::Handle();
4510 result ^= Api::UnwrapHandle(h_result); 4406 result ^= Api::UnwrapHandle(h_result);
4511 String& foo = String::Handle(String::New("foo")); 4407 String& foo = String::Handle(String::New("foo"));
4512 Integer& expected = Integer::Handle(); 4408 Integer& expected = Integer::Handle();
4513 expected ^= foo.HashCode(); 4409 expected ^= foo.HashCode();
4514 EXPECT(result.IsIdenticalTo(expected)); 4410 EXPECT(result.IsIdenticalTo(expected));
4515 } 4411 }
4516 4412
4517
4518 static void CheckIdenticalHashStructure(const Instance& a, const Instance& b) { 4413 static void CheckIdenticalHashStructure(const Instance& a, const Instance& b) {
4519 const char* kScript = 4414 const char* kScript =
4520 "(a, b) {\n" 4415 "(a, b) {\n"
4521 " if (a._usedData != b._usedData ||\n" 4416 " if (a._usedData != b._usedData ||\n"
4522 " a._deletedKeys != b._deletedKeys ||\n" 4417 " a._deletedKeys != b._deletedKeys ||\n"
4523 " a._hashMask != b._hashMask ||\n" 4418 " a._hashMask != b._hashMask ||\n"
4524 " a._index.length != b._index.length ||\n" 4419 " a._index.length != b._index.length ||\n"
4525 " a._data.length != b._data.length) {\n" 4420 " a._data.length != b._data.length) {\n"
4526 " return false;\n" 4421 " return false;\n"
4527 " }\n" 4422 " }\n"
(...skipping 18 matching lines...) Expand all
4546 name = String::New("b"); 4441 name = String::New("b");
4547 param_names.SetAt(1, name); 4442 param_names.SetAt(1, name);
4548 Array& param_values = Array::Handle(Array::New(2)); 4443 Array& param_values = Array::Handle(Array::New(2));
4549 param_values.SetAt(0, a); 4444 param_values.SetAt(0, a);
4550 param_values.SetAt(1, b); 4445 param_values.SetAt(1, b);
4551 name = String::New(kScript); 4446 name = String::New(kScript);
4552 Library& lib = Library::Handle(Library::CollectionLibrary()); 4447 Library& lib = Library::Handle(Library::CollectionLibrary());
4553 EXPECT(lib.Evaluate(name, param_names, param_values) == Bool::True().raw()); 4448 EXPECT(lib.Evaluate(name, param_names, param_values) == Bool::True().raw());
4554 } 4449 }
4555 4450
4556
4557 TEST_CASE(LinkedHashMap) { 4451 TEST_CASE(LinkedHashMap) {
4558 // Check that initial index size and hash mask match in Dart vs. C++. 4452 // Check that initial index size and hash mask match in Dart vs. C++.
4559 // 1. Create an empty custom linked hash map in Dart. 4453 // 1. Create an empty custom linked hash map in Dart.
4560 const char* kScript = 4454 const char* kScript =
4561 "import 'dart:collection';\n" 4455 "import 'dart:collection';\n"
4562 "makeMap() {\n" 4456 "makeMap() {\n"
4563 " Function eq = (a, b) => true;\n" 4457 " Function eq = (a, b) => true;\n"
4564 " Function hc = (a) => 42;\n" 4458 " Function hc = (a) => 42;\n"
4565 " return new LinkedHashMap(equals: eq, hashCode: hc);\n" 4459 " return new LinkedHashMap(equals: eq, hashCode: hc);\n"
4566 "}"; 4460 "}";
4567 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); 4461 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
4568 EXPECT_VALID(h_lib); 4462 EXPECT_VALID(h_lib);
4569 Library& lib = Library::Handle(); 4463 Library& lib = Library::Handle();
4570 lib ^= Api::UnwrapHandle(h_lib); 4464 lib ^= Api::UnwrapHandle(h_lib);
4571 EXPECT(!lib.IsNull()); 4465 EXPECT(!lib.IsNull());
4572 Dart_Handle h_result = Dart_Invoke(h_lib, NewString("makeMap"), 0, NULL); 4466 Dart_Handle h_result = Dart_Invoke(h_lib, NewString("makeMap"), 0, NULL);
4573 EXPECT_VALID(h_result); 4467 EXPECT_VALID(h_result);
4574 4468
4575 // 2. Create an empty internalized LinkedHashMap in C++. 4469 // 2. Create an empty internalized LinkedHashMap in C++.
4576 Instance& dart_map = Instance::Handle(); 4470 Instance& dart_map = Instance::Handle();
4577 dart_map ^= Api::UnwrapHandle(h_result); 4471 dart_map ^= Api::UnwrapHandle(h_result);
4578 LinkedHashMap& cc_map = LinkedHashMap::Handle(LinkedHashMap::NewDefault()); 4472 LinkedHashMap& cc_map = LinkedHashMap::Handle(LinkedHashMap::NewDefault());
4579 4473
4580 // 3. Expect them to have identical structure. 4474 // 3. Expect them to have identical structure.
4581 CheckIdenticalHashStructure(dart_map, cc_map); 4475 CheckIdenticalHashStructure(dart_map, cc_map);
4582 } 4476 }
4583 4477
4584
4585 TEST_CASE(LinkedHashMap_iteration) { 4478 TEST_CASE(LinkedHashMap_iteration) {
4586 const char* kScript = 4479 const char* kScript =
4587 "makeMap() {\n" 4480 "makeMap() {\n"
4588 " var map = {'x': 3, 'y': 4, 'z': 5, 'w': 6};\n" 4481 " var map = {'x': 3, 'y': 4, 'z': 5, 'w': 6};\n"
4589 " map.remove('y');\n" 4482 " map.remove('y');\n"
4590 " map.remove('w');\n" 4483 " map.remove('w');\n"
4591 " return map;\n" 4484 " return map;\n"
4592 "}"; 4485 "}";
4593 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); 4486 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
4594 EXPECT_VALID(h_lib); 4487 EXPECT_VALID(h_lib);
(...skipping 21 matching lines...) Expand all
4616 4509
4617 EXPECT(iterator.MoveNext()); 4510 EXPECT(iterator.MoveNext());
4618 object = iterator.CurrentKey(); 4511 object = iterator.CurrentKey();
4619 EXPECT_STREQ("z", object.ToCString()); 4512 EXPECT_STREQ("z", object.ToCString());
4620 object = iterator.CurrentValue(); 4513 object = iterator.CurrentValue();
4621 EXPECT_STREQ("5", object.ToCString()); 4514 EXPECT_STREQ("5", object.ToCString());
4622 4515
4623 EXPECT(!iterator.MoveNext()); 4516 EXPECT(!iterator.MoveNext());
4624 } 4517 }
4625 4518
4626
4627 static void CheckConcatAll(const String* data[], intptr_t n) { 4519 static void CheckConcatAll(const String* data[], intptr_t n) {
4628 Thread* thread = Thread::Current(); 4520 Thread* thread = Thread::Current();
4629 Zone* zone = thread->zone(); 4521 Zone* zone = thread->zone();
4630 GrowableHandlePtrArray<const String> pieces(zone, n); 4522 GrowableHandlePtrArray<const String> pieces(zone, n);
4631 const Array& array = Array::Handle(zone, Array::New(n)); 4523 const Array& array = Array::Handle(zone, Array::New(n));
4632 for (int i = 0; i < n; i++) { 4524 for (int i = 0; i < n; i++) {
4633 pieces.Add(*data[i]); 4525 pieces.Add(*data[i]);
4634 array.SetAt(i, *data[i]); 4526 array.SetAt(i, *data[i]);
4635 } 4527 }
4636 const String& res1 = 4528 const String& res1 =
4637 String::Handle(zone, Symbols::FromConcatAll(thread, pieces)); 4529 String::Handle(zone, Symbols::FromConcatAll(thread, pieces));
4638 const String& res2 = String::Handle(zone, String::ConcatAll(array)); 4530 const String& res2 = String::Handle(zone, String::ConcatAll(array));
4639 EXPECT(res1.Equals(res2)); 4531 EXPECT(res1.Equals(res2));
4640 } 4532 }
4641 4533
4642
4643 ISOLATE_UNIT_TEST_CASE(Symbols_FromConcatAll) { 4534 ISOLATE_UNIT_TEST_CASE(Symbols_FromConcatAll) {
4644 { 4535 {
4645 const String* data[3] = {&Symbols::FallThroughError(), &Symbols::Dot(), 4536 const String* data[3] = {&Symbols::FallThroughError(), &Symbols::Dot(),
4646 &Symbols::isPaused()}; 4537 &Symbols::isPaused()};
4647 CheckConcatAll(data, 3); 4538 CheckConcatAll(data, 3);
4648 } 4539 }
4649 4540
4650 { 4541 {
4651 const intptr_t kWideCharsLen = 7; 4542 const intptr_t kWideCharsLen = 7;
4652 uint16_t wide_chars[kWideCharsLen] = {'H', 'e', 'l', 'l', 'o', 256, '!'}; 4543 uint16_t wide_chars[kWideCharsLen] = {'H', 'e', 'l', 'l', 'o', 256, '!'};
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
4696 } 4587 }
4697 4588
4698 { 4589 {
4699 const String& empty = String::Handle(String::New("")); 4590 const String& empty = String::Handle(String::New(""));
4700 const String* data[3] = {&Symbols::FallThroughError(), &empty, 4591 const String* data[3] = {&Symbols::FallThroughError(), &empty,
4701 &Symbols::isPaused()}; 4592 &Symbols::isPaused()};
4702 CheckConcatAll(data, 3); 4593 CheckConcatAll(data, 3);
4703 } 4594 }
4704 } 4595 }
4705 4596
4706
4707 struct TestResult { 4597 struct TestResult {
4708 const char* in; 4598 const char* in;
4709 const char* out; 4599 const char* out;
4710 }; 4600 };
4711 4601
4712
4713 ISOLATE_UNIT_TEST_CASE(String_ScrubName) { 4602 ISOLATE_UNIT_TEST_CASE(String_ScrubName) {
4714 TestResult tests[] = { 4603 TestResult tests[] = {
4715 {"(dynamic, dynamic) => void", "(dynamic, dynamic) => void"}, 4604 {"(dynamic, dynamic) => void", "(dynamic, dynamic) => void"},
4716 {"_List@915557746", "_List"}, 4605 {"_List@915557746", "_List"},
4717 {"_HashMap@600006304<K, V>(dynamic) => V", 4606 {"_HashMap@600006304<K, V>(dynamic) => V",
4718 "_HashMap<K, V>(dynamic) => V"}, 4607 "_HashMap<K, V>(dynamic) => V"},
4719 {"set:foo", "foo="}, 4608 {"set:foo", "foo="},
4720 {"get:foo", "foo"}, 4609 {"get:foo", "foo"},
4721 {"_ReceivePortImpl@709387912", "_ReceivePortImpl"}, 4610 {"_ReceivePortImpl@709387912", "_ReceivePortImpl"},
4722 {"_ReceivePortImpl@709387912._internal@709387912", 4611 {"_ReceivePortImpl@709387912._internal@709387912",
4723 "_ReceivePortImpl._internal"}, 4612 "_ReceivePortImpl._internal"},
4724 {"_C@6328321&_E@6328321&_F@6328321", "_C&_E&_F"}, 4613 {"_C@6328321&_E@6328321&_F@6328321", "_C&_E&_F"},
4725 {"List.", "List"}, 4614 {"List.", "List"},
4726 {"get:foo@6328321", "foo"}, 4615 {"get:foo@6328321", "foo"},
4727 {"_MyClass@6328321.", "_MyClass"}, 4616 {"_MyClass@6328321.", "_MyClass"},
4728 {"_MyClass@6328321.named", "_MyClass.named"}, 4617 {"_MyClass@6328321.named", "_MyClass.named"},
4729 }; 4618 };
4730 String& test = String::Handle(); 4619 String& test = String::Handle();
4731 String& result = String::Handle(); 4620 String& result = String::Handle();
4732 for (size_t i = 0; i < ARRAY_SIZE(tests); i++) { 4621 for (size_t i = 0; i < ARRAY_SIZE(tests); i++) {
4733 test = String::New(tests[i].in); 4622 test = String::New(tests[i].in);
4734 result = String::ScrubName(test); 4623 result = String::ScrubName(test);
4735 EXPECT_STREQ(tests[i].out, result.ToCString()); 4624 EXPECT_STREQ(tests[i].out, result.ToCString());
4736 } 4625 }
4737 } 4626 }
4738 4627
4739
4740 ISOLATE_UNIT_TEST_CASE(String_EqualsUTF32) { 4628 ISOLATE_UNIT_TEST_CASE(String_EqualsUTF32) {
4741 // Regression test for Issue 27433. Checks that comparisons between Strings 4629 // Regression test for Issue 27433. Checks that comparisons between Strings
4742 // and utf32 arrays happens after conversion to utf16 instead of utf32, as 4630 // and utf32 arrays happens after conversion to utf16 instead of utf32, as
4743 // required for proper canonicalization of string literals with a lossy 4631 // required for proper canonicalization of string literals with a lossy
4744 // utf32->utf16 conversion. 4632 // utf32->utf16 conversion.
4745 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff, 4633 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff,
4746 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff}; 4634 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff};
4747 4635
4748 const String& str = 4636 const String& str =
4749 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes))); 4637 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes)));
4750 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes))); 4638 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes)));
4751 } 4639 }
4752 4640
4753 } // namespace dart 4641 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object_store.cc ('k') | runtime/vm/object_x64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698