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

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

Issue 1473403003: Move ApiLocalScope out of class ApiState into class Thread so that the API local handles and zone e… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: code-review-patch Created 5 years 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/dart_api_impl.cc ('k') | runtime/vm/dart_api_state.h » ('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 "bin/builtin.h" 5 #include "bin/builtin.h"
6 #include "include/dart_api.h" 6 #include "include/dart_api.h"
7 #include "include/dart_mirrors_api.h" 7 #include "include/dart_mirrors_api.h"
8 #include "include/dart_native_api.h" 8 #include "include/dart_native_api.h"
9 #include "include/dart_tools_api.h" 9 #include "include/dart_tools_api.h"
10 #include "platform/assert.h" 10 #include "platform/assert.h"
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 390 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
391 EXPECT_VALID(result); 391 EXPECT_VALID(result);
392 EXPECT(Dart_IsInteger(result)); 392 EXPECT(Dart_IsInteger(result));
393 int64_t value = 0; 393 int64_t value = 0;
394 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 394 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
395 EXPECT_EQ(42, value); 395 EXPECT_EQ(42, value);
396 } 396 }
397 397
398 398
399 TEST_CASE(ErrorHandleTypes) { 399 TEST_CASE(ErrorHandleTypes) {
400 Isolate* isolate = Isolate::Current();
401 const String& compile_message = String::Handle(String::New("CompileError")); 400 const String& compile_message = String::Handle(String::New("CompileError"));
402 const String& fatal_message = String::Handle(String::New("FatalError")); 401 const String& fatal_message = String::Handle(String::New("FatalError"));
403 402
404 Dart_Handle not_error = NewString("NotError"); 403 Dart_Handle not_error = NewString("NotError");
405 Dart_Handle api_error = Api::NewError("Api%s", "Error"); 404 Dart_Handle api_error = Api::NewError("Api%s", "Error");
406 Dart_Handle exception_error = 405 Dart_Handle exception_error =
407 Dart_NewUnhandledExceptionError(NewString("ExceptionError")); 406 Dart_NewUnhandledExceptionError(NewString("ExceptionError"));
408 Dart_Handle compile_error = 407 Dart_Handle compile_error =
409 Api::NewHandle(isolate, LanguageError::New(compile_message)); 408 Api::NewHandle(thread, LanguageError::New(compile_message));
410 Dart_Handle fatal_error = 409 Dart_Handle fatal_error =
411 Api::NewHandle(isolate, UnwindError::New(fatal_message)); 410 Api::NewHandle(thread, UnwindError::New(fatal_message));
412 411
413 EXPECT_VALID(not_error); 412 EXPECT_VALID(not_error);
414 EXPECT(Dart_IsError(api_error)); 413 EXPECT(Dart_IsError(api_error));
415 EXPECT(Dart_IsError(exception_error)); 414 EXPECT(Dart_IsError(exception_error));
416 EXPECT(Dart_IsError(compile_error)); 415 EXPECT(Dart_IsError(compile_error));
417 EXPECT(Dart_IsError(fatal_error)); 416 EXPECT(Dart_IsError(fatal_error));
418 417
419 EXPECT(!Dart_IsApiError(not_error)); 418 EXPECT(!Dart_IsApiError(not_error));
420 EXPECT(Dart_IsApiError(api_error)); 419 EXPECT(Dart_IsApiError(api_error));
421 EXPECT(!Dart_IsApiError(exception_error)); 420 EXPECT(!Dart_IsApiError(exception_error));
(...skipping 21 matching lines...) Expand all
443 EXPECT_STREQ("", Dart_GetError(not_error)); 442 EXPECT_STREQ("", Dart_GetError(not_error));
444 EXPECT_STREQ("ApiError", Dart_GetError(api_error)); 443 EXPECT_STREQ("ApiError", Dart_GetError(api_error));
445 EXPECT_SUBSTRING("Unhandled exception:\nExceptionError", 444 EXPECT_SUBSTRING("Unhandled exception:\nExceptionError",
446 Dart_GetError(exception_error)); 445 Dart_GetError(exception_error));
447 EXPECT_STREQ("CompileError", Dart_GetError(compile_error)); 446 EXPECT_STREQ("CompileError", Dart_GetError(compile_error));
448 EXPECT_STREQ("FatalError", Dart_GetError(fatal_error)); 447 EXPECT_STREQ("FatalError", Dart_GetError(fatal_error));
449 } 448 }
450 449
451 450
452 TEST_CASE(UnhandleExceptionError) { 451 TEST_CASE(UnhandleExceptionError) {
453 Isolate* isolate = Isolate::Current();
454 const char* exception_cstr = ""; 452 const char* exception_cstr = "";
455 453
456 // Test with an API Error. 454 // Test with an API Error.
457 const char* kApiError = "Api Error Exception Test."; 455 const char* kApiError = "Api Error Exception Test.";
458 Dart_Handle api_error = Api::NewHandle( 456 Dart_Handle api_error = Api::NewHandle(
459 isolate, 457 thread,
460 ApiError::New(String::Handle(String::New(kApiError)))); 458 ApiError::New(String::Handle(String::New(kApiError))));
461 Dart_Handle exception_error = Dart_NewUnhandledExceptionError(api_error); 459 Dart_Handle exception_error = Dart_NewUnhandledExceptionError(api_error);
462 EXPECT(!Dart_IsApiError(exception_error)); 460 EXPECT(!Dart_IsApiError(exception_error));
463 EXPECT(Dart_IsUnhandledExceptionError(exception_error)); 461 EXPECT(Dart_IsUnhandledExceptionError(exception_error));
464 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error))); 462 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error)));
465 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error), 463 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error),
466 &exception_cstr)); 464 &exception_cstr));
467 EXPECT_STREQ(kApiError, exception_cstr); 465 EXPECT_STREQ(kApiError, exception_cstr);
468 466
469 // Test with a Compilation Error. 467 // Test with a Compilation Error.
470 const char* kCompileError = "CompileError Exception Test."; 468 const char* kCompileError = "CompileError Exception Test.";
471 const String& compile_message = 469 const String& compile_message =
472 String::Handle(String::New(kCompileError)); 470 String::Handle(String::New(kCompileError));
473 Dart_Handle compile_error = 471 Dart_Handle compile_error =
474 Api::NewHandle(isolate, LanguageError::New(compile_message)); 472 Api::NewHandle(thread, LanguageError::New(compile_message));
475 exception_error = Dart_NewUnhandledExceptionError(compile_error); 473 exception_error = Dart_NewUnhandledExceptionError(compile_error);
476 EXPECT(!Dart_IsApiError(exception_error)); 474 EXPECT(!Dart_IsApiError(exception_error));
477 EXPECT(Dart_IsUnhandledExceptionError(exception_error)); 475 EXPECT(Dart_IsUnhandledExceptionError(exception_error));
478 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error))); 476 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error)));
479 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error), 477 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error),
480 &exception_cstr)); 478 &exception_cstr));
481 EXPECT_STREQ(kCompileError, exception_cstr); 479 EXPECT_STREQ(kCompileError, exception_cstr);
482 480
483 // Test with a Fatal Error. 481 // Test with a Fatal Error.
484 const String& fatal_message = 482 const String& fatal_message =
485 String::Handle(String::New("FatalError Exception Test.")); 483 String::Handle(String::New("FatalError Exception Test."));
486 Dart_Handle fatal_error = 484 Dart_Handle fatal_error =
487 Api::NewHandle(isolate, UnwindError::New(fatal_message)); 485 Api::NewHandle(thread, UnwindError::New(fatal_message));
488 exception_error = Dart_NewUnhandledExceptionError(fatal_error); 486 exception_error = Dart_NewUnhandledExceptionError(fatal_error);
489 EXPECT(Dart_IsError(exception_error)); 487 EXPECT(Dart_IsError(exception_error));
490 EXPECT(!Dart_IsUnhandledExceptionError(exception_error)); 488 EXPECT(!Dart_IsUnhandledExceptionError(exception_error));
491 489
492 // Test with a Regular object. 490 // Test with a Regular object.
493 const char* kRegularString = "Regular String Exception Test."; 491 const char* kRegularString = "Regular String Exception Test.";
494 Dart_Handle obj = Api::NewHandle(isolate, String::New(kRegularString)); 492 Dart_Handle obj = Api::NewHandle(thread, String::New(kRegularString));
495 exception_error = Dart_NewUnhandledExceptionError(obj); 493 exception_error = Dart_NewUnhandledExceptionError(obj);
496 EXPECT(!Dart_IsApiError(exception_error)); 494 EXPECT(!Dart_IsApiError(exception_error));
497 EXPECT(Dart_IsUnhandledExceptionError(exception_error)); 495 EXPECT(Dart_IsUnhandledExceptionError(exception_error));
498 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error))); 496 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error)));
499 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error), 497 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error),
500 &exception_cstr)); 498 &exception_cstr));
501 EXPECT_STREQ(kRegularString, exception_cstr); 499 EXPECT_STREQ(kRegularString, exception_cstr);
502 } 500 }
503 501
504 502
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 EXPECT(!Dart_IdentityEquals(five, mint)); 608 EXPECT(!Dart_IdentityEquals(five, mint));
611 EXPECT(!Dart_IdentityEquals(abc, xyz)); 609 EXPECT(!Dart_IdentityEquals(abc, xyz));
612 610
613 // Case where identical() is not the same as pointer equality. 611 // Case where identical() is not the same as pointer equality.
614 Dart_Handle nan1 = Dart_NewDouble(NAN); 612 Dart_Handle nan1 = Dart_NewDouble(NAN);
615 Dart_Handle nan2 = Dart_NewDouble(NAN); 613 Dart_Handle nan2 = Dart_NewDouble(NAN);
616 EXPECT(Dart_IdentityEquals(nan1, nan2)); 614 EXPECT(Dart_IdentityEquals(nan1, nan2));
617 615
618 // Non-instance objects. 616 // Non-instance objects.
619 { 617 {
620 DARTSCOPE(Thread::Current()); 618 DARTSCOPE(thread);
621 Dart_Handle lib1 = Dart_LookupLibrary(dart_core); 619 Dart_Handle lib1 = Dart_LookupLibrary(dart_core);
622 Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors); 620 Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors);
623 621
624 EXPECT(Dart_IdentityEquals(lib1, lib1)); 622 EXPECT(Dart_IdentityEquals(lib1, lib1));
625 EXPECT(Dart_IdentityEquals(lib2, lib2)); 623 EXPECT(Dart_IdentityEquals(lib2, lib2));
626 EXPECT(!Dart_IdentityEquals(lib1, lib2)); 624 EXPECT(!Dart_IdentityEquals(lib1, lib2));
627 625
628 // Mix instance and non-instance. 626 // Mix instance and non-instance.
629 EXPECT(!Dart_IdentityEquals(lib1, nan1)); 627 EXPECT(!Dart_IdentityEquals(lib1, nan1));
630 EXPECT(!Dart_IdentityEquals(nan1, lib1)); 628 EXPECT(!Dart_IdentityEquals(nan1, lib1));
(...skipping 24 matching lines...) Expand all
655 653
656 // Note abc and abc_again are not required to have equal identity hashes. 654 // Note abc and abc_again are not required to have equal identity hashes.
657 655
658 // Case where identical() is not the same as pointer equality. 656 // Case where identical() is not the same as pointer equality.
659 Dart_Handle nan1 = Dart_NewDouble(NAN); 657 Dart_Handle nan1 = Dart_NewDouble(NAN);
660 Dart_Handle nan2 = Dart_NewDouble(NAN); 658 Dart_Handle nan2 = Dart_NewDouble(NAN);
661 EXPECT_EQ(Dart_IdentityHash(nan1), Dart_IdentityHash(nan2)); 659 EXPECT_EQ(Dart_IdentityHash(nan1), Dart_IdentityHash(nan2));
662 660
663 // Non-instance objects. 661 // Non-instance objects.
664 { 662 {
665 DARTSCOPE(Thread::Current()); 663 DARTSCOPE(thread);
666 Dart_Handle lib1 = Dart_LookupLibrary(dart_core); 664 Dart_Handle lib1 = Dart_LookupLibrary(dart_core);
667 Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors); 665 Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors);
668 666
669 EXPECT_EQ(Dart_IdentityHash(lib1), Dart_IdentityHash(lib1)); 667 EXPECT_EQ(Dart_IdentityHash(lib1), Dart_IdentityHash(lib1));
670 EXPECT_EQ(Dart_IdentityHash(lib2), Dart_IdentityHash(lib2)); 668 EXPECT_EQ(Dart_IdentityHash(lib2), Dart_IdentityHash(lib2));
671 } 669 }
672 } 670 }
673 671
674 672
675 TEST_CASE(ObjectEquals) { 673 TEST_CASE(ObjectEquals) {
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 NULL); 1217 NULL);
1220 EXPECT_VALID(small8); 1218 EXPECT_VALID(small8);
1221 static const uint16_t small_data16[] = {'b', 'a', 'r'}; 1219 static const uint16_t small_data16[] = {'b', 'a', 'r'};
1222 Dart_Handle small16 = Dart_NewExternalUTF16String( 1220 Dart_Handle small16 = Dart_NewExternalUTF16String(
1223 small_data16, 1221 small_data16,
1224 ARRAY_SIZE(small_data16), 1222 ARRAY_SIZE(small_data16),
1225 NULL, 1223 NULL,
1226 NULL); 1224 NULL);
1227 EXPECT_VALID(small16); 1225 EXPECT_VALID(small16);
1228 { 1226 {
1229 DARTSCOPE(Thread::Current()); 1227 DARTSCOPE(thread);
1230 String& handle = String::Handle(); 1228 String& handle = String::Handle();
1231 handle ^= Api::UnwrapHandle(big8); 1229 handle ^= Api::UnwrapHandle(big8);
1232 EXPECT(handle.IsOld()); 1230 EXPECT(handle.IsOld());
1233 handle ^= Api::UnwrapHandle(big16); 1231 handle ^= Api::UnwrapHandle(big16);
1234 EXPECT(handle.IsOld()); 1232 EXPECT(handle.IsOld());
1235 handle ^= Api::UnwrapHandle(small8); 1233 handle ^= Api::UnwrapHandle(small8);
1236 EXPECT(handle.IsNew()); 1234 EXPECT(handle.IsNew());
1237 handle ^= Api::UnwrapHandle(small16); 1235 handle ^= Api::UnwrapHandle(small16);
1238 EXPECT(handle.IsNew()); 1236 EXPECT(handle.IsNew());
1239 } 1237 }
(...skipping 13 matching lines...) Expand all
1253 kBigLength); 1251 kBigLength);
1254 EXPECT_VALID(big); 1252 EXPECT_VALID(big);
1255 static const int kSmallLength = 16*KB/8; 1253 static const int kSmallLength = 16*KB/8;
1256 int64_t* small_data = new int64_t[kSmallLength](); 1254 int64_t* small_data = new int64_t[kSmallLength]();
1257 Dart_Handle small = Dart_NewExternalTypedData( 1255 Dart_Handle small = Dart_NewExternalTypedData(
1258 Dart_TypedData_kInt64, 1256 Dart_TypedData_kInt64,
1259 small_data, 1257 small_data,
1260 kSmallLength); 1258 kSmallLength);
1261 EXPECT_VALID(small); 1259 EXPECT_VALID(small);
1262 { 1260 {
1263 DARTSCOPE(Thread::Current()); 1261 DARTSCOPE(thread);
1264 ExternalTypedData& handle = ExternalTypedData::Handle(); 1262 ExternalTypedData& handle = ExternalTypedData::Handle();
1265 handle ^= Api::UnwrapHandle(big); 1263 handle ^= Api::UnwrapHandle(big);
1266 EXPECT(handle.IsOld()); 1264 EXPECT(handle.IsOld());
1267 handle ^= Api::UnwrapHandle(small); 1265 handle ^= Api::UnwrapHandle(small);
1268 EXPECT(handle.IsNew()); 1266 EXPECT(handle.IsNew());
1269 } 1267 }
1270 Dart_ExitScope(); 1268 Dart_ExitScope();
1271 delete[] big_data; 1269 delete[] big_data;
1272 delete[] small_data; 1270 delete[] small_data;
1273 } 1271 }
(...skipping 1098 matching lines...) Expand 10 before | Expand all | Expand 10 after
2372 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 2370 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
2373 EXPECT(peer == 42); 2371 EXPECT(peer == 42);
2374 } 2372 }
2375 2373
2376 2374
2377 // Unit test for entering a scope, creating a local handle and exiting 2375 // Unit test for entering a scope, creating a local handle and exiting
2378 // the scope. 2376 // the scope.
2379 UNIT_TEST_CASE(EnterExitScope) { 2377 UNIT_TEST_CASE(EnterExitScope) {
2380 TestIsolateScope __test_isolate__; 2378 TestIsolateScope __test_isolate__;
2381 2379
2382 Isolate* isolate = Isolate::Current(); 2380 Thread* thread = Thread::Current();
2383 EXPECT(isolate != NULL); 2381 EXPECT(thread != NULL);
2384 ApiState* state = isolate->api_state(); 2382 ApiLocalScope* scope = thread->api_top_scope();
2385 EXPECT(state != NULL);
2386 ApiLocalScope* scope = state->top_scope();
2387 Dart_EnterScope(); 2383 Dart_EnterScope();
2388 { 2384 {
2389 EXPECT(state->top_scope() != NULL); 2385 EXPECT(thread->api_top_scope() != NULL);
2390 DARTSCOPE(Thread::Current()); 2386 DARTSCOPE(Thread::Current());
2391 const String& str1 = String::Handle(String::New("Test String")); 2387 const String& str1 = String::Handle(String::New("Test String"));
2392 Dart_Handle ref = Api::NewHandle(isolate, str1.raw()); 2388 Dart_Handle ref = Api::NewHandle(thread, str1.raw());
2393 String& str2 = String::Handle(); 2389 String& str2 = String::Handle();
2394 str2 ^= Api::UnwrapHandle(ref); 2390 str2 ^= Api::UnwrapHandle(ref);
2395 EXPECT(str1.Equals(str2)); 2391 EXPECT(str1.Equals(str2));
2396 } 2392 }
2397 Dart_ExitScope(); 2393 Dart_ExitScope();
2398 EXPECT(scope == state->top_scope()); 2394 EXPECT(scope == thread->api_top_scope());
2399 } 2395 }
2400 2396
2401 2397
2402 // Unit test for creating and deleting persistent handles. 2398 // Unit test for creating and deleting persistent handles.
2403 UNIT_TEST_CASE(PersistentHandles) { 2399 UNIT_TEST_CASE(PersistentHandles) {
2404 const char* kTestString1 = "Test String1"; 2400 const char* kTestString1 = "Test String1";
2405 const char* kTestString2 = "Test String2"; 2401 const char* kTestString2 = "Test String2";
2406 TestCase::CreateTestIsolate(); 2402 TestCase::CreateTestIsolate();
2407 Thread* thread = Thread::Current(); 2403 Thread* thread = Thread::Current();
2408 Isolate* isolate = thread->isolate(); 2404 Isolate* isolate = thread->isolate();
2409 EXPECT(isolate != NULL); 2405 EXPECT(isolate != NULL);
2410 ApiState* state = isolate->api_state(); 2406 ApiState* state = isolate->api_state();
2411 EXPECT(state != NULL); 2407 EXPECT(state != NULL);
2412 ApiLocalScope* scope = state->top_scope(); 2408 ApiLocalScope* scope = thread->api_top_scope();
2413 Dart_PersistentHandle handles[2000]; 2409 Dart_PersistentHandle handles[2000];
2414 Dart_EnterScope(); 2410 Dart_EnterScope();
2415 { 2411 {
2416 DARTSCOPE(Thread::Current()); 2412 DARTSCOPE(Thread::Current());
2417 Dart_Handle ref1 = Api::NewHandle(isolate, String::New(kTestString1)); 2413 Dart_Handle ref1 = Api::NewHandle(thread, String::New(kTestString1));
2418 for (int i = 0; i < 1000; i++) { 2414 for (int i = 0; i < 1000; i++) {
2419 handles[i] = Dart_NewPersistentHandle(ref1); 2415 handles[i] = Dart_NewPersistentHandle(ref1);
2420 } 2416 }
2421 Dart_EnterScope(); 2417 Dart_EnterScope();
2422 Dart_Handle ref2 = Api::NewHandle(isolate, String::New(kTestString2)); 2418 Dart_Handle ref2 = Api::NewHandle(thread, String::New(kTestString2));
2423 for (int i = 1000; i < 2000; i++) { 2419 for (int i = 1000; i < 2000; i++) {
2424 handles[i] = Dart_NewPersistentHandle(ref2); 2420 handles[i] = Dart_NewPersistentHandle(ref2);
2425 } 2421 }
2426 for (int i = 500; i < 1500; i++) { 2422 for (int i = 500; i < 1500; i++) {
2427 Dart_DeletePersistentHandle(handles[i]); 2423 Dart_DeletePersistentHandle(handles[i]);
2428 } 2424 }
2429 for (int i = 500; i < 1000; i++) { 2425 for (int i = 500; i < 1000; i++) {
2430 handles[i] = Dart_NewPersistentHandle(ref2); 2426 handles[i] = Dart_NewPersistentHandle(ref2);
2431 } 2427 }
2432 for (int i = 1000; i < 1500; i++) { 2428 for (int i = 1000; i < 1500; i++) {
(...skipping 20 matching lines...) Expand all
2453 String& str = String::Handle(); 2449 String& str = String::Handle();
2454 str ^= PersistentHandle::Cast(handles[i])->raw(); 2450 str ^= PersistentHandle::Cast(handles[i])->raw();
2455 EXPECT(str.Equals(kTestString1)); 2451 EXPECT(str.Equals(kTestString1));
2456 } 2452 }
2457 for (int i = 1500; i < 2000; i++) { 2453 for (int i = 1500; i < 2000; i++) {
2458 String& str = String::Handle(); 2454 String& str = String::Handle();
2459 str ^= PersistentHandle::Cast(handles[i])->raw(); 2455 str ^= PersistentHandle::Cast(handles[i])->raw();
2460 EXPECT(str.Equals(kTestString2)); 2456 EXPECT(str.Equals(kTestString2));
2461 } 2457 }
2462 } 2458 }
2463 EXPECT(scope == state->top_scope()); 2459 EXPECT(scope == thread->api_top_scope());
2464 EXPECT_EQ(2001, state->CountPersistentHandles()); 2460 EXPECT_EQ(2001, state->CountPersistentHandles());
2465 Dart_ShutdownIsolate(); 2461 Dart_ShutdownIsolate();
2466 } 2462 }
2467 2463
2468 2464
2469 // Test that we are able to create a persistent handle from a 2465 // Test that we are able to create a persistent handle from a
2470 // persistent handle. 2466 // persistent handle.
2471 UNIT_TEST_CASE(NewPersistentHandle_FromPersistentHandle) { 2467 UNIT_TEST_CASE(NewPersistentHandle_FromPersistentHandle) {
2472 TestIsolateScope __test_isolate__; 2468 TestIsolateScope __test_isolate__;
2473 2469
(...skipping 21 matching lines...) Expand all
2495 EXPECT(value); 2491 EXPECT(value);
2496 } 2492 }
2497 2493
2498 2494
2499 // Test that we can assign to a persistent handle. 2495 // Test that we can assign to a persistent handle.
2500 UNIT_TEST_CASE(AssignToPersistentHandle) { 2496 UNIT_TEST_CASE(AssignToPersistentHandle) {
2501 const char* kTestString1 = "Test String1"; 2497 const char* kTestString1 = "Test String1";
2502 const char* kTestString2 = "Test String2"; 2498 const char* kTestString2 = "Test String2";
2503 TestIsolateScope __test_isolate__; 2499 TestIsolateScope __test_isolate__;
2504 2500
2505 Isolate* isolate = Isolate::Current(); 2501 DARTSCOPE(Thread::Current());
2502 Isolate* isolate = T->isolate();
2506 EXPECT(isolate != NULL); 2503 EXPECT(isolate != NULL);
2507 ApiState* state = isolate->api_state(); 2504 ApiState* state = isolate->api_state();
2508 EXPECT(state != NULL); 2505 EXPECT(state != NULL);
2509 DARTSCOPE(Thread::Current());
2510 String& str = String::Handle(); 2506 String& str = String::Handle();
2511 2507
2512 // Start with a known persistent handle. 2508 // Start with a known persistent handle.
2513 Dart_Handle ref1 = Api::NewHandle(isolate, String::New(kTestString1)); 2509 Dart_Handle ref1 = Api::NewHandle(T, String::New(kTestString1));
2514 Dart_PersistentHandle obj = Dart_NewPersistentHandle(ref1); 2510 Dart_PersistentHandle obj = Dart_NewPersistentHandle(ref1);
2515 EXPECT(state->IsValidPersistentHandle(obj)); 2511 EXPECT(state->IsValidPersistentHandle(obj));
2516 str ^= PersistentHandle::Cast(obj)->raw(); 2512 str ^= PersistentHandle::Cast(obj)->raw();
2517 EXPECT(str.Equals(kTestString1)); 2513 EXPECT(str.Equals(kTestString1));
2518 2514
2519 // Now create another local handle and assign it to the persistent handle. 2515 // Now create another local handle and assign it to the persistent handle.
2520 Dart_Handle ref2 = Api::NewHandle(isolate, String::New(kTestString2)); 2516 Dart_Handle ref2 = Api::NewHandle(T, String::New(kTestString2));
2521 Dart_SetPersistentHandle(obj, ref2); 2517 Dart_SetPersistentHandle(obj, ref2);
2522 str ^= PersistentHandle::Cast(obj)->raw(); 2518 str ^= PersistentHandle::Cast(obj)->raw();
2523 EXPECT(str.Equals(kTestString2)); 2519 EXPECT(str.Equals(kTestString2));
2524 2520
2525 // Now assign Null to the persistent handle and check. 2521 // Now assign Null to the persistent handle and check.
2526 Dart_SetPersistentHandle(obj, Dart_Null()); 2522 Dart_SetPersistentHandle(obj, Dart_Null());
2527 EXPECT(Dart_IsNull(obj)); 2523 EXPECT(Dart_IsNull(obj));
2528 } 2524 }
2529 2525
2530 2526
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2578 { 2574 {
2579 Dart_EnterScope(); 2575 Dart_EnterScope();
2580 2576
2581 // Create an object in new space. 2577 // Create an object in new space.
2582 Dart_Handle new_ref = NewString("new string"); 2578 Dart_Handle new_ref = NewString("new string");
2583 EXPECT_VALID(new_ref); 2579 EXPECT_VALID(new_ref);
2584 2580
2585 // Create an object in old space. 2581 // Create an object in old space.
2586 Dart_Handle old_ref; 2582 Dart_Handle old_ref;
2587 { 2583 {
2588 Isolate* isolate = Isolate::Current();
2589 DARTSCOPE(Thread::Current()); 2584 DARTSCOPE(Thread::Current());
2590 old_ref = Api::NewHandle(isolate, String::New("old string", Heap::kOld)); 2585 old_ref = Api::NewHandle(thread, String::New("old string", Heap::kOld));
2591 EXPECT_VALID(old_ref); 2586 EXPECT_VALID(old_ref);
2592 } 2587 }
2593 2588
2594 // Create a weak ref to the new space object. 2589 // Create a weak ref to the new space object.
2595 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, 2590 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref,
2596 NULL, 2591 NULL,
2597 0, 2592 0,
2598 WeakPersistentHandleCallback); 2593 WeakPersistentHandleCallback);
2599 EXPECT_VALID(AsHandle(weak_new_ref)); 2594 EXPECT_VALID(AsHandle(weak_new_ref));
2600 EXPECT(!Dart_IsNull(AsHandle(weak_new_ref))); 2595 EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
2825 Dart_DeleteWeakPersistentHandle(isolate, weak1); 2820 Dart_DeleteWeakPersistentHandle(isolate, weak1);
2826 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2821 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2827 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); 2822 EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
2828 } 2823 }
2829 2824
2830 2825
2831 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOldspaceGC) { 2826 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOldspaceGC) {
2832 // Check that external allocation in old space can trigger GC. 2827 // Check that external allocation in old space can trigger GC.
2833 Isolate* isolate = Isolate::Current(); 2828 Isolate* isolate = Isolate::Current();
2834 Dart_EnterScope(); 2829 Dart_EnterScope();
2835 Dart_Handle live = Api::NewHandle(isolate, String::New("live", Heap::kOld)); 2830 Dart_Handle live = Api::NewHandle(thread, String::New("live", Heap::kOld));
2836 EXPECT_VALID(live); 2831 EXPECT_VALID(live);
2837 Dart_WeakPersistentHandle weak = NULL; 2832 Dart_WeakPersistentHandle weak = NULL;
2838 EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld)); 2833 EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld));
2839 const intptr_t kSmallExternalSize = 1 * KB; 2834 const intptr_t kSmallExternalSize = 1 * KB;
2840 { 2835 {
2841 Dart_EnterScope(); 2836 Dart_EnterScope();
2842 Dart_Handle dead = Api::NewHandle(isolate, String::New("dead", Heap::kOld)); 2837 Dart_Handle dead = Api::NewHandle(thread, String::New("dead", Heap::kOld));
2843 EXPECT_VALID(dead); 2838 EXPECT_VALID(dead);
2844 weak = Dart_NewWeakPersistentHandle(dead, 2839 weak = Dart_NewWeakPersistentHandle(dead,
2845 NULL, 2840 NULL,
2846 kSmallExternalSize, 2841 kSmallExternalSize,
2847 NopCallback); 2842 NopCallback);
2848 EXPECT_VALID(AsHandle(weak)); 2843 EXPECT_VALID(AsHandle(weak));
2849 Dart_ExitScope(); 2844 Dart_ExitScope();
2850 } 2845 }
2851 EXPECT_EQ(kSmallExternalSize, 2846 EXPECT_EQ(kSmallExternalSize,
2852 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize); 2847 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2913 } 2908 }
2914 } 2909 }
2915 2910
2916 2911
2917 TEST_CASE(ImplicitReferencesOldSpace) { 2912 TEST_CASE(ImplicitReferencesOldSpace) {
2918 Dart_PersistentHandle strong = NULL; 2913 Dart_PersistentHandle strong = NULL;
2919 Dart_WeakPersistentHandle strong_weak = NULL; 2914 Dart_WeakPersistentHandle strong_weak = NULL;
2920 2915
2921 Dart_EnterScope(); 2916 Dart_EnterScope();
2922 { 2917 {
2923 Isolate* isolate = Isolate::Current();
2924 DARTSCOPE(Thread::Current()); 2918 DARTSCOPE(Thread::Current());
2925 2919
2926 Dart_Handle local = Api::NewHandle( 2920 Dart_Handle local = Api::NewHandle(
2927 isolate, String::New("strongly reachable", Heap::kOld)); 2921 thread, String::New("strongly reachable", Heap::kOld));
2928 strong = Dart_NewPersistentHandle(local); 2922 strong = Dart_NewPersistentHandle(local);
2929 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); 2923 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback);
2930 2924
2931 EXPECT(!Dart_IsNull(AsHandle(strong))); 2925 EXPECT(!Dart_IsNull(AsHandle(strong)));
2932 EXPECT_VALID(AsHandle(strong)); 2926 EXPECT_VALID(AsHandle(strong));
2933 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); 2927 EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
2934 EXPECT_VALID(AsHandle(strong_weak)); 2928 EXPECT_VALID(AsHandle(strong_weak));
2935 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) 2929 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak)))
2936 2930
2937 weak1 = Dart_NewWeakPersistentHandle( 2931 weak1 = Dart_NewWeakPersistentHandle(
2938 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kOld)), 2932 Api::NewHandle(thread, String::New("weakly reachable 1", Heap::kOld)),
2939 NULL, 0, ImplicitReferencesCallback); 2933 NULL, 0, ImplicitReferencesCallback);
2940 EXPECT(!Dart_IsNull(AsHandle(weak1))); 2934 EXPECT(!Dart_IsNull(AsHandle(weak1)));
2941 EXPECT_VALID(AsHandle(weak1)); 2935 EXPECT_VALID(AsHandle(weak1));
2942 2936
2943 weak2 = Dart_NewWeakPersistentHandle( 2937 weak2 = Dart_NewWeakPersistentHandle(
2944 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kOld)), 2938 Api::NewHandle(thread, String::New("weakly reachable 2", Heap::kOld)),
2945 NULL, 0, ImplicitReferencesCallback); 2939 NULL, 0, ImplicitReferencesCallback);
2946 EXPECT(!Dart_IsNull(AsHandle(weak2))); 2940 EXPECT(!Dart_IsNull(AsHandle(weak2)));
2947 EXPECT_VALID(AsHandle(weak2)); 2941 EXPECT_VALID(AsHandle(weak2));
2948 2942
2949 weak3 = Dart_NewWeakPersistentHandle( 2943 weak3 = Dart_NewWeakPersistentHandle(
2950 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kOld)), 2944 Api::NewHandle(thread, String::New("weakly reachable 3", Heap::kOld)),
2951 NULL, 0, ImplicitReferencesCallback); 2945 NULL, 0, ImplicitReferencesCallback);
2952 EXPECT(!Dart_IsNull(AsHandle(weak3))); 2946 EXPECT(!Dart_IsNull(AsHandle(weak3)));
2953 EXPECT_VALID(AsHandle(weak3)); 2947 EXPECT_VALID(AsHandle(weak3));
2954 } 2948 }
2955 Dart_ExitScope(); 2949 Dart_ExitScope();
2956 2950
2957 { 2951 {
2958 Dart_EnterScope(); 2952 Dart_EnterScope();
2959 EXPECT_VALID(AsHandle(strong_weak)); 2953 EXPECT_VALID(AsHandle(strong_weak));
2960 EXPECT_VALID(AsHandle(weak1)); 2954 EXPECT_VALID(AsHandle(weak1));
(...skipping 16 matching lines...) Expand all
2977 } 2971 }
2978 2972
2979 2973
2980 TEST_CASE(ImplicitReferencesNewSpace) { 2974 TEST_CASE(ImplicitReferencesNewSpace) {
2981 Dart_PersistentHandle strong = NULL; 2975 Dart_PersistentHandle strong = NULL;
2982 Dart_WeakPersistentHandle strong_weak = NULL; 2976 Dart_WeakPersistentHandle strong_weak = NULL;
2983 2977
2984 2978
2985 Dart_EnterScope(); 2979 Dart_EnterScope();
2986 { 2980 {
2987 Isolate* isolate = Isolate::Current();
2988 DARTSCOPE(Thread::Current()); 2981 DARTSCOPE(Thread::Current());
2989 2982
2990 Dart_Handle local = Api::NewHandle( 2983 Dart_Handle local = Api::NewHandle(
2991 isolate, String::New("strongly reachable", Heap::kOld)); 2984 thread, String::New("strongly reachable", Heap::kOld));
2992 strong = Dart_NewPersistentHandle(local); 2985 strong = Dart_NewPersistentHandle(local);
2993 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); 2986 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback);
2994 2987
2995 EXPECT(!Dart_IsNull(AsHandle(strong))); 2988 EXPECT(!Dart_IsNull(AsHandle(strong)));
2996 EXPECT_VALID(AsHandle(strong)); 2989 EXPECT_VALID(AsHandle(strong));
2997 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); 2990 EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
2998 EXPECT_VALID(AsHandle(strong_weak)); 2991 EXPECT_VALID(AsHandle(strong_weak));
2999 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) 2992 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak)))
3000 2993
3001 weak1 = Dart_NewWeakPersistentHandle( 2994 weak1 = Dart_NewWeakPersistentHandle(
3002 Api::NewHandle(isolate, String::New("weakly reachable 1", Heap::kNew)), 2995 Api::NewHandle(thread, String::New("weakly reachable 1", Heap::kNew)),
3003 NULL, 0, ImplicitReferencesCallback); 2996 NULL, 0, ImplicitReferencesCallback);
3004 EXPECT(!Dart_IsNull(AsHandle(weak1))); 2997 EXPECT(!Dart_IsNull(AsHandle(weak1)));
3005 EXPECT_VALID(AsHandle(weak1)); 2998 EXPECT_VALID(AsHandle(weak1));
3006 2999
3007 weak2 = Dart_NewWeakPersistentHandle( 3000 weak2 = Dart_NewWeakPersistentHandle(
3008 Api::NewHandle(isolate, String::New("weakly reachable 2", Heap::kNew)), 3001 Api::NewHandle(thread, String::New("weakly reachable 2", Heap::kNew)),
3009 NULL, 0, ImplicitReferencesCallback); 3002 NULL, 0, ImplicitReferencesCallback);
3010 EXPECT(!Dart_IsNull(AsHandle(weak2))); 3003 EXPECT(!Dart_IsNull(AsHandle(weak2)));
3011 EXPECT_VALID(AsHandle(weak2)); 3004 EXPECT_VALID(AsHandle(weak2));
3012 3005
3013 weak3 = Dart_NewWeakPersistentHandle( 3006 weak3 = Dart_NewWeakPersistentHandle(
3014 Api::NewHandle(isolate, String::New("weakly reachable 3", Heap::kNew)), 3007 Api::NewHandle(thread, String::New("weakly reachable 3", Heap::kNew)),
3015 NULL, 0, ImplicitReferencesCallback); 3008 NULL, 0, ImplicitReferencesCallback);
3016 EXPECT(!Dart_IsNull(AsHandle(weak3))); 3009 EXPECT(!Dart_IsNull(AsHandle(weak3)));
3017 EXPECT_VALID(AsHandle(weak3)); 3010 EXPECT_VALID(AsHandle(weak3));
3018 } 3011 }
3019 Dart_ExitScope(); 3012 Dart_ExitScope();
3020 3013
3021 { 3014 {
3022 Dart_EnterScope(); 3015 Dart_EnterScope();
3023 EXPECT_VALID(AsHandle(strong_weak)); 3016 EXPECT_VALID(AsHandle(strong_weak));
3024 EXPECT_VALID(AsHandle(weak1)); 3017 EXPECT_VALID(AsHandle(weak1));
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
3202 3195
3203 3196
3204 // Unit test for creating multiple scopes and local handles within them. 3197 // Unit test for creating multiple scopes and local handles within them.
3205 // Ensure that the local handles get all cleaned out when exiting the 3198 // Ensure that the local handles get all cleaned out when exiting the
3206 // scope. 3199 // scope.
3207 UNIT_TEST_CASE(LocalHandles) { 3200 UNIT_TEST_CASE(LocalHandles) {
3208 TestCase::CreateTestIsolate(); 3201 TestCase::CreateTestIsolate();
3209 Thread* thread = Thread::Current(); 3202 Thread* thread = Thread::Current();
3210 Isolate* isolate = thread->isolate(); 3203 Isolate* isolate = thread->isolate();
3211 EXPECT(isolate != NULL); 3204 EXPECT(isolate != NULL);
3212 ApiState* state = isolate->api_state(); 3205 ApiLocalScope* scope = thread->api_top_scope();
3213 EXPECT(state != NULL);
3214 ApiLocalScope* scope = state->top_scope();
3215 Dart_Handle handles[300]; 3206 Dart_Handle handles[300];
3216 { 3207 {
3217 StackZone zone(thread); 3208 StackZone zone(thread);
3218 HANDLESCOPE(thread); 3209 HANDLESCOPE(thread);
3219 Smi& val = Smi::Handle(); 3210 Smi& val = Smi::Handle();
3220 3211
3221 // Start a new scope and allocate some local handles. 3212 // Start a new scope and allocate some local handles.
3222 Dart_EnterScope(); 3213 Dart_EnterScope();
3223 for (int i = 0; i < 100; i++) { 3214 for (int i = 0; i < 100; i++) {
3224 handles[i] = Api::NewHandle(isolate, Smi::New(i)); 3215 handles[i] = Api::NewHandle(thread, Smi::New(i));
3225 } 3216 }
3226 EXPECT_EQ(100, state->CountLocalHandles()); 3217 EXPECT_EQ(100, thread->CountLocalHandles());
3227 for (int i = 0; i < 100; i++) { 3218 for (int i = 0; i < 100; i++) {
3228 val ^= Api::UnwrapHandle(handles[i]); 3219 val ^= Api::UnwrapHandle(handles[i]);
3229 EXPECT_EQ(i, val.Value()); 3220 EXPECT_EQ(i, val.Value());
3230 } 3221 }
3231 // Start another scope and allocate some more local handles. 3222 // Start another scope and allocate some more local handles.
3232 { 3223 {
3233 Dart_EnterScope(); 3224 Dart_EnterScope();
3234 for (int i = 100; i < 200; i++) { 3225 for (int i = 100; i < 200; i++) {
3235 handles[i] = Api::NewHandle(isolate, Smi::New(i)); 3226 handles[i] = Api::NewHandle(thread, Smi::New(i));
3236 } 3227 }
3237 EXPECT_EQ(200, state->CountLocalHandles()); 3228 EXPECT_EQ(200, thread->CountLocalHandles());
3238 for (int i = 100; i < 200; i++) { 3229 for (int i = 100; i < 200; i++) {
3239 val ^= Api::UnwrapHandle(handles[i]); 3230 val ^= Api::UnwrapHandle(handles[i]);
3240 EXPECT_EQ(i, val.Value()); 3231 EXPECT_EQ(i, val.Value());
3241 } 3232 }
3242 3233
3243 // Start another scope and allocate some more local handles. 3234 // Start another scope and allocate some more local handles.
3244 { 3235 {
3245 Dart_EnterScope(); 3236 Dart_EnterScope();
3246 for (int i = 200; i < 300; i++) { 3237 for (int i = 200; i < 300; i++) {
3247 handles[i] = Api::NewHandle(isolate, Smi::New(i)); 3238 handles[i] = Api::NewHandle(thread, Smi::New(i));
3248 } 3239 }
3249 EXPECT_EQ(300, state->CountLocalHandles()); 3240 EXPECT_EQ(300, thread->CountLocalHandles());
3250 for (int i = 200; i < 300; i++) { 3241 for (int i = 200; i < 300; i++) {
3251 val ^= Api::UnwrapHandle(handles[i]); 3242 val ^= Api::UnwrapHandle(handles[i]);
3252 EXPECT_EQ(i, val.Value()); 3243 EXPECT_EQ(i, val.Value());
3253 } 3244 }
3254 EXPECT_EQ(300, state->CountLocalHandles()); 3245 EXPECT_EQ(300, thread->CountLocalHandles());
3255 VERIFY_ON_TRANSITION; 3246 VERIFY_ON_TRANSITION;
3256 Dart_ExitScope(); 3247 Dart_ExitScope();
3257 } 3248 }
3258 EXPECT_EQ(200, state->CountLocalHandles()); 3249 EXPECT_EQ(200, thread->CountLocalHandles());
3259 Dart_ExitScope(); 3250 Dart_ExitScope();
3260 } 3251 }
3261 EXPECT_EQ(100, state->CountLocalHandles()); 3252 EXPECT_EQ(100, thread->CountLocalHandles());
3262 Dart_ExitScope(); 3253 Dart_ExitScope();
3263 } 3254 }
3264 EXPECT_EQ(0, state->CountLocalHandles()); 3255 EXPECT_EQ(0, thread->CountLocalHandles());
3265 EXPECT(scope == state->top_scope()); 3256 EXPECT(scope == thread->api_top_scope());
3266 Dart_ShutdownIsolate(); 3257 Dart_ShutdownIsolate();
3267 } 3258 }
3268 3259
3269 3260
3270 // Unit test for creating multiple scopes and allocating objects in the 3261 // Unit test for creating multiple scopes and allocating objects in the
3271 // zone for the scope. Ensure that the memory is freed when the scope 3262 // zone for the scope. Ensure that the memory is freed when the scope
3272 // exits. 3263 // exits.
3273 UNIT_TEST_CASE(LocalZoneMemory) { 3264 UNIT_TEST_CASE(LocalZoneMemory) {
3274 TestCase::CreateTestIsolate(); 3265 TestCase::CreateTestIsolate();
3275 Isolate* isolate = Isolate::Current(); 3266 Thread* thread = Thread::Current();
3276 EXPECT(isolate != NULL); 3267 EXPECT(thread != NULL);
3277 ApiState* state = isolate->api_state(); 3268 ApiLocalScope* scope = thread->api_top_scope();
3278 EXPECT(state != NULL);
3279 ApiLocalScope* scope = state->top_scope();
3280 { 3269 {
3281 // Start a new scope and allocate some memory. 3270 // Start a new scope and allocate some memory.
3282 Dart_EnterScope(); 3271 Dart_EnterScope();
3283 for (int i = 0; i < 100; i++) { 3272 for (int i = 0; i < 100; i++) {
3284 Dart_ScopeAllocate(16); 3273 Dart_ScopeAllocate(16);
3285 } 3274 }
3286 EXPECT_EQ(1600, state->ZoneSizeInBytes()); 3275 EXPECT_EQ(1600, thread->ZoneSizeInBytes());
3287 // Start another scope and allocate some more memory. 3276 // Start another scope and allocate some more memory.
3288 { 3277 {
3289 Dart_EnterScope(); 3278 Dart_EnterScope();
3290 for (int i = 0; i < 100; i++) { 3279 for (int i = 0; i < 100; i++) {
3291 Dart_ScopeAllocate(16); 3280 Dart_ScopeAllocate(16);
3292 } 3281 }
3293 EXPECT_EQ(3200, state->ZoneSizeInBytes()); 3282 EXPECT_EQ(3200, thread->ZoneSizeInBytes());
3294 { 3283 {
3295 // Start another scope and allocate some more memory. 3284 // Start another scope and allocate some more memory.
3296 { 3285 {
3297 Dart_EnterScope(); 3286 Dart_EnterScope();
3298 for (int i = 0; i < 200; i++) { 3287 for (int i = 0; i < 200; i++) {
3299 Dart_ScopeAllocate(16); 3288 Dart_ScopeAllocate(16);
3300 } 3289 }
3301 EXPECT_EQ(6400, state->ZoneSizeInBytes()); 3290 EXPECT_EQ(6400, thread->ZoneSizeInBytes());
3302 Dart_ExitScope(); 3291 Dart_ExitScope();
3303 } 3292 }
3304 } 3293 }
3305 EXPECT_EQ(3200, state->ZoneSizeInBytes()); 3294 EXPECT_EQ(3200, thread->ZoneSizeInBytes());
3306 Dart_ExitScope(); 3295 Dart_ExitScope();
3307 } 3296 }
3308 EXPECT_EQ(1600, state->ZoneSizeInBytes()); 3297 EXPECT_EQ(1600, thread->ZoneSizeInBytes());
3309 Dart_ExitScope(); 3298 Dart_ExitScope();
3310 } 3299 }
3311 EXPECT_EQ(0, state->ZoneSizeInBytes()); 3300 EXPECT_EQ(0, thread->ZoneSizeInBytes());
3312 EXPECT(scope == state->top_scope()); 3301 EXPECT(scope == thread->api_top_scope());
3313 Dart_ShutdownIsolate(); 3302 Dart_ShutdownIsolate();
3314 } 3303 }
3315 3304
3316 3305
3317 UNIT_TEST_CASE(Isolates) { 3306 UNIT_TEST_CASE(Isolates) {
3318 // This test currently assumes that the Dart_Isolate type is an opaque 3307 // This test currently assumes that the Dart_Isolate type is an opaque
3319 // representation of Isolate*. 3308 // representation of Isolate*.
3320 Dart_Isolate iso_1 = TestCase::CreateTestIsolate(); 3309 Dart_Isolate iso_1 = TestCase::CreateTestIsolate();
3321 EXPECT_EQ(iso_1, Api::CastIsolate(Isolate::Current())); 3310 EXPECT_EQ(iso_1, Api::CastIsolate(Isolate::Current()));
3322 Dart_Isolate isolate = Dart_CurrentIsolate(); 3311 Dart_Isolate isolate = Dart_CurrentIsolate();
(...skipping 1508 matching lines...) Expand 10 before | Expand all | Expand 10 after
4831 EXPECT_VALID(list_obj); 4820 EXPECT_VALID(list_obj);
4832 EXPECT(Dart_IsList(list_obj)); 4821 EXPECT(Dart_IsList(list_obj));
4833 } 4822 }
4834 4823
4835 4824
4836 static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) { 4825 static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) {
4837 EXPECT(Dart_IsLibrary(lib)); 4826 EXPECT(Dart_IsLibrary(lib));
4838 Thread* thread = Thread::Current(); 4827 Thread* thread = Thread::Current();
4839 const Library& library_obj = Api::UnwrapLibraryHandle(thread->zone(), lib); 4828 const Library& library_obj = Api::UnwrapLibraryHandle(thread->zone(), lib);
4840 const String& name = String::Handle(String::New(str)); 4829 const String& name = String::Handle(String::New(str));
4841 return Api::NewHandle(thread->isolate(), library_obj.PrivateName(name)); 4830 return Api::NewHandle(thread, library_obj.PrivateName(name));
4842 } 4831 }
4843 4832
4844 4833
4845 TEST_CASE(Invoke) { 4834 TEST_CASE(Invoke) {
4846 const char* kScriptChars = 4835 const char* kScriptChars =
4847 "class BaseMethods {\n" 4836 "class BaseMethods {\n"
4848 " inheritedMethod(arg) => 'inherited $arg';\n" 4837 " inheritedMethod(arg) => 'inherited $arg';\n"
4849 " static nonInheritedMethod(arg) => 'noninherited $arg';\n" 4838 " static nonInheritedMethod(arg) => 'noninherited $arg';\n"
4850 "}\n" 4839 "}\n"
4851 "\n" 4840 "\n"
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
5242 ASSERT(auto_setup_scope != NULL); 5231 ASSERT(auto_setup_scope != NULL);
5243 *auto_setup_scope = false; 5232 *auto_setup_scope = false;
5244 return reinterpret_cast<Dart_NativeFunction>(&ExceptionNative); 5233 return reinterpret_cast<Dart_NativeFunction>(&ExceptionNative);
5245 } 5234 }
5246 5235
5247 5236
5248 TEST_CASE(ThrowException) { 5237 TEST_CASE(ThrowException) {
5249 const char* kScriptChars = 5238 const char* kScriptChars =
5250 "int test() native \"ThrowException_native\";"; 5239 "int test() native \"ThrowException_native\";";
5251 Dart_Handle result; 5240 Dart_Handle result;
5252 Isolate* isolate = Isolate::Current(); 5241 intptr_t size = thread->ZoneSizeInBytes();
5253 EXPECT(isolate != NULL);
5254 ApiState* state = isolate->api_state();
5255 EXPECT(state != NULL);
5256 intptr_t size = state->ZoneSizeInBytes();
5257 Dart_EnterScope(); // Start a Dart API scope for invoking API functions. 5242 Dart_EnterScope(); // Start a Dart API scope for invoking API functions.
5258 5243
5259 // Load up a test script which extends the native wrapper class. 5244 // Load up a test script which extends the native wrapper class.
5260 Dart_Handle lib = TestCase::LoadTestScript( 5245 Dart_Handle lib = TestCase::LoadTestScript(
5261 kScriptChars, 5246 kScriptChars,
5262 reinterpret_cast<Dart_NativeEntryResolver>(native_lookup)); 5247 reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
5263 5248
5264 // Throwing an exception here should result in an error. 5249 // Throwing an exception here should result in an error.
5265 result = Dart_ThrowException(NewString("This doesn't work")); 5250 result = Dart_ThrowException(NewString("This doesn't work"));
5266 EXPECT_ERROR(result, "No Dart frames on stack, cannot throw exception"); 5251 EXPECT_ERROR(result, "No Dart frames on stack, cannot throw exception");
5267 EXPECT(!Dart_ErrorHasException(result)); 5252 EXPECT(!Dart_ErrorHasException(result));
5268 5253
5269 // Invoke 'test' and check for an uncaught exception. 5254 // Invoke 'test' and check for an uncaught exception.
5270 result = Dart_Invoke(lib, NewString("test"), 0, NULL); 5255 result = Dart_Invoke(lib, NewString("test"), 0, NULL);
5271 EXPECT_ERROR(result, "Hello from ExceptionNative!"); 5256 EXPECT_ERROR(result, "Hello from ExceptionNative!");
5272 EXPECT(Dart_ErrorHasException(result)); 5257 EXPECT(Dart_ErrorHasException(result));
5273 5258
5274 Dart_ExitScope(); // Exit the Dart API scope. 5259 Dart_ExitScope(); // Exit the Dart API scope.
5275 EXPECT_EQ(size, state->ZoneSizeInBytes()); 5260 EXPECT_EQ(size, thread->ZoneSizeInBytes());
5276 } 5261 }
5277 5262
5278 5263
5279 static intptr_t kNativeArgumentNativeField1Value = 30; 5264 static intptr_t kNativeArgumentNativeField1Value = 30;
5280 static intptr_t kNativeArgumentNativeField2Value = 40; 5265 static intptr_t kNativeArgumentNativeField2Value = 40;
5281 static intptr_t native_arg_str_peer = 100; 5266 static intptr_t native_arg_str_peer = 100;
5282 static void NativeArgumentCreate(Dart_NativeArguments args) { 5267 static void NativeArgumentCreate(Dart_NativeArguments args) {
5283 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url())); 5268 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
5284 Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL); 5269 Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL);
5285 EXPECT_VALID(type); 5270 EXPECT_VALID(type);
(...skipping 2801 matching lines...) Expand 10 before | Expand all | Expand 10 after
8087 EXPECT(out == NULL); 8072 EXPECT(out == NULL);
8088 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8073 EXPECT_EQ(0, isolate->heap()->PeerCount());
8089 } 8074 }
8090 8075
8091 8076
8092 // Allocates an object in old space and assigns it a peer. Removes 8077 // Allocates an object in old space and assigns it a peer. Removes
8093 // the peer and checks that the count of peer objects is decremented 8078 // the peer and checks that the count of peer objects is decremented
8094 // by one. 8079 // by one.
8095 TEST_CASE(OneOldSpacePeer) { 8080 TEST_CASE(OneOldSpacePeer) {
8096 Isolate* isolate = Isolate::Current(); 8081 Isolate* isolate = Isolate::Current();
8097 Dart_Handle str = Api::NewHandle(isolate, String::New("str", Heap::kOld)); 8082 Dart_Handle str = Api::NewHandle(thread, String::New("str", Heap::kOld));
8098 EXPECT_VALID(str); 8083 EXPECT_VALID(str);
8099 EXPECT(Dart_IsString(str)); 8084 EXPECT(Dart_IsString(str));
8100 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8085 EXPECT_EQ(0, isolate->heap()->PeerCount());
8101 void* out = &out; 8086 void* out = &out;
8102 EXPECT(Dart_GetPeer(str, &out)); 8087 EXPECT(Dart_GetPeer(str, &out));
8103 EXPECT(out == NULL); 8088 EXPECT(out == NULL);
8104 int peer = 1234; 8089 int peer = 1234;
8105 EXPECT_VALID(Dart_SetPeer(str, &peer)); 8090 EXPECT_VALID(Dart_SetPeer(str, &peer));
8106 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8091 EXPECT_EQ(1, isolate->heap()->PeerCount());
8107 out = &out; 8092 out = &out;
(...skipping 12 matching lines...) Expand all
8120 8105
8121 8106
8122 // Allocates an object in old space and assigns it a peer. Allow the 8107 // Allocates an object in old space and assigns it a peer. Allow the
8123 // peer referent to be garbage collected and check that the count of 8108 // peer referent to be garbage collected and check that the count of
8124 // peer objects is decremented by one. 8109 // peer objects is decremented by one.
8125 TEST_CASE(CollectOneOldSpacePeer) { 8110 TEST_CASE(CollectOneOldSpacePeer) {
8126 Isolate* isolate = Isolate::Current(); 8111 Isolate* isolate = Isolate::Current();
8127 Dart_EnterScope(); 8112 Dart_EnterScope();
8128 { 8113 {
8129 DARTSCOPE(Thread::Current()); 8114 DARTSCOPE(Thread::Current());
8130 Dart_Handle str = Api::NewHandle(isolate, String::New("str", Heap::kOld)); 8115 Dart_Handle str = Api::NewHandle(T, String::New("str", Heap::kOld));
8131 EXPECT_VALID(str); 8116 EXPECT_VALID(str);
8132 EXPECT(Dart_IsString(str)); 8117 EXPECT(Dart_IsString(str));
8133 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8118 EXPECT_EQ(0, isolate->heap()->PeerCount());
8134 void* out = &out; 8119 void* out = &out;
8135 EXPECT(Dart_GetPeer(str, &out)); 8120 EXPECT(Dart_GetPeer(str, &out));
8136 EXPECT(out == NULL); 8121 EXPECT(out == NULL);
8137 int peer = 1234; 8122 int peer = 1234;
8138 EXPECT_VALID(Dart_SetPeer(str, &peer)); 8123 EXPECT_VALID(Dart_SetPeer(str, &peer));
8139 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8124 EXPECT_EQ(1, isolate->heap()->PeerCount());
8140 out = &out; 8125 out = &out;
8141 EXPECT_VALID(Dart_GetPeer(str, &out)); 8126 EXPECT_VALID(Dart_GetPeer(str, &out));
8142 EXPECT(out == reinterpret_cast<void*>(&peer)); 8127 EXPECT(out == reinterpret_cast<void*>(&peer));
8143 isolate->heap()->CollectGarbage(Heap::kOld); 8128 isolate->heap()->CollectGarbage(Heap::kOld);
8144 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8129 EXPECT_EQ(1, isolate->heap()->PeerCount());
8145 EXPECT_VALID(Dart_GetPeer(str, &out)); 8130 EXPECT_VALID(Dart_GetPeer(str, &out));
8146 EXPECT(out == reinterpret_cast<void*>(&peer)); 8131 EXPECT(out == reinterpret_cast<void*>(&peer));
8147 } 8132 }
8148 Dart_ExitScope(); 8133 Dart_ExitScope();
8149 isolate->heap()->CollectGarbage(Heap::kOld); 8134 isolate->heap()->CollectGarbage(Heap::kOld);
8150 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8135 EXPECT_EQ(0, isolate->heap()->PeerCount());
8151 } 8136 }
8152 8137
8153 8138
8154 // Allocates two objects in old space and assigns them peers. Removes 8139 // Allocates two objects in old space and assigns them peers. Removes
8155 // the peers and checks that the count of peer objects is decremented 8140 // the peers and checks that the count of peer objects is decremented
8156 // by two. 8141 // by two.
8157 TEST_CASE(TwoOldSpacePeers) { 8142 TEST_CASE(TwoOldSpacePeers) {
8158 Isolate* isolate = Isolate::Current(); 8143 Isolate* isolate = Isolate::Current();
8159 Dart_Handle s1 = Api::NewHandle(isolate, String::New("s1", Heap::kOld)); 8144 Dart_Handle s1 = Api::NewHandle(thread, String::New("s1", Heap::kOld));
8160 EXPECT_VALID(s1); 8145 EXPECT_VALID(s1);
8161 EXPECT(Dart_IsString(s1)); 8146 EXPECT(Dart_IsString(s1));
8162 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8147 EXPECT_EQ(0, isolate->heap()->PeerCount());
8163 void* o1 = &o1; 8148 void* o1 = &o1;
8164 EXPECT(Dart_GetPeer(s1, &o1)); 8149 EXPECT(Dart_GetPeer(s1, &o1));
8165 EXPECT(o1 == NULL); 8150 EXPECT(o1 == NULL);
8166 int p1 = 1234; 8151 int p1 = 1234;
8167 EXPECT_VALID(Dart_SetPeer(s1, &p1)); 8152 EXPECT_VALID(Dart_SetPeer(s1, &p1));
8168 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8153 EXPECT_EQ(1, isolate->heap()->PeerCount());
8169 o1 = &o1; 8154 o1 = &o1;
8170 EXPECT_VALID(Dart_GetPeer(s1, &o1)); 8155 EXPECT_VALID(Dart_GetPeer(s1, &o1));
8171 EXPECT(o1 == reinterpret_cast<void*>(&p1)); 8156 EXPECT(o1 == reinterpret_cast<void*>(&p1));
8172 Dart_Handle s2 = Api::NewHandle(isolate, String::New("s2", Heap::kOld)); 8157 Dart_Handle s2 = Api::NewHandle(thread, String::New("s2", Heap::kOld));
8173 EXPECT_VALID(s2); 8158 EXPECT_VALID(s2);
8174 EXPECT(Dart_IsString(s2)); 8159 EXPECT(Dart_IsString(s2));
8175 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8160 EXPECT_EQ(1, isolate->heap()->PeerCount());
8176 void* o2 = &o2; 8161 void* o2 = &o2;
8177 EXPECT(Dart_GetPeer(s2, &o2)); 8162 EXPECT(Dart_GetPeer(s2, &o2));
8178 EXPECT(o2 == NULL); 8163 EXPECT(o2 == NULL);
8179 int p2 = 5678; 8164 int p2 = 5678;
8180 EXPECT_VALID(Dart_SetPeer(s2, &p2)); 8165 EXPECT_VALID(Dart_SetPeer(s2, &p2));
8181 EXPECT_EQ(2, isolate->heap()->PeerCount()); 8166 EXPECT_EQ(2, isolate->heap()->PeerCount());
8182 o2 = &o2; 8167 o2 = &o2;
(...skipping 13 matching lines...) Expand all
8196 8181
8197 8182
8198 // Allocates two objects in old space and assigns them a peer. Allows 8183 // Allocates two objects in old space and assigns them a peer. Allows
8199 // the peer referents to be garbage collected and checks that the 8184 // the peer referents to be garbage collected and checks that the
8200 // count of peer objects is decremented by two. 8185 // count of peer objects is decremented by two.
8201 TEST_CASE(CollectTwoOldSpacePeers) { 8186 TEST_CASE(CollectTwoOldSpacePeers) {
8202 Isolate* isolate = Isolate::Current(); 8187 Isolate* isolate = Isolate::Current();
8203 Dart_EnterScope(); 8188 Dart_EnterScope();
8204 { 8189 {
8205 DARTSCOPE(Thread::Current()); 8190 DARTSCOPE(Thread::Current());
8206 Dart_Handle s1 = Api::NewHandle(isolate, String::New("s1", Heap::kOld)); 8191 Dart_Handle s1 = Api::NewHandle(T, String::New("s1", Heap::kOld));
8207 EXPECT_VALID(s1); 8192 EXPECT_VALID(s1);
8208 EXPECT(Dart_IsString(s1)); 8193 EXPECT(Dart_IsString(s1));
8209 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8194 EXPECT_EQ(0, isolate->heap()->PeerCount());
8210 void* o1 = &o1; 8195 void* o1 = &o1;
8211 EXPECT(Dart_GetPeer(s1, &o1)); 8196 EXPECT(Dart_GetPeer(s1, &o1));
8212 EXPECT(o1 == NULL); 8197 EXPECT(o1 == NULL);
8213 int p1 = 1234; 8198 int p1 = 1234;
8214 EXPECT_VALID(Dart_SetPeer(s1, &p1)); 8199 EXPECT_VALID(Dart_SetPeer(s1, &p1));
8215 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8200 EXPECT_EQ(1, isolate->heap()->PeerCount());
8216 o1 = &o1; 8201 o1 = &o1;
8217 EXPECT_VALID(Dart_GetPeer(s1, &o1)); 8202 EXPECT_VALID(Dart_GetPeer(s1, &o1));
8218 EXPECT(o1 == reinterpret_cast<void*>(&p1)); 8203 EXPECT(o1 == reinterpret_cast<void*>(&p1));
8219 Dart_Handle s2 = Api::NewHandle(isolate, String::New("s2", Heap::kOld)); 8204 Dart_Handle s2 = Api::NewHandle(T, String::New("s2", Heap::kOld));
8220 EXPECT_VALID(s2); 8205 EXPECT_VALID(s2);
8221 EXPECT(Dart_IsString(s2)); 8206 EXPECT(Dart_IsString(s2));
8222 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8207 EXPECT_EQ(1, isolate->heap()->PeerCount());
8223 void* o2 = &o2; 8208 void* o2 = &o2;
8224 EXPECT(Dart_GetPeer(s2, &o2)); 8209 EXPECT(Dart_GetPeer(s2, &o2));
8225 EXPECT(o2 == NULL); 8210 EXPECT(o2 == NULL);
8226 int p2 = 5678; 8211 int p2 = 5678;
8227 EXPECT_VALID(Dart_SetPeer(s2, &p2)); 8212 EXPECT_VALID(Dart_SetPeer(s2, &p2));
8228 EXPECT_EQ(2, isolate->heap()->PeerCount()); 8213 EXPECT_EQ(2, isolate->heap()->PeerCount());
8229 o2 = &o2; 8214 o2 = &o2;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
8302 EXPECT(Dart_IsString(empty_str)); 8287 EXPECT(Dart_IsString(empty_str));
8303 EXPECT(Dart_IsStringLatin1(str)); 8288 EXPECT(Dart_IsStringLatin1(str));
8304 EXPECT(Dart_IsStringLatin1(empty_str)); 8289 EXPECT(Dart_IsStringLatin1(empty_str));
8305 EXPECT(Dart_IsExternalString(str)); 8290 EXPECT(Dart_IsExternalString(str));
8306 EXPECT(Dart_IsExternalString(empty_str)); 8291 EXPECT(Dart_IsExternalString(empty_str));
8307 EXPECT_VALID(Dart_StringLength(str, &length)); 8292 EXPECT_VALID(Dart_StringLength(str, &length));
8308 EXPECT_EQ(0, length); 8293 EXPECT_EQ(0, length);
8309 8294
8310 // Test with single character canonical string, it should not become 8295 // Test with single character canonical string, it should not become
8311 // external string but the peer should be setup for it. 8296 // external string but the peer should be setup for it.
8312 Isolate* isolate = Isolate::Current(); 8297 Dart_Handle canonical_str = Api::NewHandle(thread, Symbols::New("*"));
8313 Dart_Handle canonical_str = Api::NewHandle(isolate, Symbols::New("*"));
8314 EXPECT(Dart_IsString(canonical_str)); 8298 EXPECT(Dart_IsString(canonical_str));
8315 EXPECT(!Dart_IsExternalString(canonical_str)); 8299 EXPECT(!Dart_IsExternalString(canonical_str));
8316 uint8_t ext_canonical_str[kLength]; 8300 uint8_t ext_canonical_str[kLength];
8317 str = Dart_MakeExternalString(canonical_str, 8301 str = Dart_MakeExternalString(canonical_str,
8318 ext_canonical_str, 8302 ext_canonical_str,
8319 kLength, 8303 kLength,
8320 &canonical_str_peer, 8304 &canonical_str_peer,
8321 MakeExternalCback); 8305 MakeExternalCback);
8322 EXPECT(Dart_IsString(str)); 8306 EXPECT(Dart_IsString(str));
8323 EXPECT(!Dart_IsExternalString(canonical_str)); 8307 EXPECT(!Dart_IsExternalString(canonical_str));
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
8394 EXPECT(Dart_IdentityEquals(str, utf16_str)); 8378 EXPECT(Dart_IdentityEquals(str, utf16_str));
8395 for (intptr_t i = 0; i < length; i++) { 8379 for (intptr_t i = 0; i < length; i++) {
8396 EXPECT_EQ(0x4e8c, ext_utf16_str[i]); 8380 EXPECT_EQ(0x4e8c, ext_utf16_str[i]);
8397 } 8381 }
8398 8382
8399 Zone* zone = thread->zone(); 8383 Zone* zone = thread->zone();
8400 // Test with a symbol (hash value should be preserved on externalization). 8384 // Test with a symbol (hash value should be preserved on externalization).
8401 const char* symbol_ascii = "?unseen"; 8385 const char* symbol_ascii = "?unseen";
8402 expected_length = strlen(symbol_ascii); 8386 expected_length = strlen(symbol_ascii);
8403 Dart_Handle symbol_str = 8387 Dart_Handle symbol_str =
8404 Api::NewHandle(isolate, Symbols::New(symbol_ascii, expected_length)); 8388 Api::NewHandle(thread, Symbols::New(symbol_ascii, expected_length));
8405 EXPECT_VALID(symbol_str); 8389 EXPECT_VALID(symbol_str);
8406 EXPECT(Dart_IsString(symbol_str)); 8390 EXPECT(Dart_IsString(symbol_str));
8407 EXPECT(Dart_IsStringLatin1(symbol_str)); 8391 EXPECT(Dart_IsStringLatin1(symbol_str));
8408 EXPECT(!Dart_IsExternalString(symbol_str)); 8392 EXPECT(!Dart_IsExternalString(symbol_str));
8409 EXPECT_VALID(Dart_StringLength(symbol_str, &length)); 8393 EXPECT_VALID(Dart_StringLength(symbol_str, &length));
8410 EXPECT_EQ(expected_length, length); 8394 EXPECT_EQ(expected_length, length);
8411 EXPECT(Api::UnwrapStringHandle(zone, symbol_str).HasHash()); 8395 EXPECT(Api::UnwrapStringHandle(zone, symbol_str).HasHash());
8412 8396
8413 uint8_t ext_symbol_ascii[kLength]; 8397 uint8_t ext_symbol_ascii[kLength];
8414 EXPECT_VALID(Dart_StringStorageSize(symbol_str, &size)); 8398 EXPECT_VALID(Dart_StringStorageSize(symbol_str, &size));
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after
9337 9321
9338 // Heartbeat test for new events. 9322 // Heartbeat test for new events.
9339 EXPECT_SUBSTRING("\"name\":\"TestVMDuration2\"", buffer); 9323 EXPECT_SUBSTRING("\"name\":\"TestVMDuration2\"", buffer);
9340 EXPECT_SUBSTRING("\"function\":\"::_bar\"", buffer); 9324 EXPECT_SUBSTRING("\"function\":\"::_bar\"", buffer);
9341 9325
9342 // Free buffer allocated by AppendStreamConsumer 9326 // Free buffer allocated by AppendStreamConsumer
9343 free(data.buffer); 9327 free(data.buffer);
9344 } 9328 }
9345 9329
9346 } // namespace dart 9330 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/dart_api_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698