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

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

Issue 2666133002: Added new type of unit test, RAW_UNIT_TEST_CASE, which is used for tests that can be flaky if run w… (Closed)
Patch Set: Fixed name of UNIT_TEST_CASE macro Created 3 years, 10 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_id_ring_test.cc ('k') | runtime/vm/os_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/dart_api_impl.h" 9 #include "vm/dart_api_impl.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 13 matching lines...) Expand all
24 24
25 static RawClass* CreateDummyClass(const String& class_name, 25 static RawClass* CreateDummyClass(const String& class_name,
26 const Script& script) { 26 const Script& script) {
27 const Class& cls = Class::Handle(Class::New( 27 const Class& cls = Class::Handle(Class::New(
28 Library::Handle(), class_name, script, TokenPosition::kNoSource)); 28 Library::Handle(), class_name, script, TokenPosition::kNoSource));
29 cls.set_is_synthesized_class(); // Dummy class for testing. 29 cls.set_is_synthesized_class(); // Dummy class for testing.
30 return cls.raw(); 30 return cls.raw();
31 } 31 }
32 32
33 33
34 VM_TEST_CASE(Class) { 34 ISOLATE_UNIT_TEST_CASE(Class) {
35 // Allocate the class first. 35 // Allocate the class first.
36 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 36 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
37 const Script& script = Script::Handle(); 37 const Script& script = Script::Handle();
38 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 38 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
39 39
40 // Class has no fields and no functions yet. 40 // Class has no fields and no functions yet.
41 EXPECT_EQ(Array::Handle(cls.fields()).Length(), 0); 41 EXPECT_EQ(Array::Handle(cls.fields()).Length(), 0);
42 EXPECT_EQ(Array::Handle(cls.functions()).Length(), 0); 42 EXPECT_EQ(Array::Handle(cls.functions()).Length(), 0);
43 43
44 // Setup the interfaces in the class. 44 // Setup the interfaces in the class.
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 EXPECT(!function.HasOptionalParameters()); 132 EXPECT(!function.HasOptionalParameters());
133 133
134 function_name = String::New("bar"); 134 function_name = String::New("bar");
135 function = cls.LookupDynamicFunction(function_name); 135 function = cls.LookupDynamicFunction(function_name);
136 EXPECT(!function.IsNull()); 136 EXPECT(!function.IsNull());
137 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters()); 137 EXPECT_EQ(kNumFixedParameters, function.num_fixed_parameters());
138 EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters()); 138 EXPECT_EQ(kNumOptionalParameters, function.NumOptionalParameters());
139 } 139 }
140 140
141 141
142 VM_TEST_CASE(TypeArguments) { 142 ISOLATE_UNIT_TEST_CASE(TypeArguments) {
143 const Type& type1 = Type::Handle(Type::Double()); 143 const Type& type1 = Type::Handle(Type::Double());
144 const Type& type2 = Type::Handle(Type::StringType()); 144 const Type& type2 = Type::Handle(Type::StringType());
145 const TypeArguments& type_arguments1 = 145 const TypeArguments& type_arguments1 =
146 TypeArguments::Handle(TypeArguments::New(2)); 146 TypeArguments::Handle(TypeArguments::New(2));
147 type_arguments1.SetTypeAt(0, type1); 147 type_arguments1.SetTypeAt(0, type1);
148 type_arguments1.SetTypeAt(1, type2); 148 type_arguments1.SetTypeAt(1, type2);
149 const TypeArguments& type_arguments2 = 149 const TypeArguments& type_arguments2 =
150 TypeArguments::Handle(TypeArguments::New(2)); 150 TypeArguments::Handle(TypeArguments::New(2));
151 type_arguments2.SetTypeAt(0, type1); 151 type_arguments2.SetTypeAt(0, type1);
152 type_arguments2.SetTypeAt(1, type2); 152 type_arguments2.SetTypeAt(1, type2);
153 EXPECT_NE(type_arguments1.raw(), type_arguments2.raw()); 153 EXPECT_NE(type_arguments1.raw(), type_arguments2.raw());
154 OS::Print("1: %s\n", type_arguments1.ToCString()); 154 OS::Print("1: %s\n", type_arguments1.ToCString());
155 OS::Print("2: %s\n", type_arguments2.ToCString()); 155 OS::Print("2: %s\n", type_arguments2.ToCString());
156 EXPECT(type_arguments1.Equals(type_arguments2)); 156 EXPECT(type_arguments1.Equals(type_arguments2));
157 TypeArguments& type_arguments3 = TypeArguments::Handle(); 157 TypeArguments& type_arguments3 = TypeArguments::Handle();
158 type_arguments1.Canonicalize(); 158 type_arguments1.Canonicalize();
159 type_arguments3 ^= type_arguments2.Canonicalize(); 159 type_arguments3 ^= type_arguments2.Canonicalize();
160 EXPECT_EQ(type_arguments1.raw(), type_arguments3.raw()); 160 EXPECT_EQ(type_arguments1.raw(), type_arguments3.raw());
161 } 161 }
162 162
163 163
164 VM_TEST_CASE(TokenStream) { 164 ISOLATE_UNIT_TEST_CASE(TokenStream) {
165 Zone* zone = Thread::Current()->zone(); 165 Zone* zone = Thread::Current()->zone();
166 String& source = String::Handle(zone, String::New("= ( 9 , .")); 166 String& source = String::Handle(zone, String::New("= ( 9 , ."));
167 String& private_key = String::Handle(zone, String::New("")); 167 String& private_key = String::Handle(zone, String::New(""));
168 const TokenStream& token_stream = 168 const TokenStream& token_stream =
169 TokenStream::Handle(zone, TokenStream::New(source, private_key, false)); 169 TokenStream::Handle(zone, TokenStream::New(source, private_key, false));
170 TokenStream::Iterator iterator(zone, token_stream, TokenPosition::kMinSource); 170 TokenStream::Iterator iterator(zone, token_stream, TokenPosition::kMinSource);
171 iterator.Advance(); // Advance to '(' token. 171 iterator.Advance(); // Advance to '(' token.
172 EXPECT_EQ(Token::kLPAREN, iterator.CurrentTokenKind()); 172 EXPECT_EQ(Token::kLPAREN, iterator.CurrentTokenKind());
173 iterator.Advance(); 173 iterator.Advance();
174 iterator.Advance(); 174 iterator.Advance();
175 iterator.Advance(); // Advance to '.' token. 175 iterator.Advance(); // Advance to '.' token.
176 EXPECT_EQ(Token::kPERIOD, iterator.CurrentTokenKind()); 176 EXPECT_EQ(Token::kPERIOD, iterator.CurrentTokenKind());
177 iterator.Advance(); // Advance to end of stream. 177 iterator.Advance(); // Advance to end of stream.
178 EXPECT_EQ(Token::kEOS, iterator.CurrentTokenKind()); 178 EXPECT_EQ(Token::kEOS, iterator.CurrentTokenKind());
179 } 179 }
180 180
181 181
182 VM_TEST_CASE(GenerateExactSource) { 182 ISOLATE_UNIT_TEST_CASE(GenerateExactSource) {
183 // Verify the exact formatting of generated sources. 183 // Verify the exact formatting of generated sources.
184 const char* kScriptChars = 184 const char* kScriptChars =
185 "\n" 185 "\n"
186 "class A {\n" 186 "class A {\n"
187 " static bar() { return 42; }\n" 187 " static bar() { return 42; }\n"
188 " static fly() { return 5; }\n" 188 " static fly() { return 5; }\n"
189 " void catcher(x) {\n" 189 " void catcher(x) {\n"
190 " try {\n" 190 " try {\n"
191 " if (x is! List) {\n" 191 " if (x is! List) {\n"
192 " for (int i = 0; i < x; i++) {\n" 192 " for (int i = 0; i < x; i++) {\n"
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 EXPECT(!cls.IsNull()); 240 EXPECT(!cls.IsNull());
241 const TokenPosition end_token_pos = cls.ComputeEndTokenPos(); 241 const TokenPosition end_token_pos = cls.ComputeEndTokenPos();
242 const Script& scr = Script::Handle(cls.script()); 242 const Script& scr = Script::Handle(cls.script());
243 intptr_t line; 243 intptr_t line;
244 intptr_t col; 244 intptr_t col;
245 scr.GetTokenLocation(end_token_pos, &line, &col); 245 scr.GetTokenLocation(end_token_pos, &line, &col);
246 EXPECT(line == 10 && col == 1); 246 EXPECT(line == 10 && col == 1);
247 } 247 }
248 248
249 249
250 VM_TEST_CASE(InstanceClass) { 250 ISOLATE_UNIT_TEST_CASE(InstanceClass) {
251 // Allocate the class first. 251 // Allocate the class first.
252 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass")); 252 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass"));
253 Script& script = Script::Handle(); 253 Script& script = Script::Handle();
254 const Class& empty_class = 254 const Class& empty_class =
255 Class::Handle(CreateDummyClass(class_name, script)); 255 Class::Handle(CreateDummyClass(class_name, script));
256 256
257 // EmptyClass has no fields and no functions. 257 // EmptyClass has no fields and no functions.
258 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0); 258 EXPECT_EQ(Array::Handle(empty_class.fields()).Length(), 0);
259 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0); 259 EXPECT_EQ(Array::Handle(empty_class.functions()).Length(), 0);
260 260
(...skipping 25 matching lines...) Expand all
286 intptr_t header_size = sizeof(RawObject); 286 intptr_t header_size = sizeof(RawObject);
287 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment), 287 EXPECT_EQ(Utils::RoundUp((header_size + (1 * kWordSize)), kObjectAlignment),
288 one_field_class.instance_size()); 288 one_field_class.instance_size());
289 EXPECT_EQ(header_size, field.Offset()); 289 EXPECT_EQ(header_size, field.Offset());
290 EXPECT(!one_field_class.is_implemented()); 290 EXPECT(!one_field_class.is_implemented());
291 one_field_class.set_is_implemented(); 291 one_field_class.set_is_implemented();
292 EXPECT(one_field_class.is_implemented()); 292 EXPECT(one_field_class.is_implemented());
293 } 293 }
294 294
295 295
296 VM_TEST_CASE(Smi) { 296 ISOLATE_UNIT_TEST_CASE(Smi) {
297 const Smi& smi = Smi::Handle(Smi::New(5)); 297 const Smi& smi = Smi::Handle(Smi::New(5));
298 Object& smi_object = Object::Handle(smi.raw()); 298 Object& smi_object = Object::Handle(smi.raw());
299 EXPECT(smi.IsSmi()); 299 EXPECT(smi.IsSmi());
300 EXPECT(smi_object.IsSmi()); 300 EXPECT(smi_object.IsSmi());
301 EXPECT_EQ(5, smi.Value()); 301 EXPECT_EQ(5, smi.Value());
302 const Object& object = Object::Handle(); 302 const Object& object = Object::Handle();
303 EXPECT(!object.IsSmi()); 303 EXPECT(!object.IsSmi());
304 smi_object = Object::null(); 304 smi_object = Object::null();
305 EXPECT(!smi_object.IsSmi()); 305 EXPECT(!smi_object.IsSmi());
306 306
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 Bigint& big1 = Bigint::Handle(Bigint::NewFromCString("10000000000000000000")); 347 Bigint& big1 = Bigint::Handle(Bigint::NewFromCString("10000000000000000000"));
348 Bigint& big2 = 348 Bigint& big2 =
349 Bigint::Handle(Bigint::NewFromCString("-10000000000000000000")); 349 Bigint::Handle(Bigint::NewFromCString("-10000000000000000000"));
350 EXPECT_EQ(-1, a.CompareWith(big1)); 350 EXPECT_EQ(-1, a.CompareWith(big1));
351 EXPECT_EQ(1, a.CompareWith(big2)); 351 EXPECT_EQ(1, a.CompareWith(big2));
352 EXPECT_EQ(-1, c.CompareWith(big1)); 352 EXPECT_EQ(-1, c.CompareWith(big1));
353 EXPECT_EQ(1, c.CompareWith(big2)); 353 EXPECT_EQ(1, c.CompareWith(big2));
354 } 354 }
355 355
356 356
357 VM_TEST_CASE(StringCompareTo) { 357 ISOLATE_UNIT_TEST_CASE(StringCompareTo) {
358 const String& abcd = String::Handle(String::New("abcd")); 358 const String& abcd = String::Handle(String::New("abcd"));
359 const String& abce = String::Handle(String::New("abce")); 359 const String& abce = String::Handle(String::New("abce"));
360 EXPECT_EQ(0, abcd.CompareTo(abcd)); 360 EXPECT_EQ(0, abcd.CompareTo(abcd));
361 EXPECT_EQ(0, abce.CompareTo(abce)); 361 EXPECT_EQ(0, abce.CompareTo(abce));
362 EXPECT(abcd.CompareTo(abce) < 0); 362 EXPECT(abcd.CompareTo(abce) < 0);
363 EXPECT(abce.CompareTo(abcd) > 0); 363 EXPECT(abce.CompareTo(abcd) > 0);
364 364
365 const int kMonkeyLen = 4; 365 const int kMonkeyLen = 4;
366 const uint8_t monkey_utf8[kMonkeyLen] = {0xf0, 0x9f, 0x90, 0xb5}; 366 const uint8_t monkey_utf8[kMonkeyLen] = {0xf0, 0x9f, 0x90, 0xb5};
367 const String& monkey_face = 367 const String& monkey_face =
(...skipping 22 matching lines...) Expand all
390 EXPECT(abce.CompareTo(monkey_face) < 0); 390 EXPECT(abce.CompareTo(monkey_face) < 0);
391 EXPECT(abcd.CompareTo(domino) < 0); 391 EXPECT(abcd.CompareTo(domino) < 0);
392 EXPECT(abce.CompareTo(domino) < 0); 392 EXPECT(abce.CompareTo(domino) < 0);
393 EXPECT(domino.CompareTo(abcd) > 0); 393 EXPECT(domino.CompareTo(abcd) > 0);
394 EXPECT(domino.CompareTo(abcd) > 0); 394 EXPECT(domino.CompareTo(abcd) > 0);
395 EXPECT(monkey_face.CompareTo(abce) > 0); 395 EXPECT(monkey_face.CompareTo(abce) > 0);
396 EXPECT(monkey_face.CompareTo(abce) > 0); 396 EXPECT(monkey_face.CompareTo(abce) > 0);
397 } 397 }
398 398
399 399
400 VM_TEST_CASE(StringEncodeIRI) { 400 ISOLATE_UNIT_TEST_CASE(StringEncodeIRI) {
401 const char* kInput = 401 const char* kInput =
402 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart"; 402 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart";
403 const char* kOutput = 403 const char* kOutput =
404 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F" 404 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F"
405 "dart-repo%2Fdart%2Ftest.dart"; 405 "dart-repo%2Fdart%2Ftest.dart";
406 const String& input = String::Handle(String::New(kInput)); 406 const String& input = String::Handle(String::New(kInput));
407 const char* encoded = String::EncodeIRI(input); 407 const char* encoded = String::EncodeIRI(input);
408 EXPECT(strcmp(encoded, kOutput) == 0); 408 EXPECT(strcmp(encoded, kOutput) == 0);
409 } 409 }
410 410
411 411
412 VM_TEST_CASE(StringDecodeIRI) { 412 ISOLATE_UNIT_TEST_CASE(StringDecodeIRI) {
413 const char* kOutput = 413 const char* kOutput =
414 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart"; 414 "file:///usr/local/johnmccutchan/workspace/dart-repo/dart/test.dart";
415 const char* kInput = 415 const char* kInput =
416 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F" 416 "file%3A%2F%2F%2Fusr%2Flocal%2Fjohnmccutchan%2Fworkspace%2F"
417 "dart-repo%2Fdart%2Ftest.dart"; 417 "dart-repo%2Fdart%2Ftest.dart";
418 const String& input = String::Handle(String::New(kInput)); 418 const String& input = String::Handle(String::New(kInput));
419 const String& output = String::Handle(String::New(kOutput)); 419 const String& output = String::Handle(String::New(kOutput));
420 const String& decoded = String::Handle(String::DecodeIRI(input)); 420 const String& decoded = String::Handle(String::DecodeIRI(input));
421 EXPECT(output.Equals(decoded)); 421 EXPECT(output.Equals(decoded));
422 } 422 }
423 423
424 424
425 VM_TEST_CASE(StringDecodeIRIInvalid) { 425 ISOLATE_UNIT_TEST_CASE(StringDecodeIRIInvalid) {
426 String& input = String::Handle(); 426 String& input = String::Handle();
427 input = String::New("file%"); 427 input = String::New("file%");
428 String& decoded = String::Handle(); 428 String& decoded = String::Handle();
429 decoded = String::DecodeIRI(input); 429 decoded = String::DecodeIRI(input);
430 EXPECT(decoded.IsNull()); 430 EXPECT(decoded.IsNull());
431 input = String::New("file%3"); 431 input = String::New("file%3");
432 decoded = String::DecodeIRI(input); 432 decoded = String::DecodeIRI(input);
433 EXPECT(decoded.IsNull()); 433 EXPECT(decoded.IsNull());
434 input = String::New("file%3g"); 434 input = String::New("file%3g");
435 decoded = String::DecodeIRI(input); 435 decoded = String::DecodeIRI(input);
436 EXPECT(decoded.IsNull()); 436 EXPECT(decoded.IsNull());
437 } 437 }
438 438
439 439
440 VM_TEST_CASE(StringIRITwoByte) { 440 ISOLATE_UNIT_TEST_CASE(StringIRITwoByte) {
441 const intptr_t kInputLen = 3; 441 const intptr_t kInputLen = 3;
442 const uint16_t kInput[kInputLen] = {'x', '/', 256}; 442 const uint16_t kInput[kInputLen] = {'x', '/', 256};
443 const String& input = String::Handle(String::FromUTF16(kInput, kInputLen)); 443 const String& input = String::Handle(String::FromUTF16(kInput, kInputLen));
444 const intptr_t kOutputLen = 10; 444 const intptr_t kOutputLen = 10;
445 const uint16_t kOutput[kOutputLen] = {'x', '%', '2', 'F', '%', 445 const uint16_t kOutput[kOutputLen] = {'x', '%', '2', 'F', '%',
446 'C', '4', '%', '8', '0'}; 446 'C', '4', '%', '8', '0'};
447 const String& output = String::Handle(String::FromUTF16(kOutput, kOutputLen)); 447 const String& output = String::Handle(String::FromUTF16(kOutput, kOutputLen));
448 const String& encoded = String::Handle(String::New(String::EncodeIRI(input))); 448 const String& encoded = String::Handle(String::New(String::EncodeIRI(input)));
449 EXPECT(output.Equals(encoded)); 449 EXPECT(output.Equals(encoded));
450 const String& decoded = String::Handle(String::DecodeIRI(output)); 450 const String& decoded = String::Handle(String::DecodeIRI(output));
451 EXPECT(input.Equals(decoded)); 451 EXPECT(input.Equals(decoded));
452 } 452 }
453 453
454 454
455 VM_TEST_CASE(Mint) { 455 ISOLATE_UNIT_TEST_CASE(Mint) {
456 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot 456 // On 64-bit architectures a Smi is stored in a 64 bit word. A Midint cannot
457 // be allocated if it does fit into a Smi. 457 // be allocated if it does fit into a Smi.
458 #if !defined(ARCH_IS_64_BIT) 458 #if !defined(ARCH_IS_64_BIT)
459 { 459 {
460 Mint& med = Mint::Handle(); 460 Mint& med = Mint::Handle();
461 EXPECT(med.IsNull()); 461 EXPECT(med.IsNull());
462 int64_t v = DART_2PART_UINT64_C(1, 0); 462 int64_t v = DART_2PART_UINT64_C(1, 0);
463 med ^= Integer::New(v); 463 med ^= Integer::New(v);
464 EXPECT_EQ(v, med.value()); 464 EXPECT_EQ(v, med.value());
465 const String& smi_str = String::Handle(String::New("1")); 465 const String& smi_str = String::Handle(String::New("1"));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 mint1 ^= Integer::NewCanonical(mint_string); 519 mint1 ^= Integer::NewCanonical(mint_string);
520 Mint& mint2 = Mint::Handle(); 520 Mint& mint2 = Mint::Handle();
521 mint2 ^= Integer::NewCanonical(mint_string); 521 mint2 ^= Integer::NewCanonical(mint_string);
522 EXPECT_EQ(mint1.value(), mint_value); 522 EXPECT_EQ(mint1.value(), mint_value);
523 EXPECT_EQ(mint2.value(), mint_value); 523 EXPECT_EQ(mint2.value(), mint_value);
524 EXPECT_EQ(mint1.raw(), mint2.raw()); 524 EXPECT_EQ(mint1.raw(), mint2.raw());
525 #endif 525 #endif
526 } 526 }
527 527
528 528
529 VM_TEST_CASE(Double) { 529 ISOLATE_UNIT_TEST_CASE(Double) {
530 { 530 {
531 const double dbl_const = 5.0; 531 const double dbl_const = 5.0;
532 const Double& dbl = Double::Handle(Double::New(dbl_const)); 532 const Double& dbl = Double::Handle(Double::New(dbl_const));
533 Object& dbl_object = Object::Handle(dbl.raw()); 533 Object& dbl_object = Object::Handle(dbl.raw());
534 EXPECT(dbl.IsDouble()); 534 EXPECT(dbl.IsDouble());
535 EXPECT(dbl_object.IsDouble()); 535 EXPECT(dbl_object.IsDouble());
536 EXPECT_EQ(dbl_const, dbl.value()); 536 EXPECT_EQ(dbl_const, dbl.value());
537 } 537 }
538 538
539 { 539 {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 EXPECT_EQ(2.0, dbl1.value()); 603 EXPECT_EQ(2.0, dbl1.value());
604 604
605 // Disallow legacy form. 605 // Disallow legacy form.
606 const String& dbl_str2 = String::Handle(String::New("2.0d")); 606 const String& dbl_str2 = String::Handle(String::New("2.0d"));
607 const Double& dbl2 = Double::Handle(Double::New(dbl_str2)); 607 const Double& dbl2 = Double::Handle(Double::New(dbl_str2));
608 EXPECT(dbl2.IsNull()); 608 EXPECT(dbl2.IsNull());
609 } 609 }
610 } 610 }
611 611
612 612
613 VM_TEST_CASE(Bigint) { 613 ISOLATE_UNIT_TEST_CASE(Bigint) {
614 Bigint& b = Bigint::Handle(); 614 Bigint& b = Bigint::Handle();
615 EXPECT(b.IsNull()); 615 EXPECT(b.IsNull());
616 const char* cstr = "18446744073709551615000"; 616 const char* cstr = "18446744073709551615000";
617 const String& test = String::Handle(String::New(cstr)); 617 const String& test = String::Handle(String::New(cstr));
618 b ^= Integer::NewCanonical(test); 618 b ^= Integer::NewCanonical(test);
619 const char* str = b.ToCString(); 619 const char* str = b.ToCString();
620 EXPECT_STREQ(cstr, str); 620 EXPECT_STREQ(cstr, str);
621 621
622 int64_t t64 = DART_2PART_UINT64_C(1, 0); 622 int64_t t64 = DART_2PART_UINT64_C(1, 0);
623 Bigint& big = Bigint::Handle(Bigint::NewFromInt64(t64)); 623 Bigint& big = Bigint::Handle(Bigint::NewFromInt64(t64));
(...skipping 18 matching lines...) Expand all
642 Smi& smi2 = Smi::Handle(Smi::New(-2)); 642 Smi& smi2 = Smi::Handle(Smi::New(-2));
643 643
644 EXPECT_EQ(-1, smi1.CompareWith(big1)); 644 EXPECT_EQ(-1, smi1.CompareWith(big1));
645 EXPECT_EQ(-1, smi2.CompareWith(big1)); 645 EXPECT_EQ(-1, smi2.CompareWith(big1));
646 646
647 EXPECT_EQ(1, smi1.CompareWith(big3)); 647 EXPECT_EQ(1, smi1.CompareWith(big3));
648 EXPECT_EQ(1, smi2.CompareWith(big3)); 648 EXPECT_EQ(1, smi2.CompareWith(big3));
649 } 649 }
650 650
651 651
652 VM_TEST_CASE(Integer) { 652 ISOLATE_UNIT_TEST_CASE(Integer) {
653 Integer& i = Integer::Handle(); 653 Integer& i = Integer::Handle();
654 i = Integer::NewCanonical(String::Handle(String::New("12"))); 654 i = Integer::NewCanonical(String::Handle(String::New("12")));
655 EXPECT(i.IsSmi()); 655 EXPECT(i.IsSmi());
656 i = Integer::NewCanonical(String::Handle(String::New("-120"))); 656 i = Integer::NewCanonical(String::Handle(String::New("-120")));
657 EXPECT(i.IsSmi()); 657 EXPECT(i.IsSmi());
658 i = Integer::NewCanonical(String::Handle(String::New("0"))); 658 i = Integer::NewCanonical(String::Handle(String::New("0")));
659 EXPECT(i.IsSmi()); 659 EXPECT(i.IsSmi());
660 i = Integer::NewCanonical( 660 i = Integer::NewCanonical(
661 String::Handle(String::New("12345678901234567890"))); 661 String::Handle(String::New("12345678901234567890")));
662 EXPECT(i.IsBigint()); 662 EXPECT(i.IsBigint());
663 i = Integer::NewCanonical( 663 i = Integer::NewCanonical(
664 String::Handle(String::New("-12345678901234567890111222"))); 664 String::Handle(String::New("-12345678901234567890111222")));
665 EXPECT(i.IsBigint()); 665 EXPECT(i.IsBigint());
666 } 666 }
667 667
668 668
669 VM_TEST_CASE(String) { 669 ISOLATE_UNIT_TEST_CASE(String) {
670 const char* kHello = "Hello World!"; 670 const char* kHello = "Hello World!";
671 int32_t hello_len = strlen(kHello); 671 int32_t hello_len = strlen(kHello);
672 const String& str = String::Handle(String::New(kHello)); 672 const String& str = String::Handle(String::New(kHello));
673 EXPECT(str.IsInstance()); 673 EXPECT(str.IsInstance());
674 EXPECT(str.IsString()); 674 EXPECT(str.IsString());
675 EXPECT(str.IsOneByteString()); 675 EXPECT(str.IsOneByteString());
676 EXPECT(!str.IsTwoByteString()); 676 EXPECT(!str.IsTwoByteString());
677 EXPECT(!str.IsNumber()); 677 EXPECT(!str.IsNumber());
678 EXPECT_EQ(hello_len, str.Length()); 678 EXPECT_EQ(hello_len, str.Length());
679 EXPECT_EQ('H', str.CharAt(0)); 679 EXPECT_EQ('H', str.CharAt(0));
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 const String& str16 = String::Handle(String::FromUTF32(char32, 3)); 806 const String& str16 = String::Handle(String::FromUTF32(char32, 3));
807 EXPECT(!str16.IsOneByteString()); 807 EXPECT(!str16.IsOneByteString());
808 EXPECT(str16.IsTwoByteString()); 808 EXPECT(str16.IsTwoByteString());
809 EXPECT_EQ(0x0000, str16.CharAt(0)); 809 EXPECT_EQ(0x0000, str16.CharAt(0));
810 EXPECT_EQ(0x7FFF, str16.CharAt(1)); 810 EXPECT_EQ(0x7FFF, str16.CharAt(1));
811 EXPECT_EQ(0xFFFF, str16.CharAt(2)); 811 EXPECT_EQ(0xFFFF, str16.CharAt(2));
812 } 812 }
813 } 813 }
814 814
815 815
816 VM_TEST_CASE(StringFormat) { 816 ISOLATE_UNIT_TEST_CASE(StringFormat) {
817 const char* hello_str = "Hello World!"; 817 const char* hello_str = "Hello World!";
818 const String& str = 818 const String& str =
819 String::Handle(String::NewFormatted("Hello %s!", "World")); 819 String::Handle(String::NewFormatted("Hello %s!", "World"));
820 EXPECT(str.IsInstance()); 820 EXPECT(str.IsInstance());
821 EXPECT(str.IsString()); 821 EXPECT(str.IsString());
822 EXPECT(str.IsOneByteString()); 822 EXPECT(str.IsOneByteString());
823 EXPECT(!str.IsTwoByteString()); 823 EXPECT(!str.IsTwoByteString());
824 EXPECT(!str.IsNumber()); 824 EXPECT(!str.IsNumber());
825 EXPECT(str.Equals(hello_str)); 825 EXPECT(str.Equals(hello_str));
826 } 826 }
827 827
828 828
829 VM_TEST_CASE(StringConcat) { 829 ISOLATE_UNIT_TEST_CASE(StringConcat) {
830 // Create strings from concatenated 1-byte empty strings. 830 // Create strings from concatenated 1-byte empty strings.
831 { 831 {
832 const String& empty1 = String::Handle(String::New("")); 832 const String& empty1 = String::Handle(String::New(""));
833 EXPECT(empty1.IsOneByteString()); 833 EXPECT(empty1.IsOneByteString());
834 EXPECT_EQ(0, empty1.Length()); 834 EXPECT_EQ(0, empty1.Length());
835 835
836 const String& empty2 = String::Handle(String::New("")); 836 const String& empty2 = String::Handle(String::New(""));
837 EXPECT(empty2.IsOneByteString()); 837 EXPECT(empty2.IsOneByteString());
838 EXPECT_EQ(0, empty2.Length()); 838 EXPECT_EQ(0, empty2.Length());
839 839
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
1350 EXPECT_EQ(twostr.Length() * 2 + onestr.Length(), two_one_two_str.Length()); 1350 EXPECT_EQ(twostr.Length() * 2 + onestr.Length(), two_one_two_str.Length());
1351 uint16_t two_one_two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9, 'o', 1351 uint16_t two_one_two[] = {0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9, 'o',
1352 'n', 'e', ' ', 'b', 'y', 't', 1352 'n', 'e', ' ', 'b', 'y', 't',
1353 'e', 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9}; 1353 'e', 0x05E6, 0x05D5, 0x05D5, 0x05D9, 0x05D9};
1354 intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]); 1354 intptr_t two_one_two_len = sizeof(two_one_two) / sizeof(two_one_two[0]);
1355 EXPECT(two_one_two_str.Equals(two_one_two, two_one_two_len)); 1355 EXPECT(two_one_two_str.Equals(two_one_two, two_one_two_len));
1356 } 1356 }
1357 } 1357 }
1358 1358
1359 1359
1360 VM_TEST_CASE(StringHashConcat) { 1360 ISOLATE_UNIT_TEST_CASE(StringHashConcat) {
1361 EXPECT_EQ(String::Handle(String::New("onebyte")).Hash(), 1361 EXPECT_EQ(String::Handle(String::New("onebyte")).Hash(),
1362 String::HashConcat(String::Handle(String::New("one")), 1362 String::HashConcat(String::Handle(String::New("one")),
1363 String::Handle(String::New("byte")))); 1363 String::Handle(String::New("byte"))));
1364 uint16_t clef_utf16[] = {0xD834, 0xDD1E}; 1364 uint16_t clef_utf16[] = {0xD834, 0xDD1E};
1365 const String& clef = String::Handle(String::FromUTF16(clef_utf16, 2)); 1365 const String& clef = String::Handle(String::FromUTF16(clef_utf16, 2));
1366 int32_t clef_utf32[] = {0x1D11E}; 1366 int32_t clef_utf32[] = {0x1D11E};
1367 EXPECT(clef.Equals(clef_utf32, 1)); 1367 EXPECT(clef.Equals(clef_utf32, 1));
1368 intptr_t hash32 = String::Hash(clef_utf32, 1); 1368 intptr_t hash32 = String::Hash(clef_utf32, 1);
1369 EXPECT_EQ(hash32, clef.Hash()); 1369 EXPECT_EQ(hash32, clef.Hash());
1370 EXPECT_EQ(hash32, String::HashConcat( 1370 EXPECT_EQ(hash32, String::HashConcat(
1371 String::Handle(String::FromUTF16(clef_utf16, 1)), 1371 String::Handle(String::FromUTF16(clef_utf16, 1)),
1372 String::Handle(String::FromUTF16(clef_utf16 + 1, 1)))); 1372 String::Handle(String::FromUTF16(clef_utf16 + 1, 1))));
1373 } 1373 }
1374 1374
1375 1375
1376 VM_TEST_CASE(StringSubStringDifferentWidth) { 1376 ISOLATE_UNIT_TEST_CASE(StringSubStringDifferentWidth) {
1377 // Create 1-byte substring from a 1-byte source string. 1377 // Create 1-byte substring from a 1-byte source string.
1378 const char* onechars = "\xC3\xB6\xC3\xB1\xC3\xA9"; 1378 const char* onechars = "\xC3\xB6\xC3\xB1\xC3\xA9";
1379 1379
1380 const String& onestr = String::Handle(String::New(onechars)); 1380 const String& onestr = String::Handle(String::New(onechars));
1381 EXPECT(!onestr.IsNull()); 1381 EXPECT(!onestr.IsNull());
1382 EXPECT(onestr.IsOneByteString()); 1382 EXPECT(onestr.IsOneByteString());
1383 EXPECT(!onestr.IsTwoByteString()); 1383 EXPECT(!onestr.IsTwoByteString());
1384 1384
1385 const String& onesub = String::Handle(String::SubString(onestr, 0)); 1385 const String& onesub = String::Handle(String::SubString(onestr, 0));
1386 EXPECT(!onesub.IsNull()); 1386 EXPECT(!onesub.IsNull());
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1427 EXPECT(foursub2.IsTwoByteString()); 1427 EXPECT(foursub2.IsTwoByteString());
1428 EXPECT_EQ(foursub2.Length(), 3); 1428 EXPECT_EQ(foursub2.Length(), 3);
1429 1429
1430 const String& foursub4 = String::Handle(String::SubString(fourstr, 6)); 1430 const String& foursub4 = String::Handle(String::SubString(fourstr, 6));
1431 EXPECT_EQ(foursub4.Length(), 8); 1431 EXPECT_EQ(foursub4.Length(), 8);
1432 EXPECT(!foursub4.IsNull()); 1432 EXPECT(!foursub4.IsNull());
1433 EXPECT(foursub4.IsTwoByteString()); 1433 EXPECT(foursub4.IsTwoByteString());
1434 } 1434 }
1435 1435
1436 1436
1437 VM_TEST_CASE(StringFromUtf8Literal) { 1437 ISOLATE_UNIT_TEST_CASE(StringFromUtf8Literal) {
1438 // Create a 1-byte string from a UTF-8 encoded string literal. 1438 // Create a 1-byte string from a UTF-8 encoded string literal.
1439 { 1439 {
1440 const char* src = 1440 const char* src =
1441 "\xC2\xA0\xC2\xA1\xC2\xA2\xC2\xA3" 1441 "\xC2\xA0\xC2\xA1\xC2\xA2\xC2\xA3"
1442 "\xC2\xA4\xC2\xA5\xC2\xA6\xC2\xA7" 1442 "\xC2\xA4\xC2\xA5\xC2\xA6\xC2\xA7"
1443 "\xC2\xA8\xC2\xA9\xC2\xAA\xC2\xAB" 1443 "\xC2\xA8\xC2\xA9\xC2\xAA\xC2\xAB"
1444 "\xC2\xAC\xC2\xAD\xC2\xAE\xC2\xAF" 1444 "\xC2\xAC\xC2\xAD\xC2\xAE\xC2\xAF"
1445 "\xC2\xB0\xC2\xB1\xC2\xB2\xC2\xB3" 1445 "\xC2\xB0\xC2\xB1\xC2\xB2\xC2\xB3"
1446 "\xC2\xB4\xC2\xB5\xC2\xB6\xC2\xB7" 1446 "\xC2\xB4\xC2\xB5\xC2\xB6\xC2\xB7"
1447 "\xC2\xB8\xC2\xB9\xC2\xBA\xC2\xBB" 1447 "\xC2\xB8\xC2\xB9\xC2\xBA\xC2\xBB"
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1587 EXPECT(str.IsTwoByteString()); 1587 EXPECT(str.IsTwoByteString());
1588 intptr_t expected_size = sizeof(expected) / sizeof(expected[0]); 1588 intptr_t expected_size = sizeof(expected) / sizeof(expected[0]);
1589 EXPECT_EQ(expected_size, str.Length()); 1589 EXPECT_EQ(expected_size, str.Length());
1590 for (int i = 0; i < str.Length(); ++i) { 1590 for (int i = 0; i < str.Length(); ++i) {
1591 EXPECT_EQ(expected[i], str.CharAt(i)); 1591 EXPECT_EQ(expected[i], str.CharAt(i));
1592 } 1592 }
1593 } 1593 }
1594 } 1594 }
1595 1595
1596 1596
1597 VM_TEST_CASE(StringEqualsUtf8) { 1597 ISOLATE_UNIT_TEST_CASE(StringEqualsUtf8) {
1598 const char* onesrc = "abc"; 1598 const char* onesrc = "abc";
1599 const String& onestr = String::Handle(String::New(onesrc)); 1599 const String& onestr = String::Handle(String::New(onesrc));
1600 EXPECT(onestr.IsOneByteString()); 1600 EXPECT(onestr.IsOneByteString());
1601 EXPECT(!onestr.Equals("")); 1601 EXPECT(!onestr.Equals(""));
1602 EXPECT(!onestr.Equals("a")); 1602 EXPECT(!onestr.Equals("a"));
1603 EXPECT(!onestr.Equals("ab")); 1603 EXPECT(!onestr.Equals("ab"));
1604 EXPECT(onestr.Equals("abc")); 1604 EXPECT(onestr.Equals("abc"));
1605 EXPECT(!onestr.Equals("abcd")); 1605 EXPECT(!onestr.Equals("abcd"));
1606 1606
1607 const char* twosrc = "\xD7\x90\xD7\x91\xD7\x92"; 1607 const char* twosrc = "\xD7\x90\xD7\x91\xD7\x92";
(...skipping 11 matching lines...) Expand all
1619 EXPECT(!fourstr.Equals("")); 1619 EXPECT(!fourstr.Equals(""));
1620 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0")); 1620 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0"));
1621 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1")); 1621 EXPECT(!fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"));
1622 EXPECT(fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1\xF0\x90\x8E\xA2")); 1622 EXPECT(fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1\xF0\x90\x8E\xA2"));
1623 EXPECT( 1623 EXPECT(
1624 !fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1" 1624 !fourstr.Equals("\xF0\x90\x8E\xA0\xF0\x90\x8E\xA1"
1625 "\xF0\x90\x8E\xA2\xF0\x90\x8E\xA3")); 1625 "\xF0\x90\x8E\xA2\xF0\x90\x8E\xA3"));
1626 } 1626 }
1627 1627
1628 1628
1629 VM_TEST_CASE(StringEqualsUTF32) { 1629 ISOLATE_UNIT_TEST_CASE(StringEqualsUTF32) {
1630 const String& empty = String::Handle(String::New("")); 1630 const String& empty = String::Handle(String::New(""));
1631 const String& t_str = String::Handle(String::New("t")); 1631 const String& t_str = String::Handle(String::New("t"));
1632 const String& th_str = String::Handle(String::New("th")); 1632 const String& th_str = String::Handle(String::New("th"));
1633 const int32_t chars[] = {'t', 'h', 'i', 's'}; 1633 const int32_t chars[] = {'t', 'h', 'i', 's'};
1634 EXPECT(!empty.Equals(chars, -1)); 1634 EXPECT(!empty.Equals(chars, -1));
1635 EXPECT(empty.Equals(chars, 0)); 1635 EXPECT(empty.Equals(chars, 0));
1636 EXPECT(!empty.Equals(chars, 1)); 1636 EXPECT(!empty.Equals(chars, 1));
1637 EXPECT(!t_str.Equals(chars, 0)); 1637 EXPECT(!t_str.Equals(chars, 0));
1638 EXPECT(t_str.Equals(chars, 1)); 1638 EXPECT(t_str.Equals(chars, 1));
1639 EXPECT(!t_str.Equals(chars, 2)); 1639 EXPECT(!t_str.Equals(chars, 2));
1640 EXPECT(!th_str.Equals(chars, 1)); 1640 EXPECT(!th_str.Equals(chars, 1));
1641 EXPECT(th_str.Equals(chars, 2)); 1641 EXPECT(th_str.Equals(chars, 2));
1642 EXPECT(!th_str.Equals(chars, 3)); 1642 EXPECT(!th_str.Equals(chars, 3));
1643 } 1643 }
1644 1644
1645 1645
1646 VM_TEST_CASE(ExternalOneByteString) { 1646 ISOLATE_UNIT_TEST_CASE(ExternalOneByteString) {
1647 uint8_t characters[] = {0xF6, 0xF1, 0xE9}; 1647 uint8_t characters[] = {0xF6, 0xF1, 0xE9};
1648 intptr_t len = ARRAY_SIZE(characters); 1648 intptr_t len = ARRAY_SIZE(characters);
1649 1649
1650 const String& str = String::Handle( 1650 const String& str = String::Handle(
1651 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1651 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
1652 EXPECT(!str.IsOneByteString()); 1652 EXPECT(!str.IsOneByteString());
1653 EXPECT(str.IsExternalOneByteString()); 1653 EXPECT(str.IsExternalOneByteString());
1654 EXPECT_EQ(str.Length(), len); 1654 EXPECT_EQ(str.Length(), len);
1655 EXPECT(str.Equals("\xC3\xB6\xC3\xB1\xC3\xA9")); 1655 EXPECT(str.Equals("\xC3\xB6\xC3\xB1\xC3\xA9"));
1656 1656
(...skipping 10 matching lines...) Expand all
1667 EXPECT(concat.Equals("\xC3\xB6\xC3\xB1\xC3\xA9\xC3\xB6\xC3\xB1\xC3\xA9")); 1667 EXPECT(concat.Equals("\xC3\xB6\xC3\xB1\xC3\xA9\xC3\xB6\xC3\xB1\xC3\xA9"));
1668 1668
1669 const String& substr = String::Handle(String::SubString(str, 1, 1)); 1669 const String& substr = String::Handle(String::SubString(str, 1, 1));
1670 EXPECT(!substr.IsExternalOneByteString()); 1670 EXPECT(!substr.IsExternalOneByteString());
1671 EXPECT(substr.IsOneByteString()); 1671 EXPECT(substr.IsOneByteString());
1672 EXPECT_EQ(1, substr.Length()); 1672 EXPECT_EQ(1, substr.Length());
1673 EXPECT(substr.Equals("\xC3\xB1")); 1673 EXPECT(substr.Equals("\xC3\xB1"));
1674 } 1674 }
1675 1675
1676 1676
1677 VM_TEST_CASE(EscapeSpecialCharactersOneByteString) { 1677 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersOneByteString) {
1678 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t', 1678 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t',
1679 '\v', '\r', '\\', '$', 'z'}; 1679 '\v', '\r', '\\', '$', 'z'};
1680 intptr_t len = ARRAY_SIZE(characters); 1680 intptr_t len = ARRAY_SIZE(characters);
1681 1681
1682 const String& str = 1682 const String& str =
1683 String::Handle(OneByteString::New(characters, len, Heap::kNew)); 1683 String::Handle(OneByteString::New(characters, len, Heap::kNew));
1684 EXPECT(str.IsOneByteString()); 1684 EXPECT(str.IsOneByteString());
1685 EXPECT_EQ(str.Length(), len); 1685 EXPECT_EQ(str.Length(), len);
1686 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z")); 1686 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
1687 const String& escaped_str = 1687 const String& escaped_str =
1688 String::Handle(String::EscapeSpecialCharacters(str)); 1688 String::Handle(String::EscapeSpecialCharacters(str));
1689 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z")); 1689 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
1690 1690
1691 const String& escaped_empty_str = 1691 const String& escaped_empty_str =
1692 String::Handle(String::EscapeSpecialCharacters(Symbols::Empty())); 1692 String::Handle(String::EscapeSpecialCharacters(Symbols::Empty()));
1693 EXPECT_EQ(escaped_empty_str.Length(), 0); 1693 EXPECT_EQ(escaped_empty_str.Length(), 0);
1694 } 1694 }
1695 1695
1696 1696
1697 VM_TEST_CASE(EscapeSpecialCharactersExternalOneByteString) { 1697 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersExternalOneByteString) {
1698 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t', 1698 uint8_t characters[] = {'a', '\n', '\f', '\b', '\t',
1699 '\v', '\r', '\\', '$', 'z'}; 1699 '\v', '\r', '\\', '$', 'z'};
1700 intptr_t len = ARRAY_SIZE(characters); 1700 intptr_t len = ARRAY_SIZE(characters);
1701 1701
1702 const String& str = String::Handle( 1702 const String& str = String::Handle(
1703 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1703 ExternalOneByteString::New(characters, len, NULL, NULL, Heap::kNew));
1704 EXPECT(!str.IsOneByteString()); 1704 EXPECT(!str.IsOneByteString());
1705 EXPECT(str.IsExternalOneByteString()); 1705 EXPECT(str.IsExternalOneByteString());
1706 EXPECT_EQ(str.Length(), len); 1706 EXPECT_EQ(str.Length(), len);
1707 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z")); 1707 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
1708 const String& escaped_str = 1708 const String& escaped_str =
1709 String::Handle(String::EscapeSpecialCharacters(str)); 1709 String::Handle(String::EscapeSpecialCharacters(str));
1710 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z")); 1710 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
1711 1711
1712 const String& empty_str = String::Handle( 1712 const String& empty_str = String::Handle(
1713 ExternalOneByteString::New(characters, 0, NULL, NULL, Heap::kNew)); 1713 ExternalOneByteString::New(characters, 0, NULL, NULL, Heap::kNew));
1714 const String& escaped_empty_str = 1714 const String& escaped_empty_str =
1715 String::Handle(String::EscapeSpecialCharacters(empty_str)); 1715 String::Handle(String::EscapeSpecialCharacters(empty_str));
1716 EXPECT_EQ(empty_str.Length(), 0); 1716 EXPECT_EQ(empty_str.Length(), 0);
1717 EXPECT_EQ(escaped_empty_str.Length(), 0); 1717 EXPECT_EQ(escaped_empty_str.Length(), 0);
1718 } 1718 }
1719 1719
1720 VM_TEST_CASE(EscapeSpecialCharactersTwoByteString) { 1720 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersTwoByteString) {
1721 uint16_t characters[] = {'a', '\n', '\f', '\b', '\t', 1721 uint16_t characters[] = {'a', '\n', '\f', '\b', '\t',
1722 '\v', '\r', '\\', '$', 'z'}; 1722 '\v', '\r', '\\', '$', 'z'};
1723 intptr_t len = ARRAY_SIZE(characters); 1723 intptr_t len = ARRAY_SIZE(characters);
1724 1724
1725 const String& str = 1725 const String& str =
1726 String::Handle(TwoByteString::New(characters, len, Heap::kNew)); 1726 String::Handle(TwoByteString::New(characters, len, Heap::kNew));
1727 EXPECT(str.IsTwoByteString()); 1727 EXPECT(str.IsTwoByteString());
1728 EXPECT_EQ(str.Length(), len); 1728 EXPECT_EQ(str.Length(), len);
1729 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z")); 1729 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
1730 const String& escaped_str = 1730 const String& escaped_str =
1731 String::Handle(String::EscapeSpecialCharacters(str)); 1731 String::Handle(String::EscapeSpecialCharacters(str));
1732 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z")); 1732 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
1733 1733
1734 const String& empty_str = 1734 const String& empty_str =
1735 String::Handle(TwoByteString::New(static_cast<intptr_t>(0), Heap::kNew)); 1735 String::Handle(TwoByteString::New(static_cast<intptr_t>(0), Heap::kNew));
1736 const String& escaped_empty_str = 1736 const String& escaped_empty_str =
1737 String::Handle(String::EscapeSpecialCharacters(empty_str)); 1737 String::Handle(String::EscapeSpecialCharacters(empty_str));
1738 EXPECT_EQ(empty_str.Length(), 0); 1738 EXPECT_EQ(empty_str.Length(), 0);
1739 EXPECT_EQ(escaped_empty_str.Length(), 0); 1739 EXPECT_EQ(escaped_empty_str.Length(), 0);
1740 } 1740 }
1741 1741
1742 1742
1743 VM_TEST_CASE(EscapeSpecialCharactersExternalTwoByteString) { 1743 ISOLATE_UNIT_TEST_CASE(EscapeSpecialCharactersExternalTwoByteString) {
1744 uint16_t characters[] = {'a', '\n', '\f', '\b', '\t', 1744 uint16_t characters[] = {'a', '\n', '\f', '\b', '\t',
1745 '\v', '\r', '\\', '$', 'z'}; 1745 '\v', '\r', '\\', '$', 'z'};
1746 intptr_t len = ARRAY_SIZE(characters); 1746 intptr_t len = ARRAY_SIZE(characters);
1747 1747
1748 const String& str = String::Handle( 1748 const String& str = String::Handle(
1749 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1749 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
1750 EXPECT(str.IsExternalTwoByteString()); 1750 EXPECT(str.IsExternalTwoByteString());
1751 EXPECT_EQ(str.Length(), len); 1751 EXPECT_EQ(str.Length(), len);
1752 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z")); 1752 EXPECT(str.Equals("a\n\f\b\t\v\r\\$z"));
1753 const String& escaped_str = 1753 const String& escaped_str =
1754 String::Handle(String::EscapeSpecialCharacters(str)); 1754 String::Handle(String::EscapeSpecialCharacters(str));
1755 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z")); 1755 EXPECT(escaped_str.Equals("a\\n\\f\\b\\t\\v\\r\\\\\\$z"));
1756 1756
1757 const String& empty_str = String::Handle( 1757 const String& empty_str = String::Handle(
1758 ExternalTwoByteString::New(characters, 0, NULL, NULL, Heap::kNew)); 1758 ExternalTwoByteString::New(characters, 0, NULL, NULL, Heap::kNew));
1759 const String& escaped_empty_str = 1759 const String& escaped_empty_str =
1760 String::Handle(String::EscapeSpecialCharacters(empty_str)); 1760 String::Handle(String::EscapeSpecialCharacters(empty_str));
1761 EXPECT_EQ(empty_str.Length(), 0); 1761 EXPECT_EQ(empty_str.Length(), 0);
1762 EXPECT_EQ(escaped_empty_str.Length(), 0); 1762 EXPECT_EQ(escaped_empty_str.Length(), 0);
1763 } 1763 }
1764 1764
1765 1765
1766 VM_TEST_CASE(ExternalTwoByteString) { 1766 ISOLATE_UNIT_TEST_CASE(ExternalTwoByteString) {
1767 uint16_t characters[] = {0x1E6B, 0x1E85, 0x1E53}; 1767 uint16_t characters[] = {0x1E6B, 0x1E85, 0x1E53};
1768 intptr_t len = ARRAY_SIZE(characters); 1768 intptr_t len = ARRAY_SIZE(characters);
1769 1769
1770 const String& str = String::Handle( 1770 const String& str = String::Handle(
1771 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew)); 1771 ExternalTwoByteString::New(characters, len, NULL, NULL, Heap::kNew));
1772 EXPECT(!str.IsTwoByteString()); 1772 EXPECT(!str.IsTwoByteString());
1773 EXPECT(str.IsExternalTwoByteString()); 1773 EXPECT(str.IsExternalTwoByteString());
1774 EXPECT_EQ(str.Length(), len); 1774 EXPECT_EQ(str.Length(), len);
1775 EXPECT(str.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93")); 1775 EXPECT(str.Equals("\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"));
1776 1776
(...skipping 12 matching lines...) Expand all
1789 "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93")); 1789 "\xE1\xB9\xAB\xE1\xBA\x85\xE1\xB9\x93"));
1790 1790
1791 const String& substr = String::Handle(String::SubString(str, 1, 1)); 1791 const String& substr = String::Handle(String::SubString(str, 1, 1));
1792 EXPECT(!substr.IsExternalTwoByteString()); 1792 EXPECT(!substr.IsExternalTwoByteString());
1793 EXPECT(substr.IsTwoByteString()); 1793 EXPECT(substr.IsTwoByteString());
1794 EXPECT_EQ(1, substr.Length()); 1794 EXPECT_EQ(1, substr.Length());
1795 EXPECT(substr.Equals("\xE1\xBA\x85")); 1795 EXPECT(substr.Equals("\xE1\xBA\x85"));
1796 } 1796 }
1797 1797
1798 1798
1799 VM_TEST_CASE(Symbol) { 1799 ISOLATE_UNIT_TEST_CASE(Symbol) {
1800 const String& one = String::Handle(Symbols::New(thread, "Eins")); 1800 const String& one = String::Handle(Symbols::New(thread, "Eins"));
1801 EXPECT(one.IsSymbol()); 1801 EXPECT(one.IsSymbol());
1802 const String& two = String::Handle(Symbols::New(thread, "Zwei")); 1802 const String& two = String::Handle(Symbols::New(thread, "Zwei"));
1803 const String& three = String::Handle(Symbols::New(thread, "Drei")); 1803 const String& three = String::Handle(Symbols::New(thread, "Drei"));
1804 const String& four = String::Handle(Symbols::New(thread, "Vier")); 1804 const String& four = String::Handle(Symbols::New(thread, "Vier"));
1805 const String& five = String::Handle(Symbols::New(thread, "Fuenf")); 1805 const String& five = String::Handle(Symbols::New(thread, "Fuenf"));
1806 const String& six = String::Handle(Symbols::New(thread, "Sechs")); 1806 const String& six = String::Handle(Symbols::New(thread, "Sechs"));
1807 const String& seven = String::Handle(Symbols::New(thread, "Sieben")); 1807 const String& seven = String::Handle(Symbols::New(thread, "Sieben"));
1808 const String& eight = String::Handle(Symbols::New(thread, "Acht")); 1808 const String& eight = String::Handle(Symbols::New(thread, "Acht"));
1809 const String& nine = String::Handle(Symbols::New(thread, "Neun")); 1809 const String& nine = String::Handle(Symbols::New(thread, "Neun"));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1851 String& elf1 = String::Handle(Symbols::FromUTF16(thread, char16, 3)); 1851 String& elf1 = String::Handle(Symbols::FromUTF16(thread, char16, 3));
1852 int32_t char32[] = {'E', 'l', 'f'}; 1852 int32_t char32[] = {'E', 'l', 'f'};
1853 String& elf2 = String::Handle(Symbols::FromUTF32(thread, char32, 3)); 1853 String& elf2 = String::Handle(Symbols::FromUTF32(thread, char32, 3));
1854 EXPECT(elf1.IsSymbol()); 1854 EXPECT(elf1.IsSymbol());
1855 EXPECT(elf2.IsSymbol()); 1855 EXPECT(elf2.IsSymbol());
1856 EXPECT_EQ(elf1.raw(), Symbols::New(thread, "Elf")); 1856 EXPECT_EQ(elf1.raw(), Symbols::New(thread, "Elf"));
1857 EXPECT_EQ(elf2.raw(), Symbols::New(thread, "Elf")); 1857 EXPECT_EQ(elf2.raw(), Symbols::New(thread, "Elf"));
1858 } 1858 }
1859 1859
1860 1860
1861 VM_TEST_CASE(SymbolUnicode) { 1861 ISOLATE_UNIT_TEST_CASE(SymbolUnicode) {
1862 uint16_t monkey_utf16[] = {0xd83d, 0xdc35}; // Unicode Monkey Face. 1862 uint16_t monkey_utf16[] = {0xd83d, 0xdc35}; // Unicode Monkey Face.
1863 String& monkey = String::Handle(Symbols::FromUTF16(thread, monkey_utf16, 2)); 1863 String& monkey = String::Handle(Symbols::FromUTF16(thread, monkey_utf16, 2));
1864 EXPECT(monkey.IsSymbol()); 1864 EXPECT(monkey.IsSymbol());
1865 const char monkey_utf8[] = {'\xf0', '\x9f', '\x90', '\xb5', 0}; 1865 const char monkey_utf8[] = {'\xf0', '\x9f', '\x90', '\xb5', 0};
1866 EXPECT_EQ(monkey.raw(), Symbols::New(thread, monkey_utf8)); 1866 EXPECT_EQ(monkey.raw(), Symbols::New(thread, monkey_utf8));
1867 1867
1868 int32_t kMonkeyFace = 0x1f435; 1868 int32_t kMonkeyFace = 0x1f435;
1869 String& monkey2 = String::Handle(Symbols::FromCharCode(thread, kMonkeyFace)); 1869 String& monkey2 = String::Handle(Symbols::FromCharCode(thread, kMonkeyFace));
1870 EXPECT_EQ(monkey.raw(), monkey2.raw()); 1870 EXPECT_EQ(monkey.raw(), monkey2.raw());
1871 1871
1872 // Unicode cat face with tears of joy. 1872 // Unicode cat face with tears of joy.
1873 int32_t kCatFaceWithTearsOfJoy = 0x1f639; 1873 int32_t kCatFaceWithTearsOfJoy = 0x1f639;
1874 String& cat = 1874 String& cat =
1875 String::Handle(Symbols::FromCharCode(thread, kCatFaceWithTearsOfJoy)); 1875 String::Handle(Symbols::FromCharCode(thread, kCatFaceWithTearsOfJoy));
1876 1876
1877 uint16_t cat_utf16[] = {0xd83d, 0xde39}; 1877 uint16_t cat_utf16[] = {0xd83d, 0xde39};
1878 String& cat2 = String::Handle(Symbols::FromUTF16(thread, cat_utf16, 2)); 1878 String& cat2 = String::Handle(Symbols::FromUTF16(thread, cat_utf16, 2));
1879 EXPECT(cat2.IsSymbol()); 1879 EXPECT(cat2.IsSymbol());
1880 EXPECT_EQ(cat2.raw(), cat.raw()); 1880 EXPECT_EQ(cat2.raw(), cat.raw());
1881 } 1881 }
1882 1882
1883 1883
1884 VM_TEST_CASE(Bool) { 1884 ISOLATE_UNIT_TEST_CASE(Bool) {
1885 EXPECT(Bool::True().value()); 1885 EXPECT(Bool::True().value());
1886 EXPECT(!Bool::False().value()); 1886 EXPECT(!Bool::False().value());
1887 } 1887 }
1888 1888
1889 1889
1890 VM_TEST_CASE(Array) { 1890 ISOLATE_UNIT_TEST_CASE(Array) {
1891 const int kArrayLen = 5; 1891 const int kArrayLen = 5;
1892 const Array& array = Array::Handle(Array::New(kArrayLen)); 1892 const Array& array = Array::Handle(Array::New(kArrayLen));
1893 EXPECT_EQ(kArrayLen, array.Length()); 1893 EXPECT_EQ(kArrayLen, array.Length());
1894 Object& element = Object::Handle(array.At(0)); 1894 Object& element = Object::Handle(array.At(0));
1895 EXPECT(element.IsNull()); 1895 EXPECT(element.IsNull());
1896 element = array.At(kArrayLen - 1); 1896 element = array.At(kArrayLen - 1);
1897 EXPECT(element.IsNull()); 1897 EXPECT(element.IsNull());
1898 array.SetAt(0, array); 1898 array.SetAt(0, array);
1899 array.SetAt(2, array); 1899 array.SetAt(2, array);
1900 element = array.At(0); 1900 element = array.At(0);
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
2035 if (Dart_IsError(result)) { 2035 if (Dart_IsError(result)) {
2036 EXPECT_ERROR(result, "Out of Memory"); 2036 EXPECT_ERROR(result, "Out of Memory");
2037 } else { 2037 } else {
2038 intptr_t actual = 0; 2038 intptr_t actual = 0;
2039 EXPECT_VALID(Dart_ListLength(result, &actual)); 2039 EXPECT_VALID(Dart_ListLength(result, &actual));
2040 EXPECT_EQ(max_elements, actual); 2040 EXPECT_EQ(max_elements, actual);
2041 } 2041 }
2042 } 2042 }
2043 2043
2044 2044
2045 VM_TEST_CASE(StringCodePointIterator) { 2045 ISOLATE_UNIT_TEST_CASE(StringCodePointIterator) {
2046 const String& str0 = String::Handle(String::New("")); 2046 const String& str0 = String::Handle(String::New(""));
2047 String::CodePointIterator it0(str0); 2047 String::CodePointIterator it0(str0);
2048 EXPECT(!it0.Next()); 2048 EXPECT(!it0.Next());
2049 2049
2050 const String& str1 = String::Handle(String::New(" \xc3\xa7 ")); 2050 const String& str1 = String::Handle(String::New(" \xc3\xa7 "));
2051 String::CodePointIterator it1(str1); 2051 String::CodePointIterator it1(str1);
2052 EXPECT(it1.Next()); 2052 EXPECT(it1.Next());
2053 EXPECT_EQ(' ', it1.Current()); 2053 EXPECT_EQ(' ', it1.Current());
2054 EXPECT(it1.Next()); 2054 EXPECT(it1.Next());
2055 EXPECT_EQ(0xE7, it1.Current()); 2055 EXPECT_EQ(0xE7, it1.Current());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2092 EXPECT(it3.Next()); 2092 EXPECT(it3.Next());
2093 EXPECT_EQ(0x1D461, it3.Current()); 2093 EXPECT_EQ(0x1D461, it3.Current());
2094 EXPECT(it3.Next()); 2094 EXPECT(it3.Next());
2095 EXPECT_EQ(0x1D462, it3.Current()); 2095 EXPECT_EQ(0x1D462, it3.Current());
2096 EXPECT(it3.Next()); 2096 EXPECT(it3.Next());
2097 EXPECT_EQ(0x1D463, it3.Current()); 2097 EXPECT_EQ(0x1D463, it3.Current());
2098 EXPECT(!it3.Next()); 2098 EXPECT(!it3.Next());
2099 } 2099 }
2100 2100
2101 2101
2102 VM_TEST_CASE(StringCodePointIteratorRange) { 2102 ISOLATE_UNIT_TEST_CASE(StringCodePointIteratorRange) {
2103 const String& str = String::Handle(String::New("foo bar baz")); 2103 const String& str = String::Handle(String::New("foo bar baz"));
2104 2104
2105 String::CodePointIterator it0(str, 3, 0); 2105 String::CodePointIterator it0(str, 3, 0);
2106 EXPECT(!it0.Next()); 2106 EXPECT(!it0.Next());
2107 2107
2108 String::CodePointIterator it1(str, 4, 3); 2108 String::CodePointIterator it1(str, 4, 3);
2109 EXPECT(it1.Next()); 2109 EXPECT(it1.Next());
2110 EXPECT_EQ('b', it1.Current()); 2110 EXPECT_EQ('b', it1.Current());
2111 EXPECT(it1.Next()); 2111 EXPECT(it1.Next());
2112 EXPECT_EQ('a', it1.Current()); 2112 EXPECT_EQ('a', it1.Current());
2113 EXPECT(it1.Next()); 2113 EXPECT(it1.Next());
2114 EXPECT_EQ('r', it1.Current()); 2114 EXPECT_EQ('r', it1.Current());
2115 EXPECT(!it1.Next()); 2115 EXPECT(!it1.Next());
2116 } 2116 }
2117 2117
2118 2118
2119 VM_TEST_CASE(GrowableObjectArray) { 2119 ISOLATE_UNIT_TEST_CASE(GrowableObjectArray) {
2120 const int kArrayLen = 5; 2120 const int kArrayLen = 5;
2121 Smi& value = Smi::Handle(); 2121 Smi& value = Smi::Handle();
2122 Smi& expected_value = Smi::Handle(); 2122 Smi& expected_value = Smi::Handle();
2123 GrowableObjectArray& array = GrowableObjectArray::Handle(); 2123 GrowableObjectArray& array = GrowableObjectArray::Handle();
2124 2124
2125 // Test basic growing functionality. 2125 // Test basic growing functionality.
2126 array = GrowableObjectArray::New(kArrayLen); 2126 array = GrowableObjectArray::New(kArrayLen);
2127 EXPECT_EQ(kArrayLen, array.Capacity()); 2127 EXPECT_EQ(kArrayLen, array.Capacity());
2128 EXPECT_EQ(0, array.Length()); 2128 EXPECT_EQ(0, array.Length());
2129 for (intptr_t i = 0; i < 10; i++) { 2129 for (intptr_t i = 0; i < 10; i++) {
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2231 new_array = Array::MakeArray(array); 2231 new_array = Array::MakeArray(array);
2232 EXPECT_EQ(1, new_array.Length()); 2232 EXPECT_EQ(1, new_array.Length());
2233 heap->CollectAllGarbage(); 2233 heap->CollectAllGarbage();
2234 intptr_t capacity_after = heap->CapacityInWords(Heap::kOld); 2234 intptr_t capacity_after = heap->CapacityInWords(Heap::kOld);
2235 // Page should shrink. 2235 // Page should shrink.
2236 EXPECT_LT(capacity_after, capacity_before); 2236 EXPECT_LT(capacity_after, capacity_before);
2237 EXPECT_EQ(1, new_array.Length()); 2237 EXPECT_EQ(1, new_array.Length());
2238 } 2238 }
2239 2239
2240 2240
2241 VM_TEST_CASE(InternalTypedData) { 2241 ISOLATE_UNIT_TEST_CASE(InternalTypedData) {
2242 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4}; 2242 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4};
2243 intptr_t data_length = ARRAY_SIZE(data); 2243 intptr_t data_length = ARRAY_SIZE(data);
2244 2244
2245 const TypedData& int8_array = 2245 const TypedData& int8_array =
2246 TypedData::Handle(TypedData::New(kTypedDataInt8ArrayCid, data_length)); 2246 TypedData::Handle(TypedData::New(kTypedDataInt8ArrayCid, data_length));
2247 EXPECT(!int8_array.IsNull()); 2247 EXPECT(!int8_array.IsNull());
2248 EXPECT_EQ(data_length, int8_array.Length()); 2248 EXPECT_EQ(data_length, int8_array.Length());
2249 for (intptr_t i = 0; i < data_length; ++i) { 2249 for (intptr_t i = 0; i < data_length; ++i) {
2250 int8_array.SetInt8(i, data[i]); 2250 int8_array.SetInt8(i, data[i]);
2251 } 2251 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2287 } 2287 }
2288 for (intptr_t i = 0; i < data_length; ++i) { 2288 for (intptr_t i = 0; i < data_length; ++i) {
2289 int8_array.SetInt8(i, 123 + i); 2289 int8_array.SetInt8(i, 123 + i);
2290 } 2290 }
2291 for (intptr_t i = 0; i < data_length; ++i) { 2291 for (intptr_t i = 0; i < data_length; ++i) {
2292 EXPECT(int8_array.GetInt8(i) != int8_array2.GetInt8(i)); 2292 EXPECT(int8_array.GetInt8(i) != int8_array2.GetInt8(i));
2293 } 2293 }
2294 } 2294 }
2295 2295
2296 2296
2297 VM_TEST_CASE(ExternalTypedData) { 2297 ISOLATE_UNIT_TEST_CASE(ExternalTypedData) {
2298 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4}; 2298 uint8_t data[] = {253, 254, 255, 0, 1, 2, 3, 4};
2299 intptr_t data_length = ARRAY_SIZE(data); 2299 intptr_t data_length = ARRAY_SIZE(data);
2300 2300
2301 const ExternalTypedData& int8_array = 2301 const ExternalTypedData& int8_array =
2302 ExternalTypedData::Handle(ExternalTypedData::New( 2302 ExternalTypedData::Handle(ExternalTypedData::New(
2303 kExternalTypedDataInt8ArrayCid, data, data_length)); 2303 kExternalTypedDataInt8ArrayCid, data, data_length));
2304 EXPECT(!int8_array.IsNull()); 2304 EXPECT(!int8_array.IsNull());
2305 EXPECT_EQ(data_length, int8_array.Length()); 2305 EXPECT_EQ(data_length, int8_array.Length());
2306 2306
2307 const ExternalTypedData& uint8_array = 2307 const ExternalTypedData& uint8_array =
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2381 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); 2381 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
2382 EXPECT_VALID(h_lib); 2382 EXPECT_VALID(h_lib);
2383 Library& lib = Library::Handle(); 2383 Library& lib = Library::Handle();
2384 lib ^= Api::UnwrapHandle(h_lib); 2384 lib ^= Api::UnwrapHandle(h_lib);
2385 EXPECT(!lib.IsNull()); 2385 EXPECT(!lib.IsNull());
2386 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); 2386 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
2387 EXPECT_VALID(result); 2387 EXPECT_VALID(result);
2388 } 2388 }
2389 2389
2390 2390
2391 VM_TEST_CASE(EmbeddedScript) { 2391 ISOLATE_UNIT_TEST_CASE(EmbeddedScript) {
2392 const char* url_chars = "builtin:test-case"; 2392 const char* url_chars = "builtin:test-case";
2393 const char* text = 2393 const char* text =
2394 /* 1 */ 2394 /* 1 */
2395 "<!DOCTYPE html>\n" 2395 "<!DOCTYPE html>\n"
2396 /* 2 */ 2396 /* 2 */
2397 " ... more junk ...\n" 2397 " ... more junk ...\n"
2398 /* 3 */ 2398 /* 3 */
2399 " <script type='application/dart'>main() {\n" 2399 " <script type='application/dart'>main() {\n"
2400 /* 4 */ 2400 /* 4 */
2401 " return 'foo';\n" 2401 " return 'foo';\n"
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2483 EXPECT_EQ(-1, first_idx.value()); 2483 EXPECT_EQ(-1, first_idx.value());
2484 EXPECT_EQ(-1, last_idx.value()); 2484 EXPECT_EQ(-1, last_idx.value());
2485 script.TokenRangeAtLine(1000, &first_idx, &last_idx); 2485 script.TokenRangeAtLine(1000, &first_idx, &last_idx);
2486 EXPECT_EQ(-1, first_idx.value()); 2486 EXPECT_EQ(-1, first_idx.value());
2487 EXPECT_EQ(-1, last_idx.value()); 2487 EXPECT_EQ(-1, last_idx.value());
2488 2488
2489 free(src_chars); 2489 free(src_chars);
2490 } 2490 }
2491 2491
2492 2492
2493 VM_TEST_CASE(Context) { 2493 ISOLATE_UNIT_TEST_CASE(Context) {
2494 const int kNumVariables = 5; 2494 const int kNumVariables = 5;
2495 const Context& parent_context = Context::Handle(Context::New(0)); 2495 const Context& parent_context = Context::Handle(Context::New(0));
2496 const Context& context = Context::Handle(Context::New(kNumVariables)); 2496 const Context& context = Context::Handle(Context::New(kNumVariables));
2497 context.set_parent(parent_context); 2497 context.set_parent(parent_context);
2498 EXPECT_EQ(kNumVariables, context.num_variables()); 2498 EXPECT_EQ(kNumVariables, context.num_variables());
2499 EXPECT(Context::Handle(context.parent()).raw() == parent_context.raw()); 2499 EXPECT(Context::Handle(context.parent()).raw() == parent_context.raw());
2500 EXPECT_EQ(0, Context::Handle(context.parent()).num_variables()); 2500 EXPECT_EQ(0, Context::Handle(context.parent()).num_variables());
2501 EXPECT(Context::Handle(Context::Handle(context.parent()).parent()).IsNull()); 2501 EXPECT(Context::Handle(Context::Handle(context.parent()).parent()).IsNull());
2502 Object& variable = Object::Handle(context.At(0)); 2502 Object& variable = Object::Handle(context.At(0));
2503 EXPECT(variable.IsNull()); 2503 EXPECT(variable.IsNull());
2504 variable = context.At(kNumVariables - 1); 2504 variable = context.At(kNumVariables - 1);
2505 EXPECT(variable.IsNull()); 2505 EXPECT(variable.IsNull());
2506 context.SetAt(0, Smi::Handle(Smi::New(2))); 2506 context.SetAt(0, Smi::Handle(Smi::New(2)));
2507 context.SetAt(2, Smi::Handle(Smi::New(3))); 2507 context.SetAt(2, Smi::Handle(Smi::New(3)));
2508 Smi& smi = Smi::Handle(); 2508 Smi& smi = Smi::Handle();
2509 smi ^= context.At(0); 2509 smi ^= context.At(0);
2510 EXPECT_EQ(2, smi.Value()); 2510 EXPECT_EQ(2, smi.Value());
2511 smi ^= context.At(2); 2511 smi ^= context.At(2);
2512 EXPECT_EQ(3, smi.Value()); 2512 EXPECT_EQ(3, smi.Value());
2513 } 2513 }
2514 2514
2515 2515
2516 VM_TEST_CASE(ContextScope) { 2516 ISOLATE_UNIT_TEST_CASE(ContextScope) {
2517 const intptr_t parent_scope_function_level = 0; 2517 const intptr_t parent_scope_function_level = 0;
2518 LocalScope* parent_scope = 2518 LocalScope* parent_scope =
2519 new LocalScope(NULL, parent_scope_function_level, 0); 2519 new LocalScope(NULL, parent_scope_function_level, 0);
2520 2520
2521 const intptr_t local_scope_function_level = 1; 2521 const intptr_t local_scope_function_level = 1;
2522 LocalScope* local_scope = 2522 LocalScope* local_scope =
2523 new LocalScope(parent_scope, local_scope_function_level, 0); 2523 new LocalScope(parent_scope, local_scope_function_level, 0);
2524 2524
2525 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType()); 2525 const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
2526 const String& a = String::ZoneHandle(Symbols::New(thread, "a")); 2526 const String& a = String::ZoneHandle(Symbols::New(thread, "a"));
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2591 EXPECT(outer_scope->LocalLookupVariable(b) == NULL); 2591 EXPECT(outer_scope->LocalLookupVariable(b) == NULL);
2592 2592
2593 var_c = outer_scope->LocalLookupVariable(c); 2593 var_c = outer_scope->LocalLookupVariable(c);
2594 EXPECT(var_c->is_captured()); 2594 EXPECT(var_c->is_captured());
2595 EXPECT_EQ(1, var_c->index()); 2595 EXPECT_EQ(1, var_c->index());
2596 EXPECT_EQ(parent_scope_context_level - local_scope_context_level, 2596 EXPECT_EQ(parent_scope_context_level - local_scope_context_level,
2597 var_c->owner()->context_level()); // Adjusted context level. 2597 var_c->owner()->context_level()); // Adjusted context level.
2598 } 2598 }
2599 2599
2600 2600
2601 VM_TEST_CASE(Closure) { 2601 ISOLATE_UNIT_TEST_CASE(Closure) {
2602 // Allocate the class first. 2602 // Allocate the class first.
2603 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 2603 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
2604 const Script& script = Script::Handle(); 2604 const Script& script = Script::Handle();
2605 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 2605 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
2606 const Array& functions = Array::Handle(Array::New(1)); 2606 const Array& functions = Array::Handle(Array::New(1));
2607 2607
2608 const Context& context = Context::Handle(Context::New(0)); 2608 const Context& context = Context::Handle(Context::New(0));
2609 Function& parent = Function::Handle(); 2609 Function& parent = Function::Handle();
2610 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa")); 2610 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
2611 parent = 2611 parent =
2612 Function::New(parent_name, RawFunction::kRegularFunction, false, false, 2612 Function::New(parent_name, RawFunction::kRegularFunction, false, false,
2613 false, false, false, cls, TokenPosition::kMinSource); 2613 false, false, false, cls, TokenPosition::kMinSource);
2614 functions.SetAt(0, parent); 2614 functions.SetAt(0, parent);
2615 cls.SetFunctions(functions); 2615 cls.SetFunctions(functions);
2616 2616
2617 Function& function = Function::Handle(); 2617 Function& function = Function::Handle();
2618 const String& function_name = String::Handle(Symbols::New(thread, "foo")); 2618 const String& function_name = String::Handle(Symbols::New(thread, "foo"));
2619 function = Function::NewClosureFunction(function_name, parent, 2619 function = Function::NewClosureFunction(function_name, parent,
2620 TokenPosition::kMinSource); 2620 TokenPosition::kMinSource);
2621 const Closure& closure = Closure::Handle(Closure::New(function, context)); 2621 const Closure& closure = Closure::Handle(Closure::New(function, context));
2622 const Class& closure_class = Class::Handle(closure.clazz()); 2622 const Class& closure_class = Class::Handle(closure.clazz());
2623 EXPECT_EQ(closure_class.id(), kClosureCid); 2623 EXPECT_EQ(closure_class.id(), kClosureCid);
2624 const Function& closure_function = Function::Handle(closure.function()); 2624 const Function& closure_function = Function::Handle(closure.function());
2625 EXPECT_EQ(closure_function.raw(), function.raw()); 2625 EXPECT_EQ(closure_function.raw(), function.raw());
2626 const Context& closure_context = Context::Handle(closure.context()); 2626 const Context& closure_context = Context::Handle(closure.context());
2627 EXPECT_EQ(closure_context.raw(), context.raw()); 2627 EXPECT_EQ(closure_context.raw(), context.raw());
2628 } 2628 }
2629 2629
2630 2630
2631 VM_TEST_CASE(ObjectPrinting) { 2631 ISOLATE_UNIT_TEST_CASE(ObjectPrinting) {
2632 // Simple Smis. 2632 // Simple Smis.
2633 EXPECT_STREQ("2", Smi::Handle(Smi::New(2)).ToCString()); 2633 EXPECT_STREQ("2", Smi::Handle(Smi::New(2)).ToCString());
2634 EXPECT_STREQ("-15", Smi::Handle(Smi::New(-15)).ToCString()); 2634 EXPECT_STREQ("-15", Smi::Handle(Smi::New(-15)).ToCString());
2635 2635
2636 // bool class and true/false values. 2636 // bool class and true/false values.
2637 ObjectStore* object_store = Isolate::Current()->object_store(); 2637 ObjectStore* object_store = Isolate::Current()->object_store();
2638 const Class& bool_class = Class::Handle(object_store->bool_class()); 2638 const Class& bool_class = Class::Handle(object_store->bool_class());
2639 EXPECT_STREQ("Library:'dart:core' Class: bool", bool_class.ToCString()); 2639 EXPECT_STREQ("Library:'dart:core' Class: bool", bool_class.ToCString());
2640 EXPECT_STREQ("true", Bool::True().ToCString()); 2640 EXPECT_STREQ("true", Bool::True().ToCString());
2641 EXPECT_STREQ("false", Bool::False().ToCString()); 2641 EXPECT_STREQ("false", Bool::False().ToCString());
2642 2642
2643 // Strings. 2643 // Strings.
2644 EXPECT_STREQ("Sugarbowl", 2644 EXPECT_STREQ("Sugarbowl",
2645 String::Handle(String::New("Sugarbowl")).ToCString()); 2645 String::Handle(String::New("Sugarbowl")).ToCString());
2646 } 2646 }
2647 2647
2648 2648
2649 VM_TEST_CASE(CheckedHandle) { 2649 ISOLATE_UNIT_TEST_CASE(CheckedHandle) {
2650 // Ensure that null handles have the correct C++ vtable setup. 2650 // Ensure that null handles have the correct C++ vtable setup.
2651 const String& str1 = String::Handle(); 2651 const String& str1 = String::Handle();
2652 EXPECT(str1.IsString()); 2652 EXPECT(str1.IsString());
2653 EXPECT(str1.IsNull()); 2653 EXPECT(str1.IsNull());
2654 const String& str2 = String::CheckedHandle(Object::null()); 2654 const String& str2 = String::CheckedHandle(Object::null());
2655 EXPECT(str2.IsString()); 2655 EXPECT(str2.IsString());
2656 EXPECT(str2.IsNull()); 2656 EXPECT(str2.IsNull());
2657 String& str3 = String::Handle(); 2657 String& str3 = String::Handle();
2658 str3 ^= Object::null(); 2658 str3 ^= Object::null();
2659 EXPECT(str3.IsString()); 2659 EXPECT(str3.IsString());
(...skipping 23 matching lines...) Expand all
2683 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name)); 2683 const Library& owner_library = Library::Handle(CreateDummyLibrary(lib_name));
2684 owner_class.set_library(owner_library); 2684 owner_class.set_library(owner_library);
2685 const String& function_name = String::ZoneHandle(Symbols::New(thread, name)); 2685 const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
2686 return Function::New(function_name, RawFunction::kRegularFunction, true, 2686 return Function::New(function_name, RawFunction::kRegularFunction, true,
2687 false, false, false, false, owner_class, 2687 false, false, false, false, owner_class,
2688 TokenPosition::kMinSource); 2688 TokenPosition::kMinSource);
2689 } 2689 }
2690 2690
2691 2691
2692 // Test for Code and Instruction object creation. 2692 // Test for Code and Instruction object creation.
2693 VM_TEST_CASE(Code) { 2693 ISOLATE_UNIT_TEST_CASE(Code) {
2694 extern void GenerateIncrement(Assembler * assembler); 2694 extern void GenerateIncrement(Assembler * assembler);
2695 Assembler _assembler_; 2695 Assembler _assembler_;
2696 GenerateIncrement(&_assembler_); 2696 GenerateIncrement(&_assembler_);
2697 const Function& function = Function::Handle(CreateFunction("Test_Code")); 2697 const Function& function = Function::Handle(CreateFunction("Test_Code"));
2698 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2698 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2699 function.AttachCode(code); 2699 function.AttachCode(code);
2700 const Instructions& instructions = Instructions::Handle(code.instructions()); 2700 const Instructions& instructions = Instructions::Handle(code.instructions());
2701 uword payload_start = instructions.PayloadStart(); 2701 uword payload_start = instructions.PayloadStart();
2702 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start)); 2702 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start));
2703 const Object& result = 2703 const Object& result =
2704 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2704 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2705 EXPECT_EQ(1, Smi::Cast(result).Value()); 2705 EXPECT_EQ(1, Smi::Cast(result).Value());
2706 } 2706 }
2707 2707
2708 2708
2709 // Test for immutability of generated instructions. The test crashes with a 2709 // Test for immutability of generated instructions. The test crashes with a
2710 // segmentation fault when writing into it. 2710 // segmentation fault when writing into it.
2711 VM_TEST_CASE(CodeImmutability) { 2711 ISOLATE_UNIT_TEST_CASE(CodeImmutability) {
2712 extern void GenerateIncrement(Assembler * assembler); 2712 extern void GenerateIncrement(Assembler * assembler);
2713 Assembler _assembler_; 2713 Assembler _assembler_;
2714 GenerateIncrement(&_assembler_); 2714 GenerateIncrement(&_assembler_);
2715 const Function& function = Function::Handle(CreateFunction("Test_Code")); 2715 const Function& function = Function::Handle(CreateFunction("Test_Code"));
2716 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2716 Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2717 function.AttachCode(code); 2717 function.AttachCode(code);
2718 Instructions& instructions = Instructions::Handle(code.instructions()); 2718 Instructions& instructions = Instructions::Handle(code.instructions());
2719 uword payload_start = instructions.PayloadStart(); 2719 uword payload_start = instructions.PayloadStart();
2720 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start)); 2720 EXPECT_EQ(instructions.raw(), Instructions::FromPayloadStart(payload_start));
2721 // Try writing into the generated code, expected to crash. 2721 // Try writing into the generated code, expected to crash.
2722 *(reinterpret_cast<char*>(payload_start) + 1) = 1; 2722 *(reinterpret_cast<char*>(payload_start) + 1) = 1;
2723 if (!FLAG_write_protect_code) { 2723 if (!FLAG_write_protect_code) {
2724 // Since this test is expected to crash, crash if write protection of code 2724 // Since this test is expected to crash, crash if write protection of code
2725 // is switched off. 2725 // is switched off.
2726 // TODO(regis, fschneider): Should this be FATAL() instead? 2726 // TODO(regis, fschneider): Should this be FATAL() instead?
2727 OS::DebugBreak(); 2727 OS::DebugBreak();
2728 } 2728 }
2729 } 2729 }
2730 2730
2731 2731
2732 // Test for Embedded String object in the instructions. 2732 // Test for Embedded String object in the instructions.
2733 VM_TEST_CASE(EmbedStringInCode) { 2733 ISOLATE_UNIT_TEST_CASE(EmbedStringInCode) {
2734 extern void GenerateEmbedStringInCode(Assembler * assembler, const char* str); 2734 extern void GenerateEmbedStringInCode(Assembler * assembler, const char* str);
2735 const char* kHello = "Hello World!"; 2735 const char* kHello = "Hello World!";
2736 word expected_length = static_cast<word>(strlen(kHello)); 2736 word expected_length = static_cast<word>(strlen(kHello));
2737 Assembler _assembler_; 2737 Assembler _assembler_;
2738 GenerateEmbedStringInCode(&_assembler_, kHello); 2738 GenerateEmbedStringInCode(&_assembler_, kHello);
2739 const Function& function = 2739 const Function& function =
2740 Function::Handle(CreateFunction("Test_EmbedStringInCode")); 2740 Function::Handle(CreateFunction("Test_EmbedStringInCode"));
2741 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2741 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2742 function.AttachCode(code); 2742 function.AttachCode(code);
2743 const Object& result = 2743 const Object& result =
2744 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2744 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2745 EXPECT(result.raw()->IsHeapObject()); 2745 EXPECT(result.raw()->IsHeapObject());
2746 String& string_object = String::Handle(); 2746 String& string_object = String::Handle();
2747 string_object ^= result.raw(); 2747 string_object ^= result.raw();
2748 EXPECT(string_object.Length() == expected_length); 2748 EXPECT(string_object.Length() == expected_length);
2749 for (int i = 0; i < expected_length; i++) { 2749 for (int i = 0; i < expected_length; i++) {
2750 EXPECT(string_object.CharAt(i) == kHello[i]); 2750 EXPECT(string_object.CharAt(i) == kHello[i]);
2751 } 2751 }
2752 } 2752 }
2753 2753
2754 2754
2755 // Test for Embedded Smi object in the instructions. 2755 // Test for Embedded Smi object in the instructions.
2756 VM_TEST_CASE(EmbedSmiInCode) { 2756 ISOLATE_UNIT_TEST_CASE(EmbedSmiInCode) {
2757 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value); 2757 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
2758 const intptr_t kSmiTestValue = 5; 2758 const intptr_t kSmiTestValue = 5;
2759 Assembler _assembler_; 2759 Assembler _assembler_;
2760 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue); 2760 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
2761 const Function& function = 2761 const Function& function =
2762 Function::Handle(CreateFunction("Test_EmbedSmiInCode")); 2762 Function::Handle(CreateFunction("Test_EmbedSmiInCode"));
2763 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2763 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2764 function.AttachCode(code); 2764 function.AttachCode(code);
2765 const Object& result = 2765 const Object& result =
2766 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2766 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2767 EXPECT(Smi::Cast(result).Value() == kSmiTestValue); 2767 EXPECT(Smi::Cast(result).Value() == kSmiTestValue);
2768 } 2768 }
2769 2769
2770 2770
2771 #if defined(ARCH_IS_64_BIT) 2771 #if defined(ARCH_IS_64_BIT)
2772 // Test for Embedded Smi object in the instructions. 2772 // Test for Embedded Smi object in the instructions.
2773 VM_TEST_CASE(EmbedSmiIn64BitCode) { 2773 ISOLATE_UNIT_TEST_CASE(EmbedSmiIn64BitCode) {
2774 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value); 2774 extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
2775 const intptr_t kSmiTestValue = DART_INT64_C(5) << 32; 2775 const intptr_t kSmiTestValue = DART_INT64_C(5) << 32;
2776 Assembler _assembler_; 2776 Assembler _assembler_;
2777 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue); 2777 GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
2778 const Function& function = 2778 const Function& function =
2779 Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode")); 2779 Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode"));
2780 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_)); 2780 const Code& code = Code::Handle(Code::FinalizeCode(function, &_assembler_));
2781 function.AttachCode(code); 2781 function.AttachCode(code);
2782 const Object& result = 2782 const Object& result =
2783 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array())); 2783 Object::Handle(DartEntry::InvokeFunction(function, Array::empty_array()));
2784 EXPECT(Smi::Cast(result).Value() == kSmiTestValue); 2784 EXPECT(Smi::Cast(result).Value() == kSmiTestValue);
2785 } 2785 }
2786 #endif // ARCH_IS_64_BIT 2786 #endif // ARCH_IS_64_BIT
2787 2787
2788 2788
2789 VM_TEST_CASE(ExceptionHandlers) { 2789 ISOLATE_UNIT_TEST_CASE(ExceptionHandlers) {
2790 const int kNumEntries = 4; 2790 const int kNumEntries = 4;
2791 // Add an exception handler table to the code. 2791 // Add an exception handler table to the code.
2792 ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle(); 2792 ExceptionHandlers& exception_handlers = ExceptionHandlers::Handle();
2793 exception_handlers ^= ExceptionHandlers::New(kNumEntries); 2793 exception_handlers ^= ExceptionHandlers::New(kNumEntries);
2794 const bool kNeedsStackTrace = true; 2794 const bool kNeedsStackTrace = true;
2795 const bool kNoStackTrace = false; 2795 const bool kNoStackTrace = false;
2796 exception_handlers.SetHandlerInfo(0, -1, 20u, kNeedsStackTrace, false); 2796 exception_handlers.SetHandlerInfo(0, -1, 20u, kNeedsStackTrace, false);
2797 exception_handlers.SetHandlerInfo(1, 0, 30u, kNeedsStackTrace, false); 2797 exception_handlers.SetHandlerInfo(1, 0, 30u, kNeedsStackTrace, false);
2798 exception_handlers.SetHandlerInfo(2, -1, 40u, kNoStackTrace, true); 2798 exception_handlers.SetHandlerInfo(2, -1, 40u, kNoStackTrace, true);
2799 exception_handlers.SetHandlerInfo(3, 1, 150u, kNoStackTrace, true); 2799 exception_handlers.SetHandlerInfo(3, 1, 150u, kNoStackTrace, true);
(...skipping 17 matching lines...) Expand all
2817 EXPECT(handlers.NeedsStackTrace(0)); 2817 EXPECT(handlers.NeedsStackTrace(0));
2818 EXPECT(!handlers.HasCatchAll(0)); 2818 EXPECT(!handlers.HasCatchAll(0));
2819 EXPECT_EQ(20u, info.handler_pc_offset); 2819 EXPECT_EQ(20u, info.handler_pc_offset);
2820 EXPECT_EQ(1, handlers.OuterTryIndex(3)); 2820 EXPECT_EQ(1, handlers.OuterTryIndex(3));
2821 EXPECT_EQ(150u, handlers.HandlerPCOffset(3)); 2821 EXPECT_EQ(150u, handlers.HandlerPCOffset(3));
2822 EXPECT(!handlers.NeedsStackTrace(3)); 2822 EXPECT(!handlers.NeedsStackTrace(3));
2823 EXPECT(handlers.HasCatchAll(3)); 2823 EXPECT(handlers.HasCatchAll(3));
2824 } 2824 }
2825 2825
2826 2826
2827 VM_TEST_CASE(PcDescriptors) { 2827 ISOLATE_UNIT_TEST_CASE(PcDescriptors) {
2828 DescriptorList* builder = new DescriptorList(0); 2828 DescriptorList* builder = new DescriptorList(0);
2829 2829
2830 // kind, pc_offset, deopt_id, token_pos, try_index 2830 // kind, pc_offset, deopt_id, token_pos, try_index
2831 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 1, TokenPosition(20), 1); 2831 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 1, TokenPosition(20), 1);
2832 builder->AddDescriptor(RawPcDescriptors::kDeopt, 20, 2, TokenPosition(30), 0); 2832 builder->AddDescriptor(RawPcDescriptors::kDeopt, 20, 2, TokenPosition(30), 0);
2833 builder->AddDescriptor(RawPcDescriptors::kOther, 30, 3, TokenPosition(40), 1); 2833 builder->AddDescriptor(RawPcDescriptors::kOther, 30, 3, TokenPosition(40), 1);
2834 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 4, TokenPosition(40), 2); 2834 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 4, TokenPosition(40), 2);
2835 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 5, TokenPosition(80), 3); 2835 builder->AddDescriptor(RawPcDescriptors::kOther, 10, 5, TokenPosition(80), 3);
2836 builder->AddDescriptor(RawPcDescriptors::kOther, 80, 6, TokenPosition(150), 2836 builder->AddDescriptor(RawPcDescriptors::kOther, 80, 6, TokenPosition(150),
2837 3); 2837 3);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2875 2875
2876 EXPECT_EQ(3, iter.TryIndex()); 2876 EXPECT_EQ(3, iter.TryIndex());
2877 EXPECT_EQ(static_cast<uword>(80), iter.PcOffset()); 2877 EXPECT_EQ(static_cast<uword>(80), iter.PcOffset());
2878 EXPECT_EQ(150, iter.TokenPos().value()); 2878 EXPECT_EQ(150, iter.TokenPos().value());
2879 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind()); 2879 EXPECT_EQ(RawPcDescriptors::kOther, iter.Kind());
2880 2880
2881 EXPECT_EQ(false, iter.MoveNext()); 2881 EXPECT_EQ(false, iter.MoveNext());
2882 } 2882 }
2883 2883
2884 2884
2885 VM_TEST_CASE(PcDescriptorsLargeDeltas) { 2885 ISOLATE_UNIT_TEST_CASE(PcDescriptorsLargeDeltas) {
2886 DescriptorList* builder = new DescriptorList(0); 2886 DescriptorList* builder = new DescriptorList(0);
2887 2887
2888 // kind, pc_offset, deopt_id, token_pos, try_index 2888 // kind, pc_offset, deopt_id, token_pos, try_index
2889 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 1, TokenPosition(200), 2889 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 1, TokenPosition(200),
2890 1); 2890 1);
2891 builder->AddDescriptor(RawPcDescriptors::kDeopt, 200, 2, TokenPosition(300), 2891 builder->AddDescriptor(RawPcDescriptors::kDeopt, 200, 2, TokenPosition(300),
2892 0); 2892 0);
2893 builder->AddDescriptor(RawPcDescriptors::kOther, 300, 3, TokenPosition(400), 2893 builder->AddDescriptor(RawPcDescriptors::kOther, 300, 3, TokenPosition(400),
2894 1); 2894 1);
2895 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 4, TokenPosition(0), 2); 2895 builder->AddDescriptor(RawPcDescriptors::kOther, 100, 4, TokenPosition(0), 2);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2957 const Class& cls = Class::Handle(CreateTestClass("global:")); 2957 const Class& cls = Class::Handle(CreateTestClass("global:"));
2958 const String& field_name = 2958 const String& field_name =
2959 String::Handle(Symbols::New(Thread::Current(), name)); 2959 String::Handle(Symbols::New(Thread::Current(), name));
2960 const Field& field = Field::Handle( 2960 const Field& field = Field::Handle(
2961 Field::New(field_name, true, false, false, true, cls, 2961 Field::New(field_name, true, false, false, true, cls,
2962 Object::dynamic_type(), TokenPosition::kMinSource)); 2962 Object::dynamic_type(), TokenPosition::kMinSource));
2963 return field.raw(); 2963 return field.raw();
2964 } 2964 }
2965 2965
2966 2966
2967 VM_TEST_CASE(ClassDictionaryIterator) { 2967 ISOLATE_UNIT_TEST_CASE(ClassDictionaryIterator) {
2968 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6")); 2968 Class& ae66 = Class::ZoneHandle(CreateTestClass("Ae6/6"));
2969 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4")); 2969 Class& re44 = Class::ZoneHandle(CreateTestClass("Re4/4"));
2970 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8")); 2970 Field& ce68 = Field::ZoneHandle(CreateTestField("Ce6/8"));
2971 Field& tee = Field::ZoneHandle(CreateTestField("TEE")); 2971 Field& tee = Field::ZoneHandle(CreateTestField("TEE"));
2972 String& url = String::ZoneHandle(String::New("SBB")); 2972 String& url = String::ZoneHandle(String::New("SBB"));
2973 Library& lib = Library::Handle(Library::New(url)); 2973 Library& lib = Library::Handle(Library::New(url));
2974 lib.AddClass(ae66); 2974 lib.AddClass(ae66);
2975 lib.AddObject(ce68, String::ZoneHandle(ce68.name())); 2975 lib.AddObject(ce68, String::ZoneHandle(ce68.name()));
2976 lib.AddClass(re44); 2976 lib.AddClass(re44);
2977 lib.AddObject(tee, String::ZoneHandle(tee.name())); 2977 lib.AddObject(tee, String::ZoneHandle(tee.name()));
(...skipping 18 matching lines...) Expand all
2996 const bool is_const = false; 2996 const bool is_const = false;
2997 const bool is_abstract = false; 2997 const bool is_abstract = false;
2998 const bool is_external = false; 2998 const bool is_external = false;
2999 const bool is_native = false; 2999 const bool is_native = false;
3000 return Function::New(function_name, RawFunction::kRegularFunction, is_static, 3000 return Function::New(function_name, RawFunction::kRegularFunction, is_static,
3001 is_const, is_abstract, is_external, is_native, cls, 3001 is_const, is_abstract, is_external, is_native, cls,
3002 TokenPosition::kMinSource); 3002 TokenPosition::kMinSource);
3003 } 3003 }
3004 3004
3005 3005
3006 VM_TEST_CASE(ICData) { 3006 ISOLATE_UNIT_TEST_CASE(ICData) {
3007 Function& function = Function::Handle(GetDummyTarget("Bern")); 3007 Function& function = Function::Handle(GetDummyTarget("Bern"));
3008 const intptr_t id = 12; 3008 const intptr_t id = 12;
3009 const intptr_t num_args_tested = 1; 3009 const intptr_t num_args_tested = 1;
3010 const String& target_name = String::Handle(Symbols::New(thread, "Thun")); 3010 const String& target_name = String::Handle(Symbols::New(thread, "Thun"));
3011 const Array& args_descriptor = 3011 const Array& args_descriptor =
3012 Array::Handle(ArgumentsDescriptor::New(1, Object::null_array())); 3012 Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
3013 ICData& o1 = ICData::Handle(); 3013 ICData& o1 = ICData::Handle();
3014 o1 = ICData::New(function, target_name, args_descriptor, id, num_args_tested, 3014 o1 = ICData::New(function, target_name, args_descriptor, id, num_args_tested,
3015 false); 3015 false);
3016 EXPECT_EQ(1, o1.NumArgsTested()); 3016 EXPECT_EQ(1, o1.NumArgsTested());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3069 3069
3070 // Check ICData for unoptimized static calls. 3070 // Check ICData for unoptimized static calls.
3071 const intptr_t kNumArgsChecked = 0; 3071 const intptr_t kNumArgsChecked = 0;
3072 const ICData& scall_icdata = ICData::Handle(ICData::New( 3072 const ICData& scall_icdata = ICData::Handle(ICData::New(
3073 function, target_name, args_descriptor, 57, kNumArgsChecked, false)); 3073 function, target_name, args_descriptor, 57, kNumArgsChecked, false));
3074 scall_icdata.AddTarget(target1); 3074 scall_icdata.AddTarget(target1);
3075 EXPECT_EQ(target1.raw(), scall_icdata.GetTargetAt(0)); 3075 EXPECT_EQ(target1.raw(), scall_icdata.GetTargetAt(0));
3076 } 3076 }
3077 3077
3078 3078
3079 VM_TEST_CASE(SubtypeTestCache) { 3079 ISOLATE_UNIT_TEST_CASE(SubtypeTestCache) {
3080 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass")); 3080 String& class_name = String::Handle(Symbols::New(thread, "EmptyClass"));
3081 Script& script = Script::Handle(); 3081 Script& script = Script::Handle();
3082 const Class& empty_class = 3082 const Class& empty_class =
3083 Class::Handle(CreateDummyClass(class_name, script)); 3083 Class::Handle(CreateDummyClass(class_name, script));
3084 SubtypeTestCache& cache = SubtypeTestCache::Handle(SubtypeTestCache::New()); 3084 SubtypeTestCache& cache = SubtypeTestCache::Handle(SubtypeTestCache::New());
3085 EXPECT(!cache.IsNull()); 3085 EXPECT(!cache.IsNull());
3086 EXPECT_EQ(0, cache.NumberOfChecks()); 3086 EXPECT_EQ(0, cache.NumberOfChecks());
3087 const Object& class_id_or_fun = Object::Handle(Smi::New(empty_class.id())); 3087 const Object& class_id_or_fun = Object::Handle(Smi::New(empty_class.id()));
3088 const TypeArguments& targ_0 = TypeArguments::Handle(TypeArguments::New(2)); 3088 const TypeArguments& targ_0 = TypeArguments::Handle(TypeArguments::New(2));
3089 const TypeArguments& targ_1 = TypeArguments::Handle(TypeArguments::New(3)); 3089 const TypeArguments& targ_1 = TypeArguments::Handle(TypeArguments::New(3));
3090 cache.AddCheck(class_id_or_fun, targ_0, targ_1, Bool::True()); 3090 cache.AddCheck(class_id_or_fun, targ_0, targ_1, Bool::True());
3091 EXPECT_EQ(1, cache.NumberOfChecks()); 3091 EXPECT_EQ(1, cache.NumberOfChecks());
3092 Object& test_class_id_or_fun = Object::Handle(); 3092 Object& test_class_id_or_fun = Object::Handle();
3093 TypeArguments& test_targ_0 = TypeArguments::Handle(); 3093 TypeArguments& test_targ_0 = TypeArguments::Handle();
3094 TypeArguments& test_targ_1 = TypeArguments::Handle(); 3094 TypeArguments& test_targ_1 = TypeArguments::Handle();
3095 Bool& test_result = Bool::Handle(); 3095 Bool& test_result = Bool::Handle();
3096 cache.GetCheck(0, &test_class_id_or_fun, &test_targ_0, &test_targ_1, 3096 cache.GetCheck(0, &test_class_id_or_fun, &test_targ_0, &test_targ_1,
3097 &test_result); 3097 &test_result);
3098 EXPECT_EQ(class_id_or_fun.raw(), test_class_id_or_fun.raw()); 3098 EXPECT_EQ(class_id_or_fun.raw(), test_class_id_or_fun.raw());
3099 EXPECT_EQ(targ_0.raw(), test_targ_0.raw()); 3099 EXPECT_EQ(targ_0.raw(), test_targ_0.raw());
3100 EXPECT_EQ(targ_1.raw(), test_targ_1.raw()); 3100 EXPECT_EQ(targ_1.raw(), test_targ_1.raw());
3101 EXPECT_EQ(Bool::True().raw(), test_result.raw()); 3101 EXPECT_EQ(Bool::True().raw(), test_result.raw());
3102 } 3102 }
3103 3103
3104 3104
3105 VM_TEST_CASE(FieldTests) { 3105 ISOLATE_UNIT_TEST_CASE(FieldTests) {
3106 const String& f = String::Handle(String::New("oneField")); 3106 const String& f = String::Handle(String::New("oneField"));
3107 const String& getter_f = String::Handle(Field::GetterName(f)); 3107 const String& getter_f = String::Handle(Field::GetterName(f));
3108 const String& setter_f = String::Handle(Field::SetterName(f)); 3108 const String& setter_f = String::Handle(Field::SetterName(f));
3109 EXPECT(!Field::IsGetterName(f)); 3109 EXPECT(!Field::IsGetterName(f));
3110 EXPECT(!Field::IsSetterName(f)); 3110 EXPECT(!Field::IsSetterName(f));
3111 EXPECT(Field::IsGetterName(getter_f)); 3111 EXPECT(Field::IsGetterName(getter_f));
3112 EXPECT(!Field::IsSetterName(getter_f)); 3112 EXPECT(!Field::IsSetterName(getter_f));
3113 EXPECT(!Field::IsGetterName(setter_f)); 3113 EXPECT(!Field::IsGetterName(setter_f));
3114 EXPECT(Field::IsSetterName(setter_f)); 3114 EXPECT(Field::IsSetterName(setter_f));
3115 EXPECT_STREQ(f.ToCString(), 3115 EXPECT_STREQ(f.ToCString(),
3116 String::Handle(Field::NameFromGetter(getter_f)).ToCString()); 3116 String::Handle(Field::NameFromGetter(getter_f)).ToCString());
3117 EXPECT_STREQ(f.ToCString(), 3117 EXPECT_STREQ(f.ToCString(),
3118 String::Handle(Field::NameFromSetter(setter_f)).ToCString()); 3118 String::Handle(Field::NameFromSetter(setter_f)).ToCString());
3119 } 3119 }
3120 3120
3121 3121
3122 // Expose helper function from object.cc for testing. 3122 // Expose helper function from object.cc for testing.
3123 bool EqualsIgnoringPrivate(const String& name, const String& private_name); 3123 bool EqualsIgnoringPrivate(const String& name, const String& private_name);
3124 3124
3125 3125
3126 VM_TEST_CASE(EqualsIgnoringPrivate) { 3126 ISOLATE_UNIT_TEST_CASE(EqualsIgnoringPrivate) {
3127 String& mangled_name = String::Handle(); 3127 String& mangled_name = String::Handle();
3128 String& bare_name = String::Handle(); 3128 String& bare_name = String::Handle();
3129 3129
3130 // Simple matches. 3130 // Simple matches.
3131 mangled_name = OneByteString::New("foo"); 3131 mangled_name = OneByteString::New("foo");
3132 bare_name = OneByteString::New("foo"); 3132 bare_name = OneByteString::New("foo");
3133 EXPECT(String::EqualsIgnoringPrivateKey(mangled_name, bare_name)); 3133 EXPECT(String::EqualsIgnoringPrivateKey(mangled_name, bare_name));
3134 3134
3135 mangled_name = OneByteString::New("foo."); 3135 mangled_name = OneByteString::New("foo.");
3136 bare_name = OneByteString::New("foo."); 3136 bare_name = OneByteString::New("foo.");
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
3249 // str1 - ExternalOneByteString, str2 - OneByteString. 3249 // str1 - ExternalOneByteString, str2 - OneByteString.
3250 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, bare_name)); 3250 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, bare_name));
3251 3251
3252 // str1 - ExternalOneByteString, str2 - ExternalOneByteString. 3252 // str1 - ExternalOneByteString, str2 - ExternalOneByteString.
3253 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bare_name)); 3253 EXPECT(String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bare_name));
3254 EXPECT( 3254 EXPECT(
3255 !String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bad_bare_name)); 3255 !String::EqualsIgnoringPrivateKey(ext_mangled_name, ext_bad_bare_name));
3256 } 3256 }
3257 3257
3258 3258
3259 VM_TEST_CASE(ArrayNew_Overflow_Crash) { 3259 ISOLATE_UNIT_TEST_CASE(ArrayNew_Overflow_Crash) {
3260 Array::Handle(Array::New(Array::kMaxElements + 1)); 3260 Array::Handle(Array::New(Array::kMaxElements + 1));
3261 } 3261 }
3262 3262
3263 3263
3264 TEST_CASE(StackTraceFormat) { 3264 TEST_CASE(StackTraceFormat) {
3265 const char* kScriptChars = 3265 const char* kScriptChars =
3266 "void baz() {\n" 3266 "void baz() {\n"
3267 " throw 'MyException';\n" 3267 " throw 'MyException';\n"
3268 "}\n" 3268 "}\n"
3269 "\n" 3269 "\n"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
3314 "#4 MyClass.field (test-lib:25:5)\n" 3314 "#4 MyClass.field (test-lib:25:5)\n"
3315 "#5 MyClass.foo.fooHelper (test-lib:30:7)\n" 3315 "#5 MyClass.foo.fooHelper (test-lib:30:7)\n"
3316 "#6 MyClass.foo (test-lib:32:14)\n" 3316 "#6 MyClass.foo (test-lib:32:14)\n"
3317 "#7 MyClass.MyClass.<anonymous closure> (test-lib:21:12)\n" 3317 "#7 MyClass.MyClass.<anonymous closure> (test-lib:21:12)\n"
3318 "#8 MyClass.MyClass (test-lib:21:18)\n" 3318 "#8 MyClass.MyClass (test-lib:21:18)\n"
3319 "#9 main.<anonymous closure> (test-lib:37:14)\n" 3319 "#9 main.<anonymous closure> (test-lib:37:14)\n"
3320 "#10 main (test-lib:37:24)"); 3320 "#10 main (test-lib:37:24)");
3321 } 3321 }
3322 3322
3323 3323
3324 VM_TEST_CASE(WeakProperty_PreserveCrossGen) { 3324 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveCrossGen) {
3325 Isolate* isolate = Isolate::Current(); 3325 Isolate* isolate = Isolate::Current();
3326 WeakProperty& weak = WeakProperty::Handle(); 3326 WeakProperty& weak = WeakProperty::Handle();
3327 { 3327 {
3328 // Weak property and value in new. Key in old. 3328 // Weak property and value in new. Key in old.
3329 HANDLESCOPE(thread); 3329 HANDLESCOPE(thread);
3330 String& key = String::Handle(); 3330 String& key = String::Handle();
3331 key ^= OneByteString::New("key", Heap::kOld); 3331 key ^= OneByteString::New("key", Heap::kOld);
3332 String& value = String::Handle(); 3332 String& value = String::Handle();
3333 value ^= OneByteString::New("value", Heap::kNew); 3333 value ^= OneByteString::New("value", Heap::kNew);
3334 weak ^= WeakProperty::New(Heap::kNew); 3334 weak ^= WeakProperty::New(Heap::kNew);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
3426 value ^= OneByteString::null(); 3426 value ^= OneByteString::null();
3427 } 3427 }
3428 isolate->heap()->CollectAllGarbage(); 3428 isolate->heap()->CollectAllGarbage();
3429 // Weak property key and value should survive due to cross-generation 3429 // Weak property key and value should survive due to cross-generation
3430 // pointers. 3430 // pointers.
3431 EXPECT(weak.key() != Object::null()); 3431 EXPECT(weak.key() != Object::null());
3432 EXPECT(weak.value() != Object::null()); 3432 EXPECT(weak.value() != Object::null());
3433 } 3433 }
3434 3434
3435 3435
3436 VM_TEST_CASE(WeakProperty_PreserveRecurse) { 3436 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveRecurse) {
3437 // This used to end in an infinite recursion. Caused by scavenging the weak 3437 // This used to end in an infinite recursion. Caused by scavenging the weak
3438 // property before scavenging the key. 3438 // property before scavenging the key.
3439 Isolate* isolate = Isolate::Current(); 3439 Isolate* isolate = Isolate::Current();
3440 WeakProperty& weak = WeakProperty::Handle(); 3440 WeakProperty& weak = WeakProperty::Handle();
3441 Array& arr = Array::Handle(Array::New(1)); 3441 Array& arr = Array::Handle(Array::New(1));
3442 { 3442 {
3443 HANDLESCOPE(thread); 3443 HANDLESCOPE(thread);
3444 String& key = String::Handle(); 3444 String& key = String::Handle();
3445 key ^= OneByteString::New("key"); 3445 key ^= OneByteString::New("key");
3446 arr.SetAt(0, key); 3446 arr.SetAt(0, key);
3447 String& value = String::Handle(); 3447 String& value = String::Handle();
3448 value ^= OneByteString::New("value"); 3448 value ^= OneByteString::New("value");
3449 weak ^= WeakProperty::New(); 3449 weak ^= WeakProperty::New();
3450 weak.set_key(key); 3450 weak.set_key(key);
3451 weak.set_value(value); 3451 weak.set_value(value);
3452 } 3452 }
3453 isolate->heap()->CollectAllGarbage(); 3453 isolate->heap()->CollectAllGarbage();
3454 EXPECT(weak.key() != Object::null()); 3454 EXPECT(weak.key() != Object::null());
3455 EXPECT(weak.value() != Object::null()); 3455 EXPECT(weak.value() != Object::null());
3456 } 3456 }
3457 3457
3458 3458
3459 VM_TEST_CASE(WeakProperty_PreserveOne_NewSpace) { 3459 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveOne_NewSpace) {
3460 Isolate* isolate = Isolate::Current(); 3460 Isolate* isolate = Isolate::Current();
3461 WeakProperty& weak = WeakProperty::Handle(); 3461 WeakProperty& weak = WeakProperty::Handle();
3462 String& key = String::Handle(); 3462 String& key = String::Handle();
3463 key ^= OneByteString::New("key"); 3463 key ^= OneByteString::New("key");
3464 { 3464 {
3465 HANDLESCOPE(thread); 3465 HANDLESCOPE(thread);
3466 String& value = String::Handle(); 3466 String& value = String::Handle();
3467 value ^= OneByteString::New("value"); 3467 value ^= OneByteString::New("value");
3468 weak ^= WeakProperty::New(); 3468 weak ^= WeakProperty::New();
3469 weak.set_key(key); 3469 weak.set_key(key);
3470 weak.set_value(value); 3470 weak.set_value(value);
3471 } 3471 }
3472 isolate->heap()->CollectAllGarbage(); 3472 isolate->heap()->CollectAllGarbage();
3473 EXPECT(weak.key() != Object::null()); 3473 EXPECT(weak.key() != Object::null());
3474 EXPECT(weak.value() != Object::null()); 3474 EXPECT(weak.value() != Object::null());
3475 } 3475 }
3476 3476
3477 3477
3478 VM_TEST_CASE(WeakProperty_PreserveTwo_NewSpace) { 3478 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwo_NewSpace) {
3479 Isolate* isolate = Isolate::Current(); 3479 Isolate* isolate = Isolate::Current();
3480 WeakProperty& weak1 = WeakProperty::Handle(); 3480 WeakProperty& weak1 = WeakProperty::Handle();
3481 String& key1 = String::Handle(); 3481 String& key1 = String::Handle();
3482 key1 ^= OneByteString::New("key1"); 3482 key1 ^= OneByteString::New("key1");
3483 WeakProperty& weak2 = WeakProperty::Handle(); 3483 WeakProperty& weak2 = WeakProperty::Handle();
3484 String& key2 = String::Handle(); 3484 String& key2 = String::Handle();
3485 key2 ^= OneByteString::New("key2"); 3485 key2 ^= OneByteString::New("key2");
3486 { 3486 {
3487 HANDLESCOPE(thread); 3487 HANDLESCOPE(thread);
3488 String& value1 = String::Handle(); 3488 String& value1 = String::Handle();
3489 value1 ^= OneByteString::New("value1"); 3489 value1 ^= OneByteString::New("value1");
3490 weak1 ^= WeakProperty::New(); 3490 weak1 ^= WeakProperty::New();
3491 weak1.set_key(key1); 3491 weak1.set_key(key1);
3492 weak1.set_value(value1); 3492 weak1.set_value(value1);
3493 String& value2 = String::Handle(); 3493 String& value2 = String::Handle();
3494 value2 ^= OneByteString::New("value2"); 3494 value2 ^= OneByteString::New("value2");
3495 weak2 ^= WeakProperty::New(); 3495 weak2 ^= WeakProperty::New();
3496 weak2.set_key(key2); 3496 weak2.set_key(key2);
3497 weak2.set_value(value2); 3497 weak2.set_value(value2);
3498 } 3498 }
3499 isolate->heap()->CollectAllGarbage(); 3499 isolate->heap()->CollectAllGarbage();
3500 EXPECT(weak1.key() != Object::null()); 3500 EXPECT(weak1.key() != Object::null());
3501 EXPECT(weak1.value() != Object::null()); 3501 EXPECT(weak1.value() != Object::null());
3502 EXPECT(weak2.key() != Object::null()); 3502 EXPECT(weak2.key() != Object::null());
3503 EXPECT(weak2.value() != Object::null()); 3503 EXPECT(weak2.value() != Object::null());
3504 } 3504 }
3505 3505
3506 3506
3507 VM_TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) { 3507 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwoShared_NewSpace) {
3508 Isolate* isolate = Isolate::Current(); 3508 Isolate* isolate = Isolate::Current();
3509 WeakProperty& weak1 = WeakProperty::Handle(); 3509 WeakProperty& weak1 = WeakProperty::Handle();
3510 WeakProperty& weak2 = WeakProperty::Handle(); 3510 WeakProperty& weak2 = WeakProperty::Handle();
3511 String& key = String::Handle(); 3511 String& key = String::Handle();
3512 key ^= OneByteString::New("key"); 3512 key ^= OneByteString::New("key");
3513 { 3513 {
3514 HANDLESCOPE(thread); 3514 HANDLESCOPE(thread);
3515 String& value1 = String::Handle(); 3515 String& value1 = String::Handle();
3516 value1 ^= OneByteString::New("value1"); 3516 value1 ^= OneByteString::New("value1");
3517 weak1 ^= WeakProperty::New(); 3517 weak1 ^= WeakProperty::New();
3518 weak1.set_key(key); 3518 weak1.set_key(key);
3519 weak1.set_value(value1); 3519 weak1.set_value(value1);
3520 String& value2 = String::Handle(); 3520 String& value2 = String::Handle();
3521 value2 ^= OneByteString::New("value2"); 3521 value2 ^= OneByteString::New("value2");
3522 weak2 ^= WeakProperty::New(); 3522 weak2 ^= WeakProperty::New();
3523 weak2.set_key(key); 3523 weak2.set_key(key);
3524 weak2.set_value(value2); 3524 weak2.set_value(value2);
3525 } 3525 }
3526 isolate->heap()->CollectAllGarbage(); 3526 isolate->heap()->CollectAllGarbage();
3527 EXPECT(weak1.key() != Object::null()); 3527 EXPECT(weak1.key() != Object::null());
3528 EXPECT(weak1.value() != Object::null()); 3528 EXPECT(weak1.value() != Object::null());
3529 EXPECT(weak2.key() != Object::null()); 3529 EXPECT(weak2.key() != Object::null());
3530 EXPECT(weak2.value() != Object::null()); 3530 EXPECT(weak2.value() != Object::null());
3531 } 3531 }
3532 3532
3533 3533
3534 VM_TEST_CASE(WeakProperty_PreserveOne_OldSpace) { 3534 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveOne_OldSpace) {
3535 Isolate* isolate = Isolate::Current(); 3535 Isolate* isolate = Isolate::Current();
3536 WeakProperty& weak = WeakProperty::Handle(); 3536 WeakProperty& weak = WeakProperty::Handle();
3537 String& key = String::Handle(); 3537 String& key = String::Handle();
3538 key ^= OneByteString::New("key", Heap::kOld); 3538 key ^= OneByteString::New("key", Heap::kOld);
3539 { 3539 {
3540 HANDLESCOPE(thread); 3540 HANDLESCOPE(thread);
3541 String& value = String::Handle(); 3541 String& value = String::Handle();
3542 value ^= OneByteString::New("value", Heap::kOld); 3542 value ^= OneByteString::New("value", Heap::kOld);
3543 weak ^= WeakProperty::New(Heap::kOld); 3543 weak ^= WeakProperty::New(Heap::kOld);
3544 weak.set_key(key); 3544 weak.set_key(key);
3545 weak.set_value(value); 3545 weak.set_value(value);
3546 } 3546 }
3547 isolate->heap()->CollectAllGarbage(); 3547 isolate->heap()->CollectAllGarbage();
3548 EXPECT(weak.key() != Object::null()); 3548 EXPECT(weak.key() != Object::null());
3549 EXPECT(weak.value() != Object::null()); 3549 EXPECT(weak.value() != Object::null());
3550 } 3550 }
3551 3551
3552 3552
3553 VM_TEST_CASE(WeakProperty_PreserveTwo_OldSpace) { 3553 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwo_OldSpace) {
3554 Isolate* isolate = Isolate::Current(); 3554 Isolate* isolate = Isolate::Current();
3555 WeakProperty& weak1 = WeakProperty::Handle(); 3555 WeakProperty& weak1 = WeakProperty::Handle();
3556 String& key1 = String::Handle(); 3556 String& key1 = String::Handle();
3557 key1 ^= OneByteString::New("key1", Heap::kOld); 3557 key1 ^= OneByteString::New("key1", Heap::kOld);
3558 WeakProperty& weak2 = WeakProperty::Handle(); 3558 WeakProperty& weak2 = WeakProperty::Handle();
3559 String& key2 = String::Handle(); 3559 String& key2 = String::Handle();
3560 key2 ^= OneByteString::New("key2", Heap::kOld); 3560 key2 ^= OneByteString::New("key2", Heap::kOld);
3561 { 3561 {
3562 HANDLESCOPE(thread); 3562 HANDLESCOPE(thread);
3563 String& value1 = String::Handle(); 3563 String& value1 = String::Handle();
3564 value1 ^= OneByteString::New("value1", Heap::kOld); 3564 value1 ^= OneByteString::New("value1", Heap::kOld);
3565 weak1 ^= WeakProperty::New(Heap::kOld); 3565 weak1 ^= WeakProperty::New(Heap::kOld);
3566 weak1.set_key(key1); 3566 weak1.set_key(key1);
3567 weak1.set_value(value1); 3567 weak1.set_value(value1);
3568 String& value2 = String::Handle(); 3568 String& value2 = String::Handle();
3569 value2 ^= OneByteString::New("value2", Heap::kOld); 3569 value2 ^= OneByteString::New("value2", Heap::kOld);
3570 weak2 ^= WeakProperty::New(Heap::kOld); 3570 weak2 ^= WeakProperty::New(Heap::kOld);
3571 weak2.set_key(key2); 3571 weak2.set_key(key2);
3572 weak2.set_value(value2); 3572 weak2.set_value(value2);
3573 } 3573 }
3574 isolate->heap()->CollectAllGarbage(); 3574 isolate->heap()->CollectAllGarbage();
3575 EXPECT(weak1.key() != Object::null()); 3575 EXPECT(weak1.key() != Object::null());
3576 EXPECT(weak1.value() != Object::null()); 3576 EXPECT(weak1.value() != Object::null());
3577 EXPECT(weak2.key() != Object::null()); 3577 EXPECT(weak2.key() != Object::null());
3578 EXPECT(weak2.value() != Object::null()); 3578 EXPECT(weak2.value() != Object::null());
3579 } 3579 }
3580 3580
3581 3581
3582 VM_TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) { 3582 ISOLATE_UNIT_TEST_CASE(WeakProperty_PreserveTwoShared_OldSpace) {
3583 Isolate* isolate = Isolate::Current(); 3583 Isolate* isolate = Isolate::Current();
3584 WeakProperty& weak1 = WeakProperty::Handle(); 3584 WeakProperty& weak1 = WeakProperty::Handle();
3585 WeakProperty& weak2 = WeakProperty::Handle(); 3585 WeakProperty& weak2 = WeakProperty::Handle();
3586 String& key = String::Handle(); 3586 String& key = String::Handle();
3587 key ^= OneByteString::New("key", Heap::kOld); 3587 key ^= OneByteString::New("key", Heap::kOld);
3588 { 3588 {
3589 HANDLESCOPE(thread); 3589 HANDLESCOPE(thread);
3590 String& value1 = String::Handle(); 3590 String& value1 = String::Handle();
3591 value1 ^= OneByteString::New("value1", Heap::kOld); 3591 value1 ^= OneByteString::New("value1", Heap::kOld);
3592 weak1 ^= WeakProperty::New(Heap::kOld); 3592 weak1 ^= WeakProperty::New(Heap::kOld);
3593 weak1.set_key(key); 3593 weak1.set_key(key);
3594 weak1.set_value(value1); 3594 weak1.set_value(value1);
3595 String& value2 = String::Handle(); 3595 String& value2 = String::Handle();
3596 value2 ^= OneByteString::New("value2", Heap::kOld); 3596 value2 ^= OneByteString::New("value2", Heap::kOld);
3597 weak2 ^= WeakProperty::New(Heap::kOld); 3597 weak2 ^= WeakProperty::New(Heap::kOld);
3598 weak2.set_key(key); 3598 weak2.set_key(key);
3599 weak2.set_value(value2); 3599 weak2.set_value(value2);
3600 } 3600 }
3601 isolate->heap()->CollectAllGarbage(); 3601 isolate->heap()->CollectAllGarbage();
3602 EXPECT(weak1.key() != Object::null()); 3602 EXPECT(weak1.key() != Object::null());
3603 EXPECT(weak1.value() != Object::null()); 3603 EXPECT(weak1.value() != Object::null());
3604 EXPECT(weak2.key() != Object::null()); 3604 EXPECT(weak2.key() != Object::null());
3605 EXPECT(weak2.value() != Object::null()); 3605 EXPECT(weak2.value() != Object::null());
3606 } 3606 }
3607 3607
3608 3608
3609 VM_TEST_CASE(WeakProperty_ClearOne_NewSpace) { 3609 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearOne_NewSpace) {
3610 Isolate* isolate = Isolate::Current(); 3610 Isolate* isolate = Isolate::Current();
3611 WeakProperty& weak = WeakProperty::Handle(); 3611 WeakProperty& weak = WeakProperty::Handle();
3612 { 3612 {
3613 HANDLESCOPE(thread); 3613 HANDLESCOPE(thread);
3614 String& key = String::Handle(); 3614 String& key = String::Handle();
3615 key ^= OneByteString::New("key"); 3615 key ^= OneByteString::New("key");
3616 String& value = String::Handle(); 3616 String& value = String::Handle();
3617 value ^= OneByteString::New("value"); 3617 value ^= OneByteString::New("value");
3618 weak ^= WeakProperty::New(); 3618 weak ^= WeakProperty::New();
3619 weak.set_key(key); 3619 weak.set_key(key);
3620 weak.set_value(value); 3620 weak.set_value(value);
3621 key ^= OneByteString::null(); 3621 key ^= OneByteString::null();
3622 value ^= OneByteString::null(); 3622 value ^= OneByteString::null();
3623 } 3623 }
3624 isolate->heap()->CollectAllGarbage(); 3624 isolate->heap()->CollectAllGarbage();
3625 EXPECT(weak.key() == Object::null()); 3625 EXPECT(weak.key() == Object::null());
3626 EXPECT(weak.value() == Object::null()); 3626 EXPECT(weak.value() == Object::null());
3627 } 3627 }
3628 3628
3629 3629
3630 VM_TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) { 3630 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearTwoShared_NewSpace) {
3631 Isolate* isolate = Isolate::Current(); 3631 Isolate* isolate = Isolate::Current();
3632 WeakProperty& weak1 = WeakProperty::Handle(); 3632 WeakProperty& weak1 = WeakProperty::Handle();
3633 WeakProperty& weak2 = WeakProperty::Handle(); 3633 WeakProperty& weak2 = WeakProperty::Handle();
3634 { 3634 {
3635 HANDLESCOPE(thread); 3635 HANDLESCOPE(thread);
3636 String& key = String::Handle(); 3636 String& key = String::Handle();
3637 key ^= OneByteString::New("key"); 3637 key ^= OneByteString::New("key");
3638 String& value1 = String::Handle(); 3638 String& value1 = String::Handle();
3639 value1 ^= OneByteString::New("value1"); 3639 value1 ^= OneByteString::New("value1");
3640 weak1 ^= WeakProperty::New(); 3640 weak1 ^= WeakProperty::New();
3641 weak1.set_key(key); 3641 weak1.set_key(key);
3642 weak1.set_value(value1); 3642 weak1.set_value(value1);
3643 String& value2 = String::Handle(); 3643 String& value2 = String::Handle();
3644 value2 ^= OneByteString::New("value2"); 3644 value2 ^= OneByteString::New("value2");
3645 weak2 ^= WeakProperty::New(); 3645 weak2 ^= WeakProperty::New();
3646 weak2.set_key(key); 3646 weak2.set_key(key);
3647 weak2.set_value(value2); 3647 weak2.set_value(value2);
3648 } 3648 }
3649 isolate->heap()->CollectAllGarbage(); 3649 isolate->heap()->CollectAllGarbage();
3650 EXPECT(weak1.key() == Object::null()); 3650 EXPECT(weak1.key() == Object::null());
3651 EXPECT(weak1.value() == Object::null()); 3651 EXPECT(weak1.value() == Object::null());
3652 EXPECT(weak2.key() == Object::null()); 3652 EXPECT(weak2.key() == Object::null());
3653 EXPECT(weak2.value() == Object::null()); 3653 EXPECT(weak2.value() == Object::null());
3654 } 3654 }
3655 3655
3656 3656
3657 VM_TEST_CASE(WeakProperty_ClearOne_OldSpace) { 3657 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearOne_OldSpace) {
3658 Isolate* isolate = Isolate::Current(); 3658 Isolate* isolate = Isolate::Current();
3659 WeakProperty& weak = WeakProperty::Handle(); 3659 WeakProperty& weak = WeakProperty::Handle();
3660 { 3660 {
3661 HANDLESCOPE(thread); 3661 HANDLESCOPE(thread);
3662 String& key = String::Handle(); 3662 String& key = String::Handle();
3663 key ^= OneByteString::New("key", Heap::kOld); 3663 key ^= OneByteString::New("key", Heap::kOld);
3664 String& value = String::Handle(); 3664 String& value = String::Handle();
3665 value ^= OneByteString::New("value", Heap::kOld); 3665 value ^= OneByteString::New("value", Heap::kOld);
3666 weak ^= WeakProperty::New(Heap::kOld); 3666 weak ^= WeakProperty::New(Heap::kOld);
3667 weak.set_key(key); 3667 weak.set_key(key);
3668 weak.set_value(value); 3668 weak.set_value(value);
3669 key ^= OneByteString::null(); 3669 key ^= OneByteString::null();
3670 value ^= OneByteString::null(); 3670 value ^= OneByteString::null();
3671 } 3671 }
3672 isolate->heap()->CollectAllGarbage(); 3672 isolate->heap()->CollectAllGarbage();
3673 EXPECT(weak.key() == Object::null()); 3673 EXPECT(weak.key() == Object::null());
3674 EXPECT(weak.value() == Object::null()); 3674 EXPECT(weak.value() == Object::null());
3675 } 3675 }
3676 3676
3677 3677
3678 VM_TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) { 3678 ISOLATE_UNIT_TEST_CASE(WeakProperty_ClearTwoShared_OldSpace) {
3679 Isolate* isolate = Isolate::Current(); 3679 Isolate* isolate = Isolate::Current();
3680 WeakProperty& weak1 = WeakProperty::Handle(); 3680 WeakProperty& weak1 = WeakProperty::Handle();
3681 WeakProperty& weak2 = WeakProperty::Handle(); 3681 WeakProperty& weak2 = WeakProperty::Handle();
3682 { 3682 {
3683 HANDLESCOPE(thread); 3683 HANDLESCOPE(thread);
3684 String& key = String::Handle(); 3684 String& key = String::Handle();
3685 key ^= OneByteString::New("key", Heap::kOld); 3685 key ^= OneByteString::New("key", Heap::kOld);
3686 String& value1 = String::Handle(); 3686 String& value1 = String::Handle();
3687 value1 ^= OneByteString::New("value1"); 3687 value1 ^= OneByteString::New("value1");
3688 weak1 ^= WeakProperty::New(Heap::kOld); 3688 weak1 ^= WeakProperty::New(Heap::kOld);
3689 weak1.set_key(key); 3689 weak1.set_key(key);
3690 weak1.set_value(value1); 3690 weak1.set_value(value1);
3691 String& value2 = String::Handle(); 3691 String& value2 = String::Handle();
3692 value2 ^= OneByteString::New("value2", Heap::kOld); 3692 value2 ^= OneByteString::New("value2", Heap::kOld);
3693 weak2 ^= WeakProperty::New(Heap::kOld); 3693 weak2 ^= WeakProperty::New(Heap::kOld);
3694 weak2.set_key(key); 3694 weak2.set_key(key);
3695 weak2.set_value(value2); 3695 weak2.set_value(value2);
3696 } 3696 }
3697 isolate->heap()->CollectAllGarbage(); 3697 isolate->heap()->CollectAllGarbage();
3698 EXPECT(weak1.key() == Object::null()); 3698 EXPECT(weak1.key() == Object::null());
3699 EXPECT(weak1.value() == Object::null()); 3699 EXPECT(weak1.value() == Object::null());
3700 EXPECT(weak2.key() == Object::null()); 3700 EXPECT(weak2.key() == Object::null());
3701 EXPECT(weak2.value() == Object::null()); 3701 EXPECT(weak2.value() == Object::null());
3702 } 3702 }
3703 3703
3704 3704
3705 VM_TEST_CASE(MirrorReference) { 3705 ISOLATE_UNIT_TEST_CASE(MirrorReference) {
3706 const MirrorReference& reference = 3706 const MirrorReference& reference =
3707 MirrorReference::Handle(MirrorReference::New(Object::Handle())); 3707 MirrorReference::Handle(MirrorReference::New(Object::Handle()));
3708 Object& initial_referent = Object::Handle(reference.referent()); 3708 Object& initial_referent = Object::Handle(reference.referent());
3709 EXPECT(initial_referent.IsNull()); 3709 EXPECT(initial_referent.IsNull());
3710 3710
3711 Library& library = Library::Handle(Library::CoreLibrary()); 3711 Library& library = Library::Handle(Library::CoreLibrary());
3712 EXPECT(!library.IsNull()); 3712 EXPECT(!library.IsNull());
3713 EXPECT(library.IsLibrary()); 3713 EXPECT(library.IsLibrary());
3714 reference.set_referent(library); 3714 reference.set_referent(library);
3715 const Object& returned_referent = Object::Handle(reference.referent()); 3715 const Object& returned_referent = Object::Handle(reference.referent());
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3753 3753
3754 3754
3755 static RawClass* GetClass(const Library& lib, const char* name) { 3755 static RawClass* GetClass(const Library& lib, const char* name) {
3756 const Class& cls = Class::Handle( 3756 const Class& cls = Class::Handle(
3757 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name)))); 3757 lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
3758 EXPECT(!cls.IsNull()); // No ambiguity error expected. 3758 EXPECT(!cls.IsNull()); // No ambiguity error expected.
3759 return cls.raw(); 3759 return cls.raw();
3760 } 3760 }
3761 3761
3762 3762
3763 VM_TEST_CASE(FindClosureIndex) { 3763 ISOLATE_UNIT_TEST_CASE(FindClosureIndex) {
3764 // Allocate the class first. 3764 // Allocate the class first.
3765 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 3765 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
3766 const Script& script = Script::Handle(); 3766 const Script& script = Script::Handle();
3767 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 3767 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
3768 const Array& functions = Array::Handle(Array::New(1)); 3768 const Array& functions = Array::Handle(Array::New(1));
3769 const Isolate* iso = Isolate::Current(); 3769 const Isolate* iso = Isolate::Current();
3770 3770
3771 Function& parent = Function::Handle(); 3771 Function& parent = Function::Handle();
3772 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa")); 3772 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
3773 parent = 3773 parent =
(...skipping 17 matching lines...) Expand all
3791 EXPECT_EQ(bad_closure_index, -1); 3791 EXPECT_EQ(bad_closure_index, -1);
3792 3792
3793 // Retrieve closure function via index. 3793 // Retrieve closure function via index.
3794 Function& func_from_index = Function::Handle(); 3794 Function& func_from_index = Function::Handle();
3795 func_from_index ^= iso->ClosureFunctionFromIndex(good_closure_index); 3795 func_from_index ^= iso->ClosureFunctionFromIndex(good_closure_index);
3796 // Same closure function. 3796 // Same closure function.
3797 EXPECT_EQ(func_from_index.raw(), function.raw()); 3797 EXPECT_EQ(func_from_index.raw(), function.raw());
3798 } 3798 }
3799 3799
3800 3800
3801 VM_TEST_CASE(FindInvocationDispatcherFunctionIndex) { 3801 ISOLATE_UNIT_TEST_CASE(FindInvocationDispatcherFunctionIndex) {
3802 const String& class_name = String::Handle(Symbols::New(thread, "MyClass")); 3802 const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
3803 const Script& script = Script::Handle(); 3803 const Script& script = Script::Handle();
3804 const Class& cls = Class::Handle(CreateDummyClass(class_name, script)); 3804 const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
3805 ClassFinalizer::FinalizeTypesInClass(cls); 3805 ClassFinalizer::FinalizeTypesInClass(cls);
3806 3806
3807 const Array& functions = Array::Handle(Array::New(1)); 3807 const Array& functions = Array::Handle(Array::New(1));
3808 Function& parent = Function::Handle(); 3808 Function& parent = Function::Handle();
3809 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa")); 3809 const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
3810 parent = 3810 parent =
3811 Function::New(parent_name, RawFunction::kRegularFunction, false, false, 3811 Function::New(parent_name, RawFunction::kRegularFunction, false, false,
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
4044 const Function& func_b = Function::Handle(GetFunction(class_a, "b")); 4044 const Function& func_b = Function::Handle(GetFunction(class_a, "b"));
4045 EXPECT(func_b.CanBeInlined()); 4045 EXPECT(func_b.CanBeInlined());
4046 4046
4047 // After setting a breakpoint in a function A.b, it is no longer inlineable. 4047 // After setting a breakpoint in a function A.b, it is no longer inlineable.
4048 result = Dart_SetBreakpoint(NewString(TestCase::url()), kBreakpointLine); 4048 result = Dart_SetBreakpoint(NewString(TestCase::url()), kBreakpointLine);
4049 EXPECT_VALID(result); 4049 EXPECT_VALID(result);
4050 EXPECT(!func_b.CanBeInlined()); 4050 EXPECT(!func_b.CanBeInlined());
4051 } 4051 }
4052 4052
4053 4053
4054 VM_TEST_CASE(SpecialClassesHaveEmptyArrays) { 4054 ISOLATE_UNIT_TEST_CASE(SpecialClassesHaveEmptyArrays) {
4055 ObjectStore* object_store = Isolate::Current()->object_store(); 4055 ObjectStore* object_store = Isolate::Current()->object_store();
4056 Class& cls = Class::Handle(); 4056 Class& cls = Class::Handle();
4057 Object& array = Object::Handle(); 4057 Object& array = Object::Handle();
4058 4058
4059 cls = object_store->null_class(); 4059 cls = object_store->null_class();
4060 array = cls.fields(); 4060 array = cls.fields();
4061 EXPECT(!array.IsNull()); 4061 EXPECT(!array.IsNull());
4062 EXPECT(array.IsArray()); 4062 EXPECT(array.IsArray());
4063 array = cls.functions(); 4063 array = cls.functions();
4064 EXPECT(!array.IsNull()); 4064 EXPECT(!array.IsNull());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4100 return; 4100 return;
4101 } 4101 }
4102 objects_->Add(&handle); 4102 objects_->Add(&handle);
4103 } 4103 }
4104 4104
4105 private: 4105 private:
4106 GrowableArray<Object*>* objects_; 4106 GrowableArray<Object*>* objects_;
4107 }; 4107 };
4108 4108
4109 4109
4110 VM_TEST_CASE(PrintJSON) { 4110 ISOLATE_UNIT_TEST_CASE(PrintJSON) {
4111 Heap* heap = Isolate::Current()->heap(); 4111 Heap* heap = Isolate::Current()->heap();
4112 heap->CollectAllGarbage(); 4112 heap->CollectAllGarbage();
4113 GrowableArray<Object*> objects; 4113 GrowableArray<Object*> objects;
4114 ObjectAccumulator acc(&objects); 4114 ObjectAccumulator acc(&objects);
4115 heap->IterateObjects(&acc); 4115 heap->IterateObjects(&acc);
4116 for (intptr_t i = 0; i < objects.length(); ++i) { 4116 for (intptr_t i = 0; i < objects.length(); ++i) {
4117 JSONStream js; 4117 JSONStream js;
4118 objects[i]->PrintJSON(&js, false); 4118 objects[i]->PrintJSON(&js, false);
4119 EXPECT_SUBSTRING("\"type\":", js.ToCString()); 4119 EXPECT_SUBSTRING("\"type\":", js.ToCString());
4120 } 4120 }
4121 } 4121 }
4122 4122
4123 4123
4124 VM_TEST_CASE(PrintJSONPrimitives) { 4124 ISOLATE_UNIT_TEST_CASE(PrintJSONPrimitives) {
4125 char buffer[1024]; 4125 char buffer[1024];
4126 Isolate* isolate = Isolate::Current(); 4126 Isolate* isolate = Isolate::Current();
4127 4127
4128 // Class reference 4128 // Class reference
4129 { 4129 {
4130 JSONStream js; 4130 JSONStream js;
4131 Class& cls = Class::Handle(isolate->object_store()->bool_class()); 4131 Class& cls = Class::Handle(isolate->object_store()->bool_class());
4132 cls.PrintJSON(&js, true); 4132 cls.PrintJSON(&js, true);
4133 ElideJSONSubstring("classes", js.ToCString(), buffer); 4133 ElideJSONSubstring("classes", js.ToCString(), buffer);
4134 EXPECT_STREQ( 4134 EXPECT_STREQ(
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
4584 pieces.Add(*data[i]); 4584 pieces.Add(*data[i]);
4585 array.SetAt(i, *data[i]); 4585 array.SetAt(i, *data[i]);
4586 } 4586 }
4587 const String& res1 = 4587 const String& res1 =
4588 String::Handle(zone, Symbols::FromConcatAll(thread, pieces)); 4588 String::Handle(zone, Symbols::FromConcatAll(thread, pieces));
4589 const String& res2 = String::Handle(zone, String::ConcatAll(array)); 4589 const String& res2 = String::Handle(zone, String::ConcatAll(array));
4590 EXPECT(res1.Equals(res2)); 4590 EXPECT(res1.Equals(res2));
4591 } 4591 }
4592 4592
4593 4593
4594 VM_TEST_CASE(Symbols_FromConcatAll) { 4594 ISOLATE_UNIT_TEST_CASE(Symbols_FromConcatAll) {
4595 { 4595 {
4596 const String* data[3] = {&Symbols::FallThroughError(), &Symbols::Dot(), 4596 const String* data[3] = {&Symbols::FallThroughError(), &Symbols::Dot(),
4597 &Symbols::isPaused()}; 4597 &Symbols::isPaused()};
4598 CheckConcatAll(data, 3); 4598 CheckConcatAll(data, 3);
4599 } 4599 }
4600 4600
4601 { 4601 {
4602 const intptr_t kWideCharsLen = 7; 4602 const intptr_t kWideCharsLen = 7;
4603 uint16_t wide_chars[kWideCharsLen] = {'H', 'e', 'l', 'l', 'o', 256, '!'}; 4603 uint16_t wide_chars[kWideCharsLen] = {'H', 'e', 'l', 'l', 'o', 256, '!'};
4604 const String& two_str = 4604 const String& two_str =
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
4654 } 4654 }
4655 } 4655 }
4656 4656
4657 4657
4658 struct TestResult { 4658 struct TestResult {
4659 const char* in; 4659 const char* in;
4660 const char* out; 4660 const char* out;
4661 }; 4661 };
4662 4662
4663 4663
4664 VM_TEST_CASE(String_ScrubName) { 4664 ISOLATE_UNIT_TEST_CASE(String_ScrubName) {
4665 TestResult tests[] = { 4665 TestResult tests[] = {
4666 {"(dynamic, dynamic) => void", "(dynamic, dynamic) => void"}, 4666 {"(dynamic, dynamic) => void", "(dynamic, dynamic) => void"},
4667 {"_List@915557746", "_List"}, 4667 {"_List@915557746", "_List"},
4668 {"_HashMap@600006304<K, V>(dynamic) => V", 4668 {"_HashMap@600006304<K, V>(dynamic) => V",
4669 "_HashMap<K, V>(dynamic) => V"}, 4669 "_HashMap<K, V>(dynamic) => V"},
4670 {"set:foo", "foo="}, 4670 {"set:foo", "foo="},
4671 {"get:foo", "foo"}, 4671 {"get:foo", "foo"},
4672 {"_ReceivePortImpl@709387912", "_ReceivePortImpl"}, 4672 {"_ReceivePortImpl@709387912", "_ReceivePortImpl"},
4673 {"_ReceivePortImpl@709387912._internal@709387912", 4673 {"_ReceivePortImpl@709387912._internal@709387912",
4674 "_ReceivePortImpl._internal"}, 4674 "_ReceivePortImpl._internal"},
4675 {"_C@6328321&_E@6328321&_F@6328321", "_C&_E&_F"}, 4675 {"_C@6328321&_E@6328321&_F@6328321", "_C&_E&_F"},
4676 {"List.", "List"}, 4676 {"List.", "List"},
4677 {"get:foo@6328321", "foo"}, 4677 {"get:foo@6328321", "foo"},
4678 {"_MyClass@6328321.", "_MyClass"}, 4678 {"_MyClass@6328321.", "_MyClass"},
4679 {"_MyClass@6328321.named", "_MyClass.named"}, 4679 {"_MyClass@6328321.named", "_MyClass.named"},
4680 }; 4680 };
4681 String& test = String::Handle(); 4681 String& test = String::Handle();
4682 String& result = String::Handle(); 4682 String& result = String::Handle();
4683 for (size_t i = 0; i < ARRAY_SIZE(tests); i++) { 4683 for (size_t i = 0; i < ARRAY_SIZE(tests); i++) {
4684 test = String::New(tests[i].in); 4684 test = String::New(tests[i].in);
4685 result = String::ScrubName(test); 4685 result = String::ScrubName(test);
4686 EXPECT_STREQ(tests[i].out, result.ToCString()); 4686 EXPECT_STREQ(tests[i].out, result.ToCString());
4687 } 4687 }
4688 } 4688 }
4689 4689
4690 4690
4691 VM_TEST_CASE(String_EqualsUTF32) { 4691 ISOLATE_UNIT_TEST_CASE(String_EqualsUTF32) {
4692 // Regression test for Issue 27433. Checks that comparisons between Strings 4692 // Regression test for Issue 27433. Checks that comparisons between Strings
4693 // and utf32 arrays happens after conversion to utf16 instead of utf32, as 4693 // and utf32 arrays happens after conversion to utf16 instead of utf32, as
4694 // required for proper canonicalization of string literals with a lossy 4694 // required for proper canonicalization of string literals with a lossy
4695 // utf32->utf16 conversion. 4695 // utf32->utf16 conversion.
4696 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff, 4696 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff,
4697 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff}; 4697 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff};
4698 4698
4699 const String& str = 4699 const String& str =
4700 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes))); 4700 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes)));
4701 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes))); 4701 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes)));
4702 } 4702 }
4703 4703
4704 } // namespace dart 4704 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object_id_ring_test.cc ('k') | runtime/vm/os_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698