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

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

Issue 2974233002: VM: Re-format to use at most one newline between functions (Closed)
Patch Set: Rebase and merge Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/dart_api_message.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 "vm/dart_api_impl.h"
5 #include "bin/builtin.h" 6 #include "bin/builtin.h"
6 #include "vm/compiler.h"
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "include/dart_mirrors_api.h" 8 #include "include/dart_mirrors_api.h"
9 #include "include/dart_native_api.h" 9 #include "include/dart_native_api.h"
10 #include "include/dart_tools_api.h" 10 #include "include/dart_tools_api.h"
11 #include "platform/assert.h" 11 #include "platform/assert.h"
12 #include "platform/text_buffer.h" 12 #include "platform/text_buffer.h"
13 #include "platform/utils.h" 13 #include "platform/utils.h"
14 #include "vm/class_finalizer.h" 14 #include "vm/class_finalizer.h"
15 #include "vm/dart_api_impl.h" 15 #include "vm/compiler.h"
16 #include "vm/dart_api_state.h" 16 #include "vm/dart_api_state.h"
17 #include "vm/lockers.h" 17 #include "vm/lockers.h"
18 #include "vm/timeline.h" 18 #include "vm/timeline.h"
19 #include "vm/unit_test.h" 19 #include "vm/unit_test.h"
20 #include "vm/verifier.h" 20 #include "vm/verifier.h"
21 21
22 namespace dart { 22 namespace dart {
23 23
24 DECLARE_FLAG(bool, verify_acquired_data); 24 DECLARE_FLAG(bool, verify_acquired_data);
25 DECLARE_FLAG(bool, ignore_patch_signature_mismatch); 25 DECLARE_FLAG(bool, ignore_patch_signature_mismatch);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 57
58 EXPECT(Dart_IsError(Dart_ErrorGetException(instance))); 58 EXPECT(Dart_IsError(Dart_ErrorGetException(instance)));
59 EXPECT(Dart_IsError(Dart_ErrorGetException(error))); 59 EXPECT(Dart_IsError(Dart_ErrorGetException(error)));
60 EXPECT_VALID(Dart_ErrorGetException(exception)); 60 EXPECT_VALID(Dart_ErrorGetException(exception));
61 61
62 EXPECT(Dart_IsError(Dart_ErrorGetStackTrace(instance))); 62 EXPECT(Dart_IsError(Dart_ErrorGetStackTrace(instance)));
63 EXPECT(Dart_IsError(Dart_ErrorGetStackTrace(error))); 63 EXPECT(Dart_IsError(Dart_ErrorGetStackTrace(error)));
64 EXPECT_VALID(Dart_ErrorGetStackTrace(exception)); 64 EXPECT_VALID(Dart_ErrorGetStackTrace(exception));
65 } 65 }
66 66
67
68 TEST_CASE(StackTraceInfo) { 67 TEST_CASE(StackTraceInfo) {
69 const char* kScriptChars = 68 const char* kScriptChars =
70 "bar() => throw new Error();\n" 69 "bar() => throw new Error();\n"
71 "foo() => bar();\n" 70 "foo() => bar();\n"
72 "testMain() => foo();\n"; 71 "testMain() => foo();\n";
73 72
74 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 73 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
75 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 74 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
76 75
77 EXPECT(Dart_IsError(error)); 76 EXPECT(Dart_IsError(error));
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 EXPECT_EQ(3, line_number); 127 EXPECT_EQ(3, line_number);
129 EXPECT_EQ(15, column_number); 128 EXPECT_EQ(15, column_number);
130 129
131 // Out-of-bounds frames. 130 // Out-of-bounds frames.
132 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 131 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
133 EXPECT(Dart_IsError(result)); 132 EXPECT(Dart_IsError(result));
134 result = Dart_GetActivationFrame(stacktrace, -1, &frame); 133 result = Dart_GetActivationFrame(stacktrace, -1, &frame);
135 EXPECT(Dart_IsError(result)); 134 EXPECT(Dart_IsError(result));
136 } 135 }
137 136
138
139 TEST_CASE(DeepStackTraceInfo) { 137 TEST_CASE(DeepStackTraceInfo) {
140 const char* kScriptChars = 138 const char* kScriptChars =
141 "foo(n) => n == 1 ? throw new Error() : foo(n-1);\n" 139 "foo(n) => n == 1 ? throw new Error() : foo(n-1);\n"
142 "testMain() => foo(50);\n"; 140 "testMain() => foo(50);\n";
143 141
144 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 142 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
145 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 143 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
146 144
147 EXPECT(Dart_IsError(error)); 145 EXPECT(Dart_IsError(error));
148 146
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 EXPECT_EQ(2, line_number); 205 EXPECT_EQ(2, line_number);
208 EXPECT_EQ(15, column_number); 206 EXPECT_EQ(15, column_number);
209 207
210 // Out-of-bounds frames. 208 // Out-of-bounds frames.
211 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 209 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
212 EXPECT(Dart_IsError(result)); 210 EXPECT(Dart_IsError(result));
213 result = Dart_GetActivationFrame(stacktrace, -1, &frame); 211 result = Dart_GetActivationFrame(stacktrace, -1, &frame);
214 EXPECT(Dart_IsError(result)); 212 EXPECT(Dart_IsError(result));
215 } 213 }
216 214
217
218 TEST_CASE(StackOverflowStackTraceInfo) { 215 TEST_CASE(StackOverflowStackTraceInfo) {
219 const char* kScriptChars = 216 const char* kScriptChars =
220 "class C {\n" 217 "class C {\n"
221 " static foo() => foo();\n" 218 " static foo() => foo();\n"
222 "}\n" 219 "}\n"
223 "testMain() => C.foo();\n"; 220 "testMain() => C.foo();\n";
224 221
225 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 222 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
226 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 223 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
227 224
(...skipping 28 matching lines...) Expand all
256 EXPECT_EQ(2, line_number); 253 EXPECT_EQ(2, line_number);
257 EXPECT_EQ(13, column_number); 254 EXPECT_EQ(13, column_number);
258 255
259 // Out-of-bounds frames. 256 // Out-of-bounds frames.
260 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 257 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
261 EXPECT(Dart_IsError(result)); 258 EXPECT(Dart_IsError(result));
262 result = Dart_GetActivationFrame(stacktrace, -1, &frame); 259 result = Dart_GetActivationFrame(stacktrace, -1, &frame);
263 EXPECT(Dart_IsError(result)); 260 EXPECT(Dart_IsError(result));
264 } 261 }
265 262
266
267 TEST_CASE(OutOfMemoryStackTraceInfo) { 263 TEST_CASE(OutOfMemoryStackTraceInfo) {
268 const char* kScriptChars = 264 const char* kScriptChars =
269 "var number_of_ints = 134000000;\n" 265 "var number_of_ints = 134000000;\n"
270 "testMain() {\n" 266 "testMain() {\n"
271 " new List<int>(number_of_ints)\n" 267 " new List<int>(number_of_ints)\n"
272 "}\n"; 268 "}\n";
273 269
274 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 270 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
275 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 271 Dart_Handle error = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
276 272
277 EXPECT(Dart_IsError(error)); 273 EXPECT(Dart_IsError(error));
278 274
279 Dart_StackTrace stacktrace; 275 Dart_StackTrace stacktrace;
280 Dart_Handle result = Dart_GetStackTraceFromError(error, &stacktrace); 276 Dart_Handle result = Dart_GetStackTraceFromError(error, &stacktrace);
281 EXPECT(Dart_IsError(result)); // No StackTrace for OutOfMemory. 277 EXPECT(Dart_IsError(result)); // No StackTrace for OutOfMemory.
282 } 278 }
283 279
284
285 void CurrentStackTraceNative(Dart_NativeArguments args) { 280 void CurrentStackTraceNative(Dart_NativeArguments args) {
286 Dart_EnterScope(); 281 Dart_EnterScope();
287 282
288 Dart_StackTrace stacktrace; 283 Dart_StackTrace stacktrace;
289 Dart_Handle result = Dart_GetStackTrace(&stacktrace); 284 Dart_Handle result = Dart_GetStackTrace(&stacktrace);
290 EXPECT_VALID(result); 285 EXPECT_VALID(result);
291 286
292 intptr_t frame_count = 0; 287 intptr_t frame_count = 0;
293 result = Dart_StackTraceLength(stacktrace, &frame_count); 288 result = Dart_StackTraceLength(stacktrace, &frame_count);
294 EXPECT_VALID(result); 289 EXPECT_VALID(result);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 // Out-of-bounds frames. 357 // Out-of-bounds frames.
363 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 358 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
364 EXPECT(Dart_IsError(result)); 359 EXPECT(Dart_IsError(result));
365 result = Dart_GetActivationFrame(stacktrace, -1, &frame); 360 result = Dart_GetActivationFrame(stacktrace, -1, &frame);
366 EXPECT(Dart_IsError(result)); 361 EXPECT(Dart_IsError(result));
367 362
368 Dart_SetReturnValue(args, Dart_NewInteger(42)); 363 Dart_SetReturnValue(args, Dart_NewInteger(42));
369 Dart_ExitScope(); 364 Dart_ExitScope();
370 } 365 }
371 366
372
373 static Dart_NativeFunction CurrentStackTraceNativeLookup( 367 static Dart_NativeFunction CurrentStackTraceNativeLookup(
374 Dart_Handle name, 368 Dart_Handle name,
375 int argument_count, 369 int argument_count,
376 bool* auto_setup_scope) { 370 bool* auto_setup_scope) {
377 ASSERT(auto_setup_scope != NULL); 371 ASSERT(auto_setup_scope != NULL);
378 *auto_setup_scope = true; 372 *auto_setup_scope = true;
379 return reinterpret_cast<Dart_NativeFunction>(&CurrentStackTraceNative); 373 return reinterpret_cast<Dart_NativeFunction>(&CurrentStackTraceNative);
380 } 374 }
381 375
382
383 TEST_CASE(CurrentStackTraceInfo) { 376 TEST_CASE(CurrentStackTraceInfo) {
384 const char* kScriptChars = 377 const char* kScriptChars =
385 "inspectStack() native 'CurrentStackTraceNatve';\n" 378 "inspectStack() native 'CurrentStackTraceNatve';\n"
386 "foo(n) => n == 1 ? inspectStack() : foo(n-1);\n" 379 "foo(n) => n == 1 ? inspectStack() : foo(n-1);\n"
387 "testMain() => foo(50);\n"; 380 "testMain() => foo(50);\n";
388 381
389 Dart_Handle lib = 382 Dart_Handle lib =
390 TestCase::LoadTestScript(kScriptChars, &CurrentStackTraceNativeLookup); 383 TestCase::LoadTestScript(kScriptChars, &CurrentStackTraceNativeLookup);
391 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 384 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
392 EXPECT_VALID(result); 385 EXPECT_VALID(result);
393 EXPECT(Dart_IsInteger(result)); 386 EXPECT(Dart_IsInteger(result));
394 int64_t value = 0; 387 int64_t value = 0;
395 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 388 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
396 EXPECT_EQ(42, value); 389 EXPECT_EQ(42, value);
397 } 390 }
398 391
399
400 #endif // !PRODUCT 392 #endif // !PRODUCT
401 393
402
403 TEST_CASE(ErrorHandleTypes) { 394 TEST_CASE(ErrorHandleTypes) {
404 const String& compile_message = String::Handle(String::New("CompileError")); 395 const String& compile_message = String::Handle(String::New("CompileError"));
405 const String& fatal_message = String::Handle(String::New("FatalError")); 396 const String& fatal_message = String::Handle(String::New("FatalError"));
406 397
407 Dart_Handle not_error = NewString("NotError"); 398 Dart_Handle not_error = NewString("NotError");
408 Dart_Handle api_error = Api::NewError("Api%s", "Error"); 399 Dart_Handle api_error = Api::NewError("Api%s", "Error");
409 Dart_Handle exception_error = 400 Dart_Handle exception_error =
410 Dart_NewUnhandledExceptionError(NewString("ExceptionError")); 401 Dart_NewUnhandledExceptionError(NewString("ExceptionError"));
411 Dart_Handle compile_error = 402 Dart_Handle compile_error =
412 Api::NewHandle(thread, LanguageError::New(compile_message)); 403 Api::NewHandle(thread, LanguageError::New(compile_message));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 EXPECT(Dart_IsFatalError(fatal_error)); 435 EXPECT(Dart_IsFatalError(fatal_error));
445 436
446 EXPECT_STREQ("", Dart_GetError(not_error)); 437 EXPECT_STREQ("", Dart_GetError(not_error));
447 EXPECT_STREQ("ApiError", Dart_GetError(api_error)); 438 EXPECT_STREQ("ApiError", Dart_GetError(api_error));
448 EXPECT_SUBSTRING("Unhandled exception:\nExceptionError", 439 EXPECT_SUBSTRING("Unhandled exception:\nExceptionError",
449 Dart_GetError(exception_error)); 440 Dart_GetError(exception_error));
450 EXPECT_STREQ("CompileError", Dart_GetError(compile_error)); 441 EXPECT_STREQ("CompileError", Dart_GetError(compile_error));
451 EXPECT_STREQ("FatalError", Dart_GetError(fatal_error)); 442 EXPECT_STREQ("FatalError", Dart_GetError(fatal_error));
452 } 443 }
453 444
454
455 TEST_CASE(UnhandleExceptionError) { 445 TEST_CASE(UnhandleExceptionError) {
456 const char* exception_cstr = ""; 446 const char* exception_cstr = "";
457 447
458 // Test with an API Error. 448 // Test with an API Error.
459 const char* kApiError = "Api Error Exception Test."; 449 const char* kApiError = "Api Error Exception Test.";
460 Dart_Handle api_error = Api::NewHandle( 450 Dart_Handle api_error = Api::NewHandle(
461 thread, ApiError::New(String::Handle(String::New(kApiError)))); 451 thread, ApiError::New(String::Handle(String::New(kApiError))));
462 Dart_Handle exception_error = Dart_NewUnhandledExceptionError(api_error); 452 Dart_Handle exception_error = Dart_NewUnhandledExceptionError(api_error);
463 EXPECT(!Dart_IsApiError(exception_error)); 453 EXPECT(!Dart_IsApiError(exception_error));
464 EXPECT(Dart_IsUnhandledExceptionError(exception_error)); 454 EXPECT(Dart_IsUnhandledExceptionError(exception_error));
(...skipping 29 matching lines...) Expand all
494 Dart_Handle obj = Api::NewHandle(thread, String::New(kRegularString)); 484 Dart_Handle obj = Api::NewHandle(thread, String::New(kRegularString));
495 exception_error = Dart_NewUnhandledExceptionError(obj); 485 exception_error = Dart_NewUnhandledExceptionError(obj);
496 EXPECT(!Dart_IsApiError(exception_error)); 486 EXPECT(!Dart_IsApiError(exception_error));
497 EXPECT(Dart_IsUnhandledExceptionError(exception_error)); 487 EXPECT(Dart_IsUnhandledExceptionError(exception_error));
498 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error))); 488 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error)));
499 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error), 489 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error),
500 &exception_cstr)); 490 &exception_cstr));
501 EXPECT_STREQ(kRegularString, exception_cstr); 491 EXPECT_STREQ(kRegularString, exception_cstr);
502 } 492 }
503 493
504
505 // Should we propagate the error via Dart_SetReturnValue? 494 // Should we propagate the error via Dart_SetReturnValue?
506 static bool use_set_return = false; 495 static bool use_set_return = false;
507 496
508 // Should we propagate the error via Dart_ThrowException? 497 // Should we propagate the error via Dart_ThrowException?
509 static bool use_throw_exception = false; 498 static bool use_throw_exception = false;
510 499
511
512 void PropagateErrorNative(Dart_NativeArguments args) { 500 void PropagateErrorNative(Dart_NativeArguments args) {
513 Dart_Handle closure = Dart_GetNativeArgument(args, 0); 501 Dart_Handle closure = Dart_GetNativeArgument(args, 0);
514 EXPECT(Dart_IsClosure(closure)); 502 EXPECT(Dart_IsClosure(closure));
515 Dart_Handle result = Dart_InvokeClosure(closure, 0, NULL); 503 Dart_Handle result = Dart_InvokeClosure(closure, 0, NULL);
516 EXPECT(Dart_IsError(result)); 504 EXPECT(Dart_IsError(result));
517 if (use_set_return) { 505 if (use_set_return) {
518 Dart_SetReturnValue(args, result); 506 Dart_SetReturnValue(args, result);
519 } else if (use_throw_exception) { 507 } else if (use_throw_exception) {
520 result = Dart_ThrowException(result); 508 result = Dart_ThrowException(result);
521 EXPECT_VALID(result); // We do not expect to reach here. 509 EXPECT_VALID(result); // We do not expect to reach here.
522 UNREACHABLE(); 510 UNREACHABLE();
523 } else { 511 } else {
524 result = Dart_PropagateError(result); 512 result = Dart_PropagateError(result);
525 EXPECT_VALID(result); // We do not expect to reach here. 513 EXPECT_VALID(result); // We do not expect to reach here.
526 UNREACHABLE(); 514 UNREACHABLE();
527 } 515 }
528 } 516 }
529 517
530
531 static Dart_NativeFunction PropagateError_native_lookup( 518 static Dart_NativeFunction PropagateError_native_lookup(
532 Dart_Handle name, 519 Dart_Handle name,
533 int argument_count, 520 int argument_count,
534 bool* auto_setup_scope) { 521 bool* auto_setup_scope) {
535 ASSERT(auto_setup_scope != NULL); 522 ASSERT(auto_setup_scope != NULL);
536 *auto_setup_scope = true; 523 *auto_setup_scope = true;
537 return reinterpret_cast<Dart_NativeFunction>(&PropagateErrorNative); 524 return reinterpret_cast<Dart_NativeFunction>(&PropagateErrorNative);
538 } 525 }
539 526
540
541 TEST_CASE(Dart_PropagateError) { 527 TEST_CASE(Dart_PropagateError) {
542 const char* kScriptChars = 528 const char* kScriptChars =
543 "raiseCompileError() {\n" 529 "raiseCompileError() {\n"
544 " return missing_semicolon\n" 530 " return missing_semicolon\n"
545 "}\n" 531 "}\n"
546 "\n" 532 "\n"
547 "void throwException() {\n" 533 "void throwException() {\n"
548 " throw new Exception('myException');\n" 534 " throw new Exception('myException');\n"
549 "}\n" 535 "}\n"
550 "\n" 536 "\n"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 result = Dart_Invoke(lib, NewString("Func1"), 0, NULL); 580 result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
595 EXPECT(Dart_IsError(result)); 581 EXPECT(Dart_IsError(result));
596 EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result)); 582 EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
597 583
598 result = Dart_Invoke(lib, NewString("Func2"), 0, NULL); 584 result = Dart_Invoke(lib, NewString("Func2"), 0, NULL);
599 EXPECT(Dart_IsError(result)); 585 EXPECT(Dart_IsError(result));
600 EXPECT(Dart_ErrorHasException(result)); 586 EXPECT(Dart_ErrorHasException(result));
601 EXPECT_SUBSTRING("myException", Dart_GetError(result)); 587 EXPECT_SUBSTRING("myException", Dart_GetError(result));
602 } 588 }
603 589
604
605 TEST_CASE(Dart_Error) { 590 TEST_CASE(Dart_Error) {
606 Dart_Handle error = Api::NewError("An %s", "error"); 591 Dart_Handle error = Api::NewError("An %s", "error");
607 EXPECT(Dart_IsError(error)); 592 EXPECT(Dart_IsError(error));
608 EXPECT_STREQ("An error", Dart_GetError(error)); 593 EXPECT_STREQ("An error", Dart_GetError(error));
609 } 594 }
610 595
611
612 TEST_CASE(Null) { 596 TEST_CASE(Null) {
613 Dart_Handle null = Dart_Null(); 597 Dart_Handle null = Dart_Null();
614 EXPECT_VALID(null); 598 EXPECT_VALID(null);
615 EXPECT(Dart_IsNull(null)); 599 EXPECT(Dart_IsNull(null));
616 600
617 Dart_Handle str = NewString("test"); 601 Dart_Handle str = NewString("test");
618 EXPECT_VALID(str); 602 EXPECT_VALID(str);
619 EXPECT(!Dart_IsNull(str)); 603 EXPECT(!Dart_IsNull(str));
620 } 604 }
621 605
622
623 TEST_CASE(EmptyString) { 606 TEST_CASE(EmptyString) {
624 Dart_Handle empty = Dart_EmptyString(); 607 Dart_Handle empty = Dart_EmptyString();
625 EXPECT_VALID(empty); 608 EXPECT_VALID(empty);
626 EXPECT(!Dart_IsNull(empty)); 609 EXPECT(!Dart_IsNull(empty));
627 } 610 }
628 611
629
630 TEST_CASE(IdentityEquals) { 612 TEST_CASE(IdentityEquals) {
631 Dart_Handle five = Dart_NewInteger(5); 613 Dart_Handle five = Dart_NewInteger(5);
632 Dart_Handle five_again = Dart_NewInteger(5); 614 Dart_Handle five_again = Dart_NewInteger(5);
633 Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF); 615 Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF);
634 Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF); 616 Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
635 Dart_Handle abc = NewString("abc"); 617 Dart_Handle abc = NewString("abc");
636 Dart_Handle abc_again = NewString("abc"); 618 Dart_Handle abc_again = NewString("abc");
637 Dart_Handle xyz = NewString("xyz"); 619 Dart_Handle xyz = NewString("xyz");
638 Dart_Handle dart_core = NewString("dart:core"); 620 Dart_Handle dart_core = NewString("dart:core");
639 Dart_Handle dart_mirrors = NewString("dart:mirrors"); 621 Dart_Handle dart_mirrors = NewString("dart:mirrors");
(...skipping 30 matching lines...) Expand all
670 EXPECT(Dart_IdentityEquals(lib1, lib1)); 652 EXPECT(Dart_IdentityEquals(lib1, lib1));
671 EXPECT(Dart_IdentityEquals(lib2, lib2)); 653 EXPECT(Dart_IdentityEquals(lib2, lib2));
672 EXPECT(!Dart_IdentityEquals(lib1, lib2)); 654 EXPECT(!Dart_IdentityEquals(lib1, lib2));
673 655
674 // Mix instance and non-instance. 656 // Mix instance and non-instance.
675 EXPECT(!Dart_IdentityEquals(lib1, nan1)); 657 EXPECT(!Dart_IdentityEquals(lib1, nan1));
676 EXPECT(!Dart_IdentityEquals(nan1, lib1)); 658 EXPECT(!Dart_IdentityEquals(nan1, lib1));
677 } 659 }
678 } 660 }
679 661
680
681 TEST_CASE(IdentityHash) { 662 TEST_CASE(IdentityHash) {
682 Dart_Handle five = Dart_NewInteger(5); 663 Dart_Handle five = Dart_NewInteger(5);
683 Dart_Handle five_again = Dart_NewInteger(5); 664 Dart_Handle five_again = Dart_NewInteger(5);
684 Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF); 665 Dart_Handle mint = Dart_NewInteger(0xFFFFFFFF);
685 Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF); 666 Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
686 Dart_Handle abc = NewString("abc"); 667 Dart_Handle abc = NewString("abc");
687 // Dart_Handle abc_again = NewString("abc"); 668 // Dart_Handle abc_again = NewString("abc");
688 Dart_Handle xyz = NewString("xyz"); 669 Dart_Handle xyz = NewString("xyz");
689 Dart_Handle dart_core = NewString("dart:core"); 670 Dart_Handle dart_core = NewString("dart:core");
690 Dart_Handle dart_mirrors = NewString("dart:mirrors"); 671 Dart_Handle dart_mirrors = NewString("dart:mirrors");
(...skipping 20 matching lines...) Expand all
711 CHECK_API_SCOPE(thread); 692 CHECK_API_SCOPE(thread);
712 HANDLESCOPE(thread); 693 HANDLESCOPE(thread);
713 Dart_Handle lib1 = Dart_LookupLibrary(dart_core); 694 Dart_Handle lib1 = Dart_LookupLibrary(dart_core);
714 Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors); 695 Dart_Handle lib2 = Dart_LookupLibrary(dart_mirrors);
715 696
716 EXPECT_EQ(Dart_IdentityHash(lib1), Dart_IdentityHash(lib1)); 697 EXPECT_EQ(Dart_IdentityHash(lib1), Dart_IdentityHash(lib1));
717 EXPECT_EQ(Dart_IdentityHash(lib2), Dart_IdentityHash(lib2)); 698 EXPECT_EQ(Dart_IdentityHash(lib2), Dart_IdentityHash(lib2));
718 } 699 }
719 } 700 }
720 701
721
722 TEST_CASE(ObjectEquals) { 702 TEST_CASE(ObjectEquals) {
723 bool equal = false; 703 bool equal = false;
724 Dart_Handle five = NewString("5"); 704 Dart_Handle five = NewString("5");
725 Dart_Handle five_again = NewString("5"); 705 Dart_Handle five_again = NewString("5");
726 Dart_Handle seven = NewString("7"); 706 Dart_Handle seven = NewString("7");
727 707
728 // Same objects. 708 // Same objects.
729 EXPECT_VALID(Dart_ObjectEquals(five, five, &equal)); 709 EXPECT_VALID(Dart_ObjectEquals(five, five, &equal));
730 EXPECT(equal); 710 EXPECT(equal);
731 711
732 // Equal objects. 712 // Equal objects.
733 EXPECT_VALID(Dart_ObjectEquals(five, five_again, &equal)); 713 EXPECT_VALID(Dart_ObjectEquals(five, five_again, &equal));
734 EXPECT(equal); 714 EXPECT(equal);
735 715
736 // Different objects. 716 // Different objects.
737 EXPECT_VALID(Dart_ObjectEquals(five, seven, &equal)); 717 EXPECT_VALID(Dart_ObjectEquals(five, seven, &equal));
738 EXPECT(!equal); 718 EXPECT(!equal);
739 719
740 // Case where identity is not equality. 720 // Case where identity is not equality.
741 Dart_Handle nan = Dart_NewDouble(NAN); 721 Dart_Handle nan = Dart_NewDouble(NAN);
742 EXPECT_VALID(Dart_ObjectEquals(nan, nan, &equal)); 722 EXPECT_VALID(Dart_ObjectEquals(nan, nan, &equal));
743 EXPECT(!equal); 723 EXPECT(!equal);
744 } 724 }
745 725
746
747 TEST_CASE(InstanceValues) { 726 TEST_CASE(InstanceValues) {
748 EXPECT(Dart_IsInstance(NewString("test"))); 727 EXPECT(Dart_IsInstance(NewString("test")));
749 EXPECT(Dart_IsInstance(Dart_True())); 728 EXPECT(Dart_IsInstance(Dart_True()));
750 729
751 // By convention, our Is*() functions exclude null. 730 // By convention, our Is*() functions exclude null.
752 EXPECT(!Dart_IsInstance(Dart_Null())); 731 EXPECT(!Dart_IsInstance(Dart_Null()));
753 } 732 }
754 733
755
756 TEST_CASE(InstanceGetType) { 734 TEST_CASE(InstanceGetType) {
757 Zone* zone = thread->zone(); 735 Zone* zone = thread->zone();
758 // Get the handle from a valid instance handle. 736 // Get the handle from a valid instance handle.
759 Dart_Handle type = Dart_InstanceGetType(Dart_Null()); 737 Dart_Handle type = Dart_InstanceGetType(Dart_Null());
760 EXPECT_VALID(type); 738 EXPECT_VALID(type);
761 EXPECT(Dart_IsType(type)); 739 EXPECT(Dart_IsType(type));
762 const Type& null_type_obj = Api::UnwrapTypeHandle(zone, type); 740 const Type& null_type_obj = Api::UnwrapTypeHandle(zone, type);
763 EXPECT(null_type_obj.raw() == Type::NullType()); 741 EXPECT(null_type_obj.raw() == Type::NullType());
764 742
765 Dart_Handle instance = Dart_True(); 743 Dart_Handle instance = Dart_True();
(...skipping 22 matching lines...) Expand all
788 766
789 // Get the handle from a non-instance handle. 767 // Get the handle from a non-instance handle.
790 Dart_Handle dart_core = NewString("dart:core"); 768 Dart_Handle dart_core = NewString("dart:core");
791 Dart_Handle obj = Dart_LookupLibrary(dart_core); 769 Dart_Handle obj = Dart_LookupLibrary(dart_core);
792 Dart_Handle type_type = Dart_InstanceGetType(obj); 770 Dart_Handle type_type = Dart_InstanceGetType(obj);
793 EXPECT_ERROR(type_type, 771 EXPECT_ERROR(type_type,
794 "Dart_InstanceGetType expects argument 'instance' to be of " 772 "Dart_InstanceGetType expects argument 'instance' to be of "
795 "type Instance."); 773 "type Instance.");
796 } 774 }
797 775
798
799 TEST_CASE(BooleanValues) { 776 TEST_CASE(BooleanValues) {
800 Dart_Handle str = NewString("test"); 777 Dart_Handle str = NewString("test");
801 EXPECT(!Dart_IsBoolean(str)); 778 EXPECT(!Dart_IsBoolean(str));
802 779
803 bool value = false; 780 bool value = false;
804 Dart_Handle result = Dart_BooleanValue(str, &value); 781 Dart_Handle result = Dart_BooleanValue(str, &value);
805 EXPECT(Dart_IsError(result)); 782 EXPECT(Dart_IsError(result));
806 783
807 Dart_Handle val1 = Dart_NewBoolean(true); 784 Dart_Handle val1 = Dart_NewBoolean(true);
808 EXPECT(Dart_IsBoolean(val1)); 785 EXPECT(Dart_IsBoolean(val1));
809 786
810 result = Dart_BooleanValue(val1, &value); 787 result = Dart_BooleanValue(val1, &value);
811 EXPECT_VALID(result); 788 EXPECT_VALID(result);
812 EXPECT(value); 789 EXPECT(value);
813 790
814 Dart_Handle val2 = Dart_NewBoolean(false); 791 Dart_Handle val2 = Dart_NewBoolean(false);
815 EXPECT(Dart_IsBoolean(val2)); 792 EXPECT(Dart_IsBoolean(val2));
816 793
817 result = Dart_BooleanValue(val2, &value); 794 result = Dart_BooleanValue(val2, &value);
818 EXPECT_VALID(result); 795 EXPECT_VALID(result);
819 EXPECT(!value); 796 EXPECT(!value);
820 } 797 }
821 798
822
823 TEST_CASE(BooleanConstants) { 799 TEST_CASE(BooleanConstants) {
824 Dart_Handle true_handle = Dart_True(); 800 Dart_Handle true_handle = Dart_True();
825 EXPECT_VALID(true_handle); 801 EXPECT_VALID(true_handle);
826 EXPECT(Dart_IsBoolean(true_handle)); 802 EXPECT(Dart_IsBoolean(true_handle));
827 803
828 bool value = false; 804 bool value = false;
829 Dart_Handle result = Dart_BooleanValue(true_handle, &value); 805 Dart_Handle result = Dart_BooleanValue(true_handle, &value);
830 EXPECT_VALID(result); 806 EXPECT_VALID(result);
831 EXPECT(value); 807 EXPECT(value);
832 808
833 Dart_Handle false_handle = Dart_False(); 809 Dart_Handle false_handle = Dart_False();
834 EXPECT_VALID(false_handle); 810 EXPECT_VALID(false_handle);
835 EXPECT(Dart_IsBoolean(false_handle)); 811 EXPECT(Dart_IsBoolean(false_handle));
836 812
837 result = Dart_BooleanValue(false_handle, &value); 813 result = Dart_BooleanValue(false_handle, &value);
838 EXPECT_VALID(result); 814 EXPECT_VALID(result);
839 EXPECT(!value); 815 EXPECT(!value);
840 } 816 }
841 817
842
843 TEST_CASE(DoubleValues) { 818 TEST_CASE(DoubleValues) {
844 const double kDoubleVal1 = 201.29; 819 const double kDoubleVal1 = 201.29;
845 const double kDoubleVal2 = 101.19; 820 const double kDoubleVal2 = 101.19;
846 Dart_Handle val1 = Dart_NewDouble(kDoubleVal1); 821 Dart_Handle val1 = Dart_NewDouble(kDoubleVal1);
847 EXPECT(Dart_IsDouble(val1)); 822 EXPECT(Dart_IsDouble(val1));
848 Dart_Handle val2 = Dart_NewDouble(kDoubleVal2); 823 Dart_Handle val2 = Dart_NewDouble(kDoubleVal2);
849 EXPECT(Dart_IsDouble(val2)); 824 EXPECT(Dart_IsDouble(val2));
850 double out1, out2; 825 double out1, out2;
851 Dart_Handle result = Dart_DoubleValue(val1, &out1); 826 Dart_Handle result = Dart_DoubleValue(val1, &out1);
852 EXPECT_VALID(result); 827 EXPECT_VALID(result);
853 EXPECT_EQ(kDoubleVal1, out1); 828 EXPECT_EQ(kDoubleVal1, out1);
854 result = Dart_DoubleValue(val2, &out2); 829 result = Dart_DoubleValue(val2, &out2);
855 EXPECT_VALID(result); 830 EXPECT_VALID(result);
856 EXPECT_EQ(kDoubleVal2, out2); 831 EXPECT_EQ(kDoubleVal2, out2);
857 } 832 }
858 833
859
860 TEST_CASE(NumberValues) { 834 TEST_CASE(NumberValues) {
861 // TODO(antonm): add various kinds of ints (smi, mint, bigint). 835 // TODO(antonm): add various kinds of ints (smi, mint, bigint).
862 const char* kScriptChars = 836 const char* kScriptChars =
863 "int getInt() { return 1; }\n" 837 "int getInt() { return 1; }\n"
864 "double getDouble() { return 1.0; }\n" 838 "double getDouble() { return 1.0; }\n"
865 "bool getBool() { return false; }\n" 839 "bool getBool() { return false; }\n"
866 "getNull() { return null; }\n"; 840 "getNull() { return null; }\n";
867 Dart_Handle result; 841 Dart_Handle result;
868 // Create a test library and Load up a test script in it. 842 // Create a test library and Load up a test script in it.
869 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 843 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
(...skipping 12 matching lines...) Expand all
882 result = Dart_Invoke(lib, NewString("getBool"), 0, NULL); 856 result = Dart_Invoke(lib, NewString("getBool"), 0, NULL);
883 EXPECT_VALID(result); 857 EXPECT_VALID(result);
884 EXPECT(!Dart_IsNumber(result)); 858 EXPECT(!Dart_IsNumber(result));
885 859
886 // Check null case. 860 // Check null case.
887 result = Dart_Invoke(lib, NewString("getNull"), 0, NULL); 861 result = Dart_Invoke(lib, NewString("getNull"), 0, NULL);
888 EXPECT_VALID(result); 862 EXPECT_VALID(result);
889 EXPECT(!Dart_IsNumber(result)); 863 EXPECT(!Dart_IsNumber(result));
890 } 864 }
891 865
892
893 TEST_CASE(IntegerValues) { 866 TEST_CASE(IntegerValues) {
894 const int64_t kIntegerVal1 = 100; 867 const int64_t kIntegerVal1 = 100;
895 const int64_t kIntegerVal2 = 0xffffffff; 868 const int64_t kIntegerVal2 = 0xffffffff;
896 const char* kIntegerVal3 = "0x123456789123456789123456789"; 869 const char* kIntegerVal3 = "0x123456789123456789123456789";
897 const uint64_t kIntegerVal4 = 0xffffffffffffffff; 870 const uint64_t kIntegerVal4 = 0xffffffffffffffff;
898 871
899 Dart_Handle val1 = Dart_NewInteger(kIntegerVal1); 872 Dart_Handle val1 = Dart_NewInteger(kIntegerVal1);
900 EXPECT(Dart_IsInteger(val1)); 873 EXPECT(Dart_IsInteger(val1));
901 bool fits = false; 874 bool fits = false;
902 Dart_Handle result = Dart_IntegerFitsIntoInt64(val1, &fits); 875 Dart_Handle result = Dart_IntegerFitsIntoInt64(val1, &fits);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 EXPECT_VALID(result); 909 EXPECT_VALID(result);
937 EXPECT_EQ(kIntegerVal4, out4); 910 EXPECT_EQ(kIntegerVal4, out4);
938 911
939 Dart_Handle val5 = Dart_NewInteger(-1); 912 Dart_Handle val5 = Dart_NewInteger(-1);
940 EXPECT_VALID(val5); 913 EXPECT_VALID(val5);
941 uint64_t out5 = 0; 914 uint64_t out5 = 0;
942 result = Dart_IntegerToUint64(val5, &out5); 915 result = Dart_IntegerToUint64(val5, &out5);
943 EXPECT(Dart_IsError(result)); 916 EXPECT(Dart_IsError(result));
944 } 917 }
945 918
946
947 TEST_CASE(IntegerFitsIntoInt64) { 919 TEST_CASE(IntegerFitsIntoInt64) {
948 Dart_Handle max = Dart_NewInteger(kMaxInt64); 920 Dart_Handle max = Dart_NewInteger(kMaxInt64);
949 EXPECT(Dart_IsInteger(max)); 921 EXPECT(Dart_IsInteger(max));
950 bool fits = false; 922 bool fits = false;
951 Dart_Handle result = Dart_IntegerFitsIntoInt64(max, &fits); 923 Dart_Handle result = Dart_IntegerFitsIntoInt64(max, &fits);
952 EXPECT_VALID(result); 924 EXPECT_VALID(result);
953 EXPECT(fits); 925 EXPECT(fits);
954 926
955 Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x8000000000000000"); 927 Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x8000000000000000");
956 EXPECT(Dart_IsInteger(above_max)); 928 EXPECT(Dart_IsInteger(above_max));
(...skipping 10 matching lines...) Expand all
967 EXPECT(fits); 939 EXPECT(fits);
968 940
969 Dart_Handle below_min = Dart_NewIntegerFromHexCString("-0x8000000000000001"); 941 Dart_Handle below_min = Dart_NewIntegerFromHexCString("-0x8000000000000001");
970 EXPECT(Dart_IsInteger(below_min)); 942 EXPECT(Dart_IsInteger(below_min));
971 fits = true; 943 fits = true;
972 result = Dart_IntegerFitsIntoInt64(below_min, &fits); 944 result = Dart_IntegerFitsIntoInt64(below_min, &fits);
973 EXPECT_VALID(result); 945 EXPECT_VALID(result);
974 EXPECT(!fits); 946 EXPECT(!fits);
975 } 947 }
976 948
977
978 TEST_CASE(IntegerFitsIntoUint64) { 949 TEST_CASE(IntegerFitsIntoUint64) {
979 Dart_Handle max = Dart_NewIntegerFromUint64(kMaxUint64); 950 Dart_Handle max = Dart_NewIntegerFromUint64(kMaxUint64);
980 EXPECT(Dart_IsInteger(max)); 951 EXPECT(Dart_IsInteger(max));
981 bool fits = false; 952 bool fits = false;
982 Dart_Handle result = Dart_IntegerFitsIntoUint64(max, &fits); 953 Dart_Handle result = Dart_IntegerFitsIntoUint64(max, &fits);
983 EXPECT_VALID(result); 954 EXPECT_VALID(result);
984 EXPECT(fits); 955 EXPECT(fits);
985 956
986 Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x10000000000000000"); 957 Dart_Handle above_max = Dart_NewIntegerFromHexCString("0x10000000000000000");
987 EXPECT(Dart_IsInteger(above_max)); 958 EXPECT(Dart_IsInteger(above_max));
(...skipping 10 matching lines...) Expand all
998 EXPECT(fits); 969 EXPECT(fits);
999 970
1000 Dart_Handle below_min = Dart_NewIntegerFromHexCString("-1"); 971 Dart_Handle below_min = Dart_NewIntegerFromHexCString("-1");
1001 EXPECT(Dart_IsInteger(below_min)); 972 EXPECT(Dart_IsInteger(below_min));
1002 fits = true; 973 fits = true;
1003 result = Dart_IntegerFitsIntoUint64(below_min, &fits); 974 result = Dart_IntegerFitsIntoUint64(below_min, &fits);
1004 EXPECT_VALID(result); 975 EXPECT_VALID(result);
1005 EXPECT(!fits); 976 EXPECT(!fits);
1006 } 977 }
1007 978
1008
1009 TEST_CASE(ArrayValues) { 979 TEST_CASE(ArrayValues) {
1010 EXPECT(!Dart_IsList(Dart_Null())); 980 EXPECT(!Dart_IsList(Dart_Null()));
1011 const int kArrayLength = 10; 981 const int kArrayLength = 10;
1012 Dart_Handle str = NewString("test"); 982 Dart_Handle str = NewString("test");
1013 EXPECT(!Dart_IsList(str)); 983 EXPECT(!Dart_IsList(str));
1014 Dart_Handle val = Dart_NewList(kArrayLength); 984 Dart_Handle val = Dart_NewList(kArrayLength);
1015 EXPECT(Dart_IsList(val)); 985 EXPECT(Dart_IsList(val));
1016 intptr_t len = 0; 986 intptr_t len = 0;
1017 Dart_Handle result = Dart_ListLength(val, &len); 987 Dart_Handle result = Dart_ListLength(val, &len);
1018 EXPECT_VALID(result); 988 EXPECT_VALID(result);
(...skipping 16 matching lines...) Expand all
1035 for (int i = 0; i < kArrayLength; i++) { 1005 for (int i = 0; i < kArrayLength; i++) {
1036 result = Dart_ListGetAt(val, i); 1006 result = Dart_ListGetAt(val, i);
1037 EXPECT_VALID(result); 1007 EXPECT_VALID(result);
1038 int64_t value; 1008 int64_t value;
1039 result = Dart_IntegerToInt64(result, &value); 1009 result = Dart_IntegerToInt64(result, &value);
1040 EXPECT_VALID(result); 1010 EXPECT_VALID(result);
1041 EXPECT_EQ(i, value); 1011 EXPECT_EQ(i, value);
1042 } 1012 }
1043 } 1013 }
1044 1014
1045
1046 TEST_CASE(IsString) { 1015 TEST_CASE(IsString) {
1047 uint8_t latin1[] = {'o', 'n', 'e', 0xC2, 0xA2}; 1016 uint8_t latin1[] = {'o', 'n', 'e', 0xC2, 0xA2};
1048 1017
1049 Dart_Handle latin1str = Dart_NewStringFromUTF8(latin1, ARRAY_SIZE(latin1)); 1018 Dart_Handle latin1str = Dart_NewStringFromUTF8(latin1, ARRAY_SIZE(latin1));
1050 EXPECT_VALID(latin1str); 1019 EXPECT_VALID(latin1str);
1051 EXPECT(Dart_IsString(latin1str)); 1020 EXPECT(Dart_IsString(latin1str));
1052 EXPECT(Dart_IsStringLatin1(latin1str)); 1021 EXPECT(Dart_IsStringLatin1(latin1str));
1053 EXPECT(!Dart_IsExternalString(latin1str)); 1022 EXPECT(!Dart_IsExternalString(latin1str));
1054 intptr_t len = -1; 1023 intptr_t len = -1;
1055 EXPECT_VALID(Dart_StringLength(latin1str, &len)); 1024 EXPECT_VALID(Dart_StringLength(latin1str, &len));
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 EXPECT_EQ(data16, peer); 1083 EXPECT_EQ(data16, peer);
1115 1084
1116 int32_t data32[] = {'f', 'o', 'u', 'r', 0x10FFFF}; 1085 int32_t data32[] = {'f', 'o', 'u', 'r', 0x10FFFF};
1117 1086
1118 Dart_Handle str32 = Dart_NewStringFromUTF32(data32, ARRAY_SIZE(data32)); 1087 Dart_Handle str32 = Dart_NewStringFromUTF32(data32, ARRAY_SIZE(data32));
1119 EXPECT_VALID(str32); 1088 EXPECT_VALID(str32);
1120 EXPECT(Dart_IsString(str32)); 1089 EXPECT(Dart_IsString(str32));
1121 EXPECT(!Dart_IsExternalString(str32)); 1090 EXPECT(!Dart_IsExternalString(str32));
1122 } 1091 }
1123 1092
1124
1125 TEST_CASE(NewString) { 1093 TEST_CASE(NewString) {
1126 const char* ascii = "string"; 1094 const char* ascii = "string";
1127 Dart_Handle ascii_str = NewString(ascii); 1095 Dart_Handle ascii_str = NewString(ascii);
1128 EXPECT_VALID(ascii_str); 1096 EXPECT_VALID(ascii_str);
1129 EXPECT(Dart_IsString(ascii_str)); 1097 EXPECT(Dart_IsString(ascii_str));
1130 1098
1131 const char* null = NULL; 1099 const char* null = NULL;
1132 Dart_Handle null_str = NewString(null); 1100 Dart_Handle null_str = NewString(null);
1133 EXPECT(Dart_IsError(null_str)); 1101 EXPECT(Dart_IsError(null_str));
1134 1102
1135 uint8_t data[] = {0xE4, 0xBA, 0x8c}; // U+4E8C. 1103 uint8_t data[] = {0xE4, 0xBA, 0x8c}; // U+4E8C.
1136 Dart_Handle utf8_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data)); 1104 Dart_Handle utf8_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data));
1137 EXPECT_VALID(utf8_str); 1105 EXPECT_VALID(utf8_str);
1138 EXPECT(Dart_IsString(utf8_str)); 1106 EXPECT(Dart_IsString(utf8_str));
1139 1107
1140 uint8_t invalid[] = {0xE4, 0xBA}; // underflow. 1108 uint8_t invalid[] = {0xE4, 0xBA}; // underflow.
1141 Dart_Handle invalid_str = 1109 Dart_Handle invalid_str =
1142 Dart_NewStringFromUTF8(invalid, ARRAY_SIZE(invalid)); 1110 Dart_NewStringFromUTF8(invalid, ARRAY_SIZE(invalid));
1143 EXPECT(Dart_IsError(invalid_str)); 1111 EXPECT(Dart_IsError(invalid_str));
1144 } 1112 }
1145 1113
1146
1147 TEST_CASE(MalformedStringToUTF8) { 1114 TEST_CASE(MalformedStringToUTF8) {
1148 // 1D11E = treble clef 1115 // 1D11E = treble clef
1149 // [0] should be high surrogate D834 1116 // [0] should be high surrogate D834
1150 // [1] should be low surrogate DD1E 1117 // [1] should be low surrogate DD1E
1151 // Strings are allowed to have individual or out of order surrogates, even 1118 // Strings are allowed to have individual or out of order surrogates, even
1152 // if that doesn't make sense as renderable characters. 1119 // if that doesn't make sense as renderable characters.
1153 const char* kScriptChars = 1120 const char* kScriptChars =
1154 "String lowSurrogate() {" 1121 "String lowSurrogate() {"
1155 " return '\\u{1D11E}'[1];" 1122 " return '\\u{1D11E}'[1];"
1156 "}" 1123 "}"
(...skipping 25 matching lines...) Expand all
1182 result = Dart_StringToUTF8(reversed, &utf8_encoded_reversed, 1149 result = Dart_StringToUTF8(reversed, &utf8_encoded_reversed,
1183 &utf8_length_reversed); 1150 &utf8_length_reversed);
1184 EXPECT_VALID(result); 1151 EXPECT_VALID(result);
1185 EXPECT_EQ(6, utf8_length_reversed); 1152 EXPECT_EQ(6, utf8_length_reversed);
1186 uint8_t expected[6] = {237, 180, 158, 237, 160, 180}; 1153 uint8_t expected[6] = {237, 180, 158, 237, 160, 180};
1187 for (int i = 0; i < 6; i++) { 1154 for (int i = 0; i < 6; i++) {
1188 EXPECT_EQ(expected[i], utf8_encoded_reversed[i]); 1155 EXPECT_EQ(expected[i], utf8_encoded_reversed[i]);
1189 } 1156 }
1190 } 1157 }
1191 1158
1192
1193 // Helper class to ensure new gen GC is triggered without any side effects. 1159 // Helper class to ensure new gen GC is triggered without any side effects.
1194 // The normal call to CollectGarbage(Heap::kNew) could potentially trigger 1160 // The normal call to CollectGarbage(Heap::kNew) could potentially trigger
1195 // an old gen collection if there is a promotion failure and this could 1161 // an old gen collection if there is a promotion failure and this could
1196 // perturb the test. 1162 // perturb the test.
1197 class GCTestHelper : public AllStatic { 1163 class GCTestHelper : public AllStatic {
1198 public: 1164 public:
1199 static void CollectNewSpace(Heap::ApiCallbacks api_callbacks) { 1165 static void CollectNewSpace(Heap::ApiCallbacks api_callbacks) {
1200 bool invoke_api_callbacks = (api_callbacks == Heap::kInvokeApiCallbacks); 1166 bool invoke_api_callbacks = (api_callbacks == Heap::kInvokeApiCallbacks);
1201 Isolate::Current()->heap()->new_space()->Scavenge(invoke_api_callbacks); 1167 Isolate::Current()->heap()->new_space()->Scavenge(invoke_api_callbacks);
1202 } 1168 }
1203 1169
1204 static void WaitForGCTasks() { 1170 static void WaitForGCTasks() {
1205 Thread* thread = Thread::Current(); 1171 Thread* thread = Thread::Current();
1206 PageSpace* old_space = thread->isolate()->heap()->old_space(); 1172 PageSpace* old_space = thread->isolate()->heap()->old_space();
1207 MonitorLocker ml(old_space->tasks_lock()); 1173 MonitorLocker ml(old_space->tasks_lock());
1208 while (old_space->tasks() > 0) { 1174 while (old_space->tasks() > 0) {
1209 ml.WaitWithSafepointCheck(thread); 1175 ml.WaitWithSafepointCheck(thread);
1210 } 1176 }
1211 } 1177 }
1212 }; 1178 };
1213 1179
1214
1215 static void ExternalStringCallbackFinalizer(void* peer) { 1180 static void ExternalStringCallbackFinalizer(void* peer) {
1216 *static_cast<int*>(peer) *= 2; 1181 *static_cast<int*>(peer) *= 2;
1217 } 1182 }
1218 1183
1219
1220 TEST_CASE(ExternalStringCallback) { 1184 TEST_CASE(ExternalStringCallback) {
1221 int peer8 = 40; 1185 int peer8 = 40;
1222 int peer16 = 41; 1186 int peer16 = 41;
1223 1187
1224 { 1188 {
1225 Dart_EnterScope(); 1189 Dart_EnterScope();
1226 1190
1227 uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'}; 1191 uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'};
1228 Dart_Handle obj8 = Dart_NewExternalLatin1String( 1192 Dart_Handle obj8 = Dart_NewExternalLatin1String(
1229 data8, ARRAY_SIZE(data8), &peer8, ExternalStringCallbackFinalizer); 1193 data8, ARRAY_SIZE(data8), &peer8, ExternalStringCallbackFinalizer);
(...skipping 15 matching lines...) Expand all
1245 GCTestHelper::WaitForGCTasks(); 1209 GCTestHelper::WaitForGCTasks();
1246 EXPECT_EQ(40, peer8); 1210 EXPECT_EQ(40, peer8);
1247 EXPECT_EQ(41, peer16); 1211 EXPECT_EQ(41, peer16);
1248 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 1212 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
1249 GCTestHelper::WaitForGCTasks(); 1213 GCTestHelper::WaitForGCTasks();
1250 EXPECT_EQ(80, peer8); 1214 EXPECT_EQ(80, peer8);
1251 EXPECT_EQ(82, peer16); 1215 EXPECT_EQ(82, peer16);
1252 } 1216 }
1253 } 1217 }
1254 1218
1255
1256 TEST_CASE(ExternalStringPretenure) { 1219 TEST_CASE(ExternalStringPretenure) {
1257 { 1220 {
1258 Dart_EnterScope(); 1221 Dart_EnterScope();
1259 static const uint8_t big_data8[16 * MB] = { 1222 static const uint8_t big_data8[16 * MB] = {
1260 0, 1223 0,
1261 }; 1224 };
1262 Dart_Handle big8 = Dart_NewExternalLatin1String( 1225 Dart_Handle big8 = Dart_NewExternalLatin1String(
1263 big_data8, ARRAY_SIZE(big_data8), NULL, NULL); 1226 big_data8, ARRAY_SIZE(big_data8), NULL, NULL);
1264 EXPECT_VALID(big8); 1227 EXPECT_VALID(big8);
1265 static const uint16_t big_data16[16 * MB / 2] = { 1228 static const uint16_t big_data16[16 * MB / 2] = {
(...skipping 19 matching lines...) Expand all
1285 EXPECT(handle.IsOld()); 1248 EXPECT(handle.IsOld());
1286 handle ^= Api::UnwrapHandle(small8); 1249 handle ^= Api::UnwrapHandle(small8);
1287 EXPECT(handle.IsNew()); 1250 EXPECT(handle.IsNew());
1288 handle ^= Api::UnwrapHandle(small16); 1251 handle ^= Api::UnwrapHandle(small16);
1289 EXPECT(handle.IsNew()); 1252 EXPECT(handle.IsNew());
1290 } 1253 }
1291 Dart_ExitScope(); 1254 Dart_ExitScope();
1292 } 1255 }
1293 } 1256 }
1294 1257
1295
1296 TEST_CASE(ExternalTypedDataPretenure) { 1258 TEST_CASE(ExternalTypedDataPretenure) {
1297 { 1259 {
1298 Dart_EnterScope(); 1260 Dart_EnterScope();
1299 static const int kBigLength = 16 * MB / 8; 1261 static const int kBigLength = 16 * MB / 8;
1300 int64_t* big_data = new int64_t[kBigLength](); 1262 int64_t* big_data = new int64_t[kBigLength]();
1301 Dart_Handle big = 1263 Dart_Handle big =
1302 Dart_NewExternalTypedData(Dart_TypedData_kInt64, big_data, kBigLength); 1264 Dart_NewExternalTypedData(Dart_TypedData_kInt64, big_data, kBigLength);
1303 EXPECT_VALID(big); 1265 EXPECT_VALID(big);
1304 static const int kSmallLength = 16 * KB / 8; 1266 static const int kSmallLength = 16 * KB / 8;
1305 int64_t* small_data = new int64_t[kSmallLength](); 1267 int64_t* small_data = new int64_t[kSmallLength]();
1306 Dart_Handle small = Dart_NewExternalTypedData(Dart_TypedData_kInt64, 1268 Dart_Handle small = Dart_NewExternalTypedData(Dart_TypedData_kInt64,
1307 small_data, kSmallLength); 1269 small_data, kSmallLength);
1308 EXPECT_VALID(small); 1270 EXPECT_VALID(small);
1309 { 1271 {
1310 CHECK_API_SCOPE(thread); 1272 CHECK_API_SCOPE(thread);
1311 HANDLESCOPE(thread); 1273 HANDLESCOPE(thread);
1312 ExternalTypedData& handle = ExternalTypedData::Handle(); 1274 ExternalTypedData& handle = ExternalTypedData::Handle();
1313 handle ^= Api::UnwrapHandle(big); 1275 handle ^= Api::UnwrapHandle(big);
1314 EXPECT(handle.IsOld()); 1276 EXPECT(handle.IsOld());
1315 handle ^= Api::UnwrapHandle(small); 1277 handle ^= Api::UnwrapHandle(small);
1316 EXPECT(handle.IsNew()); 1278 EXPECT(handle.IsNew());
1317 } 1279 }
1318 Dart_ExitScope(); 1280 Dart_ExitScope();
1319 delete[] big_data; 1281 delete[] big_data;
1320 delete[] small_data; 1282 delete[] small_data;
1321 } 1283 }
1322 } 1284 }
1323 1285
1324
1325 TEST_CASE(ListAccess) { 1286 TEST_CASE(ListAccess) {
1326 const char* kScriptChars = 1287 const char* kScriptChars =
1327 "List testMain() {" 1288 "List testMain() {"
1328 " List a = new List();" 1289 " List a = new List();"
1329 " a.add(10);" 1290 " a.add(10);"
1330 " a.add(20);" 1291 " a.add(20);"
1331 " a.add(30);" 1292 " a.add(30);"
1332 " return a;" 1293 " return a;"
1333 "}" 1294 "}"
1334 "" 1295 ""
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1465 1426
1466 result = Dart_ListSetAsBytes(list_access_test_obj, 0, native_array, 3); 1427 result = Dart_ListSetAsBytes(list_access_test_obj, 0, native_array, 3);
1467 EXPECT(Dart_IsError(result)); 1428 EXPECT(Dart_IsError(result));
1468 EXPECT(Dart_IsUnhandledExceptionError(result)); 1429 EXPECT(Dart_IsUnhandledExceptionError(result));
1469 1430
1470 result = Dart_ListSetAt(list_access_test_obj, 0, Dart_NewInteger(42)); 1431 result = Dart_ListSetAt(list_access_test_obj, 0, Dart_NewInteger(42));
1471 EXPECT(Dart_IsError(result)); 1432 EXPECT(Dart_IsError(result));
1472 EXPECT(Dart_IsUnhandledExceptionError(result)); 1433 EXPECT(Dart_IsUnhandledExceptionError(result));
1473 } 1434 }
1474 1435
1475
1476 TEST_CASE(MapAccess) { 1436 TEST_CASE(MapAccess) {
1477 EXPECT(!Dart_IsMap(Dart_Null())); 1437 EXPECT(!Dart_IsMap(Dart_Null()));
1478 const char* kScriptChars = 1438 const char* kScriptChars =
1479 "Map testMain() {" 1439 "Map testMain() {"
1480 " return {" 1440 " return {"
1481 " 'a' : 1," 1441 " 'a' : 1,"
1482 " 'b' : null," 1442 " 'b' : null,"
1483 " };" 1443 " };"
1484 "}"; 1444 "}";
1485 Dart_Handle result; 1445 Dart_Handle result;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 1518
1559 result = Dart_ListGetAt(keys, 1); 1519 result = Dart_ListGetAt(keys, 1);
1560 EXPECT(Dart_IsString(result)); 1520 EXPECT(Dart_IsString(result));
1561 equals = false; 1521 equals = false;
1562 EXPECT_VALID(Dart_ObjectEquals(result, b, &equals)); 1522 EXPECT_VALID(Dart_ObjectEquals(result, b, &equals));
1563 EXPECT(equals); 1523 EXPECT(equals);
1564 1524
1565 EXPECT(Dart_IsError(Dart_MapKeys(a))); 1525 EXPECT(Dart_IsError(Dart_MapKeys(a)));
1566 } 1526 }
1567 1527
1568
1569 TEST_CASE(IsFuture) { 1528 TEST_CASE(IsFuture) {
1570 const char* kScriptChars = 1529 const char* kScriptChars =
1571 "import 'dart:async';" 1530 "import 'dart:async';"
1572 "Future testMain() {" 1531 "Future testMain() {"
1573 " return new Completer().future;" 1532 " return new Completer().future;"
1574 "}"; 1533 "}";
1575 Dart_Handle result; 1534 Dart_Handle result;
1576 1535
1577 // Create a test library and Load up a test script in it. 1536 // Create a test library and Load up a test script in it.
1578 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 1537 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
1579 1538
1580 // Invoke a function which returns an object of type Future. 1539 // Invoke a function which returns an object of type Future.
1581 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 1540 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
1582 EXPECT_VALID(result); 1541 EXPECT_VALID(result);
1583 EXPECT(Dart_IsFuture(result)); 1542 EXPECT(Dart_IsFuture(result));
1584 1543
1585 EXPECT(!Dart_IsFuture(lib)); // Non-instance. 1544 EXPECT(!Dart_IsFuture(lib)); // Non-instance.
1586 Dart_Handle anInteger = Dart_NewInteger(0); 1545 Dart_Handle anInteger = Dart_NewInteger(0);
1587 EXPECT(!Dart_IsFuture(anInteger)); 1546 EXPECT(!Dart_IsFuture(anInteger));
1588 Dart_Handle aString = NewString("I am not a Future"); 1547 Dart_Handle aString = NewString("I am not a Future");
1589 EXPECT(!Dart_IsFuture(aString)); 1548 EXPECT(!Dart_IsFuture(aString));
1590 Dart_Handle null = Dart_Null(); 1549 Dart_Handle null = Dart_Null();
1591 EXPECT(!Dart_IsFuture(null)); 1550 EXPECT(!Dart_IsFuture(null));
1592 } 1551 }
1593 1552
1594
1595 TEST_CASE(TypedDataViewListGetAsBytes) { 1553 TEST_CASE(TypedDataViewListGetAsBytes) {
1596 const int kSize = 1000; 1554 const int kSize = 1000;
1597 1555
1598 const char* kScriptChars = 1556 const char* kScriptChars =
1599 "import 'dart:typed_data';\n" 1557 "import 'dart:typed_data';\n"
1600 "List main(int size) {\n" 1558 "List main(int size) {\n"
1601 " var a = new Int8List(size);\n" 1559 " var a = new Int8List(size);\n"
1602 " var view = new Int8List.view(a.buffer, 0, size);\n" 1560 " var view = new Int8List.view(a.buffer, 0, size);\n"
1603 " return view;\n" 1561 " return view;\n"
1604 "}\n"; 1562 "}\n";
(...skipping 12 matching lines...) Expand all
1617 EXPECT_VALID(Dart_ListGetAsBytes(view_obj, 0, data, kSize)); 1575 EXPECT_VALID(Dart_ListGetAsBytes(view_obj, 0, data, kSize));
1618 for (intptr_t i = 0; i < kSize; ++i) { 1576 for (intptr_t i = 0; i < kSize; ++i) {
1619 EXPECT_EQ(i & 0xff, data[i]); 1577 EXPECT_EQ(i & 0xff, data[i]);
1620 } 1578 }
1621 1579
1622 Dart_Handle result = Dart_ListGetAsBytes(view_obj, 0, data, kSize + 1); 1580 Dart_Handle result = Dart_ListGetAsBytes(view_obj, 0, data, kSize + 1);
1623 EXPECT(Dart_IsError(result)); 1581 EXPECT(Dart_IsError(result));
1624 delete[] data; 1582 delete[] data;
1625 } 1583 }
1626 1584
1627
1628 TEST_CASE(TypedDataViewListIsTypedData) { 1585 TEST_CASE(TypedDataViewListIsTypedData) {
1629 const int kSize = 1000; 1586 const int kSize = 1000;
1630 1587
1631 const char* kScriptChars = 1588 const char* kScriptChars =
1632 "import 'dart:typed_data';\n" 1589 "import 'dart:typed_data';\n"
1633 "List main(int size) {\n" 1590 "List main(int size) {\n"
1634 " var a = new Int8List(size);\n" 1591 " var a = new Int8List(size);\n"
1635 " var view = new Int8List.view(a.buffer, 0, size);\n" 1592 " var view = new Int8List.view(a.buffer, 0, size);\n"
1636 " return view;\n" 1593 " return view;\n"
1637 "}\n"; 1594 "}\n";
1638 // Create a test library and Load up a test script in it. 1595 // Create a test library and Load up a test script in it.
1639 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 1596 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
1640 1597
1641 // Create a typed data view object. 1598 // Create a typed data view object.
1642 Dart_Handle dart_args[1]; 1599 Dart_Handle dart_args[1];
1643 dart_args[0] = Dart_NewInteger(kSize); 1600 dart_args[0] = Dart_NewInteger(kSize);
1644 Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args); 1601 Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
1645 EXPECT_VALID(view_obj); 1602 EXPECT_VALID(view_obj);
1646 // Test that the API considers it a TypedData object. 1603 // Test that the API considers it a TypedData object.
1647 EXPECT(Dart_IsTypedData(view_obj)); 1604 EXPECT(Dart_IsTypedData(view_obj));
1648 } 1605 }
1649 1606
1650
1651 TEST_CASE(TypedDataAccess) { 1607 TEST_CASE(TypedDataAccess) {
1652 EXPECT_EQ(Dart_TypedData_kInvalid, Dart_GetTypeOfTypedData(Dart_True())); 1608 EXPECT_EQ(Dart_TypedData_kInvalid, Dart_GetTypeOfTypedData(Dart_True()));
1653 EXPECT_EQ(Dart_TypedData_kInvalid, 1609 EXPECT_EQ(Dart_TypedData_kInvalid,
1654 Dart_GetTypeOfExternalTypedData(Dart_False())); 1610 Dart_GetTypeOfExternalTypedData(Dart_False()));
1655 Dart_Handle byte_array1 = Dart_NewTypedData(Dart_TypedData_kUint8, 10); 1611 Dart_Handle byte_array1 = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
1656 EXPECT_VALID(byte_array1); 1612 EXPECT_VALID(byte_array1);
1657 EXPECT_EQ(Dart_TypedData_kUint8, Dart_GetTypeOfTypedData(byte_array1)); 1613 EXPECT_EQ(Dart_TypedData_kUint8, Dart_GetTypeOfTypedData(byte_array1));
1658 EXPECT_EQ(Dart_TypedData_kInvalid, 1614 EXPECT_EQ(Dart_TypedData_kInvalid,
1659 Dart_GetTypeOfExternalTypedData(byte_array1)); 1615 Dart_GetTypeOfExternalTypedData(byte_array1));
1660 EXPECT(Dart_IsList(byte_array1)); 1616 EXPECT(Dart_IsList(byte_array1));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 Dart_ListGetAsBytes(byte_array1, 0, data, 10); 1670 Dart_ListGetAsBytes(byte_array1, 0, data, 10);
1715 for (intptr_t i = 0; i < 10; ++i) { 1671 for (intptr_t i = 0; i < 10; ++i) {
1716 Dart_Handle integer_obj = Dart_ListGetAt(byte_array1, i); 1672 Dart_Handle integer_obj = Dart_ListGetAt(byte_array1, i);
1717 EXPECT_VALID(integer_obj); 1673 EXPECT_VALID(integer_obj);
1718 int64_t int64_t_value = -1; 1674 int64_t int64_t_value = -1;
1719 EXPECT_VALID(Dart_IntegerToInt64(integer_obj, &int64_t_value)); 1675 EXPECT_VALID(Dart_IntegerToInt64(integer_obj, &int64_t_value));
1720 EXPECT_EQ(10 - i, int64_t_value); 1676 EXPECT_EQ(10 - i, int64_t_value);
1721 } 1677 }
1722 } 1678 }
1723 1679
1724
1725 TEST_CASE(ByteBufferAccess) { 1680 TEST_CASE(ByteBufferAccess) {
1726 EXPECT(!Dart_IsByteBuffer(Dart_True())); 1681 EXPECT(!Dart_IsByteBuffer(Dart_True()));
1727 Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10); 1682 Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
1728 EXPECT_VALID(byte_array); 1683 EXPECT_VALID(byte_array);
1729 // Set through the List API. 1684 // Set through the List API.
1730 for (intptr_t i = 0; i < 10; ++i) { 1685 for (intptr_t i = 0; i < 10; ++i) {
1731 EXPECT_VALID(Dart_ListSetAt(byte_array, i, Dart_NewInteger(i + 1))); 1686 EXPECT_VALID(Dart_ListSetAt(byte_array, i, Dart_NewInteger(i + 1)));
1732 } 1687 }
1733 Dart_Handle byte_buffer = Dart_NewByteBuffer(byte_array); 1688 Dart_Handle byte_buffer = Dart_NewByteBuffer(byte_array);
1734 EXPECT_VALID(byte_buffer); 1689 EXPECT_VALID(byte_buffer);
(...skipping 23 matching lines...) Expand all
1758 result = Dart_NewByteBuffer(Dart_True()); 1713 result = Dart_NewByteBuffer(Dart_True());
1759 EXPECT(Dart_IsError(result)); 1714 EXPECT(Dart_IsError(result));
1760 result = Dart_NewByteBuffer(byte_buffer); 1715 result = Dart_NewByteBuffer(byte_buffer);
1761 EXPECT(Dart_IsError(result)); 1716 EXPECT(Dart_IsError(result));
1762 result = Dart_GetDataFromByteBuffer(Dart_False()); 1717 result = Dart_GetDataFromByteBuffer(Dart_False());
1763 EXPECT(Dart_IsError(result)); 1718 EXPECT(Dart_IsError(result));
1764 result = Dart_GetDataFromByteBuffer(byte_array); 1719 result = Dart_GetDataFromByteBuffer(byte_array);
1765 EXPECT(Dart_IsError(result)); 1720 EXPECT(Dart_IsError(result));
1766 } 1721 }
1767 1722
1768
1769 static int kLength = 16; 1723 static int kLength = 16;
1770 1724
1771 static void ByteDataNativeFunction(Dart_NativeArguments args) { 1725 static void ByteDataNativeFunction(Dart_NativeArguments args) {
1772 Dart_EnterScope(); 1726 Dart_EnterScope();
1773 Dart_Handle byte_data = Dart_NewTypedData(Dart_TypedData_kByteData, kLength); 1727 Dart_Handle byte_data = Dart_NewTypedData(Dart_TypedData_kByteData, kLength);
1774 EXPECT_VALID(byte_data); 1728 EXPECT_VALID(byte_data);
1775 EXPECT_EQ(Dart_TypedData_kByteData, Dart_GetTypeOfTypedData(byte_data)); 1729 EXPECT_EQ(Dart_TypedData_kByteData, Dart_GetTypeOfTypedData(byte_data));
1776 Dart_SetReturnValue(args, byte_data); 1730 Dart_SetReturnValue(args, byte_data);
1777 Dart_ExitScope(); 1731 Dart_ExitScope();
1778 } 1732 }
1779 1733
1780
1781 static Dart_NativeFunction ByteDataNativeResolver(Dart_Handle name, 1734 static Dart_NativeFunction ByteDataNativeResolver(Dart_Handle name,
1782 int arg_count, 1735 int arg_count,
1783 bool* auto_setup_scope) { 1736 bool* auto_setup_scope) {
1784 ASSERT(auto_setup_scope != NULL); 1737 ASSERT(auto_setup_scope != NULL);
1785 *auto_setup_scope = true; 1738 *auto_setup_scope = true;
1786 return &ByteDataNativeFunction; 1739 return &ByteDataNativeFunction;
1787 } 1740 }
1788 1741
1789
1790 TEST_CASE(ByteDataAccess) { 1742 TEST_CASE(ByteDataAccess) {
1791 const char* kScriptChars = 1743 const char* kScriptChars =
1792 "import 'dart:typed_data';\n" 1744 "import 'dart:typed_data';\n"
1793 "class Expect {\n" 1745 "class Expect {\n"
1794 " static equals(a, b) {\n" 1746 " static equals(a, b) {\n"
1795 " if (a != b) {\n" 1747 " if (a != b) {\n"
1796 " throw 'not equal. expected: $a, got: $b';\n" 1748 " throw 'not equal. expected: $a, got: $b';\n"
1797 " }\n" 1749 " }\n"
1798 " }\n" 1750 " }\n"
1799 "}\n" 1751 "}\n"
(...skipping 15 matching lines...) Expand all
1815 1767
1816 Dart_Handle result = 1768 Dart_Handle result =
1817 Dart_SetNativeResolver(lib, &ByteDataNativeResolver, NULL); 1769 Dart_SetNativeResolver(lib, &ByteDataNativeResolver, NULL);
1818 EXPECT_VALID(result); 1770 EXPECT_VALID(result);
1819 1771
1820 // Invoke 'main' function. 1772 // Invoke 'main' function.
1821 result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1773 result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1822 EXPECT_VALID(result); 1774 EXPECT_VALID(result);
1823 } 1775 }
1824 1776
1825
1826 static const intptr_t kExtLength = 16; 1777 static const intptr_t kExtLength = 16;
1827 static int8_t data[kExtLength] = { 1778 static int8_t data[kExtLength] = {
1828 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 1779 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42,
1829 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 1780 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42,
1830 }; 1781 };
1831 1782
1832 static void ExternalByteDataNativeFunction(Dart_NativeArguments args) { 1783 static void ExternalByteDataNativeFunction(Dart_NativeArguments args) {
1833 Dart_EnterScope(); 1784 Dart_EnterScope();
1834 Dart_Handle external_byte_data = 1785 Dart_Handle external_byte_data =
1835 Dart_NewExternalTypedData(Dart_TypedData_kByteData, data, 16); 1786 Dart_NewExternalTypedData(Dart_TypedData_kByteData, data, 16);
1836 EXPECT_VALID(external_byte_data); 1787 EXPECT_VALID(external_byte_data);
1837 EXPECT_EQ(Dart_TypedData_kByteData, 1788 EXPECT_EQ(Dart_TypedData_kByteData,
1838 Dart_GetTypeOfTypedData(external_byte_data)); 1789 Dart_GetTypeOfTypedData(external_byte_data));
1839 Dart_SetReturnValue(args, external_byte_data); 1790 Dart_SetReturnValue(args, external_byte_data);
1840 Dart_ExitScope(); 1791 Dart_ExitScope();
1841 } 1792 }
1842 1793
1843
1844 static Dart_NativeFunction ExternalByteDataNativeResolver( 1794 static Dart_NativeFunction ExternalByteDataNativeResolver(
1845 Dart_Handle name, 1795 Dart_Handle name,
1846 int arg_count, 1796 int arg_count,
1847 bool* auto_setup_scope) { 1797 bool* auto_setup_scope) {
1848 ASSERT(auto_setup_scope != NULL); 1798 ASSERT(auto_setup_scope != NULL);
1849 *auto_setup_scope = true; 1799 *auto_setup_scope = true;
1850 return &ExternalByteDataNativeFunction; 1800 return &ExternalByteDataNativeFunction;
1851 } 1801 }
1852 1802
1853
1854 TEST_CASE(ExternalByteDataAccess) { 1803 TEST_CASE(ExternalByteDataAccess) {
1855 // TODO(asiva): Once we have getInt16LE and getInt16BE support use the 1804 // TODO(asiva): Once we have getInt16LE and getInt16BE support use the
1856 // appropriate getter instead of the host endian format used now. 1805 // appropriate getter instead of the host endian format used now.
1857 const char* kScriptChars = 1806 const char* kScriptChars =
1858 "import 'dart:typed_data';\n" 1807 "import 'dart:typed_data';\n"
1859 "class Expect {\n" 1808 "class Expect {\n"
1860 " static equals(a, b) {\n" 1809 " static equals(a, b) {\n"
1861 " if (a != b) {\n" 1810 " if (a != b) {\n"
1862 " throw 'not equal. expected: $a, got: $b';\n" 1811 " throw 'not equal. expected: $a, got: $b';\n"
1863 " }\n" 1812 " }\n"
(...skipping 26 matching lines...) Expand all
1890 // Invoke 'main' function. 1839 // Invoke 'main' function.
1891 result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1840 result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1892 EXPECT_VALID(result); 1841 EXPECT_VALID(result);
1893 1842
1894 for (intptr_t i = 0; i < kExtLength; i += 2) { 1843 for (intptr_t i = 0; i < kExtLength; i += 2) {
1895 EXPECT_EQ(0x24, data[i]); 1844 EXPECT_EQ(0x24, data[i]);
1896 EXPECT_EQ(0x28, data[i + 1]); 1845 EXPECT_EQ(0x28, data[i + 1]);
1897 } 1846 }
1898 } 1847 }
1899 1848
1900
1901 #ifndef PRODUCT 1849 #ifndef PRODUCT
1902 1850
1903
1904 static const intptr_t kOptExtLength = 16; 1851 static const intptr_t kOptExtLength = 16;
1905 static int8_t opt_data[kOptExtLength] = { 1852 static int8_t opt_data[kOptExtLength] = {
1906 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 1853 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1907 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 1854 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1908 }; 1855 };
1909 1856
1910 static void OptExternalByteDataNativeFunction(Dart_NativeArguments args) { 1857 static void OptExternalByteDataNativeFunction(Dart_NativeArguments args) {
1911 Dart_EnterScope(); 1858 Dart_EnterScope();
1912 Dart_Handle external_byte_data = 1859 Dart_Handle external_byte_data =
1913 Dart_NewExternalTypedData(Dart_TypedData_kByteData, opt_data, 16); 1860 Dart_NewExternalTypedData(Dart_TypedData_kByteData, opt_data, 16);
1914 EXPECT_VALID(external_byte_data); 1861 EXPECT_VALID(external_byte_data);
1915 EXPECT_EQ(Dart_TypedData_kByteData, 1862 EXPECT_EQ(Dart_TypedData_kByteData,
1916 Dart_GetTypeOfTypedData(external_byte_data)); 1863 Dart_GetTypeOfTypedData(external_byte_data));
1917 Dart_SetReturnValue(args, external_byte_data); 1864 Dart_SetReturnValue(args, external_byte_data);
1918 Dart_ExitScope(); 1865 Dart_ExitScope();
1919 } 1866 }
1920 1867
1921
1922 static Dart_NativeFunction OptExternalByteDataNativeResolver( 1868 static Dart_NativeFunction OptExternalByteDataNativeResolver(
1923 Dart_Handle name, 1869 Dart_Handle name,
1924 int arg_count, 1870 int arg_count,
1925 bool* auto_setup_scope) { 1871 bool* auto_setup_scope) {
1926 ASSERT(auto_setup_scope != NULL); 1872 ASSERT(auto_setup_scope != NULL);
1927 *auto_setup_scope = true; 1873 *auto_setup_scope = true;
1928 return &OptExternalByteDataNativeFunction; 1874 return &OptExternalByteDataNativeFunction;
1929 } 1875 }
1930 1876
1931
1932 TEST_CASE(OptimizedExternalByteDataAccess) { 1877 TEST_CASE(OptimizedExternalByteDataAccess) {
1933 const char* kScriptChars = 1878 const char* kScriptChars =
1934 "import 'dart:typed_data';\n" 1879 "import 'dart:typed_data';\n"
1935 "class Expect {\n" 1880 "class Expect {\n"
1936 " static equals(a, b) {\n" 1881 " static equals(a, b) {\n"
1937 " if (a != b) {\n" 1882 " if (a != b) {\n"
1938 " throw 'not equal. expected: $a, got: $b';\n" 1883 " throw 'not equal. expected: $a, got: $b';\n"
1939 " }\n" 1884 " }\n"
1940 " }\n" 1885 " }\n"
1941 "}\n" 1886 "}\n"
(...skipping 21 matching lines...) Expand all
1963 EXPECT_VALID(result); 1908 EXPECT_VALID(result);
1964 1909
1965 // Invoke 'main' function. 1910 // Invoke 'main' function.
1966 int old_oct = FLAG_optimization_counter_threshold; 1911 int old_oct = FLAG_optimization_counter_threshold;
1967 FLAG_optimization_counter_threshold = 5; 1912 FLAG_optimization_counter_threshold = 5;
1968 result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1913 result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1969 EXPECT_VALID(result); 1914 EXPECT_VALID(result);
1970 FLAG_optimization_counter_threshold = old_oct; 1915 FLAG_optimization_counter_threshold = old_oct;
1971 } 1916 }
1972 1917
1973
1974 #endif // !PRODUCT 1918 #endif // !PRODUCT
1975 1919
1976
1977 static void TestTypedDataDirectAccess() { 1920 static void TestTypedDataDirectAccess() {
1978 Dart_Handle str = Dart_NewStringFromCString("junk"); 1921 Dart_Handle str = Dart_NewStringFromCString("junk");
1979 Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10); 1922 Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
1980 EXPECT_VALID(byte_array); 1923 EXPECT_VALID(byte_array);
1981 Dart_Handle result; 1924 Dart_Handle result;
1982 result = Dart_TypedDataAcquireData(byte_array, NULL, NULL, NULL); 1925 result = Dart_TypedDataAcquireData(byte_array, NULL, NULL, NULL);
1983 EXPECT_ERROR(result, 1926 EXPECT_ERROR(result,
1984 "Dart_TypedDataAcquireData expects argument 'type'" 1927 "Dart_TypedDataAcquireData expects argument 'type'"
1985 " to be non-null."); 1928 " to be non-null.");
1986 Dart_TypedData_Type type; 1929 Dart_TypedData_Type type;
(...skipping 19 matching lines...) Expand all
2006 result = Dart_TypedDataReleaseData(Dart_Null()); 1949 result = Dart_TypedDataReleaseData(Dart_Null());
2007 EXPECT_ERROR(result, 1950 EXPECT_ERROR(result,
2008 "Dart_TypedDataReleaseData expects argument 'object'" 1951 "Dart_TypedDataReleaseData expects argument 'object'"
2009 " to be non-null."); 1952 " to be non-null.");
2010 result = Dart_TypedDataReleaseData(str); 1953 result = Dart_TypedDataReleaseData(str);
2011 EXPECT_ERROR(result, 1954 EXPECT_ERROR(result,
2012 "Dart_TypedDataReleaseData expects argument 'object'" 1955 "Dart_TypedDataReleaseData expects argument 'object'"
2013 " to be of type 'TypedData'."); 1956 " to be of type 'TypedData'.");
2014 } 1957 }
2015 1958
2016
2017 TEST_CASE(TypedDataDirectAccessUnverified) { 1959 TEST_CASE(TypedDataDirectAccessUnverified) {
2018 FLAG_verify_acquired_data = false; 1960 FLAG_verify_acquired_data = false;
2019 TestTypedDataDirectAccess(); 1961 TestTypedDataDirectAccess();
2020 } 1962 }
2021 1963
2022
2023 TEST_CASE(TypedDataDirectAccessVerified) { 1964 TEST_CASE(TypedDataDirectAccessVerified) {
2024 FLAG_verify_acquired_data = true; 1965 FLAG_verify_acquired_data = true;
2025 TestTypedDataDirectAccess(); 1966 TestTypedDataDirectAccess();
2026 } 1967 }
2027 1968
2028
2029 static void TestDirectAccess(Dart_Handle lib, 1969 static void TestDirectAccess(Dart_Handle lib,
2030 Dart_Handle array, 1970 Dart_Handle array,
2031 Dart_TypedData_Type expected_type, 1971 Dart_TypedData_Type expected_type,
2032 bool is_external) { 1972 bool is_external) {
2033 Dart_Handle result; 1973 Dart_Handle result;
2034 1974
2035 // Invoke the dart function that sets initial values. 1975 // Invoke the dart function that sets initial values.
2036 Dart_Handle dart_args[1]; 1976 Dart_Handle dart_args[1];
2037 dart_args[0] = array; 1977 dart_args[0] = array;
2038 result = Dart_Invoke(lib, NewString("setMain"), 1, dart_args); 1978 result = Dart_Invoke(lib, NewString("setMain"), 1, dart_args);
(...skipping 30 matching lines...) Expand all
2069 2009
2070 // Release direct access to the typed data object. 2010 // Release direct access to the typed data object.
2071 result = Dart_TypedDataReleaseData(array); 2011 result = Dart_TypedDataReleaseData(array);
2072 EXPECT_VALID(result); 2012 EXPECT_VALID(result);
2073 2013
2074 // Invoke the dart function in order to check the modified values. 2014 // Invoke the dart function in order to check the modified values.
2075 result = Dart_Invoke(lib, NewString("testMain"), 1, dart_args); 2015 result = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
2076 EXPECT_VALID(result); 2016 EXPECT_VALID(result);
2077 } 2017 }
2078 2018
2079
2080 static void TestTypedDataDirectAccess1() { 2019 static void TestTypedDataDirectAccess1() {
2081 const char* kScriptChars = 2020 const char* kScriptChars =
2082 "import 'dart:typed_data';\n" 2021 "import 'dart:typed_data';\n"
2083 "class Expect {\n" 2022 "class Expect {\n"
2084 " static equals(a, b) {\n" 2023 " static equals(a, b) {\n"
2085 " if (a != b) {\n" 2024 " if (a != b) {\n"
2086 " throw new Exception('not equal. expected: $a, got: $b');\n" 2025 " throw new Exception('not equal. expected: $a, got: $b');\n"
2087 " }\n" 2026 " }\n"
2088 " }\n" 2027 " }\n"
2089 "}\n" 2028 "}\n"
(...skipping 24 matching lines...) Expand all
2114 // Test with an external typed data object. 2053 // Test with an external typed data object.
2115 uint8_t data[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 2054 uint8_t data[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2116 intptr_t data_length = ARRAY_SIZE(data); 2055 intptr_t data_length = ARRAY_SIZE(data);
2117 Dart_Handle ext_list_access_test_obj; 2056 Dart_Handle ext_list_access_test_obj;
2118 ext_list_access_test_obj = 2057 ext_list_access_test_obj =
2119 Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length); 2058 Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length);
2120 EXPECT_VALID(ext_list_access_test_obj); 2059 EXPECT_VALID(ext_list_access_test_obj);
2121 TestDirectAccess(lib, ext_list_access_test_obj, Dart_TypedData_kUint8, true); 2060 TestDirectAccess(lib, ext_list_access_test_obj, Dart_TypedData_kUint8, true);
2122 } 2061 }
2123 2062
2124
2125 TEST_CASE(TypedDataDirectAccess1Unverified) { 2063 TEST_CASE(TypedDataDirectAccess1Unverified) {
2126 FLAG_verify_acquired_data = false; 2064 FLAG_verify_acquired_data = false;
2127 TestTypedDataDirectAccess1(); 2065 TestTypedDataDirectAccess1();
2128 } 2066 }
2129 2067
2130
2131 TEST_CASE(TypedDataDirectAccess1Verified) { 2068 TEST_CASE(TypedDataDirectAccess1Verified) {
2132 FLAG_verify_acquired_data = true; 2069 FLAG_verify_acquired_data = true;
2133 TestTypedDataDirectAccess1(); 2070 TestTypedDataDirectAccess1();
2134 } 2071 }
2135 2072
2136
2137 static void TestTypedDataViewDirectAccess() { 2073 static void TestTypedDataViewDirectAccess() {
2138 const char* kScriptChars = 2074 const char* kScriptChars =
2139 "import 'dart:typed_data';\n" 2075 "import 'dart:typed_data';\n"
2140 "class Expect {\n" 2076 "class Expect {\n"
2141 " static equals(a, b) {\n" 2077 " static equals(a, b) {\n"
2142 " if (a != b) {\n" 2078 " if (a != b) {\n"
2143 " throw 'not equal. expected: $a, got: $b';\n" 2079 " throw 'not equal. expected: $a, got: $b';\n"
2144 " }\n" 2080 " }\n"
2145 " }\n" 2081 " }\n"
2146 "}\n" 2082 "}\n"
(...skipping 18 matching lines...) Expand all
2165 // Create a test library and Load up a test script in it. 2101 // Create a test library and Load up a test script in it.
2166 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 2102 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
2167 2103
2168 // Test with a typed data view object. 2104 // Test with a typed data view object.
2169 Dart_Handle list_access_test_obj; 2105 Dart_Handle list_access_test_obj;
2170 list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL); 2106 list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL);
2171 EXPECT_VALID(list_access_test_obj); 2107 EXPECT_VALID(list_access_test_obj);
2172 TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kInt8, false); 2108 TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kInt8, false);
2173 } 2109 }
2174 2110
2175
2176 TEST_CASE(TypedDataViewDirectAccessUnverified) { 2111 TEST_CASE(TypedDataViewDirectAccessUnverified) {
2177 FLAG_verify_acquired_data = false; 2112 FLAG_verify_acquired_data = false;
2178 TestTypedDataViewDirectAccess(); 2113 TestTypedDataViewDirectAccess();
2179 } 2114 }
2180 2115
2181
2182 TEST_CASE(TypedDataViewDirectAccessVerified) { 2116 TEST_CASE(TypedDataViewDirectAccessVerified) {
2183 FLAG_verify_acquired_data = true; 2117 FLAG_verify_acquired_data = true;
2184 TestTypedDataViewDirectAccess(); 2118 TestTypedDataViewDirectAccess();
2185 } 2119 }
2186 2120
2187
2188 static void TestByteDataDirectAccess() { 2121 static void TestByteDataDirectAccess() {
2189 const char* kScriptChars = 2122 const char* kScriptChars =
2190 "import 'dart:typed_data';\n" 2123 "import 'dart:typed_data';\n"
2191 "class Expect {\n" 2124 "class Expect {\n"
2192 " static equals(a, b) {\n" 2125 " static equals(a, b) {\n"
2193 " if (a != b) {\n" 2126 " if (a != b) {\n"
2194 " throw 'not equal. expected: $a, got: $b';\n" 2127 " throw 'not equal. expected: $a, got: $b';\n"
2195 " }\n" 2128 " }\n"
2196 " }\n" 2129 " }\n"
2197 "}\n" 2130 "}\n"
(...skipping 18 matching lines...) Expand all
2216 // Create a test library and Load up a test script in it. 2149 // Create a test library and Load up a test script in it.
2217 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 2150 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
2218 2151
2219 // Test with a typed data view object. 2152 // Test with a typed data view object.
2220 Dart_Handle list_access_test_obj; 2153 Dart_Handle list_access_test_obj;
2221 list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL); 2154 list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL);
2222 EXPECT_VALID(list_access_test_obj); 2155 EXPECT_VALID(list_access_test_obj);
2223 TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kByteData, false); 2156 TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kByteData, false);
2224 } 2157 }
2225 2158
2226
2227 TEST_CASE(ByteDataDirectAccessUnverified) { 2159 TEST_CASE(ByteDataDirectAccessUnverified) {
2228 FLAG_verify_acquired_data = false; 2160 FLAG_verify_acquired_data = false;
2229 TestByteDataDirectAccess(); 2161 TestByteDataDirectAccess();
2230 } 2162 }
2231 2163
2232
2233 TEST_CASE(ByteDataDirectAccessVerified) { 2164 TEST_CASE(ByteDataDirectAccessVerified) {
2234 FLAG_verify_acquired_data = true; 2165 FLAG_verify_acquired_data = true;
2235 TestByteDataDirectAccess(); 2166 TestByteDataDirectAccess();
2236 } 2167 }
2237 2168
2238
2239 static void ExternalTypedDataAccessTests(Dart_Handle obj, 2169 static void ExternalTypedDataAccessTests(Dart_Handle obj,
2240 Dart_TypedData_Type expected_type, 2170 Dart_TypedData_Type expected_type,
2241 uint8_t data[], 2171 uint8_t data[],
2242 intptr_t data_length) { 2172 intptr_t data_length) {
2243 EXPECT_VALID(obj); 2173 EXPECT_VALID(obj);
2244 EXPECT_EQ(expected_type, Dart_GetTypeOfExternalTypedData(obj)); 2174 EXPECT_EQ(expected_type, Dart_GetTypeOfExternalTypedData(obj));
2245 EXPECT(Dart_IsList(obj)); 2175 EXPECT(Dart_IsList(obj));
2246 2176
2247 void* raw_data = NULL; 2177 void* raw_data = NULL;
2248 intptr_t len; 2178 intptr_t len;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2285 Dart_Handle value = Dart_NewInteger(33 * i); 2215 Dart_Handle value = Dart_NewInteger(33 * i);
2286 EXPECT_VALID(value); 2216 EXPECT_VALID(value);
2287 EXPECT_VALID(Dart_ListSetAt(obj, i, value)); 2217 EXPECT_VALID(Dart_ListSetAt(obj, i, value));
2288 } 2218 }
2289 // Read them back through the underlying array. 2219 // Read them back through the underlying array.
2290 for (intptr_t i = 0; i < data_length; ++i) { 2220 for (intptr_t i = 0; i < data_length; ++i) {
2291 EXPECT_EQ(33 * i, data[i]); 2221 EXPECT_EQ(33 * i, data[i]);
2292 } 2222 }
2293 } 2223 }
2294 2224
2295
2296 TEST_CASE(ExternalTypedDataAccess) { 2225 TEST_CASE(ExternalTypedDataAccess) {
2297 uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77}; 2226 uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
2298 intptr_t data_length = ARRAY_SIZE(data); 2227 intptr_t data_length = ARRAY_SIZE(data);
2299 2228
2300 Dart_Handle obj = 2229 Dart_Handle obj =
2301 Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length); 2230 Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length);
2302 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8, data, data_length); 2231 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8, data, data_length);
2303 } 2232 }
2304 2233
2305
2306 TEST_CASE(ExternalClampedTypedDataAccess) { 2234 TEST_CASE(ExternalClampedTypedDataAccess) {
2307 uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77}; 2235 uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
2308 intptr_t data_length = ARRAY_SIZE(data); 2236 intptr_t data_length = ARRAY_SIZE(data);
2309 2237
2310 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped, 2238 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped,
2311 data, data_length); 2239 data, data_length);
2312 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8Clamped, data, 2240 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8Clamped, data,
2313 data_length); 2241 data_length);
2314 } 2242 }
2315 2243
2316
2317 TEST_CASE(ExternalUint8ClampedArrayAccess) { 2244 TEST_CASE(ExternalUint8ClampedArrayAccess) {
2318 const char* kScriptChars = 2245 const char* kScriptChars =
2319 "testClamped(List a) {\n" 2246 "testClamped(List a) {\n"
2320 " if (a[1] != 11) return false;\n" 2247 " if (a[1] != 11) return false;\n"
2321 " a[1] = 3;\n" 2248 " a[1] = 3;\n"
2322 " if (a[1] != 3) return false;\n" 2249 " if (a[1] != 3) return false;\n"
2323 " a[1] = -12;\n" 2250 " a[1] = -12;\n"
2324 " if (a[1] != 0) return false;\n" 2251 " if (a[1] != 0) return false;\n"
2325 " a[1] = 1200;\n" 2252 " a[1] = 1200;\n"
2326 " if (a[1] != 255) return false;\n" 2253 " if (a[1] != 255) return false;\n"
(...skipping 14 matching lines...) Expand all
2341 2268
2342 // Check that result is true. 2269 // Check that result is true.
2343 EXPECT_VALID(result); 2270 EXPECT_VALID(result);
2344 EXPECT(Dart_IsBoolean(result)); 2271 EXPECT(Dart_IsBoolean(result));
2345 bool value = false; 2272 bool value = false;
2346 result = Dart_BooleanValue(result, &value); 2273 result = Dart_BooleanValue(result, &value);
2347 EXPECT_VALID(result); 2274 EXPECT_VALID(result);
2348 EXPECT(value); 2275 EXPECT(value);
2349 } 2276 }
2350 2277
2351
2352 static void NopCallback(void* isolate_callback_data, 2278 static void NopCallback(void* isolate_callback_data,
2353 Dart_WeakPersistentHandle handle, 2279 Dart_WeakPersistentHandle handle,
2354 void* peer) {} 2280 void* peer) {}
2355 2281
2356
2357 static void UnreachedCallback(void* isolate_callback_data, 2282 static void UnreachedCallback(void* isolate_callback_data,
2358 Dart_WeakPersistentHandle handle, 2283 Dart_WeakPersistentHandle handle,
2359 void* peer) { 2284 void* peer) {
2360 UNREACHABLE(); 2285 UNREACHABLE();
2361 } 2286 }
2362 2287
2363
2364 static void ExternalTypedDataFinalizer(void* isolate_callback_data, 2288 static void ExternalTypedDataFinalizer(void* isolate_callback_data,
2365 Dart_WeakPersistentHandle handle, 2289 Dart_WeakPersistentHandle handle,
2366 void* peer) { 2290 void* peer) {
2367 *static_cast<int*>(peer) = 42; 2291 *static_cast<int*>(peer) = 42;
2368 } 2292 }
2369 2293
2370
2371 TEST_CASE(ExternalTypedDataCallback) { 2294 TEST_CASE(ExternalTypedDataCallback) {
2372 int peer = 0; 2295 int peer = 0;
2373 { 2296 {
2374 Dart_EnterScope(); 2297 Dart_EnterScope();
2375 uint8_t data[] = {1, 2, 3, 4}; 2298 uint8_t data[] = {1, 2, 3, 4};
2376 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, 2299 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8, data,
2377 ARRAY_SIZE(data)); 2300 ARRAY_SIZE(data));
2378 Dart_NewWeakPersistentHandle(obj, &peer, sizeof(data), 2301 Dart_NewWeakPersistentHandle(obj, &peer, sizeof(data),
2379 ExternalTypedDataFinalizer); 2302 ExternalTypedDataFinalizer);
2380 EXPECT_VALID(obj); 2303 EXPECT_VALID(obj);
2381 Dart_ExitScope(); 2304 Dart_ExitScope();
2382 } 2305 }
2383 { 2306 {
2384 TransitionNativeToVM transition(thread); 2307 TransitionNativeToVM transition(thread);
2385 EXPECT(peer == 0); 2308 EXPECT(peer == 0);
2386 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2309 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2387 GCTestHelper::WaitForGCTasks(); 2310 GCTestHelper::WaitForGCTasks();
2388 EXPECT(peer == 0); 2311 EXPECT(peer == 0);
2389 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 2312 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
2390 GCTestHelper::WaitForGCTasks(); 2313 GCTestHelper::WaitForGCTasks();
2391 EXPECT(peer == 42); 2314 EXPECT(peer == 42);
2392 } 2315 }
2393 } 2316 }
2394 2317
2395
2396 static void SlowFinalizer(void* isolate_callback_data, 2318 static void SlowFinalizer(void* isolate_callback_data,
2397 Dart_WeakPersistentHandle handle, 2319 Dart_WeakPersistentHandle handle,
2398 void* peer) { 2320 void* peer) {
2399 OS::Sleep(10); 2321 OS::Sleep(10);
2400 intptr_t* count = reinterpret_cast<intptr_t*>(peer); 2322 intptr_t* count = reinterpret_cast<intptr_t*>(peer);
2401 (*count)++; 2323 (*count)++;
2402 } 2324 }
2403 2325
2404
2405 TEST_CASE(SlowFinalizer) { 2326 TEST_CASE(SlowFinalizer) {
2406 intptr_t count = 0; 2327 intptr_t count = 0;
2407 for (intptr_t i = 0; i < 10; i++) { 2328 for (intptr_t i = 0; i < 10; i++) {
2408 Dart_EnterScope(); 2329 Dart_EnterScope();
2409 Dart_Handle str1 = Dart_NewStringFromCString("Live fast"); 2330 Dart_Handle str1 = Dart_NewStringFromCString("Live fast");
2410 Dart_NewWeakPersistentHandle(str1, &count, 0, SlowFinalizer); 2331 Dart_NewWeakPersistentHandle(str1, &count, 0, SlowFinalizer);
2411 Dart_Handle str2 = Dart_NewStringFromCString("Die young"); 2332 Dart_Handle str2 = Dart_NewStringFromCString("Die young");
2412 Dart_NewWeakPersistentHandle(str2, &count, 0, SlowFinalizer); 2333 Dart_NewWeakPersistentHandle(str2, &count, 0, SlowFinalizer);
2413 Dart_ExitScope(); 2334 Dart_ExitScope();
2414 2335
2415 { 2336 {
2416 TransitionNativeToVM transition(thread); 2337 TransitionNativeToVM transition(thread);
2417 Isolate::Current()->heap()->CollectAllGarbage(); 2338 Isolate::Current()->heap()->CollectAllGarbage();
2418 } 2339 }
2419 } 2340 }
2420 2341
2421 { 2342 {
2422 TransitionNativeToVM transition(thread); 2343 TransitionNativeToVM transition(thread);
2423 GCTestHelper::WaitForGCTasks(); 2344 GCTestHelper::WaitForGCTasks();
2424 } 2345 }
2425 2346
2426 EXPECT_EQ(20, count); 2347 EXPECT_EQ(20, count);
2427 } 2348 }
2428 2349
2429
2430 static void CheckFloat32x4Data(Dart_Handle obj) { 2350 static void CheckFloat32x4Data(Dart_Handle obj) {
2431 void* raw_data = NULL; 2351 void* raw_data = NULL;
2432 intptr_t len; 2352 intptr_t len;
2433 Dart_TypedData_Type type; 2353 Dart_TypedData_Type type;
2434 EXPECT_VALID(Dart_TypedDataAcquireData(obj, &type, &raw_data, &len)); 2354 EXPECT_VALID(Dart_TypedDataAcquireData(obj, &type, &raw_data, &len));
2435 EXPECT_EQ(Dart_TypedData_kFloat32x4, type); 2355 EXPECT_EQ(Dart_TypedData_kFloat32x4, type);
2436 EXPECT_EQ(len, 10); 2356 EXPECT_EQ(len, 10);
2437 float* float_data = reinterpret_cast<float*>(raw_data); 2357 float* float_data = reinterpret_cast<float*>(raw_data);
2438 for (int i = 0; i < len * 4; i++) { 2358 for (int i = 0; i < len * 4; i++) {
2439 EXPECT_EQ(0.0, float_data[i]); 2359 EXPECT_EQ(0.0, float_data[i]);
2440 } 2360 }
2441 EXPECT_VALID(Dart_TypedDataReleaseData(obj)); 2361 EXPECT_VALID(Dart_TypedDataReleaseData(obj));
2442 } 2362 }
2443 2363
2444
2445 TEST_CASE(Float32x4List) { 2364 TEST_CASE(Float32x4List) {
2446 const char* kScriptChars = 2365 const char* kScriptChars =
2447 "import 'dart:typed_data';\n" 2366 "import 'dart:typed_data';\n"
2448 "Float32x4List float32x4() {\n" 2367 "Float32x4List float32x4() {\n"
2449 " return new Float32x4List(10);\n" 2368 " return new Float32x4List(10);\n"
2450 "}\n"; 2369 "}\n";
2451 // Create a test library and Load up a test script in it. 2370 // Create a test library and Load up a test script in it.
2452 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 2371 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
2453 2372
2454 Dart_Handle obj = Dart_Invoke(lib, NewString("float32x4"), 0, NULL); 2373 Dart_Handle obj = Dart_Invoke(lib, NewString("float32x4"), 0, NULL);
(...skipping 21 matching lines...) Expand all
2476 } 2395 }
2477 Dart_ExitScope(); 2396 Dart_ExitScope();
2478 { 2397 {
2479 TransitionNativeToVM transition(thread); 2398 TransitionNativeToVM transition(thread);
2480 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 2399 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
2481 GCTestHelper::WaitForGCTasks(); 2400 GCTestHelper::WaitForGCTasks();
2482 EXPECT(peer == 42); 2401 EXPECT(peer == 42);
2483 } 2402 }
2484 } 2403 }
2485 2404
2486
2487 // Unit test for entering a scope, creating a local handle and exiting 2405 // Unit test for entering a scope, creating a local handle and exiting
2488 // the scope. 2406 // the scope.
2489 VM_UNIT_TEST_CASE(EnterExitScope) { 2407 VM_UNIT_TEST_CASE(EnterExitScope) {
2490 TestIsolateScope __test_isolate__; 2408 TestIsolateScope __test_isolate__;
2491 2409
2492 Thread* thread = Thread::Current(); 2410 Thread* thread = Thread::Current();
2493 EXPECT(thread != NULL); 2411 EXPECT(thread != NULL);
2494 ApiLocalScope* scope = thread->api_top_scope(); 2412 ApiLocalScope* scope = thread->api_top_scope();
2495 Dart_EnterScope(); 2413 Dart_EnterScope();
2496 { 2414 {
2497 EXPECT(thread->api_top_scope() != NULL); 2415 EXPECT(thread->api_top_scope() != NULL);
2498 HANDLESCOPE(thread); 2416 HANDLESCOPE(thread);
2499 const String& str1 = String::Handle(String::New("Test String")); 2417 const String& str1 = String::Handle(String::New("Test String"));
2500 Dart_Handle ref = Api::NewHandle(thread, str1.raw()); 2418 Dart_Handle ref = Api::NewHandle(thread, str1.raw());
2501 String& str2 = String::Handle(); 2419 String& str2 = String::Handle();
2502 str2 ^= Api::UnwrapHandle(ref); 2420 str2 ^= Api::UnwrapHandle(ref);
2503 EXPECT(str1.Equals(str2)); 2421 EXPECT(str1.Equals(str2));
2504 } 2422 }
2505 Dart_ExitScope(); 2423 Dart_ExitScope();
2506 EXPECT(scope == thread->api_top_scope()); 2424 EXPECT(scope == thread->api_top_scope());
2507 } 2425 }
2508 2426
2509
2510 // Unit test for creating and deleting persistent handles. 2427 // Unit test for creating and deleting persistent handles.
2511 VM_UNIT_TEST_CASE(PersistentHandles) { 2428 VM_UNIT_TEST_CASE(PersistentHandles) {
2512 const char* kTestString1 = "Test String1"; 2429 const char* kTestString1 = "Test String1";
2513 const char* kTestString2 = "Test String2"; 2430 const char* kTestString2 = "Test String2";
2514 TestCase::CreateTestIsolate(); 2431 TestCase::CreateTestIsolate();
2515 Thread* thread = Thread::Current(); 2432 Thread* thread = Thread::Current();
2516 Isolate* isolate = thread->isolate(); 2433 Isolate* isolate = thread->isolate();
2517 EXPECT(isolate != NULL); 2434 EXPECT(isolate != NULL);
2518 ApiState* state = isolate->api_state(); 2435 ApiState* state = isolate->api_state();
2519 EXPECT(state != NULL); 2436 EXPECT(state != NULL);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2567 String& str = String::Handle(); 2484 String& str = String::Handle();
2568 str ^= PersistentHandle::Cast(handles[i])->raw(); 2485 str ^= PersistentHandle::Cast(handles[i])->raw();
2569 EXPECT(str.Equals(kTestString2)); 2486 EXPECT(str.Equals(kTestString2));
2570 } 2487 }
2571 } 2488 }
2572 EXPECT(scope == thread->api_top_scope()); 2489 EXPECT(scope == thread->api_top_scope());
2573 EXPECT_EQ(2001, state->CountPersistentHandles()); 2490 EXPECT_EQ(2001, state->CountPersistentHandles());
2574 Dart_ShutdownIsolate(); 2491 Dart_ShutdownIsolate();
2575 } 2492 }
2576 2493
2577
2578 // Test that we are able to create a persistent handle from a 2494 // Test that we are able to create a persistent handle from a
2579 // persistent handle. 2495 // persistent handle.
2580 VM_UNIT_TEST_CASE(NewPersistentHandle_FromPersistentHandle) { 2496 VM_UNIT_TEST_CASE(NewPersistentHandle_FromPersistentHandle) {
2581 TestIsolateScope __test_isolate__; 2497 TestIsolateScope __test_isolate__;
2582 2498
2583 Isolate* isolate = Isolate::Current(); 2499 Isolate* isolate = Isolate::Current();
2584 EXPECT(isolate != NULL); 2500 EXPECT(isolate != NULL);
2585 ApiState* state = isolate->api_state(); 2501 ApiState* state = isolate->api_state();
2586 EXPECT(state != NULL); 2502 EXPECT(state != NULL);
2587 Thread* thread = Thread::Current(); 2503 Thread* thread = Thread::Current();
(...skipping 11 matching lines...) Expand all
2599 2515
2600 // Make sure that the value transferred. 2516 // Make sure that the value transferred.
2601 Dart_Handle obj4 = Dart_HandleFromPersistent(obj3); 2517 Dart_Handle obj4 = Dart_HandleFromPersistent(obj3);
2602 EXPECT(Dart_IsBoolean(obj4)); 2518 EXPECT(Dart_IsBoolean(obj4));
2603 bool value = false; 2519 bool value = false;
2604 Dart_Handle result = Dart_BooleanValue(obj4, &value); 2520 Dart_Handle result = Dart_BooleanValue(obj4, &value);
2605 EXPECT_VALID(result); 2521 EXPECT_VALID(result);
2606 EXPECT(value); 2522 EXPECT(value);
2607 } 2523 }
2608 2524
2609
2610 // Test that we can assign to a persistent handle. 2525 // Test that we can assign to a persistent handle.
2611 VM_UNIT_TEST_CASE(AssignToPersistentHandle) { 2526 VM_UNIT_TEST_CASE(AssignToPersistentHandle) {
2612 const char* kTestString1 = "Test String1"; 2527 const char* kTestString1 = "Test String1";
2613 const char* kTestString2 = "Test String2"; 2528 const char* kTestString2 = "Test String2";
2614 TestIsolateScope __test_isolate__; 2529 TestIsolateScope __test_isolate__;
2615 2530
2616 Thread* T = Thread::Current(); 2531 Thread* T = Thread::Current();
2617 CHECK_API_SCOPE(T); 2532 CHECK_API_SCOPE(T);
2618 HANDLESCOPE(T); 2533 HANDLESCOPE(T);
2619 Isolate* isolate = T->isolate(); 2534 Isolate* isolate = T->isolate();
(...skipping 13 matching lines...) Expand all
2633 Dart_Handle ref2 = Api::NewHandle(T, String::New(kTestString2)); 2548 Dart_Handle ref2 = Api::NewHandle(T, String::New(kTestString2));
2634 Dart_SetPersistentHandle(obj, ref2); 2549 Dart_SetPersistentHandle(obj, ref2);
2635 str ^= PersistentHandle::Cast(obj)->raw(); 2550 str ^= PersistentHandle::Cast(obj)->raw();
2636 EXPECT(str.Equals(kTestString2)); 2551 EXPECT(str.Equals(kTestString2));
2637 2552
2638 // Now assign Null to the persistent handle and check. 2553 // Now assign Null to the persistent handle and check.
2639 Dart_SetPersistentHandle(obj, Dart_Null()); 2554 Dart_SetPersistentHandle(obj, Dart_Null());
2640 EXPECT(Dart_IsNull(obj)); 2555 EXPECT(Dart_IsNull(obj));
2641 } 2556 }
2642 2557
2643
2644 static Dart_Handle AsHandle(Dart_PersistentHandle weak) { 2558 static Dart_Handle AsHandle(Dart_PersistentHandle weak) {
2645 return Dart_HandleFromPersistent(weak); 2559 return Dart_HandleFromPersistent(weak);
2646 } 2560 }
2647 2561
2648
2649 static Dart_Handle AsHandle(Dart_WeakPersistentHandle weak) { 2562 static Dart_Handle AsHandle(Dart_WeakPersistentHandle weak) {
2650 return Dart_HandleFromWeakPersistent(weak); 2563 return Dart_HandleFromWeakPersistent(weak);
2651 } 2564 }
2652 2565
2653
2654 static Dart_WeakPersistentHandle weak_new_ref = NULL; 2566 static Dart_WeakPersistentHandle weak_new_ref = NULL;
2655 static Dart_WeakPersistentHandle weak_old_ref = NULL; 2567 static Dart_WeakPersistentHandle weak_old_ref = NULL;
2656 2568
2657
2658 static void WeakPersistentHandleCallback(void* isolate_callback_data, 2569 static void WeakPersistentHandleCallback(void* isolate_callback_data,
2659 Dart_WeakPersistentHandle handle, 2570 Dart_WeakPersistentHandle handle,
2660 void* peer) { 2571 void* peer) {
2661 if (handle == weak_new_ref) { 2572 if (handle == weak_new_ref) {
2662 weak_new_ref = NULL; 2573 weak_new_ref = NULL;
2663 } else if (handle == weak_old_ref) { 2574 } else if (handle == weak_old_ref) {
2664 weak_old_ref = NULL; 2575 weak_old_ref = NULL;
2665 } 2576 }
2666 } 2577 }
2667 2578
2668
2669 TEST_CASE(WeakPersistentHandle) { 2579 TEST_CASE(WeakPersistentHandle) {
2670 Dart_Handle local_new_ref = Dart_Null(); 2580 Dart_Handle local_new_ref = Dart_Null();
2671 weak_new_ref = Dart_NewWeakPersistentHandle(local_new_ref, NULL, 0, 2581 weak_new_ref = Dart_NewWeakPersistentHandle(local_new_ref, NULL, 0,
2672 WeakPersistentHandleCallback); 2582 WeakPersistentHandleCallback);
2673 2583
2674 Dart_Handle local_old_ref = Dart_Null(); 2584 Dart_Handle local_old_ref = Dart_Null();
2675 weak_old_ref = Dart_NewWeakPersistentHandle(local_old_ref, NULL, 0, 2585 weak_old_ref = Dart_NewWeakPersistentHandle(local_old_ref, NULL, 0,
2676 WeakPersistentHandleCallback); 2586 WeakPersistentHandleCallback);
2677 2587
2678 { 2588 {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2779 } 2689 }
2780 2690
2781 { 2691 {
2782 TransitionNativeToVM transition(thread); 2692 TransitionNativeToVM transition(thread);
2783 // Garbage collect one last time to revisit deleted handles. 2693 // Garbage collect one last time to revisit deleted handles.
2784 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 2694 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
2785 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2695 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2786 } 2696 }
2787 } 2697 }
2788 2698
2789
2790 TEST_CASE(WeakPersistentHandleErrors) { 2699 TEST_CASE(WeakPersistentHandleErrors) {
2791 Dart_EnterScope(); 2700 Dart_EnterScope();
2792 2701
2793 // NULL callback. 2702 // NULL callback.
2794 Dart_Handle obj1 = NewString("new string"); 2703 Dart_Handle obj1 = NewString("new string");
2795 EXPECT_VALID(obj1); 2704 EXPECT_VALID(obj1);
2796 Dart_WeakPersistentHandle ref1 = 2705 Dart_WeakPersistentHandle ref1 =
2797 Dart_NewWeakPersistentHandle(obj1, NULL, 0, NULL); 2706 Dart_NewWeakPersistentHandle(obj1, NULL, 0, NULL);
2798 EXPECT_EQ(ref1, static_cast<void*>(NULL)); 2707 EXPECT_EQ(ref1, static_cast<void*>(NULL));
2799 2708
2800 // Immediate object. 2709 // Immediate object.
2801 Dart_Handle obj2 = Dart_NewInteger(0); 2710 Dart_Handle obj2 = Dart_NewInteger(0);
2802 EXPECT_VALID(obj2); 2711 EXPECT_VALID(obj2);
2803 Dart_WeakPersistentHandle ref2 = 2712 Dart_WeakPersistentHandle ref2 =
2804 Dart_NewWeakPersistentHandle(obj2, NULL, 0, WeakPersistentHandleCallback); 2713 Dart_NewWeakPersistentHandle(obj2, NULL, 0, WeakPersistentHandleCallback);
2805 EXPECT_EQ(ref2, static_cast<void*>(NULL)); 2714 EXPECT_EQ(ref2, static_cast<void*>(NULL));
2806 2715
2807 Dart_ExitScope(); 2716 Dart_ExitScope();
2808 } 2717 }
2809 2718
2810
2811 static void WeakPersistentHandlePeerFinalizer(void* isolate_callback_data, 2719 static void WeakPersistentHandlePeerFinalizer(void* isolate_callback_data,
2812 Dart_WeakPersistentHandle handle, 2720 Dart_WeakPersistentHandle handle,
2813 void* peer) { 2721 void* peer) {
2814 *static_cast<int*>(peer) = 42; 2722 *static_cast<int*>(peer) = 42;
2815 } 2723 }
2816 2724
2817
2818 TEST_CASE(WeakPersistentHandleCallback) { 2725 TEST_CASE(WeakPersistentHandleCallback) {
2819 Dart_WeakPersistentHandle weak_ref = NULL; 2726 Dart_WeakPersistentHandle weak_ref = NULL;
2820 int peer = 0; 2727 int peer = 0;
2821 { 2728 {
2822 Dart_EnterScope(); 2729 Dart_EnterScope();
2823 Dart_Handle obj = NewString("new string"); 2730 Dart_Handle obj = NewString("new string");
2824 EXPECT_VALID(obj); 2731 EXPECT_VALID(obj);
2825 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0, 2732 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0,
2826 WeakPersistentHandlePeerFinalizer); 2733 WeakPersistentHandlePeerFinalizer);
2827 EXPECT_VALID(AsHandle(weak_ref)); 2734 EXPECT_VALID(AsHandle(weak_ref));
2828 EXPECT(peer == 0); 2735 EXPECT(peer == 0);
2829 Dart_ExitScope(); 2736 Dart_ExitScope();
2830 } 2737 }
2831 { 2738 {
2832 TransitionNativeToVM transition(thread); 2739 TransitionNativeToVM transition(thread);
2833 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2740 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2834 EXPECT(peer == 0); 2741 EXPECT(peer == 0);
2835 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); 2742 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
2836 GCTestHelper::WaitForGCTasks(); 2743 GCTestHelper::WaitForGCTasks();
2837 EXPECT(peer == 42); 2744 EXPECT(peer == 42);
2838 } 2745 }
2839 } 2746 }
2840 2747
2841
2842 TEST_CASE(WeakPersistentHandleNoCallback) { 2748 TEST_CASE(WeakPersistentHandleNoCallback) {
2843 Dart_WeakPersistentHandle weak_ref = NULL; 2749 Dart_WeakPersistentHandle weak_ref = NULL;
2844 int peer = 0; 2750 int peer = 0;
2845 { 2751 {
2846 Dart_EnterScope(); 2752 Dart_EnterScope();
2847 Dart_Handle obj = NewString("new string"); 2753 Dart_Handle obj = NewString("new string");
2848 EXPECT_VALID(obj); 2754 EXPECT_VALID(obj);
2849 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0, 2755 weak_ref = Dart_NewWeakPersistentHandle(obj, &peer, 0,
2850 WeakPersistentHandlePeerFinalizer); 2756 WeakPersistentHandlePeerFinalizer);
2851 Dart_ExitScope(); 2757 Dart_ExitScope();
2852 } 2758 }
2853 // A finalizer is not invoked on a deleted handle. Therefore, the 2759 // A finalizer is not invoked on a deleted handle. Therefore, the
2854 // peer value should not change after the referent is collected. 2760 // peer value should not change after the referent is collected.
2855 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); 2761 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
2856 Dart_DeleteWeakPersistentHandle(isolate, weak_ref); 2762 Dart_DeleteWeakPersistentHandle(isolate, weak_ref);
2857 EXPECT(peer == 0); 2763 EXPECT(peer == 0);
2858 { 2764 {
2859 TransitionNativeToVM transition(thread); 2765 TransitionNativeToVM transition(thread);
2860 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2766 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2861 EXPECT(peer == 0); 2767 EXPECT(peer == 0);
2862 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); 2768 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
2863 GCTestHelper::WaitForGCTasks(); 2769 GCTestHelper::WaitForGCTasks();
2864 EXPECT(peer == 0); 2770 EXPECT(peer == 0);
2865 } 2771 }
2866 } 2772 }
2867 2773
2868
2869 VM_UNIT_TEST_CASE(WeakPersistentHandlesCallbackShutdown) { 2774 VM_UNIT_TEST_CASE(WeakPersistentHandlesCallbackShutdown) {
2870 TestCase::CreateTestIsolate(); 2775 TestCase::CreateTestIsolate();
2871 Dart_EnterScope(); 2776 Dart_EnterScope();
2872 Dart_Handle ref = Dart_True(); 2777 Dart_Handle ref = Dart_True();
2873 int peer = 1234; 2778 int peer = 1234;
2874 Dart_NewWeakPersistentHandle(ref, &peer, 0, 2779 Dart_NewWeakPersistentHandle(ref, &peer, 0,
2875 WeakPersistentHandlePeerFinalizer); 2780 WeakPersistentHandlePeerFinalizer);
2876 Dart_ExitScope(); 2781 Dart_ExitScope();
2877 Dart_ShutdownIsolate(); 2782 Dart_ShutdownIsolate();
2878 EXPECT(peer == 42); 2783 EXPECT(peer == 42);
2879 } 2784 }
2880 2785
2881
2882 TEST_CASE(WeakPersistentHandleExternalAllocationSize) { 2786 TEST_CASE(WeakPersistentHandleExternalAllocationSize) {
2883 Heap* heap = Isolate::Current()->heap(); 2787 Heap* heap = Isolate::Current()->heap();
2884 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); 2788 EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
2885 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); 2789 EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
2886 Dart_WeakPersistentHandle weak1 = NULL; 2790 Dart_WeakPersistentHandle weak1 = NULL;
2887 static const intptr_t kWeak1ExternalSize = 1 * KB; 2791 static const intptr_t kWeak1ExternalSize = 1 * KB;
2888 { 2792 {
2889 Dart_EnterScope(); 2793 Dart_EnterScope();
2890 Dart_Handle obj = NewString("weakly referenced string"); 2794 Dart_Handle obj = NewString("weakly referenced string");
2891 EXPECT_VALID(obj); 2795 EXPECT_VALID(obj);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2924 Dart_DeleteWeakPersistentHandle(isolate, weak2); 2828 Dart_DeleteWeakPersistentHandle(isolate, weak2);
2925 Dart_DeletePersistentHandle(strong_ref); 2829 Dart_DeletePersistentHandle(strong_ref);
2926 { 2830 {
2927 TransitionNativeToVM transition(thread); 2831 TransitionNativeToVM transition(thread);
2928 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2832 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2929 GCTestHelper::WaitForGCTasks(); 2833 GCTestHelper::WaitForGCTasks();
2930 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); 2834 EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
2931 } 2835 }
2932 } 2836 }
2933 2837
2934
2935 TEST_CASE(WeakPersistentHandleExternalAllocationSizeNewspaceGC) { 2838 TEST_CASE(WeakPersistentHandleExternalAllocationSizeNewspaceGC) {
2936 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); 2839 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
2937 Heap* heap = Isolate::Current()->heap(); 2840 Heap* heap = Isolate::Current()->heap();
2938 Dart_WeakPersistentHandle weak1 = NULL; 2841 Dart_WeakPersistentHandle weak1 = NULL;
2939 // Large enough to exceed any new space limit. Not actually allocated. 2842 // Large enough to exceed any new space limit. Not actually allocated.
2940 const intptr_t kWeak1ExternalSize = 500 * MB; 2843 const intptr_t kWeak1ExternalSize = 500 * MB;
2941 { 2844 {
2942 Dart_EnterScope(); 2845 Dart_EnterScope();
2943 Dart_Handle obj = NewString("weakly referenced string"); 2846 Dart_Handle obj = NewString("weakly referenced string");
2944 EXPECT_VALID(obj); 2847 EXPECT_VALID(obj);
(...skipping 23 matching lines...) Expand all
2968 } 2871 }
2969 Dart_DeleteWeakPersistentHandle(isolate, weak1); 2872 Dart_DeleteWeakPersistentHandle(isolate, weak1);
2970 { 2873 {
2971 TransitionNativeToVM transition(thread); 2874 TransitionNativeToVM transition(thread);
2972 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2875 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2973 GCTestHelper::WaitForGCTasks(); 2876 GCTestHelper::WaitForGCTasks();
2974 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); 2877 EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
2975 } 2878 }
2976 } 2879 }
2977 2880
2978
2979 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOldspaceGC) { 2881 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOldspaceGC) {
2980 // Check that external allocation in old space can trigger GC. 2882 // Check that external allocation in old space can trigger GC.
2981 Isolate* isolate = Isolate::Current(); 2883 Isolate* isolate = Isolate::Current();
2982 Dart_EnterScope(); 2884 Dart_EnterScope();
2983 Dart_Handle live = Api::NewHandle(thread, String::New("live", Heap::kOld)); 2885 Dart_Handle live = Api::NewHandle(thread, String::New("live", Heap::kOld));
2984 EXPECT_VALID(live); 2886 EXPECT_VALID(live);
2985 Dart_WeakPersistentHandle weak = NULL; 2887 Dart_WeakPersistentHandle weak = NULL;
2986 EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld)); 2888 EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld));
2987 const intptr_t kSmallExternalSize = 1 * KB; 2889 const intptr_t kSmallExternalSize = 1 * KB;
2988 { 2890 {
2989 Dart_EnterScope(); 2891 Dart_EnterScope();
2990 Dart_Handle dead = Api::NewHandle(thread, String::New("dead", Heap::kOld)); 2892 Dart_Handle dead = Api::NewHandle(thread, String::New("dead", Heap::kOld));
2991 EXPECT_VALID(dead); 2893 EXPECT_VALID(dead);
2992 weak = Dart_NewWeakPersistentHandle(dead, NULL, kSmallExternalSize, 2894 weak = Dart_NewWeakPersistentHandle(dead, NULL, kSmallExternalSize,
2993 NopCallback); 2895 NopCallback);
2994 EXPECT_VALID(AsHandle(weak)); 2896 EXPECT_VALID(AsHandle(weak));
2995 Dart_ExitScope(); 2897 Dart_ExitScope();
2996 } 2898 }
2997 EXPECT_EQ(kSmallExternalSize, 2899 EXPECT_EQ(kSmallExternalSize,
2998 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize); 2900 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
2999 // Large enough to trigger GC in old space. Not actually allocated. 2901 // Large enough to trigger GC in old space. Not actually allocated.
3000 const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB; 2902 const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB;
3001 Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback); 2903 Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
3002 // Expect small garbage to be collected. 2904 // Expect small garbage to be collected.
3003 EXPECT_EQ(kHugeExternalSize, 2905 EXPECT_EQ(kHugeExternalSize,
3004 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize); 2906 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
3005 Dart_ExitScope(); 2907 Dart_ExitScope();
3006 } 2908 }
3007 2909
3008
3009 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOddReferents) { 2910 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOddReferents) {
3010 Heap* heap = Isolate::Current()->heap(); 2911 Heap* heap = Isolate::Current()->heap();
3011 Dart_WeakPersistentHandle weak1 = NULL; 2912 Dart_WeakPersistentHandle weak1 = NULL;
3012 static const intptr_t kWeak1ExternalSize = 1 * KB; 2913 static const intptr_t kWeak1ExternalSize = 1 * KB;
3013 Dart_WeakPersistentHandle weak2 = NULL; 2914 Dart_WeakPersistentHandle weak2 = NULL;
3014 static const intptr_t kWeak2ExternalSize = 2 * KB; 2915 static const intptr_t kWeak2ExternalSize = 2 * KB;
3015 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld)); 2916 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
3016 { 2917 {
3017 Dart_EnterScope(); 2918 Dart_EnterScope();
3018 Dart_Handle dart_true = Dart_True(); // VM heap object. 2919 Dart_Handle dart_true = Dart_True(); // VM heap object.
(...skipping 15 matching lines...) Expand all
3034 Dart_DeleteWeakPersistentHandle(isolate, weak1); 2935 Dart_DeleteWeakPersistentHandle(isolate, weak1);
3035 Dart_DeleteWeakPersistentHandle(isolate, weak2); 2936 Dart_DeleteWeakPersistentHandle(isolate, weak2);
3036 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld)); 2937 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
3037 { 2938 {
3038 TransitionNativeToVM transition(thread); 2939 TransitionNativeToVM transition(thread);
3039 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2940 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3040 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld)); 2941 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
3041 } 2942 }
3042 } 2943 }
3043 2944
3044
3045 static Dart_WeakPersistentHandle weak1 = NULL; 2945 static Dart_WeakPersistentHandle weak1 = NULL;
3046 static Dart_WeakPersistentHandle weak2 = NULL; 2946 static Dart_WeakPersistentHandle weak2 = NULL;
3047 static Dart_WeakPersistentHandle weak3 = NULL; 2947 static Dart_WeakPersistentHandle weak3 = NULL;
3048 2948
3049
3050 static void ImplicitReferencesCallback(void* isolate_callback_data, 2949 static void ImplicitReferencesCallback(void* isolate_callback_data,
3051 Dart_WeakPersistentHandle handle, 2950 Dart_WeakPersistentHandle handle,
3052 void* peer) { 2951 void* peer) {
3053 if (handle == weak1) { 2952 if (handle == weak1) {
3054 weak1 = NULL; 2953 weak1 = NULL;
3055 } else if (handle == weak2) { 2954 } else if (handle == weak2) {
3056 weak2 = NULL; 2955 weak2 = NULL;
3057 } else if (handle == weak3) { 2956 } else if (handle == weak3) {
3058 weak3 = NULL; 2957 weak3 = NULL;
3059 } 2958 }
3060 } 2959 }
3061 2960
3062
3063 TEST_CASE(ImplicitReferencesOldSpace) { 2961 TEST_CASE(ImplicitReferencesOldSpace) {
3064 Dart_PersistentHandle strong = NULL; 2962 Dart_PersistentHandle strong = NULL;
3065 Dart_WeakPersistentHandle strong_weak = NULL; 2963 Dart_WeakPersistentHandle strong_weak = NULL;
3066 2964
3067 Dart_EnterScope(); 2965 Dart_EnterScope();
3068 { 2966 {
3069 CHECK_API_SCOPE(thread); 2967 CHECK_API_SCOPE(thread);
3070 HANDLESCOPE(thread); 2968 HANDLESCOPE(thread);
3071 2969
3072 Dart_Handle local = 2970 Dart_Handle local =
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3118 Dart_EnterScope(); 3016 Dart_EnterScope();
3119 // New space collection should not affect old space objects 3017 // New space collection should not affect old space objects
3120 EXPECT_VALID(AsHandle(strong_weak)); 3018 EXPECT_VALID(AsHandle(strong_weak));
3121 EXPECT(!Dart_IsNull(AsHandle(weak1))); 3019 EXPECT(!Dart_IsNull(AsHandle(weak1)));
3122 EXPECT(!Dart_IsNull(AsHandle(weak2))); 3020 EXPECT(!Dart_IsNull(AsHandle(weak2)));
3123 EXPECT(!Dart_IsNull(AsHandle(weak3))); 3021 EXPECT(!Dart_IsNull(AsHandle(weak3)));
3124 Dart_ExitScope(); 3022 Dart_ExitScope();
3125 } 3023 }
3126 } 3024 }
3127 3025
3128
3129 TEST_CASE(ImplicitReferencesNewSpace) { 3026 TEST_CASE(ImplicitReferencesNewSpace) {
3130 Dart_PersistentHandle strong = NULL; 3027 Dart_PersistentHandle strong = NULL;
3131 Dart_WeakPersistentHandle strong_weak = NULL; 3028 Dart_WeakPersistentHandle strong_weak = NULL;
3132 3029
3133
3134 Dart_EnterScope(); 3030 Dart_EnterScope();
3135 { 3031 {
3136 CHECK_API_SCOPE(thread); 3032 CHECK_API_SCOPE(thread);
3137 HANDLESCOPE(thread); 3033 HANDLESCOPE(thread);
3138 3034
3139 Dart_Handle local = 3035 Dart_Handle local =
3140 Api::NewHandle(thread, String::New("strongly reachable", Heap::kOld)); 3036 Api::NewHandle(thread, String::New("strongly reachable", Heap::kOld));
3141 strong = Dart_NewPersistentHandle(local); 3037 strong = Dart_NewPersistentHandle(local);
3142 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); 3038 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback);
3143 3039
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3184 { 3080 {
3185 Dart_EnterScope(); 3081 Dart_EnterScope();
3186 // Old space collection should not affect old space objects. 3082 // Old space collection should not affect old space objects.
3187 EXPECT(!Dart_IsNull(AsHandle(weak1))); 3083 EXPECT(!Dart_IsNull(AsHandle(weak1)));
3188 EXPECT(!Dart_IsNull(AsHandle(weak2))); 3084 EXPECT(!Dart_IsNull(AsHandle(weak2)));
3189 EXPECT(!Dart_IsNull(AsHandle(weak3))); 3085 EXPECT(!Dart_IsNull(AsHandle(weak3)));
3190 Dart_ExitScope(); 3086 Dart_ExitScope();
3191 } 3087 }
3192 } 3088 }
3193 3089
3194
3195 static int global_prologue_callback_status; 3090 static int global_prologue_callback_status;
3196 3091
3197
3198 static void PrologueCallbackTimes2() { 3092 static void PrologueCallbackTimes2() {
3199 global_prologue_callback_status *= 2; 3093 global_prologue_callback_status *= 2;
3200 } 3094 }
3201 3095
3202
3203 static void PrologueCallbackTimes3() { 3096 static void PrologueCallbackTimes3() {
3204 global_prologue_callback_status *= 3; 3097 global_prologue_callback_status *= 3;
3205 } 3098 }
3206 3099
3207
3208 static int global_epilogue_callback_status; 3100 static int global_epilogue_callback_status;
3209 3101
3210
3211 static void EpilogueCallbackNOP() {} 3102 static void EpilogueCallbackNOP() {}
3212 3103
3213
3214 static void EpilogueCallbackTimes4() { 3104 static void EpilogueCallbackTimes4() {
3215 global_epilogue_callback_status *= 4; 3105 global_epilogue_callback_status *= 4;
3216 } 3106 }
3217 3107
3218
3219 static void EpilogueCallbackTimes5() { 3108 static void EpilogueCallbackTimes5() {
3220 global_epilogue_callback_status *= 5; 3109 global_epilogue_callback_status *= 5;
3221 } 3110 }
3222 3111
3223
3224 TEST_CASE(SetGarbageCollectionCallbacks) { 3112 TEST_CASE(SetGarbageCollectionCallbacks) {
3225 // GC callback addition testing. 3113 // GC callback addition testing.
3226 3114
3227 // Add GC callbacks. 3115 // Add GC callbacks.
3228 EXPECT_VALID( 3116 EXPECT_VALID(
3229 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4)); 3117 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
3230 3118
3231 // Add the same callbacks again. This is an error. 3119 // Add the same callbacks again. This is an error.
3232 EXPECT(Dart_IsError( 3120 EXPECT(Dart_IsError(
3233 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4))); 3121 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4)));
3234 3122
3235 // Add another callback. This is an error. 3123 // Add another callback. This is an error.
3236 EXPECT(Dart_IsError( 3124 EXPECT(Dart_IsError(
3237 Dart_SetGcCallbacks(&PrologueCallbackTimes3, &EpilogueCallbackTimes5))); 3125 Dart_SetGcCallbacks(&PrologueCallbackTimes3, &EpilogueCallbackTimes5)));
3238 3126
3239 // GC callback removal testing. 3127 // GC callback removal testing.
3240 3128
3241 // Remove GC callbacks. 3129 // Remove GC callbacks.
3242 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL)); 3130 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
3243 3131
3244 // Remove GC callbacks whennone exist. This is an error. 3132 // Remove GC callbacks whennone exist. This is an error.
3245 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, NULL))); 3133 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, NULL)));
3246 3134
3247 EXPECT_VALID( 3135 EXPECT_VALID(
3248 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4)); 3136 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
3249 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, NULL))); 3137 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, NULL)));
3250 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, &EpilogueCallbackTimes4))); 3138 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, &EpilogueCallbackTimes4)));
3251 } 3139 }
3252 3140
3253
3254 TEST_CASE(SingleGarbageCollectionCallback) { 3141 TEST_CASE(SingleGarbageCollectionCallback) {
3255 // Add a prologue callback. 3142 // Add a prologue callback.
3256 EXPECT_VALID( 3143 EXPECT_VALID(
3257 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackNOP)); 3144 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackNOP));
3258 3145
3259 { 3146 {
3260 TransitionNativeToVM transition(thread); 3147 TransitionNativeToVM transition(thread);
3261 3148
3262 // Garbage collect new space ignoring callbacks. This should not 3149 // Garbage collect new space ignoring callbacks. This should not
3263 // invoke the prologue callback. No status values should change. 3150 // invoke the prologue callback. No status values should change.
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
3352 // Garbage collect old space. No callbacks should be invoked. No 3239 // Garbage collect old space. No callbacks should be invoked. No
3353 // status values should change. 3240 // status values should change.
3354 global_prologue_callback_status = 3; 3241 global_prologue_callback_status = 3;
3355 global_epilogue_callback_status = 7; 3242 global_epilogue_callback_status = 7;
3356 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 3243 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3357 EXPECT_EQ(3, global_prologue_callback_status); 3244 EXPECT_EQ(3, global_prologue_callback_status);
3358 EXPECT_EQ(7, global_epilogue_callback_status); 3245 EXPECT_EQ(7, global_epilogue_callback_status);
3359 } 3246 }
3360 } 3247 }
3361 3248
3362
3363 // Unit test for creating multiple scopes and local handles within them. 3249 // Unit test for creating multiple scopes and local handles within them.
3364 // Ensure that the local handles get all cleaned out when exiting the 3250 // Ensure that the local handles get all cleaned out when exiting the
3365 // scope. 3251 // scope.
3366 VM_UNIT_TEST_CASE(LocalHandles) { 3252 VM_UNIT_TEST_CASE(LocalHandles) {
3367 TestCase::CreateTestIsolate(); 3253 TestCase::CreateTestIsolate();
3368 Thread* thread = Thread::Current(); 3254 Thread* thread = Thread::Current();
3369 Isolate* isolate = thread->isolate(); 3255 Isolate* isolate = thread->isolate();
3370 EXPECT(isolate != NULL); 3256 EXPECT(isolate != NULL);
3371 ApiLocalScope* scope = thread->api_top_scope(); 3257 ApiLocalScope* scope = thread->api_top_scope();
3372 Dart_Handle handles[300]; 3258 Dart_Handle handles[300];
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3416 Dart_ExitScope(); 3302 Dart_ExitScope();
3417 } 3303 }
3418 EXPECT_EQ(100, thread->CountLocalHandles()); 3304 EXPECT_EQ(100, thread->CountLocalHandles());
3419 Dart_ExitScope(); 3305 Dart_ExitScope();
3420 } 3306 }
3421 EXPECT_EQ(0, thread->CountLocalHandles()); 3307 EXPECT_EQ(0, thread->CountLocalHandles());
3422 EXPECT(scope == thread->api_top_scope()); 3308 EXPECT(scope == thread->api_top_scope());
3423 Dart_ShutdownIsolate(); 3309 Dart_ShutdownIsolate();
3424 } 3310 }
3425 3311
3426
3427 // Unit test for creating multiple scopes and allocating objects in the 3312 // Unit test for creating multiple scopes and allocating objects in the
3428 // zone for the scope. Ensure that the memory is freed when the scope 3313 // zone for the scope. Ensure that the memory is freed when the scope
3429 // exits. 3314 // exits.
3430 VM_UNIT_TEST_CASE(LocalZoneMemory) { 3315 VM_UNIT_TEST_CASE(LocalZoneMemory) {
3431 TestCase::CreateTestIsolate(); 3316 TestCase::CreateTestIsolate();
3432 Thread* thread = Thread::Current(); 3317 Thread* thread = Thread::Current();
3433 EXPECT(thread != NULL); 3318 EXPECT(thread != NULL);
3434 ApiLocalScope* scope = thread->api_top_scope(); 3319 ApiLocalScope* scope = thread->api_top_scope();
3435 { 3320 {
3436 // Start a new scope and allocate some memory. 3321 // Start a new scope and allocate some memory.
(...skipping 24 matching lines...) Expand all
3461 Dart_ExitScope(); 3346 Dart_ExitScope();
3462 } 3347 }
3463 EXPECT_EQ(1600, thread->ZoneSizeInBytes()); 3348 EXPECT_EQ(1600, thread->ZoneSizeInBytes());
3464 Dart_ExitScope(); 3349 Dart_ExitScope();
3465 } 3350 }
3466 EXPECT_EQ(0, thread->ZoneSizeInBytes()); 3351 EXPECT_EQ(0, thread->ZoneSizeInBytes());
3467 EXPECT(scope == thread->api_top_scope()); 3352 EXPECT(scope == thread->api_top_scope());
3468 Dart_ShutdownIsolate(); 3353 Dart_ShutdownIsolate();
3469 } 3354 }
3470 3355
3471
3472 VM_UNIT_TEST_CASE(Isolates) { 3356 VM_UNIT_TEST_CASE(Isolates) {
3473 // This test currently assumes that the Dart_Isolate type is an opaque 3357 // This test currently assumes that the Dart_Isolate type is an opaque
3474 // representation of Isolate*. 3358 // representation of Isolate*.
3475 Dart_Isolate iso_1 = TestCase::CreateTestIsolate(); 3359 Dart_Isolate iso_1 = TestCase::CreateTestIsolate();
3476 EXPECT_EQ(iso_1, Api::CastIsolate(Isolate::Current())); 3360 EXPECT_EQ(iso_1, Api::CastIsolate(Isolate::Current()));
3477 Dart_Isolate isolate = Dart_CurrentIsolate(); 3361 Dart_Isolate isolate = Dart_CurrentIsolate();
3478 EXPECT_EQ(iso_1, isolate); 3362 EXPECT_EQ(iso_1, isolate);
3479 Dart_ExitIsolate(); 3363 Dart_ExitIsolate();
3480 EXPECT(NULL == Dart_CurrentIsolate()); 3364 EXPECT(NULL == Dart_CurrentIsolate());
3481 Dart_Isolate iso_2 = TestCase::CreateTestIsolate(); 3365 Dart_Isolate iso_2 = TestCase::CreateTestIsolate();
3482 EXPECT_EQ(iso_2, Dart_CurrentIsolate()); 3366 EXPECT_EQ(iso_2, Dart_CurrentIsolate());
3483 Dart_ExitIsolate(); 3367 Dart_ExitIsolate();
3484 EXPECT(NULL == Dart_CurrentIsolate()); 3368 EXPECT(NULL == Dart_CurrentIsolate());
3485 Dart_EnterIsolate(iso_2); 3369 Dart_EnterIsolate(iso_2);
3486 EXPECT_EQ(iso_2, Dart_CurrentIsolate()); 3370 EXPECT_EQ(iso_2, Dart_CurrentIsolate());
3487 Dart_ShutdownIsolate(); 3371 Dart_ShutdownIsolate();
3488 EXPECT(NULL == Dart_CurrentIsolate()); 3372 EXPECT(NULL == Dart_CurrentIsolate());
3489 Dart_EnterIsolate(iso_1); 3373 Dart_EnterIsolate(iso_1);
3490 EXPECT_EQ(iso_1, Dart_CurrentIsolate()); 3374 EXPECT_EQ(iso_1, Dart_CurrentIsolate());
3491 Dart_ShutdownIsolate(); 3375 Dart_ShutdownIsolate();
3492 EXPECT(NULL == Dart_CurrentIsolate()); 3376 EXPECT(NULL == Dart_CurrentIsolate());
3493 } 3377 }
3494 3378
3495
3496 VM_UNIT_TEST_CASE(CurrentIsolateData) { 3379 VM_UNIT_TEST_CASE(CurrentIsolateData) {
3497 intptr_t mydata = 12345; 3380 intptr_t mydata = 12345;
3498 char* err; 3381 char* err;
3499 Dart_Isolate isolate = 3382 Dart_Isolate isolate =
3500 Dart_CreateIsolate(NULL, NULL, bin::core_isolate_snapshot_data, 3383 Dart_CreateIsolate(NULL, NULL, bin::core_isolate_snapshot_data,
3501 bin::core_isolate_snapshot_instructions, NULL, 3384 bin::core_isolate_snapshot_instructions, NULL,
3502 reinterpret_cast<void*>(mydata), &err); 3385 reinterpret_cast<void*>(mydata), &err);
3503 EXPECT(isolate != NULL); 3386 EXPECT(isolate != NULL);
3504 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_CurrentIsolateData())); 3387 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_CurrentIsolateData()));
3505 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_IsolateData(isolate))); 3388 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_IsolateData(isolate)));
3506 Dart_ShutdownIsolate(); 3389 Dart_ShutdownIsolate();
3507 } 3390 }
3508 3391
3509
3510 VM_UNIT_TEST_CASE(IsolateSetCheckedMode) { 3392 VM_UNIT_TEST_CASE(IsolateSetCheckedMode) {
3511 const char* kScriptChars = 3393 const char* kScriptChars =
3512 "int bad1() {\n" 3394 "int bad1() {\n"
3513 " int foo = 'string';\n" 3395 " int foo = 'string';\n"
3514 " return foo;\n" 3396 " return foo;\n"
3515 "}\n" 3397 "}\n"
3516 "\n" 3398 "\n"
3517 "int good1() {\n" 3399 "int good1() {\n"
3518 " int five = 5;\n" 3400 " int five = 5;\n"
3519 " return five;" 3401 " return five;"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3556 EXPECT_VALID(result); 3438 EXPECT_VALID(result);
3557 Dart_ExitScope(); 3439 Dart_ExitScope();
3558 } 3440 }
3559 3441
3560 EXPECT(isolate != NULL); 3442 EXPECT(isolate != NULL);
3561 3443
3562 // Shutdown the isolate. 3444 // Shutdown the isolate.
3563 Dart_ShutdownIsolate(); 3445 Dart_ShutdownIsolate();
3564 } 3446 }
3565 3447
3566
3567 TEST_CASE(DebugName) { 3448 TEST_CASE(DebugName) {
3568 Dart_Handle debug_name = Dart_DebugName(); 3449 Dart_Handle debug_name = Dart_DebugName();
3569 EXPECT_VALID(debug_name); 3450 EXPECT_VALID(debug_name);
3570 EXPECT(Dart_IsString(debug_name)); 3451 EXPECT(Dart_IsString(debug_name));
3571 } 3452 }
3572 3453
3573
3574 static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) {} 3454 static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) {}
3575 3455
3576
3577 VM_UNIT_TEST_CASE(SetMessageCallbacks) { 3456 VM_UNIT_TEST_CASE(SetMessageCallbacks) {
3578 Dart_Isolate dart_isolate = TestCase::CreateTestIsolate(); 3457 Dart_Isolate dart_isolate = TestCase::CreateTestIsolate();
3579 Dart_SetMessageNotifyCallback(&MyMessageNotifyCallback); 3458 Dart_SetMessageNotifyCallback(&MyMessageNotifyCallback);
3580 Isolate* isolate = reinterpret_cast<Isolate*>(dart_isolate); 3459 Isolate* isolate = reinterpret_cast<Isolate*>(dart_isolate);
3581 EXPECT_EQ(&MyMessageNotifyCallback, isolate->message_notify_callback()); 3460 EXPECT_EQ(&MyMessageNotifyCallback, isolate->message_notify_callback());
3582 Dart_ShutdownIsolate(); 3461 Dart_ShutdownIsolate();
3583 } 3462 }
3584 3463
3585
3586 TEST_CASE(SetStickyError) { 3464 TEST_CASE(SetStickyError) {
3587 const char* kScriptChars = "main() => throw 'HI';"; 3465 const char* kScriptChars = "main() => throw 'HI';";
3588 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 3466 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
3589 Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL); 3467 Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL);
3590 EXPECT(Dart_IsError(retobj)); 3468 EXPECT(Dart_IsError(retobj));
3591 EXPECT(Dart_IsUnhandledExceptionError(retobj)); 3469 EXPECT(Dart_IsUnhandledExceptionError(retobj));
3592 EXPECT(!Dart_HasStickyError()); 3470 EXPECT(!Dart_HasStickyError());
3593 EXPECT(Dart_GetStickyError() == Dart_Null()); 3471 EXPECT(Dart_GetStickyError() == Dart_Null());
3594 Dart_SetStickyError(retobj); 3472 Dart_SetStickyError(retobj);
3595 EXPECT(Dart_HasStickyError()); 3473 EXPECT(Dart_HasStickyError());
3596 EXPECT(Dart_GetStickyError() != Dart_Null()); 3474 EXPECT(Dart_GetStickyError() != Dart_Null());
3597 Dart_SetStickyError(Dart_Null()); 3475 Dart_SetStickyError(Dart_Null());
3598 EXPECT(!Dart_HasStickyError()); 3476 EXPECT(!Dart_HasStickyError());
3599 EXPECT(Dart_GetStickyError() == Dart_Null()); 3477 EXPECT(Dart_GetStickyError() == Dart_Null());
3600 } 3478 }
3601 3479
3602
3603 TEST_CASE(TypeGetNonParamtericTypes) { 3480 TEST_CASE(TypeGetNonParamtericTypes) {
3604 const char* kScriptChars = 3481 const char* kScriptChars =
3605 "class MyClass0 {\n" 3482 "class MyClass0 {\n"
3606 "}\n" 3483 "}\n"
3607 "\n" 3484 "\n"
3608 "class MyClass1 implements MyInterface1 {\n" 3485 "class MyClass1 implements MyInterface1 {\n"
3609 "}\n" 3486 "}\n"
3610 "\n" 3487 "\n"
3611 "class MyClass2 implements MyInterface0, MyInterface1 {\n" 3488 "class MyClass2 implements MyInterface0, MyInterface1 {\n"
3612 "}\n" 3489 "}\n"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
3684 EXPECT(!instanceOf); 3561 EXPECT(!instanceOf);
3685 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type3, &instanceOf)); 3562 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type3, &instanceOf));
3686 EXPECT(instanceOf); 3563 EXPECT(instanceOf);
3687 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type4, &instanceOf)); 3564 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type4, &instanceOf));
3688 EXPECT(instanceOf); 3565 EXPECT(instanceOf);
3689 type2_obj = Dart_Invoke(lib, NewString("getMyClass2Type"), 0, NULL); 3566 type2_obj = Dart_Invoke(lib, NewString("getMyClass2Type"), 0, NULL);
3690 EXPECT_VALID(type2_obj); 3567 EXPECT_VALID(type2_obj);
3691 EXPECT(Dart_IdentityEquals(type2, type2_obj)); 3568 EXPECT(Dart_IdentityEquals(type2, type2_obj));
3692 } 3569 }
3693 3570
3694
3695 TEST_CASE(TypeGetParameterizedTypes) { 3571 TEST_CASE(TypeGetParameterizedTypes) {
3696 const char* kScriptChars = 3572 const char* kScriptChars =
3697 "class MyClass0<A, B> {\n" 3573 "class MyClass0<A, B> {\n"
3698 "}\n" 3574 "}\n"
3699 "\n" 3575 "\n"
3700 "class MyClass1<A, C> {\n" 3576 "class MyClass1<A, C> {\n"
3701 "}\n" 3577 "}\n"
3702 "MyClass0 getMyClass0() {\n" 3578 "MyClass0 getMyClass0() {\n"
3703 " return new MyClass0<int, double>();\n" 3579 " return new MyClass0<int, double>();\n"
3704 "}\n" 3580 "}\n"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
3788 // MyClass1<List<int>, List<double>> type. 3664 // MyClass1<List<int>, List<double>> type.
3789 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1"), 0, NULL); 3665 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1"), 0, NULL);
3790 EXPECT_VALID(type1_obj); 3666 EXPECT_VALID(type1_obj);
3791 EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceOf)); 3667 EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceOf));
3792 EXPECT(instanceOf); 3668 EXPECT(instanceOf);
3793 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1Type"), 0, NULL); 3669 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1Type"), 0, NULL);
3794 EXPECT_VALID(type1_obj); 3670 EXPECT_VALID(type1_obj);
3795 EXPECT(!Dart_IdentityEquals(type1_obj, myclass1_type)); 3671 EXPECT(!Dart_IdentityEquals(type1_obj, myclass1_type));
3796 } 3672 }
3797 3673
3798
3799 static void TestFieldOk(Dart_Handle container, 3674 static void TestFieldOk(Dart_Handle container,
3800 Dart_Handle name, 3675 Dart_Handle name,
3801 bool final, 3676 bool final,
3802 const char* initial_value) { 3677 const char* initial_value) {
3803 Dart_Handle result; 3678 Dart_Handle result;
3804 3679
3805 // Make sure we have the right initial value. 3680 // Make sure we have the right initial value.
3806 result = Dart_GetField(container, name); 3681 result = Dart_GetField(container, name);
3807 EXPECT_VALID(result); 3682 EXPECT_VALID(result);
3808 const char* value = ""; 3683 const char* value = "";
(...skipping 17 matching lines...) Expand all
3826 result = Dart_GetField(container, name); 3701 result = Dart_GetField(container, name);
3827 EXPECT_VALID(result); 3702 EXPECT_VALID(result);
3828 EXPECT_VALID(Dart_StringToCString(result, &value)); 3703 EXPECT_VALID(Dart_StringToCString(result, &value));
3829 if (final) { 3704 if (final) {
3830 EXPECT_STREQ(initial_value, value); 3705 EXPECT_STREQ(initial_value, value);
3831 } else { 3706 } else {
3832 EXPECT_STREQ(buffer, value); 3707 EXPECT_STREQ(buffer, value);
3833 } 3708 }
3834 } 3709 }
3835 3710
3836
3837 static void TestFieldNotFound(Dart_Handle container, Dart_Handle name) { 3711 static void TestFieldNotFound(Dart_Handle container, Dart_Handle name) {
3838 EXPECT(Dart_IsError(Dart_GetField(container, name))); 3712 EXPECT(Dart_IsError(Dart_GetField(container, name)));
3839 EXPECT(Dart_IsError(Dart_SetField(container, name, Dart_Null()))); 3713 EXPECT(Dart_IsError(Dart_SetField(container, name, Dart_Null())));
3840 } 3714 }
3841 3715
3842
3843 TEST_CASE(FieldAccess) { 3716 TEST_CASE(FieldAccess) {
3844 const char* kScriptChars = 3717 const char* kScriptChars =
3845 "class BaseFields {\n" 3718 "class BaseFields {\n"
3846 " BaseFields()\n" 3719 " BaseFields()\n"
3847 " : this.inherited_fld = 'inherited' {\n" 3720 " : this.inherited_fld = 'inherited' {\n"
3848 " }\n" 3721 " }\n"
3849 " var inherited_fld;\n" 3722 " var inherited_fld;\n"
3850 " static var non_inherited_fld;\n" 3723 " static var non_inherited_fld;\n"
3851 "}\n" 3724 "}\n"
3852 "\n" 3725 "\n"
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
4084 TestFieldNotFound(instance, name); 3957 TestFieldNotFound(instance, name);
4085 TestFieldOk(lib, name, false, "imported getset"); 3958 TestFieldOk(lib, name, false, "imported getset");
4086 3959
4087 // Hidden imported top-level get/set field. Not found at any level. 3960 // Hidden imported top-level get/set field. Not found at any level.
4088 name = NewString("_imported_getset_fld"); 3961 name = NewString("_imported_getset_fld");
4089 TestFieldNotFound(type, name); 3962 TestFieldNotFound(type, name);
4090 TestFieldNotFound(instance, name); 3963 TestFieldNotFound(instance, name);
4091 TestFieldNotFound(lib, name); 3964 TestFieldNotFound(lib, name);
4092 } 3965 }
4093 3966
4094
4095 TEST_CASE(SetField_FunnyValue) { 3967 TEST_CASE(SetField_FunnyValue) {
4096 const char* kScriptChars = "var top;\n"; 3968 const char* kScriptChars = "var top;\n";
4097 3969
4098 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 3970 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
4099 Dart_Handle name = NewString("top"); 3971 Dart_Handle name = NewString("top");
4100 bool value; 3972 bool value;
4101 3973
4102 // Test that you can set the field to a good value. 3974 // Test that you can set the field to a good value.
4103 EXPECT_VALID(Dart_SetField(lib, name, Dart_True())); 3975 EXPECT_VALID(Dart_SetField(lib, name, Dart_True()));
4104 Dart_Handle result = Dart_GetField(lib, name); 3976 Dart_Handle result = Dart_GetField(lib, name);
(...skipping 13 matching lines...) Expand all
4118 EXPECT(Dart_IsError(result)); 3990 EXPECT(Dart_IsError(result));
4119 EXPECT_STREQ("Dart_SetField expects argument 'value' to be of type Instance.", 3991 EXPECT_STREQ("Dart_SetField expects argument 'value' to be of type Instance.",
4120 Dart_GetError(result)); 3992 Dart_GetError(result));
4121 3993
4122 // Pass an error handle. The error is contagious. 3994 // Pass an error handle. The error is contagious.
4123 result = Dart_SetField(lib, name, Api::NewError("myerror")); 3995 result = Dart_SetField(lib, name, Api::NewError("myerror"));
4124 EXPECT(Dart_IsError(result)); 3996 EXPECT(Dart_IsError(result));
4125 EXPECT_STREQ("myerror", Dart_GetError(result)); 3997 EXPECT_STREQ("myerror", Dart_GetError(result));
4126 } 3998 }
4127 3999
4128
4129 void NativeFieldLookup(Dart_NativeArguments args) { 4000 void NativeFieldLookup(Dart_NativeArguments args) {
4130 UNREACHABLE(); 4001 UNREACHABLE();
4131 } 4002 }
4132 4003
4133
4134 static Dart_NativeFunction native_field_lookup(Dart_Handle name, 4004 static Dart_NativeFunction native_field_lookup(Dart_Handle name,
4135 int argument_count, 4005 int argument_count,
4136 bool* auto_setup_scope) { 4006 bool* auto_setup_scope) {
4137 ASSERT(auto_setup_scope != NULL); 4007 ASSERT(auto_setup_scope != NULL);
4138 *auto_setup_scope = false; 4008 *auto_setup_scope = false;
4139 return reinterpret_cast<Dart_NativeFunction>(&NativeFieldLookup); 4009 return reinterpret_cast<Dart_NativeFunction>(&NativeFieldLookup);
4140 } 4010 }
4141 4011
4142
4143 TEST_CASE(InjectNativeFields1) { 4012 TEST_CASE(InjectNativeFields1) {
4144 const char* kScriptChars = 4013 const char* kScriptChars =
4145 "class NativeFields extends NativeFieldsWrapper {\n" 4014 "class NativeFields extends NativeFieldsWrapper {\n"
4146 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4015 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4147 " int fld1;\n" 4016 " int fld1;\n"
4148 " final int fld2;\n" 4017 " final int fld2;\n"
4149 " static int fld3;\n" 4018 " static int fld3;\n"
4150 " static const int fld4 = 10;\n" 4019 " static const int fld4 = 10;\n"
4151 "}\n" 4020 "}\n"
4152 "NativeFields testMain() {\n" 4021 "NativeFields testMain() {\n"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4184 // (1 + 2) * kWordSize + size of object header. 4053 // (1 + 2) * kWordSize + size of object header.
4185 // We check to make sure the instance size computed by the VM matches 4054 // We check to make sure the instance size computed by the VM matches
4186 // our expectations. 4055 // our expectations.
4187 intptr_t header_size = sizeof(RawObject); 4056 intptr_t header_size = sizeof(RawObject);
4188 EXPECT_EQ( 4057 EXPECT_EQ(
4189 Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment), 4058 Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment),
4190 cls.instance_size()); 4059 cls.instance_size());
4191 EXPECT_EQ(kNumNativeFields, cls.num_native_fields()); 4060 EXPECT_EQ(kNumNativeFields, cls.num_native_fields());
4192 } 4061 }
4193 4062
4194
4195 TEST_CASE(InjectNativeFields2) { 4063 TEST_CASE(InjectNativeFields2) {
4196 const char* kScriptChars = 4064 const char* kScriptChars =
4197 "class NativeFields extends NativeFieldsWrapper {\n" 4065 "class NativeFields extends NativeFieldsWrapper {\n"
4198 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4066 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4199 " int fld1;\n" 4067 " int fld1;\n"
4200 " final int fld2;\n" 4068 " final int fld2;\n"
4201 " static int fld3;\n" 4069 " static int fld3;\n"
4202 " static const int fld4 = 10;\n" 4070 " static const int fld4 = 10;\n"
4203 "}\n" 4071 "}\n"
4204 "NativeFields testMain() {\n" 4072 "NativeFields testMain() {\n"
4205 " NativeFields obj = new NativeFields(10, 20);\n" 4073 " NativeFields obj = new NativeFields(10, 20);\n"
4206 " return obj;\n" 4074 " return obj;\n"
4207 "}\n"; 4075 "}\n";
4208 Dart_Handle result; 4076 Dart_Handle result;
4209 // Create a test library and Load up a test script in it. 4077 // Create a test library and Load up a test script in it.
4210 Dart_Handle lib = 4078 Dart_Handle lib =
4211 TestCase::LoadTestScript(kScriptChars, NULL, USER_TEST_URI, false); 4079 TestCase::LoadTestScript(kScriptChars, NULL, USER_TEST_URI, false);
4212 4080
4213 // Invoke a function which returns an object of type NativeFields. 4081 // Invoke a function which returns an object of type NativeFields.
4214 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4082 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4215 4083
4216 // We expect this to fail as class "NativeFields" extends 4084 // We expect this to fail as class "NativeFields" extends
4217 // "NativeFieldsWrapper" and there is no definition of it either 4085 // "NativeFieldsWrapper" and there is no definition of it either
4218 // in the dart code or through the native field injection mechanism. 4086 // in the dart code or through the native field injection mechanism.
4219 EXPECT(Dart_IsError(result)); 4087 EXPECT(Dart_IsError(result));
4220 } 4088 }
4221 4089
4222
4223 TEST_CASE(InjectNativeFields3) { 4090 TEST_CASE(InjectNativeFields3) {
4224 const char* kScriptChars = 4091 const char* kScriptChars =
4225 "import 'dart:nativewrappers';" 4092 "import 'dart:nativewrappers';"
4226 "class NativeFields extends NativeFieldWrapperClass2 {\n" 4093 "class NativeFields extends NativeFieldWrapperClass2 {\n"
4227 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4094 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4228 " int fld1;\n" 4095 " int fld1;\n"
4229 " final int fld2;\n" 4096 " final int fld2;\n"
4230 " static int fld3;\n" 4097 " static int fld3;\n"
4231 " static const int fld4 = 10;\n" 4098 " static const int fld4 = 10;\n"
4232 "}\n" 4099 "}\n"
(...skipping 21 matching lines...) Expand all
4254 // (1 + 2) * kWordSize + size of object header. 4121 // (1 + 2) * kWordSize + size of object header.
4255 // We check to make sure the instance size computed by the VM matches 4122 // We check to make sure the instance size computed by the VM matches
4256 // our expectations. 4123 // our expectations.
4257 intptr_t header_size = sizeof(RawObject); 4124 intptr_t header_size = sizeof(RawObject);
4258 EXPECT_EQ( 4125 EXPECT_EQ(
4259 Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment), 4126 Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment),
4260 cls.instance_size()); 4127 cls.instance_size());
4261 EXPECT_EQ(kNumNativeFields, cls.num_native_fields()); 4128 EXPECT_EQ(kNumNativeFields, cls.num_native_fields());
4262 } 4129 }
4263 4130
4264
4265 TEST_CASE(InjectNativeFields4) { 4131 TEST_CASE(InjectNativeFields4) {
4266 const char* kScriptChars = 4132 const char* kScriptChars =
4267 "import 'dart:nativewrappers';" 4133 "import 'dart:nativewrappers';"
4268 "class NativeFields extends NativeFieldWrapperClass2 {\n" 4134 "class NativeFields extends NativeFieldWrapperClass2 {\n"
4269 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4135 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4270 " int fld1;\n" 4136 " int fld1;\n"
4271 " final int fld2;\n" 4137 " final int fld2;\n"
4272 " static int fld3;\n" 4138 " static int fld3;\n"
4273 " static const int fld4 = 10;\n" 4139 " static const int fld4 = 10;\n"
4274 "}\n" 4140 "}\n"
(...skipping 15 matching lines...) Expand all
4290 EXPECT(Dart_IsError(result)); 4156 EXPECT(Dart_IsError(result));
4291 Dart_Handle expected_error = DartUtils::NewError( 4157 Dart_Handle expected_error = DartUtils::NewError(
4292 "'dart:test-lib': Error: line 1 pos 36: " 4158 "'dart:test-lib': Error: line 1 pos 36: "
4293 "class 'NativeFields' is trying to extend a native fields class, " 4159 "class 'NativeFields' is trying to extend a native fields class, "
4294 "but library '%s' has no native resolvers", 4160 "but library '%s' has no native resolvers",
4295 TestCase::url()); 4161 TestCase::url());
4296 EXPECT_SUBSTRING(Dart_GetError(expected_error), Dart_GetError(result)); 4162 EXPECT_SUBSTRING(Dart_GetError(expected_error), Dart_GetError(result));
4297 #endif 4163 #endif
4298 } 4164 }
4299 4165
4300
4301 static const int kTestNumNativeFields = 2; 4166 static const int kTestNumNativeFields = 2;
4302 static const intptr_t kNativeField1Value = 30; 4167 static const intptr_t kNativeField1Value = 30;
4303 static const intptr_t kNativeField2Value = 40; 4168 static const intptr_t kNativeField2Value = 40;
4304 4169
4305 void TestNativeFieldsAccess_init(Dart_NativeArguments args) { 4170 void TestNativeFieldsAccess_init(Dart_NativeArguments args) {
4306 Dart_Handle receiver = Dart_GetNativeArgument(args, 0); 4171 Dart_Handle receiver = Dart_GetNativeArgument(args, 0);
4307 Dart_SetNativeInstanceField(receiver, 0, kNativeField1Value); 4172 Dart_SetNativeInstanceField(receiver, 0, kNativeField1Value);
4308 Dart_SetNativeInstanceField(receiver, 1, kNativeField2Value); 4173 Dart_SetNativeInstanceField(receiver, 1, kNativeField2Value);
4309 } 4174 }
4310 4175
4311
4312 void TestNativeFieldsAccess_access(Dart_NativeArguments args) { 4176 void TestNativeFieldsAccess_access(Dart_NativeArguments args) {
4313 intptr_t field_values[kTestNumNativeFields]; 4177 intptr_t field_values[kTestNumNativeFields];
4314 Dart_Handle result = Dart_GetNativeFieldsOfArgument( 4178 Dart_Handle result = Dart_GetNativeFieldsOfArgument(
4315 args, 0, kTestNumNativeFields, field_values); 4179 args, 0, kTestNumNativeFields, field_values);
4316 EXPECT_VALID(result); 4180 EXPECT_VALID(result);
4317 EXPECT_EQ(kNativeField1Value, field_values[0]); 4181 EXPECT_EQ(kNativeField1Value, field_values[0]);
4318 EXPECT_EQ(kNativeField2Value, field_values[1]); 4182 EXPECT_EQ(kNativeField2Value, field_values[1]);
4319 result = Dart_GetNativeFieldsOfArgument(args, 1, kTestNumNativeFields, 4183 result = Dart_GetNativeFieldsOfArgument(args, 1, kTestNumNativeFields,
4320 field_values); 4184 field_values);
4321 EXPECT_VALID(result); 4185 EXPECT_VALID(result);
4322 EXPECT_EQ(0, field_values[0]); 4186 EXPECT_EQ(0, field_values[0]);
4323 EXPECT_EQ(0, field_values[1]); 4187 EXPECT_EQ(0, field_values[1]);
4324 } 4188 }
4325 4189
4326
4327 static Dart_NativeFunction TestNativeFieldsAccess_lookup(Dart_Handle name, 4190 static Dart_NativeFunction TestNativeFieldsAccess_lookup(Dart_Handle name,
4328 int argument_count, 4191 int argument_count,
4329 bool* auto_scope) { 4192 bool* auto_scope) {
4330 ASSERT(auto_scope != NULL); 4193 ASSERT(auto_scope != NULL);
4331 *auto_scope = true; 4194 *auto_scope = true;
4332 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); 4195 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
4333 if (!obj.IsString()) { 4196 if (!obj.IsString()) {
4334 return NULL; 4197 return NULL;
4335 } 4198 }
4336 const char* function_name = obj.ToCString(); 4199 const char* function_name = obj.ToCString();
4337 ASSERT(function_name != NULL); 4200 ASSERT(function_name != NULL);
4338 if (!strcmp(function_name, "TestNativeFieldsAccess_init")) { 4201 if (!strcmp(function_name, "TestNativeFieldsAccess_init")) {
4339 return reinterpret_cast<Dart_NativeFunction>(&TestNativeFieldsAccess_init); 4202 return reinterpret_cast<Dart_NativeFunction>(&TestNativeFieldsAccess_init);
4340 } else if (!strcmp(function_name, "TestNativeFieldsAccess_access")) { 4203 } else if (!strcmp(function_name, "TestNativeFieldsAccess_access")) {
4341 return reinterpret_cast<Dart_NativeFunction>( 4204 return reinterpret_cast<Dart_NativeFunction>(
4342 &TestNativeFieldsAccess_access); 4205 &TestNativeFieldsAccess_access);
4343 } else { 4206 } else {
4344 return NULL; 4207 return NULL;
4345 } 4208 }
4346 } 4209 }
4347 4210
4348
4349 TEST_CASE(TestNativeFieldsAccess) { 4211 TEST_CASE(TestNativeFieldsAccess) {
4350 const char* kScriptChars = 4212 const char* kScriptChars =
4351 "import 'dart:nativewrappers';" 4213 "import 'dart:nativewrappers';"
4352 "class NativeFields extends NativeFieldWrapperClass2 {\n" 4214 "class NativeFields extends NativeFieldWrapperClass2 {\n"
4353 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4215 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4354 " int fld1;\n" 4216 " int fld1;\n"
4355 " final int fld2;\n" 4217 " final int fld2;\n"
4356 " static int fld3;\n" 4218 " static int fld3;\n"
4357 " static const int fld4 = 10;\n" 4219 " static const int fld4 = 10;\n"
4358 " int initNativeFlds() native 'TestNativeFieldsAccess_init';\n" 4220 " int initNativeFlds() native 'TestNativeFieldsAccess_init';\n"
4359 " int accessNativeFlds(int i) native 'TestNativeFieldsAccess_access';\n" 4221 " int accessNativeFlds(int i) native 'TestNativeFieldsAccess_access';\n"
4360 "}\n" 4222 "}\n"
4361 "NativeFields testMain() {\n" 4223 "NativeFields testMain() {\n"
4362 " NativeFields obj = new NativeFields(10, 20);\n" 4224 " NativeFields obj = new NativeFields(10, 20);\n"
4363 " obj.initNativeFlds();\n" 4225 " obj.initNativeFlds();\n"
4364 " obj.accessNativeFlds(null);\n" 4226 " obj.accessNativeFlds(null);\n"
4365 " return obj;\n" 4227 " return obj;\n"
4366 "}\n"; 4228 "}\n";
4367 4229
4368 // Load up a test script in the test library. 4230 // Load up a test script in the test library.
4369 Dart_Handle lib = 4231 Dart_Handle lib =
4370 TestCase::LoadTestScript(kScriptChars, TestNativeFieldsAccess_lookup); 4232 TestCase::LoadTestScript(kScriptChars, TestNativeFieldsAccess_lookup);
4371 4233
4372 // Invoke a function which returns an object of type NativeFields. 4234 // Invoke a function which returns an object of type NativeFields.
4373 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4235 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4374 EXPECT_VALID(result); 4236 EXPECT_VALID(result);
4375 } 4237 }
4376 4238
4377
4378 TEST_CASE(InjectNativeFieldsSuperClass) { 4239 TEST_CASE(InjectNativeFieldsSuperClass) {
4379 const char* kScriptChars = 4240 const char* kScriptChars =
4380 "import 'dart:nativewrappers';" 4241 "import 'dart:nativewrappers';"
4381 "class NativeFieldsSuper extends NativeFieldWrapperClass1 {\n" 4242 "class NativeFieldsSuper extends NativeFieldWrapperClass1 {\n"
4382 " NativeFieldsSuper() : fld1 = 42 {}\n" 4243 " NativeFieldsSuper() : fld1 = 42 {}\n"
4383 " int fld1;\n" 4244 " int fld1;\n"
4384 "}\n" 4245 "}\n"
4385 "class NativeFields extends NativeFieldsSuper {\n" 4246 "class NativeFields extends NativeFieldsSuper {\n"
4386 " fld() => fld1;\n" 4247 " fld() => fld1;\n"
4387 "}\n" 4248 "}\n"
4388 "int testMain() {\n" 4249 "int testMain() {\n"
4389 " NativeFields obj = new NativeFields();\n" 4250 " NativeFields obj = new NativeFields();\n"
4390 " return obj.fld();\n" 4251 " return obj.fld();\n"
4391 "}\n"; 4252 "}\n";
4392 Dart_Handle result; 4253 Dart_Handle result;
4393 // Load up a test script in the test library. 4254 // Load up a test script in the test library.
4394 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup); 4255 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
4395 4256
4396 // Invoke a function which returns an object of type NativeFields. 4257 // Invoke a function which returns an object of type NativeFields.
4397 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4258 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4398 4259
4399 EXPECT_VALID(result); 4260 EXPECT_VALID(result);
4400 EXPECT(Dart_IsInteger(result)); 4261 EXPECT(Dart_IsInteger(result));
4401 int64_t value = 0; 4262 int64_t value = 0;
4402 result = Dart_IntegerToInt64(result, &value); 4263 result = Dart_IntegerToInt64(result, &value);
4403 EXPECT_VALID(result); 4264 EXPECT_VALID(result);
4404 EXPECT_EQ(42, value); 4265 EXPECT_EQ(42, value);
4405 } 4266 }
4406 4267
4407
4408 static void TestNativeFields(Dart_Handle retobj) { 4268 static void TestNativeFields(Dart_Handle retobj) {
4409 // Access and set various instance fields of the object. 4269 // Access and set various instance fields of the object.
4410 Dart_Handle result = Dart_GetField(retobj, NewString("fld3")); 4270 Dart_Handle result = Dart_GetField(retobj, NewString("fld3"));
4411 EXPECT(Dart_IsError(result)); 4271 EXPECT(Dart_IsError(result));
4412 result = Dart_GetField(retobj, NewString("fld0")); 4272 result = Dart_GetField(retobj, NewString("fld0"));
4413 EXPECT_VALID(result); 4273 EXPECT_VALID(result);
4414 EXPECT(Dart_IsNull(result)); 4274 EXPECT(Dart_IsNull(result));
4415 result = Dart_GetField(retobj, NewString("fld1")); 4275 result = Dart_GetField(retobj, NewString("fld1"));
4416 EXPECT_VALID(result); 4276 EXPECT_VALID(result);
4417 int64_t value = 0; 4277 int64_t value = 0;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
4473 result = Dart_GetField(retobj, NewString("fld1")); 4333 result = Dart_GetField(retobj, NewString("fld1"));
4474 EXPECT_VALID(result); 4334 EXPECT_VALID(result);
4475 result = Dart_IntegerToInt64(result, &value); 4335 result = Dart_IntegerToInt64(result, &value);
4476 EXPECT_EQ(40, value); 4336 EXPECT_EQ(40, value);
4477 result = Dart_GetField(retobj, NewString("fld2")); 4337 result = Dart_GetField(retobj, NewString("fld2"));
4478 EXPECT_VALID(result); 4338 EXPECT_VALID(result);
4479 result = Dart_IntegerToInt64(result, &value); 4339 result = Dart_IntegerToInt64(result, &value);
4480 EXPECT_EQ(20, value); 4340 EXPECT_EQ(20, value);
4481 } 4341 }
4482 4342
4483
4484 TEST_CASE(NativeFieldAccess) { 4343 TEST_CASE(NativeFieldAccess) {
4485 const char* kScriptChars = 4344 const char* kScriptChars =
4486 "class NativeFields extends NativeFieldsWrapper {\n" 4345 "class NativeFields extends NativeFieldsWrapper {\n"
4487 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4346 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4488 " int fld0;\n" 4347 " int fld0;\n"
4489 " int fld1;\n" 4348 " int fld1;\n"
4490 " final int fld2;\n" 4349 " final int fld2;\n"
4491 " static int fld3;\n" 4350 " static int fld3;\n"
4492 " static const int fld4 = 10;\n" 4351 " static const int fld4 = 10;\n"
4493 "}\n" 4352 "}\n"
(...skipping 29 matching lines...) Expand all
4523 4382
4524 result = Dart_GetNativeInstanceField(error, 0, &field_value); 4383 result = Dart_GetNativeInstanceField(error, 0, &field_value);
4525 EXPECT(Dart_IsError(result)); 4384 EXPECT(Dart_IsError(result));
4526 EXPECT_STREQ("myerror", Dart_GetError(result)); 4385 EXPECT_STREQ("myerror", Dart_GetError(result));
4527 4386
4528 result = Dart_SetNativeInstanceField(error, 0, 1); 4387 result = Dart_SetNativeInstanceField(error, 0, 1);
4529 EXPECT(Dart_IsError(result)); 4388 EXPECT(Dart_IsError(result));
4530 EXPECT_STREQ("myerror", Dart_GetError(result)); 4389 EXPECT_STREQ("myerror", Dart_GetError(result));
4531 } 4390 }
4532 4391
4533
4534 TEST_CASE(ImplicitNativeFieldAccess) { 4392 TEST_CASE(ImplicitNativeFieldAccess) {
4535 const char* kScriptChars = 4393 const char* kScriptChars =
4536 "import 'dart:nativewrappers';" 4394 "import 'dart:nativewrappers';"
4537 "class NativeFields extends NativeFieldWrapperClass4 {\n" 4395 "class NativeFields extends NativeFieldWrapperClass4 {\n"
4538 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4396 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4539 " int fld0;\n" 4397 " int fld0;\n"
4540 " int fld1;\n" 4398 " int fld1;\n"
4541 " final int fld2;\n" 4399 " final int fld2;\n"
4542 " static int fld3;\n" 4400 " static int fld3;\n"
4543 " static const int fld4 = 10;\n" 4401 " static const int fld4 = 10;\n"
4544 "}\n" 4402 "}\n"
4545 "NativeFields testMain() {\n" 4403 "NativeFields testMain() {\n"
4546 " NativeFields obj = new NativeFields(10, 20);\n" 4404 " NativeFields obj = new NativeFields(10, 20);\n"
4547 " return obj;\n" 4405 " return obj;\n"
4548 "}\n"; 4406 "}\n";
4549 // Load up a test script in the test library. 4407 // Load up a test script in the test library.
4550 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup); 4408 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
4551 4409
4552 // Invoke a function which returns an object of type NativeFields. 4410 // Invoke a function which returns an object of type NativeFields.
4553 Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4411 Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4554 EXPECT_VALID(retobj); 4412 EXPECT_VALID(retobj);
4555 4413
4556 // Now access and set various instance fields of the returned object. 4414 // Now access and set various instance fields of the returned object.
4557 TestNativeFields(retobj); 4415 TestNativeFields(retobj);
4558 } 4416 }
4559 4417
4560
4561 TEST_CASE(NegativeNativeFieldAccess) { 4418 TEST_CASE(NegativeNativeFieldAccess) {
4562 const char* kScriptChars = 4419 const char* kScriptChars =
4563 "class NativeFields {\n" 4420 "class NativeFields {\n"
4564 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4421 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4565 " int fld1;\n" 4422 " int fld1;\n"
4566 " final int fld2;\n" 4423 " final int fld2;\n"
4567 " static int fld3;\n" 4424 " static int fld3;\n"
4568 " static const int fld4 = 10;\n" 4425 " static const int fld4 = 10;\n"
4569 "}\n" 4426 "}\n"
4570 "NativeFields testMain1() {\n" 4427 "NativeFields testMain1() {\n"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
4622 result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &value); 4479 result = Dart_GetNativeInstanceField(retobj, kNativeFld2, &value);
4623 EXPECT(Dart_IsError(result)); 4480 EXPECT(Dart_IsError(result));
4624 result = Dart_SetNativeInstanceField(retobj, kNativeFld4, 40); 4481 result = Dart_SetNativeInstanceField(retobj, kNativeFld4, 40);
4625 EXPECT(Dart_IsError(result)); 4482 EXPECT(Dart_IsError(result));
4626 result = Dart_SetNativeInstanceField(retobj, kNativeFld3, 40); 4483 result = Dart_SetNativeInstanceField(retobj, kNativeFld3, 40);
4627 EXPECT(Dart_IsError(result)); 4484 EXPECT(Dart_IsError(result));
4628 result = Dart_SetNativeInstanceField(retobj, kNativeFld0, 400); 4485 result = Dart_SetNativeInstanceField(retobj, kNativeFld0, 400);
4629 EXPECT(Dart_IsError(result)); 4486 EXPECT(Dart_IsError(result));
4630 } 4487 }
4631 4488
4632
4633 TEST_CASE(NegativeNativeFieldInIsolateMessage) { 4489 TEST_CASE(NegativeNativeFieldInIsolateMessage) {
4634 const char* kScriptChars = 4490 const char* kScriptChars =
4635 "import 'dart:isolate';\n" 4491 "import 'dart:isolate';\n"
4636 "import 'dart:nativewrappers';\n" 4492 "import 'dart:nativewrappers';\n"
4637 "echo(msg) {\n" 4493 "echo(msg) {\n"
4638 " var data = msg[0];\n" 4494 " var data = msg[0];\n"
4639 " var reply = msg[1];\n" 4495 " var reply = msg[1];\n"
4640 " reply.send('echoing ${data(1)}}');\n" 4496 " reply.send('echoing ${data(1)}}');\n"
4641 "}\n" 4497 "}\n"
4642 "class Test extends NativeFieldWrapperClass2 {\n" 4498 "class Test extends NativeFieldWrapperClass2 {\n"
(...skipping 17 matching lines...) Expand all
4660 // Create a test library and Load up a test script in it. 4516 // Create a test library and Load up a test script in it.
4661 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 4517 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
4662 4518
4663 // Invoke 'main' which should spawn an isolate and try to send an 4519 // Invoke 'main' which should spawn an isolate and try to send an
4664 // object with native fields over to the spawned isolate. This 4520 // object with native fields over to the spawned isolate. This
4665 // should result in an unhandled exception which is checked. 4521 // should result in an unhandled exception which is checked.
4666 Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL); 4522 Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL);
4667 EXPECT(Dart_IsError(retobj)); 4523 EXPECT(Dart_IsError(retobj));
4668 } 4524 }
4669 4525
4670
4671 TEST_CASE(GetStaticField_RunsInitializer) { 4526 TEST_CASE(GetStaticField_RunsInitializer) {
4672 const char* kScriptChars = 4527 const char* kScriptChars =
4673 "class TestClass {\n" 4528 "class TestClass {\n"
4674 " static const int fld1 = 7;\n" 4529 " static const int fld1 = 7;\n"
4675 " static int fld2 = 11;\n" 4530 " static int fld2 = 11;\n"
4676 " static void testMain() {\n" 4531 " static void testMain() {\n"
4677 " }\n" 4532 " }\n"
4678 "}\n"; 4533 "}\n";
4679 Dart_Handle result; 4534 Dart_Handle result;
4680 // Create a test library and Load up a test script in it. 4535 // Create a test library and Load up a test script in it.
(...skipping 21 matching lines...) Expand all
4702 result = Dart_SetField(type, NewString("fld2"), Dart_NewInteger(13)); 4557 result = Dart_SetField(type, NewString("fld2"), Dart_NewInteger(13));
4703 EXPECT_VALID(result); 4558 EXPECT_VALID(result);
4704 4559
4705 // We now get the new value for fld2, not the initializer 4560 // We now get the new value for fld2, not the initializer
4706 result = Dart_GetField(type, NewString("fld2")); 4561 result = Dart_GetField(type, NewString("fld2"));
4707 EXPECT_VALID(result); 4562 EXPECT_VALID(result);
4708 result = Dart_IntegerToInt64(result, &value); 4563 result = Dart_IntegerToInt64(result, &value);
4709 EXPECT_EQ(13, value); 4564 EXPECT_EQ(13, value);
4710 } 4565 }
4711 4566
4712
4713 TEST_CASE(GetField_CheckIsolate) { 4567 TEST_CASE(GetField_CheckIsolate) {
4714 const char* kScriptChars = 4568 const char* kScriptChars =
4715 "class TestClass {\n" 4569 "class TestClass {\n"
4716 " static int fld2 = 11;\n" 4570 " static int fld2 = 11;\n"
4717 " static void testMain() {\n" 4571 " static void testMain() {\n"
4718 " }\n" 4572 " }\n"
4719 "}\n"; 4573 "}\n";
4720 Dart_Handle result; 4574 Dart_Handle result;
4721 int64_t value = 0; 4575 int64_t value = 0;
4722 4576
4723 // Create a test library and Load up a test script in it. 4577 // Create a test library and Load up a test script in it.
4724 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 4578 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
4725 Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL); 4579 Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL);
4726 EXPECT_VALID(type); 4580 EXPECT_VALID(type);
4727 4581
4728 result = Dart_GetField(type, NewString("fld2")); 4582 result = Dart_GetField(type, NewString("fld2"));
4729 EXPECT_VALID(result); 4583 EXPECT_VALID(result);
4730 result = Dart_IntegerToInt64(result, &value); 4584 result = Dart_IntegerToInt64(result, &value);
4731 EXPECT_EQ(11, value); 4585 EXPECT_EQ(11, value);
4732 } 4586 }
4733 4587
4734
4735 TEST_CASE(SetField_CheckIsolate) { 4588 TEST_CASE(SetField_CheckIsolate) {
4736 const char* kScriptChars = 4589 const char* kScriptChars =
4737 "class TestClass {\n" 4590 "class TestClass {\n"
4738 " static int fld2 = 11;\n" 4591 " static int fld2 = 11;\n"
4739 " static void testMain() {\n" 4592 " static void testMain() {\n"
4740 " }\n" 4593 " }\n"
4741 "}\n"; 4594 "}\n";
4742 Dart_Handle result; 4595 Dart_Handle result;
4743 int64_t value = 0; 4596 int64_t value = 0;
4744 4597
4745 // Create a test library and Load up a test script in it. 4598 // Create a test library and Load up a test script in it.
4746 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 4599 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
4747 Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL); 4600 Dart_Handle type = Dart_GetType(lib, NewString("TestClass"), 0, NULL);
4748 EXPECT_VALID(type); 4601 EXPECT_VALID(type);
4749 4602
4750 result = Dart_SetField(type, NewString("fld2"), Dart_NewInteger(13)); 4603 result = Dart_SetField(type, NewString("fld2"), Dart_NewInteger(13));
4751 EXPECT_VALID(result); 4604 EXPECT_VALID(result);
4752 4605
4753 result = Dart_GetField(type, NewString("fld2")); 4606 result = Dart_GetField(type, NewString("fld2"));
4754 EXPECT_VALID(result); 4607 EXPECT_VALID(result);
4755 result = Dart_IntegerToInt64(result, &value); 4608 result = Dart_IntegerToInt64(result, &value);
4756 EXPECT_EQ(13, value); 4609 EXPECT_EQ(13, value);
4757 } 4610 }
4758 4611
4759
4760 TEST_CASE(New) { 4612 TEST_CASE(New) {
4761 const char* kScriptChars = 4613 const char* kScriptChars =
4762 "class MyClass {\n" 4614 "class MyClass {\n"
4763 " MyClass() : foo = 7 {}\n" 4615 " MyClass() : foo = 7 {}\n"
4764 " MyClass.named(value) : foo = value {}\n" 4616 " MyClass.named(value) : foo = value {}\n"
4765 " MyClass._hidden(value) : foo = -value {}\n" 4617 " MyClass._hidden(value) : foo = -value {}\n"
4766 " MyClass.exception(value) : foo = value {\n" 4618 " MyClass.exception(value) : foo = value {\n"
4767 " throw 'ConstructorDeath';\n" 4619 " throw 'ConstructorDeath';\n"
4768 " }\n" 4620 " }\n"
4769 " factory MyClass.multiply(value) {\n" 4621 " factory MyClass.multiply(value) {\n"
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
4981 result = Dart_New(intf, Dart_Null(), 0, NULL); 4833 result = Dart_New(intf, Dart_Null(), 0, NULL);
4982 EXPECT_ERROR(result, "Dart_New: could not find constructor 'MyInterface.'."); 4834 EXPECT_ERROR(result, "Dart_New: could not find constructor 'MyInterface.'.");
4983 4835
4984 // Invoke abstract constructor that is present in the interface. 4836 // Invoke abstract constructor that is present in the interface.
4985 result = Dart_New(intf, NewString("notfound"), 1, args); 4837 result = Dart_New(intf, NewString("notfound"), 1, args);
4986 EXPECT_VALID(result); 4838 EXPECT_VALID(result);
4987 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf)); 4839 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
4988 EXPECT(!instanceOf); 4840 EXPECT(!instanceOf);
4989 } 4841 }
4990 4842
4991
4992 TEST_CASE(New_Issue2971) { 4843 TEST_CASE(New_Issue2971) {
4993 // Issue 2971: We were unable to use Dart_New to construct an 4844 // Issue 2971: We were unable to use Dart_New to construct an
4994 // instance of List, due to problems implementing interface 4845 // instance of List, due to problems implementing interface
4995 // factories. 4846 // factories.
4996 Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core")); 4847 Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core"));
4997 EXPECT_VALID(core_lib); 4848 EXPECT_VALID(core_lib);
4998 Dart_Handle list_type = Dart_GetType(core_lib, NewString("List"), 0, NULL); 4849 Dart_Handle list_type = Dart_GetType(core_lib, NewString("List"), 0, NULL);
4999 EXPECT_VALID(list_type); 4850 EXPECT_VALID(list_type);
5000 4851
5001 const int kNumArgs = 1; 4852 const int kNumArgs = 1;
5002 Dart_Handle args[kNumArgs]; 4853 Dart_Handle args[kNumArgs];
5003 args[0] = Dart_NewInteger(1); 4854 args[0] = Dart_NewInteger(1);
5004 Dart_Handle list_obj = Dart_New(list_type, Dart_Null(), kNumArgs, args); 4855 Dart_Handle list_obj = Dart_New(list_type, Dart_Null(), kNumArgs, args);
5005 EXPECT_VALID(list_obj); 4856 EXPECT_VALID(list_obj);
5006 EXPECT(Dart_IsList(list_obj)); 4857 EXPECT(Dart_IsList(list_obj));
5007 } 4858 }
5008 4859
5009
5010 static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) { 4860 static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) {
5011 EXPECT(Dart_IsLibrary(lib)); 4861 EXPECT(Dart_IsLibrary(lib));
5012 Thread* thread = Thread::Current(); 4862 Thread* thread = Thread::Current();
5013 const Library& library_obj = Api::UnwrapLibraryHandle(thread->zone(), lib); 4863 const Library& library_obj = Api::UnwrapLibraryHandle(thread->zone(), lib);
5014 const String& name = String::Handle(String::New(str)); 4864 const String& name = String::Handle(String::New(str));
5015 return Api::NewHandle(thread, library_obj.PrivateName(name)); 4865 return Api::NewHandle(thread, library_obj.PrivateName(name));
5016 } 4866 }
5017 4867
5018
5019 TEST_CASE(Invoke) { 4868 TEST_CASE(Invoke) {
5020 const char* kScriptChars = 4869 const char* kScriptChars =
5021 "class BaseMethods {\n" 4870 "class BaseMethods {\n"
5022 " inheritedMethod(arg) => 'inherited $arg';\n" 4871 " inheritedMethod(arg) => 'inherited $arg';\n"
5023 " static nonInheritedMethod(arg) => 'noninherited $arg';\n" 4872 " static nonInheritedMethod(arg) => 'noninherited $arg';\n"
5024 "}\n" 4873 "}\n"
5025 "\n" 4874 "\n"
5026 "class Methods extends BaseMethods {\n" 4875 "class Methods extends BaseMethods {\n"
5027 " instanceMethod(arg) => 'instance $arg';\n" 4876 " instanceMethod(arg) => 'instance $arg';\n"
5028 " _instanceMethod(arg) => 'hidden instance $arg';\n" 4877 " _instanceMethod(arg) => 'hidden instance $arg';\n"
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
5128 // Hidden top-level method. 4977 // Hidden top-level method.
5129 name = NewString("_topMethod"); 4978 name = NewString("_topMethod");
5130 EXPECT(Dart_IsError(Dart_Invoke(type, name, 1, args))); 4979 EXPECT(Dart_IsError(Dart_Invoke(type, name, 1, args)));
5131 EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args))); 4980 EXPECT(Dart_IsError(Dart_Invoke(instance, name, 1, args)));
5132 result = Dart_Invoke(lib, name, 1, args); 4981 result = Dart_Invoke(lib, name, 1, args);
5133 EXPECT_VALID(result); 4982 EXPECT_VALID(result);
5134 result = Dart_StringToCString(result, &str); 4983 result = Dart_StringToCString(result, &str);
5135 EXPECT_STREQ("hidden top !!!", str); 4984 EXPECT_STREQ("hidden top !!!", str);
5136 } 4985 }
5137 4986
5138
5139 TEST_CASE(Invoke_PrivateStatic) { 4987 TEST_CASE(Invoke_PrivateStatic) {
5140 const char* kScriptChars = 4988 const char* kScriptChars =
5141 "class Methods {\n" 4989 "class Methods {\n"
5142 " static _staticMethod(arg) => 'hidden static $arg';\n" 4990 " static _staticMethod(arg) => 'hidden static $arg';\n"
5143 "}\n" 4991 "}\n"
5144 "\n"; 4992 "\n";
5145 4993
5146 // Shared setup. 4994 // Shared setup.
5147 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 4995 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
5148 Dart_Handle type = Dart_GetType(lib, NewString("Methods"), 0, NULL); 4996 Dart_Handle type = Dart_GetType(lib, NewString("Methods"), 0, NULL);
5149 Dart_Handle result; 4997 Dart_Handle result;
5150 EXPECT_VALID(type); 4998 EXPECT_VALID(type);
5151 Dart_Handle name = NewString("_staticMethod"); 4999 Dart_Handle name = NewString("_staticMethod");
5152 EXPECT_VALID(name); 5000 EXPECT_VALID(name);
5153 5001
5154 Dart_Handle args[1]; 5002 Dart_Handle args[1];
5155 args[0] = NewString("!!!"); 5003 args[0] = NewString("!!!");
5156 result = Dart_Invoke(type, name, 1, args); 5004 result = Dart_Invoke(type, name, 1, args);
5157 EXPECT_VALID(result); 5005 EXPECT_VALID(result);
5158 5006
5159 const char* str = NULL; 5007 const char* str = NULL;
5160 result = Dart_StringToCString(result, &str); 5008 result = Dart_StringToCString(result, &str);
5161 EXPECT_STREQ("hidden static !!!", str); 5009 EXPECT_STREQ("hidden static !!!", str);
5162 } 5010 }
5163 5011
5164
5165 TEST_CASE(Invoke_FunnyArgs) { 5012 TEST_CASE(Invoke_FunnyArgs) {
5166 const char* kScriptChars = "test(arg) => 'hello $arg';\n"; 5013 const char* kScriptChars = "test(arg) => 'hello $arg';\n";
5167 5014
5168 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 5015 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
5169 Dart_Handle func_name = NewString("test"); 5016 Dart_Handle func_name = NewString("test");
5170 Dart_Handle args[1]; 5017 Dart_Handle args[1];
5171 const char* str; 5018 const char* str;
5172 5019
5173 // Make sure that valid args yield valid results. 5020 // Make sure that valid args yield valid results.
5174 args[0] = NewString("!!!"); 5021 args[0] = NewString("!!!");
(...skipping 26 matching lines...) Expand all
5201 EXPECT_STREQ("Dart_Invoke expects arguments[0] to be an Instance handle.", 5048 EXPECT_STREQ("Dart_Invoke expects arguments[0] to be an Instance handle.",
5202 Dart_GetError(result)); 5049 Dart_GetError(result));
5203 5050
5204 // Pass an error handle as a parameter. The error is propagated. 5051 // Pass an error handle as a parameter. The error is propagated.
5205 args[0] = Api::NewError("myerror"); 5052 args[0] = Api::NewError("myerror");
5206 result = Dart_Invoke(lib, func_name, 1, args); 5053 result = Dart_Invoke(lib, func_name, 1, args);
5207 EXPECT(Dart_IsError(result)); 5054 EXPECT(Dart_IsError(result));
5208 EXPECT_STREQ("myerror", Dart_GetError(result)); 5055 EXPECT_STREQ("myerror", Dart_GetError(result));
5209 } 5056 }
5210 5057
5211
5212 TEST_CASE(Invoke_Null) { 5058 TEST_CASE(Invoke_Null) {
5213 Dart_Handle result = Dart_Invoke(Dart_Null(), NewString("toString"), 0, NULL); 5059 Dart_Handle result = Dart_Invoke(Dart_Null(), NewString("toString"), 0, NULL);
5214 EXPECT_VALID(result); 5060 EXPECT_VALID(result);
5215 EXPECT(Dart_IsString(result)); 5061 EXPECT(Dart_IsString(result));
5216 5062
5217 const char* value = ""; 5063 const char* value = "";
5218 EXPECT_VALID(Dart_StringToCString(result, &value)); 5064 EXPECT_VALID(Dart_StringToCString(result, &value));
5219 EXPECT_STREQ("null", value); 5065 EXPECT_STREQ("null", value);
5220 5066
5221 Dart_Handle function_name = NewString("NoNoNo"); 5067 Dart_Handle function_name = NewString("NoNoNo");
5222 result = Dart_Invoke(Dart_Null(), function_name, 0, NULL); 5068 result = Dart_Invoke(Dart_Null(), function_name, 0, NULL);
5223 EXPECT(Dart_IsError(result)); 5069 EXPECT(Dart_IsError(result));
5224 EXPECT(Dart_ErrorHasException(result)); 5070 EXPECT(Dart_ErrorHasException(result));
5225 } 5071 }
5226 5072
5227
5228 TEST_CASE(InvokeNoSuchMethod) { 5073 TEST_CASE(InvokeNoSuchMethod) {
5229 const char* kScriptChars = 5074 const char* kScriptChars =
5230 "import 'dart:_internal' as _internal;\n" 5075 "import 'dart:_internal' as _internal;\n"
5231 "class Expect {\n" 5076 "class Expect {\n"
5232 " static equals(a, b) {\n" 5077 " static equals(a, b) {\n"
5233 " if (a != b) {\n" 5078 " if (a != b) {\n"
5234 " throw 'not equal. expected: $a, got: $b';\n" 5079 " throw 'not equal. expected: $a, got: $b';\n"
5235 " }\n" 5080 " }\n"
5236 " }\n" 5081 " }\n"
5237 "}\n" 5082 "}\n"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
5282 result = Dart_Invoke(instance, NewString("method"), 0, NULL); 5127 result = Dart_Invoke(instance, NewString("method"), 0, NULL);
5283 EXPECT_VALID(result); 5128 EXPECT_VALID(result);
5284 5129
5285 result = Dart_GetField(type, NewString("fld1")); 5130 result = Dart_GetField(type, NewString("fld1"));
5286 EXPECT_VALID(result); 5131 EXPECT_VALID(result);
5287 int64_t value = 0; 5132 int64_t value = 0;
5288 result = Dart_IntegerToInt64(result, &value); 5133 result = Dart_IntegerToInt64(result, &value);
5289 EXPECT_EQ(3, value); 5134 EXPECT_EQ(3, value);
5290 } 5135 }
5291 5136
5292
5293 TEST_CASE(Invoke_CrossLibrary) { 5137 TEST_CASE(Invoke_CrossLibrary) {
5294 const char* kLibrary1Chars = 5138 const char* kLibrary1Chars =
5295 "library library1_name;\n" 5139 "library library1_name;\n"
5296 "void local() {}\n" 5140 "void local() {}\n"
5297 "void _local() {}\n"; 5141 "void _local() {}\n";
5298 const char* kLibrary2Chars = 5142 const char* kLibrary2Chars =
5299 "library library2_name;\n" 5143 "library library2_name;\n"
5300 "void imported() {}\n" 5144 "void imported() {}\n"
5301 "void _imported() {}\n"; 5145 "void _imported() {}\n";
5302 5146
(...skipping 18 matching lines...) Expand all
5321 // We can invoke both private and non-private local functions. 5165 // We can invoke both private and non-private local functions.
5322 EXPECT_VALID(Dart_Invoke(lib1, NewString("local"), 0, NULL)); 5166 EXPECT_VALID(Dart_Invoke(lib1, NewString("local"), 0, NULL));
5323 EXPECT_VALID(Dart_Invoke(lib1, NewString("_local"), 0, NULL)); 5167 EXPECT_VALID(Dart_Invoke(lib1, NewString("_local"), 0, NULL));
5324 5168
5325 // We can only invoke non-private imported functions. 5169 // We can only invoke non-private imported functions.
5326 EXPECT_VALID(Dart_Invoke(lib1, NewString("imported"), 0, NULL)); 5170 EXPECT_VALID(Dart_Invoke(lib1, NewString("imported"), 0, NULL));
5327 EXPECT_ERROR(Dart_Invoke(lib1, NewString("_imported"), 0, NULL), 5171 EXPECT_ERROR(Dart_Invoke(lib1, NewString("_imported"), 0, NULL),
5328 "did not find top-level function '_imported'"); 5172 "did not find top-level function '_imported'");
5329 } 5173 }
5330 5174
5331
5332 TEST_CASE(InvokeClosure) { 5175 TEST_CASE(InvokeClosure) {
5333 const char* kScriptChars = 5176 const char* kScriptChars =
5334 "class InvokeClosure {\n" 5177 "class InvokeClosure {\n"
5335 " InvokeClosure(int i, int j) : fld1 = i, fld2 = j {}\n" 5178 " InvokeClosure(int i, int j) : fld1 = i, fld2 = j {}\n"
5336 " Function method1(int i) {\n" 5179 " Function method1(int i) {\n"
5337 " f(int j) => j + i + fld1 + fld2 + fld4; \n" 5180 " f(int j) => j + i + fld1 + fld2 + fld4; \n"
5338 " return f;\n" 5181 " return f;\n"
5339 " }\n" 5182 " }\n"
5340 " static Function method2(int i) {\n" 5183 " static Function method2(int i) {\n"
5341 " n(int j) => true + i + fld4; \n" 5184 " n(int j) => true + i + fld4; \n"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5388 EXPECT(Dart_IsClosure(retobj)); 5231 EXPECT(Dart_IsClosure(retobj));
5389 EXPECT(!Dart_IsClosure(NewString("abcdef"))); 5232 EXPECT(!Dart_IsClosure(NewString("abcdef")));
5390 5233
5391 // Now invoke the closure and check the result (should be an exception). 5234 // Now invoke the closure and check the result (should be an exception).
5392 dart_arguments[0] = Dart_NewInteger(1); 5235 dart_arguments[0] = Dart_NewInteger(1);
5393 result = Dart_InvokeClosure(retobj, 1, dart_arguments); 5236 result = Dart_InvokeClosure(retobj, 1, dart_arguments);
5394 EXPECT(Dart_IsError(result)); 5237 EXPECT(Dart_IsError(result));
5395 EXPECT(Dart_ErrorHasException(result)); 5238 EXPECT(Dart_ErrorHasException(result));
5396 } 5239 }
5397 5240
5398
5399 void ExceptionNative(Dart_NativeArguments args) { 5241 void ExceptionNative(Dart_NativeArguments args) {
5400 Dart_EnterScope(); 5242 Dart_EnterScope();
5401 Dart_ThrowException(NewString("Hello from ExceptionNative!")); 5243 Dart_ThrowException(NewString("Hello from ExceptionNative!"));
5402 UNREACHABLE(); 5244 UNREACHABLE();
5403 } 5245 }
5404 5246
5405
5406 static Dart_NativeFunction native_lookup(Dart_Handle name, 5247 static Dart_NativeFunction native_lookup(Dart_Handle name,
5407 int argument_count, 5248 int argument_count,
5408 bool* auto_setup_scope) { 5249 bool* auto_setup_scope) {
5409 ASSERT(auto_setup_scope != NULL); 5250 ASSERT(auto_setup_scope != NULL);
5410 *auto_setup_scope = true; 5251 *auto_setup_scope = true;
5411 return reinterpret_cast<Dart_NativeFunction>(&ExceptionNative); 5252 return reinterpret_cast<Dart_NativeFunction>(&ExceptionNative);
5412 } 5253 }
5413 5254
5414
5415 TEST_CASE(ThrowException) { 5255 TEST_CASE(ThrowException) {
5416 const char* kScriptChars = "int test() native \"ThrowException_native\";"; 5256 const char* kScriptChars = "int test() native \"ThrowException_native\";";
5417 Dart_Handle result; 5257 Dart_Handle result;
5418 intptr_t size = thread->ZoneSizeInBytes(); 5258 intptr_t size = thread->ZoneSizeInBytes();
5419 Dart_EnterScope(); // Start a Dart API scope for invoking API functions. 5259 Dart_EnterScope(); // Start a Dart API scope for invoking API functions.
5420 5260
5421 // Load up a test script which extends the native wrapper class. 5261 // Load up a test script which extends the native wrapper class.
5422 Dart_Handle lib = TestCase::LoadTestScript( 5262 Dart_Handle lib = TestCase::LoadTestScript(
5423 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup)); 5263 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
5424 5264
5425 // Throwing an exception here should result in an error. 5265 // Throwing an exception here should result in an error.
5426 result = Dart_ThrowException(NewString("This doesn't work")); 5266 result = Dart_ThrowException(NewString("This doesn't work"));
5427 EXPECT_ERROR(result, "No Dart frames on stack, cannot throw exception"); 5267 EXPECT_ERROR(result, "No Dart frames on stack, cannot throw exception");
5428 EXPECT(!Dart_ErrorHasException(result)); 5268 EXPECT(!Dart_ErrorHasException(result));
5429 5269
5430 // Invoke 'test' and check for an uncaught exception. 5270 // Invoke 'test' and check for an uncaught exception.
5431 result = Dart_Invoke(lib, NewString("test"), 0, NULL); 5271 result = Dart_Invoke(lib, NewString("test"), 0, NULL);
5432 EXPECT_ERROR(result, "Hello from ExceptionNative!"); 5272 EXPECT_ERROR(result, "Hello from ExceptionNative!");
5433 EXPECT(Dart_ErrorHasException(result)); 5273 EXPECT(Dart_ErrorHasException(result));
5434 5274
5435 Dart_ExitScope(); // Exit the Dart API scope. 5275 Dart_ExitScope(); // Exit the Dart API scope.
5436 EXPECT_EQ(size, thread->ZoneSizeInBytes()); 5276 EXPECT_EQ(size, thread->ZoneSizeInBytes());
5437 } 5277 }
5438 5278
5439
5440 static intptr_t kNativeArgumentNativeField1Value = 30; 5279 static intptr_t kNativeArgumentNativeField1Value = 30;
5441 static intptr_t kNativeArgumentNativeField2Value = 40; 5280 static intptr_t kNativeArgumentNativeField2Value = 40;
5442 static intptr_t native_arg_str_peer = 100; 5281 static intptr_t native_arg_str_peer = 100;
5443 static void NativeArgumentCreate(Dart_NativeArguments args) { 5282 static void NativeArgumentCreate(Dart_NativeArguments args) {
5444 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url())); 5283 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
5445 Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL); 5284 Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL);
5446 EXPECT_VALID(type); 5285 EXPECT_VALID(type);
5447 5286
5448 // Allocate without a constructor. 5287 // Allocate without a constructor.
5449 const int num_native_fields = 2; 5288 const int num_native_fields = 2;
5450 const intptr_t native_fields[] = {kNativeArgumentNativeField1Value, 5289 const intptr_t native_fields[] = {kNativeArgumentNativeField1Value,
5451 kNativeArgumentNativeField2Value}; 5290 kNativeArgumentNativeField2Value};
5452 // Allocate and Setup native fields. 5291 // Allocate and Setup native fields.
5453 Dart_Handle obj = 5292 Dart_Handle obj =
5454 Dart_AllocateWithNativeFields(type, num_native_fields, native_fields); 5293 Dart_AllocateWithNativeFields(type, num_native_fields, native_fields);
5455 EXPECT_VALID(obj); 5294 EXPECT_VALID(obj);
5456 5295
5457 kNativeArgumentNativeField1Value *= 2; 5296 kNativeArgumentNativeField1Value *= 2;
5458 kNativeArgumentNativeField2Value *= 2; 5297 kNativeArgumentNativeField2Value *= 2;
5459 Dart_SetReturnValue(args, obj); 5298 Dart_SetReturnValue(args, obj);
5460 } 5299 }
5461 5300
5462
5463 static void NativeArgumentAccess(Dart_NativeArguments args) { 5301 static void NativeArgumentAccess(Dart_NativeArguments args) {
5464 const int kNumNativeFields = 2; 5302 const int kNumNativeFields = 2;
5465 5303
5466 // Test different argument types with a valid descriptor set. 5304 // Test different argument types with a valid descriptor set.
5467 { 5305 {
5468 const char* cstr = NULL; 5306 const char* cstr = NULL;
5469 intptr_t native_fields1[kNumNativeFields]; 5307 intptr_t native_fields1[kNumNativeFields];
5470 intptr_t native_fields2[kNumNativeFields]; 5308 intptr_t native_fields2[kNumNativeFields];
5471 const Dart_NativeArgument_Descriptor arg_descriptors[9] = { 5309 const Dart_NativeArgument_Descriptor arg_descriptors[9] = {
5472 {Dart_NativeArgument_kNativeFields, 0}, 5310 {Dart_NativeArgument_kNativeFields, 0},
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
5552 }; 5390 };
5553 Dart_NativeArgument_Value arg_values[8]; 5391 Dart_NativeArgument_Value arg_values[8];
5554 Dart_Handle result = 5392 Dart_Handle result =
5555 Dart_GetNativeArguments(args, 8, arg_descriptors, arg_values); 5393 Dart_GetNativeArguments(args, 8, arg_descriptors, arg_values);
5556 EXPECT(Dart_IsError(result)); 5394 EXPECT(Dart_IsError(result));
5557 } 5395 }
5558 5396
5559 Dart_SetIntegerReturnValue(args, 0); 5397 Dart_SetIntegerReturnValue(args, 0);
5560 } 5398 }
5561 5399
5562
5563 static Dart_NativeFunction native_args_lookup(Dart_Handle name, 5400 static Dart_NativeFunction native_args_lookup(Dart_Handle name,
5564 int argument_count, 5401 int argument_count,
5565 bool* auto_scope_setup) { 5402 bool* auto_scope_setup) {
5566 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); 5403 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
5567 if (!obj.IsString()) { 5404 if (!obj.IsString()) {
5568 return NULL; 5405 return NULL;
5569 } 5406 }
5570 ASSERT(auto_scope_setup != NULL); 5407 ASSERT(auto_scope_setup != NULL);
5571 *auto_scope_setup = true; 5408 *auto_scope_setup = true;
5572 const char* function_name = obj.ToCString(); 5409 const char* function_name = obj.ToCString();
5573 ASSERT(function_name != NULL); 5410 ASSERT(function_name != NULL);
5574 if (!strcmp(function_name, "NativeArgument_Create")) { 5411 if (!strcmp(function_name, "NativeArgument_Create")) {
5575 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentCreate); 5412 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentCreate);
5576 } else if (!strcmp(function_name, "NativeArgument_Access")) { 5413 } else if (!strcmp(function_name, "NativeArgument_Access")) {
5577 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentAccess); 5414 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentAccess);
5578 } 5415 }
5579 return NULL; 5416 return NULL;
5580 } 5417 }
5581 5418
5582
5583 TEST_CASE(GetNativeArguments) { 5419 TEST_CASE(GetNativeArguments) {
5584 const bool saved_flag = FLAG_support_externalizable_strings; 5420 const bool saved_flag = FLAG_support_externalizable_strings;
5585 FLAG_support_externalizable_strings = true; 5421 FLAG_support_externalizable_strings = true;
5586 5422
5587 const char* kScriptChars = 5423 const char* kScriptChars =
5588 "import 'dart:nativewrappers';" 5424 "import 'dart:nativewrappers';"
5589 "class MyObject extends NativeFieldWrapperClass2 {" 5425 "class MyObject extends NativeFieldWrapperClass2 {"
5590 " static MyObject createObject() native 'NativeArgument_Create';" 5426 " static MyObject createObject() native 'NativeArgument_Create';"
5591 " int accessFields(int arg1," 5427 " int accessFields(int arg1,"
5592 " int arg2," 5428 " int arg2,"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5624 5460
5625 Dart_Handle args[1]; 5461 Dart_Handle args[1];
5626 args[0] = extstr; 5462 args[0] = extstr;
5627 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args); 5463 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args);
5628 EXPECT_VALID(result); 5464 EXPECT_VALID(result);
5629 EXPECT(Dart_IsInteger(result)); 5465 EXPECT(Dart_IsInteger(result));
5630 5466
5631 FLAG_support_externalizable_strings = saved_flag; 5467 FLAG_support_externalizable_strings = saved_flag;
5632 } 5468 }
5633 5469
5634
5635 static void NativeArgumentCounter(Dart_NativeArguments args) { 5470 static void NativeArgumentCounter(Dart_NativeArguments args) {
5636 Dart_EnterScope(); 5471 Dart_EnterScope();
5637 int count = Dart_GetNativeArgumentCount(args); 5472 int count = Dart_GetNativeArgumentCount(args);
5638 Dart_SetReturnValue(args, Dart_NewInteger(count)); 5473 Dart_SetReturnValue(args, Dart_NewInteger(count));
5639 Dart_ExitScope(); 5474 Dart_ExitScope();
5640 } 5475 }
5641 5476
5642
5643 static Dart_NativeFunction gnac_lookup(Dart_Handle name, 5477 static Dart_NativeFunction gnac_lookup(Dart_Handle name,
5644 int argument_count, 5478 int argument_count,
5645 bool* auto_setup_scope) { 5479 bool* auto_setup_scope) {
5646 ASSERT(auto_setup_scope != NULL); 5480 ASSERT(auto_setup_scope != NULL);
5647 *auto_setup_scope = true; 5481 *auto_setup_scope = true;
5648 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentCounter); 5482 return reinterpret_cast<Dart_NativeFunction>(&NativeArgumentCounter);
5649 } 5483 }
5650 5484
5651
5652 TEST_CASE(GetNativeArgumentCount) { 5485 TEST_CASE(GetNativeArgumentCount) {
5653 const char* kScriptChars = 5486 const char* kScriptChars =
5654 "class MyObject {" 5487 "class MyObject {"
5655 " int method1(int i, int j) native 'Name_Does_Not_Matter';" 5488 " int method1(int i, int j) native 'Name_Does_Not_Matter';"
5656 "}" 5489 "}"
5657 "testMain() {" 5490 "testMain() {"
5658 " MyObject obj = new MyObject();" 5491 " MyObject obj = new MyObject();"
5659 " return obj.method1(77, 125);" 5492 " return obj.method1(77, 125);"
5660 "}"; 5493 "}";
5661 5494
5662 Dart_Handle lib = TestCase::LoadTestScript( 5495 Dart_Handle lib = TestCase::LoadTestScript(
5663 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(gnac_lookup)); 5496 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(gnac_lookup));
5664 5497
5665 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 5498 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
5666 EXPECT_VALID(result); 5499 EXPECT_VALID(result);
5667 EXPECT(Dart_IsInteger(result)); 5500 EXPECT(Dart_IsInteger(result));
5668 5501
5669 int64_t value = 0; 5502 int64_t value = 0;
5670 result = Dart_IntegerToInt64(result, &value); 5503 result = Dart_IntegerToInt64(result, &value);
5671 EXPECT_VALID(result); 5504 EXPECT_VALID(result);
5672 EXPECT_EQ(3, value); 5505 EXPECT_EQ(3, value);
5673 } 5506 }
5674 5507
5675
5676 TEST_CASE(GetType) { 5508 TEST_CASE(GetType) {
5677 const char* kScriptChars = 5509 const char* kScriptChars =
5678 "library testlib;\n" 5510 "library testlib;\n"
5679 "class Class {\n" 5511 "class Class {\n"
5680 " static var name = 'Class';\n" 5512 " static var name = 'Class';\n"
5681 "}\n" 5513 "}\n"
5682 "\n" 5514 "\n"
5683 "class _Class {\n" 5515 "class _Class {\n"
5684 " static var name = '_Class';\n" 5516 " static var name = '_Class';\n"
5685 "}\n"; 5517 "}\n";
(...skipping 28 matching lines...) Expand all
5714 type = Dart_GetType(Api::NewError("myerror"), NewString("Class"), 0, NULL); 5546 type = Dart_GetType(Api::NewError("myerror"), NewString("Class"), 0, NULL);
5715 EXPECT(Dart_IsError(type)); 5547 EXPECT(Dart_IsError(type));
5716 EXPECT_STREQ("myerror", Dart_GetError(type)); 5548 EXPECT_STREQ("myerror", Dart_GetError(type));
5717 5549
5718 // Lookup a type using an error class name. The error propagates. 5550 // Lookup a type using an error class name. The error propagates.
5719 type = Dart_GetType(lib, Api::NewError("myerror"), 0, NULL); 5551 type = Dart_GetType(lib, Api::NewError("myerror"), 0, NULL);
5720 EXPECT(Dart_IsError(type)); 5552 EXPECT(Dart_IsError(type));
5721 EXPECT_STREQ("myerror", Dart_GetError(type)); 5553 EXPECT_STREQ("myerror", Dart_GetError(type));
5722 } 5554 }
5723 5555
5724
5725 TEST_CASE(InstanceOf) { 5556 TEST_CASE(InstanceOf) {
5726 const char* kScriptChars = 5557 const char* kScriptChars =
5727 "class OtherClass {\n" 5558 "class OtherClass {\n"
5728 " static returnNull() { return null; }\n" 5559 " static returnNull() { return null; }\n"
5729 "}\n" 5560 "}\n"
5730 "class InstanceOfTest {\n" 5561 "class InstanceOfTest {\n"
5731 " InstanceOfTest() {}\n" 5562 " InstanceOfTest() {}\n"
5732 " static InstanceOfTest testMain() {\n" 5563 " static InstanceOfTest testMain() {\n"
5733 " return new InstanceOfTest();\n" 5564 " return new InstanceOfTest();\n"
5734 " }\n" 5565 " }\n"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
5780 5611
5781 result = Dart_ObjectIsType(null, otherType, &is_instance); 5612 result = Dart_ObjectIsType(null, otherType, &is_instance);
5782 EXPECT_VALID(result); 5613 EXPECT_VALID(result);
5783 EXPECT(!is_instance); 5614 EXPECT(!is_instance);
5784 5615
5785 // Check that error is returned if null is passed as a class argument. 5616 // Check that error is returned if null is passed as a class argument.
5786 result = Dart_ObjectIsType(null, null, &is_instance); 5617 result = Dart_ObjectIsType(null, null, &is_instance);
5787 EXPECT(Dart_IsError(result)); 5618 EXPECT(Dart_IsError(result));
5788 } 5619 }
5789 5620
5790
5791 static Dart_Handle library_handler(Dart_LibraryTag tag, 5621 static Dart_Handle library_handler(Dart_LibraryTag tag,
5792 Dart_Handle library, 5622 Dart_Handle library,
5793 Dart_Handle url) { 5623 Dart_Handle url) {
5794 if (tag == Dart_kCanonicalizeUrl) { 5624 if (tag == Dart_kCanonicalizeUrl) {
5795 return url; 5625 return url;
5796 } 5626 }
5797 return Api::Success(); 5627 return Api::Success();
5798 } 5628 }
5799 5629
5800
5801 TEST_CASE(LoadScript) { 5630 TEST_CASE(LoadScript) {
5802 const char* kScriptChars = 5631 const char* kScriptChars =
5803 "main() {" 5632 "main() {"
5804 " return 12345;" 5633 " return 12345;"
5805 "}"; 5634 "}";
5806 Dart_Handle url = NewString(TestCase::url()); 5635 Dart_Handle url = NewString(TestCase::url());
5807 Dart_Handle source = NewString(kScriptChars); 5636 Dart_Handle source = NewString(kScriptChars);
5808 Dart_Handle error = Dart_NewApiError("incoming error"); 5637 Dart_Handle error = Dart_NewApiError("incoming error");
5809 Dart_Handle result; 5638 Dart_Handle result;
5810 5639
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
5864 5693
5865 // Further calls to LoadScript are errors. 5694 // Further calls to LoadScript are errors.
5866 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0); 5695 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
5867 EXPECT(Dart_IsError(result)); 5696 EXPECT(Dart_IsError(result));
5868 EXPECT_STREQ( 5697 EXPECT_STREQ(
5869 "Dart_LoadScript: " 5698 "Dart_LoadScript: "
5870 "A script has already been loaded from 'test-lib'.", 5699 "A script has already been loaded from 'test-lib'.",
5871 Dart_GetError(result)); 5700 Dart_GetError(result));
5872 } 5701 }
5873 5702
5874
5875 TEST_CASE(RootLibrary) { 5703 TEST_CASE(RootLibrary) {
5876 const char* kScriptChars = 5704 const char* kScriptChars =
5877 "library testlib;" 5705 "library testlib;"
5878 "main() {" 5706 "main() {"
5879 " return 12345;" 5707 " return 12345;"
5880 "}"; 5708 "}";
5881 5709
5882 Dart_Handle root_lib = Dart_RootLibrary(); 5710 Dart_Handle root_lib = Dart_RootLibrary();
5883 EXPECT_VALID(root_lib); 5711 EXPECT_VALID(root_lib);
5884 EXPECT(Dart_IsNull(root_lib)); 5712 EXPECT(Dart_IsNull(root_lib));
(...skipping 11 matching lines...) Expand all
5896 EXPECT_VALID(Dart_StringToCString(lib_name, &name_cstr)); 5724 EXPECT_VALID(Dart_StringToCString(lib_name, &name_cstr));
5897 EXPECT_STREQ("testlib", name_cstr); 5725 EXPECT_STREQ("testlib", name_cstr);
5898 5726
5899 Dart_Handle lib_uri = Dart_LibraryUrl(root_lib); 5727 Dart_Handle lib_uri = Dart_LibraryUrl(root_lib);
5900 EXPECT_VALID(lib_uri); 5728 EXPECT_VALID(lib_uri);
5901 EXPECT(!Dart_IsNull(lib_uri)); 5729 EXPECT(!Dart_IsNull(lib_uri));
5902 const char* uri_cstr = ""; 5730 const char* uri_cstr = "";
5903 EXPECT_VALID(Dart_StringToCString(lib_uri, &uri_cstr)); 5731 EXPECT_VALID(Dart_StringToCString(lib_uri, &uri_cstr));
5904 EXPECT_STREQ(TestCase::url(), uri_cstr); 5732 EXPECT_STREQ(TestCase::url(), uri_cstr);
5905 5733
5906
5907 Dart_Handle core_uri = Dart_NewStringFromCString("dart:core"); 5734 Dart_Handle core_uri = Dart_NewStringFromCString("dart:core");
5908 Dart_Handle core_lib = Dart_LookupLibrary(core_uri); 5735 Dart_Handle core_lib = Dart_LookupLibrary(core_uri);
5909 EXPECT_VALID(core_lib); 5736 EXPECT_VALID(core_lib);
5910 EXPECT(Dart_IsLibrary(core_lib)); 5737 EXPECT(Dart_IsLibrary(core_lib));
5911 5738
5912 Dart_Handle result = Dart_SetRootLibrary(core_uri); // Not a library. 5739 Dart_Handle result = Dart_SetRootLibrary(core_uri); // Not a library.
5913 EXPECT(Dart_IsError(result)); 5740 EXPECT(Dart_IsError(result));
5914 root_lib = Dart_RootLibrary(); 5741 root_lib = Dart_RootLibrary();
5915 lib_uri = Dart_LibraryUrl(root_lib); 5742 lib_uri = Dart_LibraryUrl(root_lib);
5916 EXPECT_VALID(Dart_StringToCString(lib_uri, &uri_cstr)); 5743 EXPECT_VALID(Dart_StringToCString(lib_uri, &uri_cstr));
5917 EXPECT_STREQ(TestCase::url(), uri_cstr); // Root library didn't change. 5744 EXPECT_STREQ(TestCase::url(), uri_cstr); // Root library didn't change.
5918 5745
5919 result = Dart_SetRootLibrary(core_lib); 5746 result = Dart_SetRootLibrary(core_lib);
5920 EXPECT_VALID(result); 5747 EXPECT_VALID(result);
5921 root_lib = Dart_RootLibrary(); 5748 root_lib = Dart_RootLibrary();
5922 lib_uri = Dart_LibraryUrl(root_lib); 5749 lib_uri = Dart_LibraryUrl(root_lib);
5923 EXPECT_VALID(Dart_StringToCString(lib_uri, &uri_cstr)); 5750 EXPECT_VALID(Dart_StringToCString(lib_uri, &uri_cstr));
5924 EXPECT_STREQ("dart:core", uri_cstr); // Root library did change. 5751 EXPECT_STREQ("dart:core", uri_cstr); // Root library did change.
5925 5752
5926 result = Dart_SetRootLibrary(Dart_Null()); 5753 result = Dart_SetRootLibrary(Dart_Null());
5927 EXPECT_VALID(result); 5754 EXPECT_VALID(result);
5928 root_lib = Dart_RootLibrary(); 5755 root_lib = Dart_RootLibrary();
5929 EXPECT(Dart_IsNull(root_lib)); // Root library did change. 5756 EXPECT(Dart_IsNull(root_lib)); // Root library did change.
5930 } 5757 }
5931 5758
5932
5933 static int index = 0; 5759 static int index = 0;
5934 5760
5935
5936 static Dart_Handle import_library_handler(Dart_LibraryTag tag, 5761 static Dart_Handle import_library_handler(Dart_LibraryTag tag,
5937 Dart_Handle library, 5762 Dart_Handle library,
5938 Dart_Handle url) { 5763 Dart_Handle url) {
5939 if (tag == Dart_kCanonicalizeUrl) { 5764 if (tag == Dart_kCanonicalizeUrl) {
5940 return url; 5765 return url;
5941 } 5766 }
5942 EXPECT(Dart_IsString(url)); 5767 EXPECT(Dart_IsString(url));
5943 const char* cstr = NULL; 5768 const char* cstr = NULL;
5944 EXPECT_VALID(Dart_StringToCString(url, &cstr)); 5769 EXPECT_VALID(Dart_StringToCString(url, &cstr));
5945 switch (index) { 5770 switch (index) {
(...skipping 13 matching lines...) Expand all
5959 EXPECT_STREQ("winnerwinner", cstr); 5784 EXPECT_STREQ("winnerwinner", cstr);
5960 break; 5785 break;
5961 default: 5786 default:
5962 EXPECT(false); 5787 EXPECT(false);
5963 return Api::NewError("invalid callback"); 5788 return Api::NewError("invalid callback");
5964 } 5789 }
5965 index += 1; 5790 index += 1;
5966 return Api::Success(); 5791 return Api::Success();
5967 } 5792 }
5968 5793
5969
5970 TEST_CASE(LoadScript_CompileError) { 5794 TEST_CASE(LoadScript_CompileError) {
5971 const char* kScriptChars = ")"; 5795 const char* kScriptChars = ")";
5972 Dart_Handle url = NewString(TestCase::url()); 5796 Dart_Handle url = NewString(TestCase::url());
5973 Dart_Handle source = NewString(kScriptChars); 5797 Dart_Handle source = NewString(kScriptChars);
5974 Dart_Handle result = Dart_SetLibraryTagHandler(import_library_handler); 5798 Dart_Handle result = Dart_SetLibraryTagHandler(import_library_handler);
5975 EXPECT_VALID(result); 5799 EXPECT_VALID(result);
5976 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0); 5800 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
5977 EXPECT(Dart_IsError(result)); 5801 EXPECT(Dart_IsError(result));
5978 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'")); 5802 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'"));
5979 } 5803 }
5980 5804
5981
5982 TEST_CASE(LookupLibrary) { 5805 TEST_CASE(LookupLibrary) {
5983 const char* kScriptChars = 5806 const char* kScriptChars =
5984 "import 'library1_dart';" 5807 "import 'library1_dart';"
5985 "main() {}"; 5808 "main() {}";
5986 const char* kLibrary1Chars = 5809 const char* kLibrary1Chars =
5987 "library library1_dart;" 5810 "library library1_dart;"
5988 "import 'library2_dart';"; 5811 "import 'library2_dart';";
5989 5812
5990 // Create a test library and Load up a test script in it. 5813 // Create a test library and Load up a test script in it.
5991 Dart_Handle url = NewString(TestCase::url()); 5814 Dart_Handle url = NewString(TestCase::url());
(...skipping 26 matching lines...) Expand all
6018 EXPECT(Dart_IsError(result)); 5841 EXPECT(Dart_IsError(result));
6019 EXPECT_STREQ("incoming error", Dart_GetError(result)); 5842 EXPECT_STREQ("incoming error", Dart_GetError(result));
6020 5843
6021 url = NewString("noodles.dart"); 5844 url = NewString("noodles.dart");
6022 result = Dart_LookupLibrary(url); 5845 result = Dart_LookupLibrary(url);
6023 EXPECT(Dart_IsError(result)); 5846 EXPECT(Dart_IsError(result));
6024 EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.", 5847 EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.",
6025 Dart_GetError(result)); 5848 Dart_GetError(result));
6026 } 5849 }
6027 5850
6028
6029 TEST_CASE(LibraryName) { 5851 TEST_CASE(LibraryName) {
6030 const char* kLibrary1Chars = "library library1_name;"; 5852 const char* kLibrary1Chars = "library library1_name;";
6031 Dart_Handle url = NewString("library1_url"); 5853 Dart_Handle url = NewString("library1_url");
6032 Dart_Handle source = NewString(kLibrary1Chars); 5854 Dart_Handle source = NewString(kLibrary1Chars);
6033 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 5855 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6034 Dart_Handle error = Dart_NewApiError("incoming error"); 5856 Dart_Handle error = Dart_NewApiError("incoming error");
6035 EXPECT_VALID(lib); 5857 EXPECT_VALID(lib);
6036 5858
6037 Dart_Handle result = Dart_LibraryName(Dart_Null()); 5859 Dart_Handle result = Dart_LibraryName(Dart_Null());
6038 EXPECT(Dart_IsError(result)); 5860 EXPECT(Dart_IsError(result));
(...skipping 11 matching lines...) Expand all
6050 EXPECT_STREQ("incoming error", Dart_GetError(result)); 5872 EXPECT_STREQ("incoming error", Dart_GetError(result));
6051 5873
6052 result = Dart_LibraryName(lib); 5874 result = Dart_LibraryName(lib);
6053 EXPECT_VALID(result); 5875 EXPECT_VALID(result);
6054 EXPECT(Dart_IsString(result)); 5876 EXPECT(Dart_IsString(result));
6055 const char* cstr = NULL; 5877 const char* cstr = NULL;
6056 EXPECT_VALID(Dart_StringToCString(result, &cstr)); 5878 EXPECT_VALID(Dart_StringToCString(result, &cstr));
6057 EXPECT_STREQ("library1_name", cstr); 5879 EXPECT_STREQ("library1_name", cstr);
6058 } 5880 }
6059 5881
6060
6061 #ifndef PRODUCT 5882 #ifndef PRODUCT
6062 5883
6063
6064 TEST_CASE(LibraryId) { 5884 TEST_CASE(LibraryId) {
6065 const char* kLibrary1Chars = "library library1_name;"; 5885 const char* kLibrary1Chars = "library library1_name;";
6066 Dart_Handle url = NewString("library1_url"); 5886 Dart_Handle url = NewString("library1_url");
6067 Dart_Handle source = NewString(kLibrary1Chars); 5887 Dart_Handle source = NewString(kLibrary1Chars);
6068 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 5888 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6069 Dart_Handle error = Dart_NewApiError("incoming error"); 5889 Dart_Handle error = Dart_NewApiError("incoming error");
6070 EXPECT_VALID(lib); 5890 EXPECT_VALID(lib);
6071 intptr_t libraryId = -1; 5891 intptr_t libraryId = -1;
6072 5892
6073 Dart_Handle result = Dart_LibraryId(Dart_Null(), &libraryId); 5893 Dart_Handle result = Dart_LibraryId(Dart_Null(), &libraryId);
(...skipping 15 matching lines...) Expand all
6089 EXPECT_VALID(result); 5909 EXPECT_VALID(result);
6090 Dart_Handle libFromId = Dart_GetLibraryFromId(libraryId); 5910 Dart_Handle libFromId = Dart_GetLibraryFromId(libraryId);
6091 EXPECT(Dart_IsLibrary(libFromId)); 5911 EXPECT(Dart_IsLibrary(libFromId));
6092 result = Dart_LibraryName(libFromId); 5912 result = Dart_LibraryName(libFromId);
6093 EXPECT(Dart_IsString(result)); 5913 EXPECT(Dart_IsString(result));
6094 const char* cstr = NULL; 5914 const char* cstr = NULL;
6095 EXPECT_VALID(Dart_StringToCString(result, &cstr)); 5915 EXPECT_VALID(Dart_StringToCString(result, &cstr));
6096 EXPECT_STREQ("library1_name", cstr); 5916 EXPECT_STREQ("library1_name", cstr);
6097 } 5917 }
6098 5918
6099
6100 #endif // !PRODUCT 5919 #endif // !PRODUCT
6101 5920
6102
6103 TEST_CASE(LibraryUrl) { 5921 TEST_CASE(LibraryUrl) {
6104 const char* kLibrary1Chars = "library library1_name;"; 5922 const char* kLibrary1Chars = "library library1_name;";
6105 Dart_Handle url = NewString("library1_url"); 5923 Dart_Handle url = NewString("library1_url");
6106 Dart_Handle source = NewString(kLibrary1Chars); 5924 Dart_Handle source = NewString(kLibrary1Chars);
6107 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 5925 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6108 Dart_Handle error = Dart_NewApiError("incoming error"); 5926 Dart_Handle error = Dart_NewApiError("incoming error");
6109 EXPECT_VALID(lib); 5927 EXPECT_VALID(lib);
6110 5928
6111 Dart_Handle result = Dart_LibraryUrl(Dart_Null()); 5929 Dart_Handle result = Dart_LibraryUrl(Dart_Null());
6112 EXPECT(Dart_IsError(result)); 5930 EXPECT(Dart_IsError(result));
(...skipping 11 matching lines...) Expand all
6124 EXPECT_STREQ("incoming error", Dart_GetError(result)); 5942 EXPECT_STREQ("incoming error", Dart_GetError(result));
6125 5943
6126 result = Dart_LibraryUrl(lib); 5944 result = Dart_LibraryUrl(lib);
6127 EXPECT_VALID(result); 5945 EXPECT_VALID(result);
6128 EXPECT(Dart_IsString(result)); 5946 EXPECT(Dart_IsString(result));
6129 const char* cstr = NULL; 5947 const char* cstr = NULL;
6130 EXPECT_VALID(Dart_StringToCString(result, &cstr)); 5948 EXPECT_VALID(Dart_StringToCString(result, &cstr));
6131 EXPECT_STREQ("library1_url", cstr); 5949 EXPECT_STREQ("library1_url", cstr);
6132 } 5950 }
6133 5951
6134
6135 TEST_CASE(LibraryGetClassNames) { 5952 TEST_CASE(LibraryGetClassNames) {
6136 const char* kLibraryChars = 5953 const char* kLibraryChars =
6137 "library library_name;\n" 5954 "library library_name;\n"
6138 "\n" 5955 "\n"
6139 "class A {}\n" 5956 "class A {}\n"
6140 "class B {}\n" 5957 "class B {}\n"
6141 "abstract class C {}\n" 5958 "abstract class C {}\n"
6142 "class _A {}\n" 5959 "class _A {}\n"
6143 "class _B {}\n" 5960 "class _B {}\n"
6144 "abstract class _C {}\n" 5961 "abstract class _C {}\n"
(...skipping 18 matching lines...) Expand all
6163 args[0] = list; 5980 args[0] = list;
6164 EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args)); 5981 EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
6165 5982
6166 Dart_Handle list_string = Dart_ToString(list); 5983 Dart_Handle list_string = Dart_ToString(list);
6167 EXPECT_VALID(list_string); 5984 EXPECT_VALID(list_string);
6168 const char* list_cstr = ""; 5985 const char* list_cstr = "";
6169 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); 5986 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
6170 EXPECT_STREQ("[A, B, C, _A, _B, _C]", list_cstr); 5987 EXPECT_STREQ("[A, B, C, _A, _B, _C]", list_cstr);
6171 } 5988 }
6172 5989
6173
6174 TEST_CASE(GetFunctionNames) { 5990 TEST_CASE(GetFunctionNames) {
6175 const char* kLibraryChars = 5991 const char* kLibraryChars =
6176 "library library_name;\n" 5992 "library library_name;\n"
6177 "\n" 5993 "\n"
6178 "void A() {}\n" 5994 "void A() {}\n"
6179 "get B => 11;\n" 5995 "get B => 11;\n"
6180 "set C(x) { }\n" 5996 "set C(x) { }\n"
6181 "var D;\n" 5997 "var D;\n"
6182 "void _A() {}\n" 5998 "void _A() {}\n"
6183 "get _B => 11;\n" 5999 "get _B => 11;\n"
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
6235 EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args)); 6051 EXPECT_VALID(Dart_Invoke(lib, NewString("sort"), kNumArgs, args));
6236 6052
6237 // Check list contents. 6053 // Check list contents.
6238 list_string = Dart_ToString(list); 6054 list_string = Dart_ToString(list);
6239 EXPECT_VALID(list_string); 6055 EXPECT_VALID(list_string);
6240 list_cstr = ""; 6056 list_cstr = "";
6241 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); 6057 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
6242 EXPECT_STREQ("[A2, B2, C2=, MyClass, _A2, _B2, _C2=]", list_cstr); 6058 EXPECT_STREQ("[A2, B2, C2=, MyClass, _A2, _B2, _C2=]", list_cstr);
6243 } 6059 }
6244 6060
6245
6246 TEST_CASE(LibraryImportLibrary) { 6061 TEST_CASE(LibraryImportLibrary) {
6247 const char* kLibrary1Chars = "library library1_name;"; 6062 const char* kLibrary1Chars = "library library1_name;";
6248 const char* kLibrary2Chars = "library library2_name;"; 6063 const char* kLibrary2Chars = "library library2_name;";
6249 Dart_Handle error = Dart_NewApiError("incoming error"); 6064 Dart_Handle error = Dart_NewApiError("incoming error");
6250 Dart_Handle result; 6065 Dart_Handle result;
6251 6066
6252 Dart_Handle url = NewString("library1_url"); 6067 Dart_Handle url = NewString("library1_url");
6253 Dart_Handle source = NewString(kLibrary1Chars); 6068 Dart_Handle source = NewString(kLibrary1Chars);
6254 Dart_Handle lib1 = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6069 Dart_Handle lib1 = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6255 EXPECT_VALID(lib1); 6070 EXPECT_VALID(lib1);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
6290 Dart_GetError(result)); 6105 Dart_GetError(result));
6291 6106
6292 result = Dart_LibraryImportLibrary(lib1, error, Dart_Null()); 6107 result = Dart_LibraryImportLibrary(lib1, error, Dart_Null());
6293 EXPECT(Dart_IsError(result)); 6108 EXPECT(Dart_IsError(result));
6294 EXPECT_STREQ("incoming error", Dart_GetError(result)); 6109 EXPECT_STREQ("incoming error", Dart_GetError(result));
6295 6110
6296 result = Dart_LibraryImportLibrary(lib1, lib2, Dart_Null()); 6111 result = Dart_LibraryImportLibrary(lib1, lib2, Dart_Null());
6297 EXPECT_VALID(result); 6112 EXPECT_VALID(result);
6298 } 6113 }
6299 6114
6300
6301 TEST_CASE(ImportLibraryWithPrefix) { 6115 TEST_CASE(ImportLibraryWithPrefix) {
6302 const char* kLibrary1Chars = 6116 const char* kLibrary1Chars =
6303 "library library1_name;" 6117 "library library1_name;"
6304 "int bar() => 42;"; 6118 "int bar() => 42;";
6305 Dart_Handle url1 = NewString("library1_url"); 6119 Dart_Handle url1 = NewString("library1_url");
6306 Dart_Handle source1 = NewString(kLibrary1Chars); 6120 Dart_Handle source1 = NewString(kLibrary1Chars);
6307 Dart_Handle lib1 = Dart_LoadLibrary(url1, Dart_Null(), source1, 0, 0); 6121 Dart_Handle lib1 = Dart_LoadLibrary(url1, Dart_Null(), source1, 0, 0);
6308 EXPECT_VALID(lib1); 6122 EXPECT_VALID(lib1);
6309 EXPECT(Dart_IsLibrary(lib1)); 6123 EXPECT(Dart_IsLibrary(lib1));
6310 6124
(...skipping 21 matching lines...) Expand all
6332 // Check that lib1 is available under the prefix in lib2. 6146 // Check that lib1 is available under the prefix in lib2.
6333 method_name = NewString("foobar"); 6147 method_name = NewString("foobar");
6334 result = Dart_Invoke(lib2, method_name, 0, NULL); 6148 result = Dart_Invoke(lib2, method_name, 0, NULL);
6335 EXPECT_VALID(result); 6149 EXPECT_VALID(result);
6336 EXPECT(Dart_IsInteger(result)); 6150 EXPECT(Dart_IsInteger(result));
6337 int64_t value = 0; 6151 int64_t value = 0;
6338 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 6152 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
6339 EXPECT_EQ(42, value); 6153 EXPECT_EQ(42, value);
6340 } 6154 }
6341 6155
6342
6343 TEST_CASE(LoadLibrary) { 6156 TEST_CASE(LoadLibrary) {
6344 const char* kLibrary1Chars = "library library1_name;"; 6157 const char* kLibrary1Chars = "library library1_name;";
6345 Dart_Handle error = Dart_NewApiError("incoming error"); 6158 Dart_Handle error = Dart_NewApiError("incoming error");
6346 Dart_Handle result; 6159 Dart_Handle result;
6347 6160
6348 Dart_Handle url = NewString("library1_url"); 6161 Dart_Handle url = NewString("library1_url");
6349 Dart_Handle source = NewString(kLibrary1Chars); 6162 Dart_Handle source = NewString(kLibrary1Chars);
6350 6163
6351 result = Dart_LoadLibrary(Dart_Null(), Dart_Null(), source, 0, 0); 6164 result = Dart_LoadLibrary(Dart_Null(), Dart_Null(), source, 0, 0);
6352 EXPECT(Dart_IsError(result)); 6165 EXPECT(Dart_IsError(result));
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
6393 EXPECT(Dart_IsLibrary(result)); 6206 EXPECT(Dart_IsLibrary(result));
6394 6207
6395 // Duplicate library load fails. 6208 // Duplicate library load fails.
6396 result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6209 result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6397 EXPECT(Dart_IsError(result)); 6210 EXPECT(Dart_IsError(result));
6398 EXPECT_STREQ( 6211 EXPECT_STREQ(
6399 "Dart_LoadLibrary: library 'library1_url' has already been loaded.", 6212 "Dart_LoadLibrary: library 'library1_url' has already been loaded.",
6400 Dart_GetError(result)); 6213 Dart_GetError(result));
6401 } 6214 }
6402 6215
6403
6404 TEST_CASE(LoadLibrary_CompileError) { 6216 TEST_CASE(LoadLibrary_CompileError) {
6405 const char* kLibrary1Chars = 6217 const char* kLibrary1Chars =
6406 "library library1_name;" 6218 "library library1_name;"
6407 ")"; 6219 ")";
6408 Dart_Handle url = NewString("library1_url"); 6220 Dart_Handle url = NewString("library1_url");
6409 Dart_Handle source = NewString(kLibrary1Chars); 6221 Dart_Handle source = NewString(kLibrary1Chars);
6410 Dart_Handle result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6222 Dart_Handle result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6411 EXPECT(Dart_IsError(result)); 6223 EXPECT(Dart_IsError(result));
6412 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'")); 6224 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'"));
6413 } 6225 }
6414 6226
6415
6416 TEST_CASE(LoadSource) { 6227 TEST_CASE(LoadSource) {
6417 const char* kLibrary1Chars = "library library1_name;"; 6228 const char* kLibrary1Chars = "library library1_name;";
6418 const char* kSourceChars = "part of library1_name;\n// Something innocuous"; 6229 const char* kSourceChars = "part of library1_name;\n// Something innocuous";
6419 const char* kBadSourceChars = ")"; 6230 const char* kBadSourceChars = ")";
6420 Dart_Handle error = Dart_NewApiError("incoming error"); 6231 Dart_Handle error = Dart_NewApiError("incoming error");
6421 Dart_Handle result; 6232 Dart_Handle result;
6422 6233
6423 // Load up a library. 6234 // Load up a library.
6424 Dart_Handle url = NewString("library1_url"); 6235 Dart_Handle url = NewString("library1_url");
6425 Dart_Handle source = NewString(kLibrary1Chars); 6236 Dart_Handle source = NewString(kLibrary1Chars);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
6495 EXPECT_VALID(result); 6306 EXPECT_VALID(result);
6496 EXPECT(Dart_IsLibrary(result)); 6307 EXPECT(Dart_IsLibrary(result));
6497 EXPECT(Dart_IdentityEquals(lib, result)); 6308 EXPECT(Dart_IdentityEquals(lib, result));
6498 6309
6499 // Language errors are detected. 6310 // Language errors are detected.
6500 source = NewString(kBadSourceChars); 6311 source = NewString(kBadSourceChars);
6501 result = Dart_LoadSource(lib, url, Dart_Null(), source, 0, 0); 6312 result = Dart_LoadSource(lib, url, Dart_Null(), source, 0, 0);
6502 EXPECT(Dart_IsError(result)); 6313 EXPECT(Dart_IsError(result));
6503 } 6314 }
6504 6315
6505
6506 TEST_CASE(LoadSource_LateLoad) { 6316 TEST_CASE(LoadSource_LateLoad) {
6507 const char* kLibrary1Chars = 6317 const char* kLibrary1Chars =
6508 "library library1_name;\n" 6318 "library library1_name;\n"
6509 "class OldClass {\n" 6319 "class OldClass {\n"
6510 " foo() => 'foo';\n" 6320 " foo() => 'foo';\n"
6511 "}\n"; 6321 "}\n";
6512 const char* kSourceChars = 6322 const char* kSourceChars =
6513 "part of library1_name;\n" 6323 "part of library1_name;\n"
6514 "class NewClass extends OldClass{\n" 6324 "class NewClass extends OldClass{\n"
6515 " bar() => 'bar';\n" 6325 " bar() => 'bar';\n"
(...skipping 29 matching lines...) Expand all
6545 EXPECT_VALID(type); 6355 EXPECT_VALID(type);
6546 recv = Dart_New(type, Dart_Null(), 0, NULL); 6356 recv = Dart_New(type, Dart_Null(), 0, NULL);
6547 result = Dart_Invoke(recv, NewString("bar"), 0, NULL); 6357 result = Dart_Invoke(recv, NewString("bar"), 0, NULL);
6548 EXPECT_VALID(result); 6358 EXPECT_VALID(result);
6549 EXPECT(Dart_IsString(result)); 6359 EXPECT(Dart_IsString(result));
6550 result_cstr = ""; 6360 result_cstr = "";
6551 EXPECT_VALID(Dart_StringToCString(result, &result_cstr)); 6361 EXPECT_VALID(Dart_StringToCString(result, &result_cstr));
6552 EXPECT_STREQ("bar", result_cstr); 6362 EXPECT_STREQ("bar", result_cstr);
6553 } 6363 }
6554 6364
6555
6556 TEST_CASE(LoadPatch) { 6365 TEST_CASE(LoadPatch) {
6557 const char* kLibrary1Chars = "library library1_name;"; 6366 const char* kLibrary1Chars = "library library1_name;";
6558 const char* kSourceChars = 6367 const char* kSourceChars =
6559 "part of library1_name;\n" 6368 "part of library1_name;\n"
6560 "external int foo();"; 6369 "external int foo();";
6561 const char* kPatchChars = "@patch int foo() => 42;"; 6370 const char* kPatchChars = "@patch int foo() => 42;";
6562 6371
6563 // Load up a library. 6372 // Load up a library.
6564 Dart_Handle url = NewString("library1_url"); 6373 Dart_Handle url = NewString("library1_url");
6565 Dart_Handle source = NewString(kLibrary1Chars); 6374 Dart_Handle source = NewString(kLibrary1Chars);
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
6696 EXPECT_VALID(result); 6505 EXPECT_VALID(result);
6697 EXPECT(Dart_IsInteger(result)); 6506 EXPECT(Dart_IsInteger(result));
6698 int64_t value = 0; 6507 int64_t value = 0;
6699 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 6508 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
6700 EXPECT_EQ(200, value); 6509 EXPECT_EQ(200, value);
6701 } 6510 }
6702 6511
6703 FLAG_ignore_patch_signature_mismatch = old_flag_value; 6512 FLAG_ignore_patch_signature_mismatch = old_flag_value;
6704 } 6513 }
6705 6514
6706
6707 static void PatchNativeFunction(Dart_NativeArguments args) { 6515 static void PatchNativeFunction(Dart_NativeArguments args) {
6708 Dart_EnterScope(); 6516 Dart_EnterScope();
6709 Dart_SetReturnValue(args, Dart_Null()); 6517 Dart_SetReturnValue(args, Dart_Null());
6710 Dart_ExitScope(); 6518 Dart_ExitScope();
6711 } 6519 }
6712 6520
6713
6714 static Dart_NativeFunction PatchNativeResolver(Dart_Handle name, 6521 static Dart_NativeFunction PatchNativeResolver(Dart_Handle name,
6715 int arg_count, 6522 int arg_count,
6716 bool* auto_setup_scope) { 6523 bool* auto_setup_scope) {
6717 ASSERT(auto_setup_scope != NULL); 6524 ASSERT(auto_setup_scope != NULL);
6718 *auto_setup_scope = false; 6525 *auto_setup_scope = false;
6719 return &PatchNativeFunction; 6526 return &PatchNativeFunction;
6720 } 6527 }
6721 6528
6722
6723 TEST_CASE(ParsePatchLibrary) { 6529 TEST_CASE(ParsePatchLibrary) {
6724 const char* kLibraryChars = 6530 const char* kLibraryChars =
6725 "library patched_library;\n" 6531 "library patched_library;\n"
6726 "class A {\n" 6532 "class A {\n"
6727 " final fvalue;\n" 6533 " final fvalue;\n"
6728 " var _f;\n" 6534 " var _f;\n"
6729 " callFunc(x, y) => x(y);\n" 6535 " callFunc(x, y) => x(y);\n"
6730 " external void method(var value);\n" 6536 " external void method(var value);\n"
6731 " get field => _field;\n" 6537 " get field => _field;\n"
6732 "}\n" 6538 "}\n"
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
6883 EXPECT_VALID(result); 6689 EXPECT_VALID(result);
6884 EXPECT(Dart_IsInteger(result)); 6690 EXPECT(Dart_IsInteger(result));
6885 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 6691 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
6886 EXPECT_EQ(8, value); 6692 EXPECT_EQ(8, value);
6887 6693
6888 // Make sure all source files show up in the patched library. 6694 // Make sure all source files show up in the patched library.
6889 const Array& lib_scripts = Array::Handle(lib.LoadedScripts()); 6695 const Array& lib_scripts = Array::Handle(lib.LoadedScripts());
6890 EXPECT_EQ(4, lib_scripts.Length()); 6696 EXPECT_EQ(4, lib_scripts.Length());
6891 } 6697 }
6892 6698
6893
6894 static void MyNativeFunction1(Dart_NativeArguments args) { 6699 static void MyNativeFunction1(Dart_NativeArguments args) {
6895 Dart_EnterScope(); 6700 Dart_EnterScope();
6896 Dart_SetReturnValue(args, Dart_NewInteger(654321)); 6701 Dart_SetReturnValue(args, Dart_NewInteger(654321));
6897 Dart_ExitScope(); 6702 Dart_ExitScope();
6898 } 6703 }
6899 6704
6900
6901 static void MyNativeFunction2(Dart_NativeArguments args) { 6705 static void MyNativeFunction2(Dart_NativeArguments args) {
6902 Dart_EnterScope(); 6706 Dart_EnterScope();
6903 Dart_SetReturnValue(args, Dart_NewInteger(123456)); 6707 Dart_SetReturnValue(args, Dart_NewInteger(123456));
6904 Dart_ExitScope(); 6708 Dart_ExitScope();
6905 } 6709 }
6906 6710
6907
6908 static Dart_NativeFunction MyNativeResolver1(Dart_Handle name, 6711 static Dart_NativeFunction MyNativeResolver1(Dart_Handle name,
6909 int arg_count, 6712 int arg_count,
6910 bool* auto_setup_scope) { 6713 bool* auto_setup_scope) {
6911 ASSERT(auto_setup_scope != NULL); 6714 ASSERT(auto_setup_scope != NULL);
6912 *auto_setup_scope = false; 6715 *auto_setup_scope = false;
6913 return &MyNativeFunction1; 6716 return &MyNativeFunction1;
6914 } 6717 }
6915 6718
6916
6917 static Dart_NativeFunction MyNativeResolver2(Dart_Handle name, 6719 static Dart_NativeFunction MyNativeResolver2(Dart_Handle name,
6918 int arg_count, 6720 int arg_count,
6919 bool* auto_setup_scope) { 6721 bool* auto_setup_scope) {
6920 ASSERT(auto_setup_scope != NULL); 6722 ASSERT(auto_setup_scope != NULL);
6921 *auto_setup_scope = false; 6723 *auto_setup_scope = false;
6922 return &MyNativeFunction2; 6724 return &MyNativeFunction2;
6923 } 6725 }
6924 6726
6925
6926 TEST_CASE(SetNativeResolver) { 6727 TEST_CASE(SetNativeResolver) {
6927 const char* kScriptChars = 6728 const char* kScriptChars =
6928 "class Test {" 6729 "class Test {"
6929 " static foo() native \"SomeNativeFunction\";\n" 6730 " static foo() native \"SomeNativeFunction\";\n"
6930 " static bar() native \"SomeNativeFunction2\";\n" 6731 " static bar() native \"SomeNativeFunction2\";\n"
6931 " static baz() native \"SomeNativeFunction3\";\n" 6732 " static baz() native \"SomeNativeFunction3\";\n"
6932 "}"; 6733 "}";
6933 Dart_Handle error = Dart_NewApiError("incoming error"); 6734 Dart_Handle error = Dart_NewApiError("incoming error");
6934 Dart_Handle result; 6735 Dart_Handle result;
6935 6736
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
6996 6797
6997 // A NULL resolver is okay, but resolution will fail. 6798 // A NULL resolver is okay, but resolution will fail.
6998 result = Dart_SetNativeResolver(lib, NULL, NULL); 6799 result = Dart_SetNativeResolver(lib, NULL, NULL);
6999 EXPECT_VALID(result); 6800 EXPECT_VALID(result);
7000 6801
7001 EXPECT_ERROR(Dart_Invoke(type, NewString("baz"), 0, NULL), 6802 EXPECT_ERROR(Dart_Invoke(type, NewString("baz"), 0, NULL),
7002 "native function 'SomeNativeFunction3' (0 arguments) " 6803 "native function 'SomeNativeFunction3' (0 arguments) "
7003 "cannot be found"); 6804 "cannot be found");
7004 } 6805 }
7005 6806
7006
7007 // Test that an imported name does not clash with the same name defined 6807 // Test that an imported name does not clash with the same name defined
7008 // in the importing library. 6808 // in the importing library.
7009 TEST_CASE(ImportLibrary2) { 6809 TEST_CASE(ImportLibrary2) {
7010 const char* kScriptChars = 6810 const char* kScriptChars =
7011 "import 'library1_dart';\n" 6811 "import 'library1_dart';\n"
7012 "var foo;\n" 6812 "var foo;\n"
7013 "main() { foo = 0; }\n"; 6813 "main() { foo = 0; }\n";
7014 const char* kLibrary1Chars = 6814 const char* kLibrary1Chars =
7015 "library library1_dart;\n" 6815 "library library1_dart;\n"
7016 "import 'library2_dart';\n" 6816 "import 'library2_dart';\n"
(...skipping 17 matching lines...) Expand all
7034 url = NewString("library2_dart"); 6834 url = NewString("library2_dart");
7035 source = NewString(kLibrary2Chars); 6835 source = NewString(kLibrary2Chars);
7036 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6836 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
7037 6837
7038 Dart_FinalizeLoading(false); 6838 Dart_FinalizeLoading(false);
7039 6839
7040 result = Dart_Invoke(result, NewString("main"), 0, NULL); 6840 result = Dart_Invoke(result, NewString("main"), 0, NULL);
7041 EXPECT_VALID(result); 6841 EXPECT_VALID(result);
7042 } 6842 }
7043 6843
7044
7045 // Test that if the same name is imported from two libraries, it is 6844 // Test that if the same name is imported from two libraries, it is
7046 // an error if that name is referenced. 6845 // an error if that name is referenced.
7047 TEST_CASE(ImportLibrary3) { 6846 TEST_CASE(ImportLibrary3) {
7048 const char* kScriptChars = 6847 const char* kScriptChars =
7049 "import 'library2_dart';\n" 6848 "import 'library2_dart';\n"
7050 "import 'library1_dart';\n" 6849 "import 'library1_dart';\n"
7051 "var foo_top = 10; // foo has dup def. So should be an error.\n" 6850 "var foo_top = 10; // foo has dup def. So should be an error.\n"
7052 "main() { foo = 0; }\n"; 6851 "main() { foo = 0; }\n";
7053 const char* kLibrary1Chars = 6852 const char* kLibrary1Chars =
7054 "library library1_dart;\n" 6853 "library library1_dart;\n"
(...skipping 19 matching lines...) Expand all
7074 source = NewString(kLibrary1Chars); 6873 source = NewString(kLibrary1Chars);
7075 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6874 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
7076 result = Dart_FinalizeLoading(false); 6875 result = Dart_FinalizeLoading(false);
7077 EXPECT_VALID(result); 6876 EXPECT_VALID(result);
7078 6877
7079 result = Dart_Invoke(result, NewString("main"), 0, NULL); 6878 result = Dart_Invoke(result, NewString("main"), 0, NULL);
7080 EXPECT(Dart_IsError(result)); 6879 EXPECT(Dart_IsError(result));
7081 EXPECT_SUBSTRING("NoSuchMethodError", Dart_GetError(result)); 6880 EXPECT_SUBSTRING("NoSuchMethodError", Dart_GetError(result));
7082 } 6881 }
7083 6882
7084
7085 // Test that if the same name is imported from two libraries, it is 6883 // Test that if the same name is imported from two libraries, it is
7086 // not an error if that name is not used. 6884 // not an error if that name is not used.
7087 TEST_CASE(ImportLibrary4) { 6885 TEST_CASE(ImportLibrary4) {
7088 const char* kScriptChars = 6886 const char* kScriptChars =
7089 "import 'library2_dart';\n" 6887 "import 'library2_dart';\n"
7090 "import 'library1_dart';\n" 6888 "import 'library1_dart';\n"
7091 "main() { }\n"; 6889 "main() { }\n";
7092 const char* kLibrary1Chars = 6890 const char* kLibrary1Chars =
7093 "library library1_dart;\n" 6891 "library library1_dart;\n"
7094 "var foo;"; 6892 "var foo;";
(...skipping 16 matching lines...) Expand all
7111 6909
7112 url = NewString("library1_dart"); 6910 url = NewString("library1_dart");
7113 source = NewString(kLibrary1Chars); 6911 source = NewString(kLibrary1Chars);
7114 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6912 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
7115 Dart_FinalizeLoading(false); 6913 Dart_FinalizeLoading(false);
7116 6914
7117 result = Dart_Invoke(result, NewString("main"), 0, NULL); 6915 result = Dart_Invoke(result, NewString("main"), 0, NULL);
7118 EXPECT_VALID(result); 6916 EXPECT_VALID(result);
7119 } 6917 }
7120 6918
7121
7122 TEST_CASE(ImportLibrary5) { 6919 TEST_CASE(ImportLibrary5) {
7123 const char* kScriptChars = 6920 const char* kScriptChars =
7124 "import 'lib.dart';\n" 6921 "import 'lib.dart';\n"
7125 "abstract class Y {\n" 6922 "abstract class Y {\n"
7126 " void set handler(void callback(List<int> x));\n" 6923 " void set handler(void callback(List<int> x));\n"
7127 "}\n" 6924 "}\n"
7128 "void main() {}\n"; 6925 "void main() {}\n";
7129 const char* kLibraryChars = 6926 const char* kLibraryChars =
7130 "library lib.dart;\n" 6927 "library lib.dart;\n"
7131 "abstract class X {\n" 6928 "abstract class X {\n"
(...skipping 10 matching lines...) Expand all
7142 6939
7143 url = NewString("lib.dart"); 6940 url = NewString("lib.dart");
7144 source = NewString(kLibraryChars); 6941 source = NewString(kLibraryChars);
7145 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6942 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
7146 Dart_FinalizeLoading(false); 6943 Dart_FinalizeLoading(false);
7147 6944
7148 result = Dart_Invoke(result, NewString("main"), 0, NULL); 6945 result = Dart_Invoke(result, NewString("main"), 0, NULL);
7149 EXPECT_VALID(result); 6946 EXPECT_VALID(result);
7150 } 6947 }
7151 6948
7152
7153 void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) { 6949 void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) {
7154 // Gets a send port message. 6950 // Gets a send port message.
7155 EXPECT_NOTNULL(message); 6951 EXPECT_NOTNULL(message);
7156 EXPECT_EQ(Dart_CObject_kArray, message->type); 6952 EXPECT_EQ(Dart_CObject_kArray, message->type);
7157 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 6953 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7158 6954
7159 // Post integer value. 6955 // Post integer value.
7160 Dart_CObject* response = 6956 Dart_CObject* response =
7161 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject))); 6957 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
7162 response->type = Dart_CObject_kInt32; 6958 response->type = Dart_CObject_kInt32;
7163 response->value.as_int32 = 123; 6959 response->value.as_int32 = 123;
7164 Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id, 6960 Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id,
7165 response); 6961 response);
7166 } 6962 }
7167 6963
7168
7169 void NewNativePort_send321(Dart_Port dest_port_id, Dart_CObject* message) { 6964 void NewNativePort_send321(Dart_Port dest_port_id, Dart_CObject* message) {
7170 // Gets a null message. 6965 // Gets a null message.
7171 EXPECT_NOTNULL(message); 6966 EXPECT_NOTNULL(message);
7172 EXPECT_EQ(Dart_CObject_kArray, message->type); 6967 EXPECT_EQ(Dart_CObject_kArray, message->type);
7173 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 6968 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7174 6969
7175 // Post integer value. 6970 // Post integer value.
7176 Dart_CObject* response = 6971 Dart_CObject* response =
7177 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject))); 6972 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
7178 response->type = Dart_CObject_kInt32; 6973 response->type = Dart_CObject_kInt32;
7179 response->value.as_int32 = 321; 6974 response->value.as_int32 = 321;
7180 Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id, 6975 Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id,
7181 response); 6976 response);
7182 } 6977 }
7183 6978
7184
7185 TEST_CASE(IllegalNewSendPort) { 6979 TEST_CASE(IllegalNewSendPort) {
7186 Dart_Handle error = Dart_NewSendPort(ILLEGAL_PORT); 6980 Dart_Handle error = Dart_NewSendPort(ILLEGAL_PORT);
7187 EXPECT(Dart_IsError(error)); 6981 EXPECT(Dart_IsError(error));
7188 EXPECT(Dart_IsApiError(error)); 6982 EXPECT(Dart_IsApiError(error));
7189 } 6983 }
7190 6984
7191
7192 TEST_CASE(IllegalPost) { 6985 TEST_CASE(IllegalPost) {
7193 Dart_Handle message = Dart_True(); 6986 Dart_Handle message = Dart_True();
7194 bool success = Dart_Post(ILLEGAL_PORT, message); 6987 bool success = Dart_Post(ILLEGAL_PORT, message);
7195 EXPECT(!success); 6988 EXPECT(!success);
7196 } 6989 }
7197 6990
7198
7199 VM_UNIT_TEST_CASE(NewNativePort) { 6991 VM_UNIT_TEST_CASE(NewNativePort) {
7200 // Create a port with a bogus handler. 6992 // Create a port with a bogus handler.
7201 Dart_Port error_port = Dart_NewNativePort("Foo", NULL, true); 6993 Dart_Port error_port = Dart_NewNativePort("Foo", NULL, true);
7202 EXPECT_EQ(ILLEGAL_PORT, error_port); 6994 EXPECT_EQ(ILLEGAL_PORT, error_port);
7203 6995
7204 // Create the port w/o a current isolate, just to make sure that works. 6996 // Create the port w/o a current isolate, just to make sure that works.
7205 Dart_Port port_id1 = 6997 Dart_Port port_id1 =
7206 Dart_NewNativePort("Port123", NewNativePort_send123, true); 6998 Dart_NewNativePort("Port123", NewNativePort_send123, true);
7207 6999
7208 TestIsolateScope __test_isolate__; 7000 TestIsolateScope __test_isolate__;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
7248 EXPECT(Dart_ErrorHasException(result)); 7040 EXPECT(Dart_ErrorHasException(result));
7249 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result)); 7041 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result));
7250 7042
7251 Dart_ExitScope(); 7043 Dart_ExitScope();
7252 7044
7253 // Delete the native ports. 7045 // Delete the native ports.
7254 EXPECT(Dart_CloseNativePort(port_id1)); 7046 EXPECT(Dart_CloseNativePort(port_id1));
7255 EXPECT(Dart_CloseNativePort(port_id2)); 7047 EXPECT(Dart_CloseNativePort(port_id2));
7256 } 7048 }
7257 7049
7258
7259 void NewNativePort_sendInteger123(Dart_Port dest_port_id, 7050 void NewNativePort_sendInteger123(Dart_Port dest_port_id,
7260 Dart_CObject* message) { 7051 Dart_CObject* message) {
7261 // Gets a send port message. 7052 // Gets a send port message.
7262 EXPECT_NOTNULL(message); 7053 EXPECT_NOTNULL(message);
7263 EXPECT_EQ(Dart_CObject_kArray, message->type); 7054 EXPECT_EQ(Dart_CObject_kArray, message->type);
7264 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 7055 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7265 7056
7266 // Post integer value. 7057 // Post integer value.
7267 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id, 7058 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7268 123); 7059 123);
7269 } 7060 }
7270 7061
7271
7272 void NewNativePort_sendInteger321(Dart_Port dest_port_id, 7062 void NewNativePort_sendInteger321(Dart_Port dest_port_id,
7273 Dart_CObject* message) { 7063 Dart_CObject* message) {
7274 // Gets a null message. 7064 // Gets a null message.
7275 EXPECT_NOTNULL(message); 7065 EXPECT_NOTNULL(message);
7276 EXPECT_EQ(Dart_CObject_kArray, message->type); 7066 EXPECT_EQ(Dart_CObject_kArray, message->type);
7277 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 7067 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7278 7068
7279 // Post integer value. 7069 // Post integer value.
7280 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id, 7070 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7281 321); 7071 321);
7282 } 7072 }
7283 7073
7284
7285 TEST_CASE(NativePortPostInteger) { 7074 TEST_CASE(NativePortPostInteger) {
7286 const char* kScriptChars = 7075 const char* kScriptChars =
7287 "import 'dart:isolate';\n" 7076 "import 'dart:isolate';\n"
7288 "void callPort(SendPort port) {\n" 7077 "void callPort(SendPort port) {\n"
7289 " var receivePort = new RawReceivePort();\n" 7078 " var receivePort = new RawReceivePort();\n"
7290 " var replyPort = receivePort.sendPort;\n" 7079 " var replyPort = receivePort.sendPort;\n"
7291 " port.send([replyPort]);\n" 7080 " port.send([replyPort]);\n"
7292 " receivePort.handler = (message) {\n" 7081 " receivePort.handler = (message) {\n"
7293 " receivePort.close();\n" 7082 " receivePort.close();\n"
7294 " throw new Exception(message);\n" 7083 " throw new Exception(message);\n"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
7326 EXPECT(Dart_ErrorHasException(result)); 7115 EXPECT(Dart_ErrorHasException(result));
7327 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result)); 7116 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result));
7328 7117
7329 Dart_ExitScope(); 7118 Dart_ExitScope();
7330 7119
7331 // Delete the native ports. 7120 // Delete the native ports.
7332 EXPECT(Dart_CloseNativePort(port_id1)); 7121 EXPECT(Dart_CloseNativePort(port_id1));
7333 EXPECT(Dart_CloseNativePort(port_id2)); 7122 EXPECT(Dart_CloseNativePort(port_id2));
7334 } 7123 }
7335 7124
7336
7337 void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id, 7125 void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id,
7338 Dart_CObject* message) { 7126 Dart_CObject* message) {
7339 EXPECT_NOTNULL(message); 7127 EXPECT_NOTNULL(message);
7340 7128
7341 if ((message->type == Dart_CObject_kArray) && 7129 if ((message->type == Dart_CObject_kArray) &&
7342 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) { 7130 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
7343 // Post integer value. 7131 // Post integer value.
7344 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id, 7132 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7345 123); 7133 123);
7346 } else { 7134 } else {
7347 EXPECT_EQ(message->type, Dart_CObject_kNull); 7135 EXPECT_EQ(message->type, Dart_CObject_kNull);
7348 } 7136 }
7349 } 7137 }
7350 7138
7351
7352 TEST_CASE(NativePortReceiveNull) { 7139 TEST_CASE(NativePortReceiveNull) {
7353 const char* kScriptChars = 7140 const char* kScriptChars =
7354 "import 'dart:isolate';\n" 7141 "import 'dart:isolate';\n"
7355 "void callPort(SendPort port) {\n" 7142 "void callPort(SendPort port) {\n"
7356 " var receivePort = new RawReceivePort();\n" 7143 " var receivePort = new RawReceivePort();\n"
7357 " var replyPort = receivePort.sendPort;\n" 7144 " var replyPort = receivePort.sendPort;\n"
7358 " port.send(null);\n" 7145 " port.send(null);\n"
7359 " port.send([replyPort]);\n" 7146 " port.send([replyPort]);\n"
7360 " receivePort.handler = (message) {\n" 7147 " receivePort.handler = (message) {\n"
7361 " receivePort.close();\n" 7148 " receivePort.close();\n"
(...skipping 17 matching lines...) Expand all
7379 EXPECT(Dart_IsError(result)); 7166 EXPECT(Dart_IsError(result));
7380 EXPECT(Dart_ErrorHasException(result)); 7167 EXPECT(Dart_ErrorHasException(result));
7381 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result)); 7168 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
7382 7169
7383 Dart_ExitScope(); 7170 Dart_ExitScope();
7384 7171
7385 // Delete the native ports. 7172 // Delete the native ports.
7386 EXPECT(Dart_CloseNativePort(port_id1)); 7173 EXPECT(Dart_CloseNativePort(port_id1));
7387 } 7174 }
7388 7175
7389
7390 void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id, 7176 void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id,
7391 Dart_CObject* message) { 7177 Dart_CObject* message) {
7392 EXPECT_NOTNULL(message); 7178 EXPECT_NOTNULL(message);
7393 7179
7394 if ((message->type == Dart_CObject_kArray) && 7180 if ((message->type == Dart_CObject_kArray) &&
7395 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) { 7181 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
7396 // Post integer value. 7182 // Post integer value.
7397 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id, 7183 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7398 123); 7184 123);
7399 } else { 7185 } else {
7400 EXPECT_EQ(message->type, Dart_CObject_kInt32); 7186 EXPECT_EQ(message->type, Dart_CObject_kInt32);
7401 EXPECT_EQ(message->value.as_int32, 321); 7187 EXPECT_EQ(message->value.as_int32, 321);
7402 } 7188 }
7403 } 7189 }
7404 7190
7405
7406 TEST_CASE(NativePortReceiveInteger) { 7191 TEST_CASE(NativePortReceiveInteger) {
7407 const char* kScriptChars = 7192 const char* kScriptChars =
7408 "import 'dart:isolate';\n" 7193 "import 'dart:isolate';\n"
7409 "void callPort(SendPort port) {\n" 7194 "void callPort(SendPort port) {\n"
7410 " var receivePort = new RawReceivePort();\n" 7195 " var receivePort = new RawReceivePort();\n"
7411 " var replyPort = receivePort.sendPort;\n" 7196 " var replyPort = receivePort.sendPort;\n"
7412 " port.send(321);\n" 7197 " port.send(321);\n"
7413 " port.send([replyPort]);\n" 7198 " port.send([replyPort]);\n"
7414 " receivePort.handler = (message) {\n" 7199 " receivePort.handler = (message) {\n"
7415 " receivePort.close();\n" 7200 " receivePort.close();\n"
(...skipping 17 matching lines...) Expand all
7433 EXPECT(Dart_IsError(result)); 7218 EXPECT(Dart_IsError(result));
7434 EXPECT(Dart_ErrorHasException(result)); 7219 EXPECT(Dart_ErrorHasException(result));
7435 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result)); 7220 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
7436 7221
7437 Dart_ExitScope(); 7222 Dart_ExitScope();
7438 7223
7439 // Delete the native ports. 7224 // Delete the native ports.
7440 EXPECT(Dart_CloseNativePort(port_id1)); 7225 EXPECT(Dart_CloseNativePort(port_id1));
7441 } 7226 }
7442 7227
7443
7444 static Dart_Isolate RunLoopTestCallback(const char* script_name, 7228 static Dart_Isolate RunLoopTestCallback(const char* script_name,
7445 const char* main, 7229 const char* main,
7446 const char* package_root, 7230 const char* package_root,
7447 const char* package_config, 7231 const char* package_config,
7448 Dart_IsolateFlags* flags, 7232 Dart_IsolateFlags* flags,
7449 void* data, 7233 void* data,
7450 char** error) { 7234 char** error) {
7451 const char* kScriptChars = 7235 const char* kScriptChars =
7452 "import 'builtin';\n" 7236 "import 'builtin';\n"
7453 "import 'dart:isolate';\n" 7237 "import 'dart:isolate';\n"
(...skipping 25 matching lines...) Expand all
7479 EXPECT_VALID(lib); 7263 EXPECT_VALID(lib);
7480 result = Dart_FinalizeLoading(false); 7264 result = Dart_FinalizeLoading(false);
7481 EXPECT_VALID(result); 7265 EXPECT_VALID(result);
7482 Dart_ExitScope(); 7266 Dart_ExitScope();
7483 Dart_ExitIsolate(); 7267 Dart_ExitIsolate();
7484 bool retval = Dart_IsolateMakeRunnable(isolate); 7268 bool retval = Dart_IsolateMakeRunnable(isolate);
7485 EXPECT(retval); 7269 EXPECT(retval);
7486 return isolate; 7270 return isolate;
7487 } 7271 }
7488 7272
7489
7490 // Common code for RunLoop_Success/RunLoop_Failure. 7273 // Common code for RunLoop_Success/RunLoop_Failure.
7491 static void RunLoopTest(bool throw_exception) { 7274 static void RunLoopTest(bool throw_exception) {
7492 Dart_IsolateCreateCallback saved = Isolate::CreateCallback(); 7275 Dart_IsolateCreateCallback saved = Isolate::CreateCallback();
7493 Isolate::SetCreateCallback(RunLoopTestCallback); 7276 Isolate::SetCreateCallback(RunLoopTestCallback);
7494 Dart_Isolate isolate = 7277 Dart_Isolate isolate =
7495 RunLoopTestCallback(NULL, NULL, NULL, NULL, NULL, NULL, NULL); 7278 RunLoopTestCallback(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7496 7279
7497 Dart_EnterIsolate(isolate); 7280 Dart_EnterIsolate(isolate);
7498 Dart_EnterScope(); 7281 Dart_EnterScope();
7499 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url())); 7282 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
(...skipping 10 matching lines...) Expand all
7510 } else { 7293 } else {
7511 EXPECT_VALID(result); 7294 EXPECT_VALID(result);
7512 } 7295 }
7513 7296
7514 Dart_ExitScope(); 7297 Dart_ExitScope();
7515 Dart_ShutdownIsolate(); 7298 Dart_ShutdownIsolate();
7516 7299
7517 Isolate::SetCreateCallback(saved); 7300 Isolate::SetCreateCallback(saved);
7518 } 7301 }
7519 7302
7520
7521 VM_UNIT_TEST_CASE(RunLoop_Success) { 7303 VM_UNIT_TEST_CASE(RunLoop_Success) {
7522 RunLoopTest(false); 7304 RunLoopTest(false);
7523 } 7305 }
7524 7306
7525
7526 VM_UNIT_TEST_CASE(RunLoop_Exception) { 7307 VM_UNIT_TEST_CASE(RunLoop_Exception) {
7527 RunLoopTest(true); 7308 RunLoopTest(true);
7528 } 7309 }
7529 7310
7530
7531 // Utility functions and variables for test case IsolateInterrupt starts here. 7311 // Utility functions and variables for test case IsolateInterrupt starts here.
7532 static Monitor* sync = NULL; 7312 static Monitor* sync = NULL;
7533 static Dart_Isolate shared_isolate = NULL; 7313 static Dart_Isolate shared_isolate = NULL;
7534 static bool main_entered = false; 7314 static bool main_entered = false;
7535 7315
7536
7537 void MarkMainEntered(Dart_NativeArguments args) { 7316 void MarkMainEntered(Dart_NativeArguments args) {
7538 Dart_EnterScope(); // Start a Dart API scope for invoking API functions. 7317 Dart_EnterScope(); // Start a Dart API scope for invoking API functions.
7539 // Indicate that main has been entered. 7318 // Indicate that main has been entered.
7540 { 7319 {
7541 MonitorLocker ml(sync); 7320 MonitorLocker ml(sync);
7542 main_entered = true; 7321 main_entered = true;
7543 ml.Notify(); 7322 ml.Notify();
7544 } 7323 }
7545 Dart_SetReturnValue(args, Dart_Null()); 7324 Dart_SetReturnValue(args, Dart_Null());
7546 Dart_ExitScope(); 7325 Dart_ExitScope();
7547 } 7326 }
7548 7327
7549
7550 static Dart_NativeFunction IsolateInterruptTestNativeLookup( 7328 static Dart_NativeFunction IsolateInterruptTestNativeLookup(
7551 Dart_Handle name, 7329 Dart_Handle name,
7552 int argument_count, 7330 int argument_count,
7553 bool* auto_setup_scope) { 7331 bool* auto_setup_scope) {
7554 ASSERT(auto_setup_scope != NULL); 7332 ASSERT(auto_setup_scope != NULL);
7555 *auto_setup_scope = false; 7333 *auto_setup_scope = false;
7556 return reinterpret_cast<Dart_NativeFunction>(&MarkMainEntered); 7334 return reinterpret_cast<Dart_NativeFunction>(&MarkMainEntered);
7557 } 7335 }
7558 7336
7559
7560 void BusyLoop_start(uword unused) { 7337 void BusyLoop_start(uword unused) {
7561 const char* kScriptChars = 7338 const char* kScriptChars =
7562 "class Native {\n" 7339 "class Native {\n"
7563 " static void markMainEntered() native 'MarkMainEntered';\n" 7340 " static void markMainEntered() native 'MarkMainEntered';\n"
7564 "}\n" 7341 "}\n"
7565 "\n" 7342 "\n"
7566 "void main() {\n" 7343 "void main() {\n"
7567 " Native.markMainEntered();\n" 7344 " Native.markMainEntered();\n"
7568 " while (true) {\n" // Infinite empty loop. 7345 " while (true) {\n" // Infinite empty loop.
7569 " }\n" 7346 " }\n"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
7603 Dart_ShutdownIsolate(); 7380 Dart_ShutdownIsolate();
7604 7381
7605 // Tell the other thread that we are done. 7382 // Tell the other thread that we are done.
7606 { 7383 {
7607 MonitorLocker ml(sync); 7384 MonitorLocker ml(sync);
7608 shared_isolate = NULL; 7385 shared_isolate = NULL;
7609 ml.Notify(); 7386 ml.Notify();
7610 } 7387 }
7611 } 7388 }
7612 7389
7613
7614 static void* saved_callback_data; 7390 static void* saved_callback_data;
7615 static void IsolateShutdownTestCallback(void* callback_data) { 7391 static void IsolateShutdownTestCallback(void* callback_data) {
7616 saved_callback_data = callback_data; 7392 saved_callback_data = callback_data;
7617 } 7393 }
7618 7394
7619 VM_UNIT_TEST_CASE(IsolateShutdown) { 7395 VM_UNIT_TEST_CASE(IsolateShutdown) {
7620 Dart_IsolateShutdownCallback saved = Isolate::ShutdownCallback(); 7396 Dart_IsolateShutdownCallback saved = Isolate::ShutdownCallback();
7621 Isolate::SetShutdownCallback(IsolateShutdownTestCallback); 7397 Isolate::SetShutdownCallback(IsolateShutdownTestCallback);
7622 7398
7623 saved_callback_data = NULL; 7399 saved_callback_data = NULL;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
7695 EXPECT_VALID(result); 7471 EXPECT_VALID(result);
7696 Dart_Handle lib = Dart_LoadScript(url, Dart_Null(), source, 0, 0); 7472 Dart_Handle lib = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
7697 EXPECT_VALID(lib); 7473 EXPECT_VALID(lib);
7698 result = Dart_FinalizeLoading(false); 7474 result = Dart_FinalizeLoading(false);
7699 EXPECT_VALID(result); 7475 EXPECT_VALID(result);
7700 result = Dart_Invoke(lib, NewString("main"), 0, NULL); 7476 result = Dart_Invoke(lib, NewString("main"), 0, NULL);
7701 EXPECT_VALID(result); 7477 EXPECT_VALID(result);
7702 Dart_ExitScope(); 7478 Dart_ExitScope();
7703 } 7479 }
7704 7480
7705
7706 // The shutdown callback has not been called. 7481 // The shutdown callback has not been called.
7707 EXPECT_EQ(0, add_result); 7482 EXPECT_EQ(0, add_result);
7708 7483
7709 EXPECT(isolate != NULL); 7484 EXPECT(isolate != NULL);
7710 7485
7711 // Shutdown the isolate. 7486 // Shutdown the isolate.
7712 Dart_ShutdownIsolate(); 7487 Dart_ShutdownIsolate();
7713 7488
7714 // The shutdown callback has been called and ran Dart code. 7489 // The shutdown callback has been called and ran Dart code.
7715 EXPECT_EQ(99, add_result); 7490 EXPECT_EQ(99, add_result);
(...skipping 10 matching lines...) Expand all
7726 static void NativeFoo1(Dart_NativeArguments args) { 7501 static void NativeFoo1(Dart_NativeArguments args) {
7727 Dart_EnterScope(); 7502 Dart_EnterScope();
7728 intptr_t i = Dart_GetNativeArgumentCount(args); 7503 intptr_t i = Dart_GetNativeArgumentCount(args);
7729 EXPECT_EQ(1, i); 7504 EXPECT_EQ(1, i);
7730 Dart_Handle arg = Dart_GetNativeArgument(args, 0); 7505 Dart_Handle arg = Dart_GetNativeArgument(args, 0);
7731 EXPECT_VALID(arg); 7506 EXPECT_VALID(arg);
7732 Dart_SetReturnValue(args, Dart_NewInteger(1)); 7507 Dart_SetReturnValue(args, Dart_NewInteger(1));
7733 Dart_ExitScope(); 7508 Dart_ExitScope();
7734 } 7509 }
7735 7510
7736
7737 static void NativeFoo2(Dart_NativeArguments args) { 7511 static void NativeFoo2(Dart_NativeArguments args) {
7738 Dart_EnterScope(); 7512 Dart_EnterScope();
7739 intptr_t i = Dart_GetNativeArgumentCount(args); 7513 intptr_t i = Dart_GetNativeArgumentCount(args);
7740 EXPECT_EQ(2, i); 7514 EXPECT_EQ(2, i);
7741 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1); 7515 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
7742 EXPECT_VALID(arg1); 7516 EXPECT_VALID(arg1);
7743 int64_t value = 0; 7517 int64_t value = 0;
7744 EXPECT_VALID(Dart_IntegerToInt64(arg1, &value)); 7518 EXPECT_VALID(Dart_IntegerToInt64(arg1, &value));
7745 int64_t integer_value = 0; 7519 int64_t integer_value = 0;
7746 Dart_Handle result = Dart_GetNativeIntegerArgument(args, 1, &integer_value); 7520 Dart_Handle result = Dart_GetNativeIntegerArgument(args, 1, &integer_value);
7747 EXPECT_VALID(result); 7521 EXPECT_VALID(result);
7748 EXPECT_EQ(value, integer_value); 7522 EXPECT_EQ(value, integer_value);
7749 double double_value; 7523 double double_value;
7750 result = Dart_GetNativeDoubleArgument(args, 1, &double_value); 7524 result = Dart_GetNativeDoubleArgument(args, 1, &double_value);
7751 EXPECT_VALID(result); 7525 EXPECT_VALID(result);
7752 bool bool_value; 7526 bool bool_value;
7753 result = Dart_GetNativeBooleanArgument(args, 1, &bool_value); 7527 result = Dart_GetNativeBooleanArgument(args, 1, &bool_value);
7754 EXPECT(Dart_IsError(result)); 7528 EXPECT(Dart_IsError(result));
7755 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1))); 7529 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1)));
7756 Dart_ExitScope(); 7530 Dart_ExitScope();
7757 } 7531 }
7758 7532
7759
7760 static void NativeFoo3(Dart_NativeArguments args) { 7533 static void NativeFoo3(Dart_NativeArguments args) {
7761 Dart_EnterScope(); 7534 Dart_EnterScope();
7762 intptr_t i = Dart_GetNativeArgumentCount(args); 7535 intptr_t i = Dart_GetNativeArgumentCount(args);
7763 EXPECT_EQ(3, i); 7536 EXPECT_EQ(3, i);
7764 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1); 7537 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
7765 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2); 7538 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2);
7766 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2))); 7539 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2)));
7767 Dart_ExitScope(); 7540 Dart_ExitScope();
7768 } 7541 }
7769 7542
7770
7771 static void NativeFoo4(Dart_NativeArguments args) { 7543 static void NativeFoo4(Dart_NativeArguments args) {
7772 Dart_EnterScope(); 7544 Dart_EnterScope();
7773 intptr_t i = Dart_GetNativeArgumentCount(args); 7545 intptr_t i = Dart_GetNativeArgumentCount(args);
7774 EXPECT_EQ(4, i); 7546 EXPECT_EQ(4, i);
7775 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1); 7547 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
7776 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2); 7548 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2);
7777 Dart_Handle arg3 = Dart_GetNativeArgument(args, 3); 7549 Dart_Handle arg3 = Dart_GetNativeArgument(args, 3);
7778 Dart_SetReturnValue( 7550 Dart_SetReturnValue(
7779 args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3))); 7551 args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3)));
7780 Dart_ExitScope(); 7552 Dart_ExitScope();
7781 } 7553 }
7782 7554
7783
7784 static Dart_NativeFunction MyNativeClosureResolver(Dart_Handle name, 7555 static Dart_NativeFunction MyNativeClosureResolver(Dart_Handle name,
7785 int arg_count, 7556 int arg_count,
7786 bool* auto_setup_scope) { 7557 bool* auto_setup_scope) {
7787 ASSERT(auto_setup_scope != NULL); 7558 ASSERT(auto_setup_scope != NULL);
7788 *auto_setup_scope = false; 7559 *auto_setup_scope = false;
7789 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); 7560 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
7790 if (!obj.IsString()) { 7561 if (!obj.IsString()) {
7791 return NULL; 7562 return NULL;
7792 } 7563 }
7793 const char* function_name = obj.ToCString(); 7564 const char* function_name = obj.ToCString();
7794 const char* kNativeFoo1 = "NativeFoo1"; 7565 const char* kNativeFoo1 = "NativeFoo1";
7795 const char* kNativeFoo2 = "NativeFoo2"; 7566 const char* kNativeFoo2 = "NativeFoo2";
7796 const char* kNativeFoo3 = "NativeFoo3"; 7567 const char* kNativeFoo3 = "NativeFoo3";
7797 const char* kNativeFoo4 = "NativeFoo4"; 7568 const char* kNativeFoo4 = "NativeFoo4";
7798 if (!strncmp(function_name, kNativeFoo1, strlen(kNativeFoo1))) { 7569 if (!strncmp(function_name, kNativeFoo1, strlen(kNativeFoo1))) {
7799 return &NativeFoo1; 7570 return &NativeFoo1;
7800 } else if (!strncmp(function_name, kNativeFoo2, strlen(kNativeFoo2))) { 7571 } else if (!strncmp(function_name, kNativeFoo2, strlen(kNativeFoo2))) {
7801 return &NativeFoo2; 7572 return &NativeFoo2;
7802 } else if (!strncmp(function_name, kNativeFoo3, strlen(kNativeFoo3))) { 7573 } else if (!strncmp(function_name, kNativeFoo3, strlen(kNativeFoo3))) {
7803 return &NativeFoo3; 7574 return &NativeFoo3;
7804 } else if (!strncmp(function_name, kNativeFoo4, strlen(kNativeFoo4))) { 7575 } else if (!strncmp(function_name, kNativeFoo4, strlen(kNativeFoo4))) {
7805 return &NativeFoo4; 7576 return &NativeFoo4;
7806 } else { 7577 } else {
7807 UNREACHABLE(); 7578 UNREACHABLE();
7808 return NULL; 7579 return NULL;
7809 } 7580 }
7810 } 7581 }
7811 7582
7812
7813 TEST_CASE(NativeFunctionClosure) { 7583 TEST_CASE(NativeFunctionClosure) {
7814 const char* kScriptChars = 7584 const char* kScriptChars =
7815 "class Test {" 7585 "class Test {"
7816 " int foo1() native \"NativeFoo1\";\n" 7586 " int foo1() native \"NativeFoo1\";\n"
7817 " int foo2(int i) native \"NativeFoo2\";\n" 7587 " int foo2(int i) native \"NativeFoo2\";\n"
7818 " int foo3([int k = 10000, int l = 1]) native \"NativeFoo3\";\n" 7588 " int foo3([int k = 10000, int l = 1]) native \"NativeFoo3\";\n"
7819 " int foo4(int i," 7589 " int foo4(int i,"
7820 " [int j = 10, int k = 1]) native \"NativeFoo4\";\n" 7590 " [int j = 10, int k = 1]) native \"NativeFoo4\";\n"
7821 " int bar1() { var func = foo1; return func(); }\n" 7591 " int bar1() { var func = foo1; return func(); }\n"
7822 " int bar2(int i) { var func = foo2; return func(i); }\n" 7592 " int bar2(int i) { var func = foo2; return func(i); }\n"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
7878 EXPECT_VALID(result); 7648 EXPECT_VALID(result);
7879 7649
7880 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 7650 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
7881 EXPECT_VALID(result); 7651 EXPECT_VALID(result);
7882 EXPECT(Dart_IsInteger(result)); 7652 EXPECT(Dart_IsInteger(result));
7883 int64_t value = 0; 7653 int64_t value = 0;
7884 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 7654 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
7885 EXPECT_EQ(0, value); 7655 EXPECT_EQ(0, value);
7886 } 7656 }
7887 7657
7888
7889 static void StaticNativeFoo1(Dart_NativeArguments args) { 7658 static void StaticNativeFoo1(Dart_NativeArguments args) {
7890 Dart_EnterScope(); 7659 Dart_EnterScope();
7891 intptr_t i = Dart_GetNativeArgumentCount(args); 7660 intptr_t i = Dart_GetNativeArgumentCount(args);
7892 EXPECT_EQ(0, i); 7661 EXPECT_EQ(0, i);
7893 Dart_SetReturnValue(args, Dart_NewInteger(0)); 7662 Dart_SetReturnValue(args, Dart_NewInteger(0));
7894 Dart_ExitScope(); 7663 Dart_ExitScope();
7895 } 7664 }
7896 7665
7897
7898 static void StaticNativeFoo2(Dart_NativeArguments args) { 7666 static void StaticNativeFoo2(Dart_NativeArguments args) {
7899 Dart_EnterScope(); 7667 Dart_EnterScope();
7900 intptr_t i = Dart_GetNativeArgumentCount(args); 7668 intptr_t i = Dart_GetNativeArgumentCount(args);
7901 EXPECT_EQ(1, i); 7669 EXPECT_EQ(1, i);
7902 Dart_Handle arg = Dart_GetNativeArgument(args, 0); 7670 Dart_Handle arg = Dart_GetNativeArgument(args, 0);
7903 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg))); 7671 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg)));
7904 Dart_ExitScope(); 7672 Dart_ExitScope();
7905 } 7673 }
7906 7674
7907
7908 static void StaticNativeFoo3(Dart_NativeArguments args) { 7675 static void StaticNativeFoo3(Dart_NativeArguments args) {
7909 Dart_EnterScope(); 7676 Dart_EnterScope();
7910 intptr_t i = Dart_GetNativeArgumentCount(args); 7677 intptr_t i = Dart_GetNativeArgumentCount(args);
7911 EXPECT_EQ(2, i); 7678 EXPECT_EQ(2, i);
7912 Dart_Handle arg1 = Dart_GetNativeArgument(args, 0); 7679 Dart_Handle arg1 = Dart_GetNativeArgument(args, 0);
7913 Dart_Handle arg2 = Dart_GetNativeArgument(args, 1); 7680 Dart_Handle arg2 = Dart_GetNativeArgument(args, 1);
7914 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2))); 7681 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2)));
7915 Dart_ExitScope(); 7682 Dart_ExitScope();
7916 } 7683 }
7917 7684
7918
7919 static void StaticNativeFoo4(Dart_NativeArguments args) { 7685 static void StaticNativeFoo4(Dart_NativeArguments args) {
7920 Dart_EnterScope(); 7686 Dart_EnterScope();
7921 intptr_t i = Dart_GetNativeArgumentCount(args); 7687 intptr_t i = Dart_GetNativeArgumentCount(args);
7922 EXPECT_EQ(3, i); 7688 EXPECT_EQ(3, i);
7923 Dart_Handle arg1 = Dart_GetNativeArgument(args, 0); 7689 Dart_Handle arg1 = Dart_GetNativeArgument(args, 0);
7924 Dart_Handle arg2 = Dart_GetNativeArgument(args, 1); 7690 Dart_Handle arg2 = Dart_GetNativeArgument(args, 1);
7925 Dart_Handle arg3 = Dart_GetNativeArgument(args, 2); 7691 Dart_Handle arg3 = Dart_GetNativeArgument(args, 2);
7926 Dart_SetReturnValue( 7692 Dart_SetReturnValue(
7927 args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3))); 7693 args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3)));
7928 Dart_ExitScope(); 7694 Dart_ExitScope();
7929 } 7695 }
7930 7696
7931
7932 static Dart_NativeFunction MyStaticNativeClosureResolver( 7697 static Dart_NativeFunction MyStaticNativeClosureResolver(
7933 Dart_Handle name, 7698 Dart_Handle name,
7934 int arg_count, 7699 int arg_count,
7935 bool* auto_setup_scope) { 7700 bool* auto_setup_scope) {
7936 ASSERT(auto_setup_scope != NULL); 7701 ASSERT(auto_setup_scope != NULL);
7937 *auto_setup_scope = false; 7702 *auto_setup_scope = false;
7938 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); 7703 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
7939 if (!obj.IsString()) { 7704 if (!obj.IsString()) {
7940 return NULL; 7705 return NULL;
7941 } 7706 }
7942 const char* function_name = obj.ToCString(); 7707 const char* function_name = obj.ToCString();
7943 const char* kNativeFoo1 = "StaticNativeFoo1"; 7708 const char* kNativeFoo1 = "StaticNativeFoo1";
7944 const char* kNativeFoo2 = "StaticNativeFoo2"; 7709 const char* kNativeFoo2 = "StaticNativeFoo2";
7945 const char* kNativeFoo3 = "StaticNativeFoo3"; 7710 const char* kNativeFoo3 = "StaticNativeFoo3";
7946 const char* kNativeFoo4 = "StaticNativeFoo4"; 7711 const char* kNativeFoo4 = "StaticNativeFoo4";
7947 if (!strncmp(function_name, kNativeFoo1, strlen(kNativeFoo1))) { 7712 if (!strncmp(function_name, kNativeFoo1, strlen(kNativeFoo1))) {
7948 return &StaticNativeFoo1; 7713 return &StaticNativeFoo1;
7949 } else if (!strncmp(function_name, kNativeFoo2, strlen(kNativeFoo2))) { 7714 } else if (!strncmp(function_name, kNativeFoo2, strlen(kNativeFoo2))) {
7950 return &StaticNativeFoo2; 7715 return &StaticNativeFoo2;
7951 } else if (!strncmp(function_name, kNativeFoo3, strlen(kNativeFoo3))) { 7716 } else if (!strncmp(function_name, kNativeFoo3, strlen(kNativeFoo3))) {
7952 return &StaticNativeFoo3; 7717 return &StaticNativeFoo3;
7953 } else if (!strncmp(function_name, kNativeFoo4, strlen(kNativeFoo4))) { 7718 } else if (!strncmp(function_name, kNativeFoo4, strlen(kNativeFoo4))) {
7954 return &StaticNativeFoo4; 7719 return &StaticNativeFoo4;
7955 } else { 7720 } else {
7956 UNREACHABLE(); 7721 UNREACHABLE();
7957 return NULL; 7722 return NULL;
7958 } 7723 }
7959 } 7724 }
7960 7725
7961
7962 TEST_CASE(NativeStaticFunctionClosure) { 7726 TEST_CASE(NativeStaticFunctionClosure) {
7963 const char* kScriptChars = 7727 const char* kScriptChars =
7964 "class Test {" 7728 "class Test {"
7965 " static int foo1() native \"StaticNativeFoo1\";\n" 7729 " static int foo1() native \"StaticNativeFoo1\";\n"
7966 " static int foo2(int i) native \"StaticNativeFoo2\";\n" 7730 " static int foo2(int i) native \"StaticNativeFoo2\";\n"
7967 " static int foo3([int k = 10000, int l = 1])" 7731 " static int foo3([int k = 10000, int l = 1])"
7968 " native \"StaticNativeFoo3\";\n" 7732 " native \"StaticNativeFoo3\";\n"
7969 " static int foo4(int i, [int j = 10, int k = 1])" 7733 " static int foo4(int i, [int j = 10, int k = 1])"
7970 " native \"StaticNativeFoo4\";\n" 7734 " native \"StaticNativeFoo4\";\n"
7971 " int bar1() { var func = foo1; return func(); }\n" 7735 " int bar1() { var func = foo1; return func(); }\n"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
8028 EXPECT_VALID(result); 7792 EXPECT_VALID(result);
8029 7793
8030 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 7794 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
8031 EXPECT_VALID(result); 7795 EXPECT_VALID(result);
8032 EXPECT(Dart_IsInteger(result)); 7796 EXPECT(Dart_IsInteger(result));
8033 int64_t value = 0; 7797 int64_t value = 0;
8034 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 7798 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
8035 EXPECT_EQ(0, value); 7799 EXPECT_EQ(0, value);
8036 } 7800 }
8037 7801
8038
8039 TEST_CASE(RangeLimits) { 7802 TEST_CASE(RangeLimits) {
8040 uint8_t chars8[1] = {'a'}; 7803 uint8_t chars8[1] = {'a'};
8041 uint16_t chars16[1] = {'a'}; 7804 uint16_t chars16[1] = {'a'};
8042 int32_t chars32[1] = {'a'}; 7805 int32_t chars32[1] = {'a'};
8043 7806
8044 EXPECT_ERROR(Dart_NewList(-1), 7807 EXPECT_ERROR(Dart_NewList(-1),
8045 "expects argument 'length' to be in the range"); 7808 "expects argument 'length' to be in the range");
8046 EXPECT_ERROR(Dart_NewList(Array::kMaxElements + 1), 7809 EXPECT_ERROR(Dart_NewList(Array::kMaxElements + 1),
8047 "expects argument 'length' to be in the range"); 7810 "expects argument 'length' to be in the range");
8048 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, -1), 7811 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, -1),
8049 "expects argument 'length' to be in the range"); 7812 "expects argument 'length' to be in the range");
8050 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, OneByteString::kMaxElements + 1), 7813 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, OneByteString::kMaxElements + 1),
8051 "expects argument 'length' to be in the range"); 7814 "expects argument 'length' to be in the range");
8052 EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, -1), 7815 EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, -1),
8053 "expects argument 'length' to be in the range"); 7816 "expects argument 'length' to be in the range");
8054 EXPECT_ERROR( 7817 EXPECT_ERROR(
8055 Dart_NewStringFromUTF16(chars16, TwoByteString::kMaxElements + 1), 7818 Dart_NewStringFromUTF16(chars16, TwoByteString::kMaxElements + 1),
8056 "expects argument 'length' to be in the range"); 7819 "expects argument 'length' to be in the range");
8057 EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, -1), 7820 EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, -1),
8058 "expects argument 'length' to be in the range"); 7821 "expects argument 'length' to be in the range");
8059 EXPECT_ERROR( 7822 EXPECT_ERROR(
8060 Dart_NewStringFromUTF32(chars32, TwoByteString::kMaxElements + 1), 7823 Dart_NewStringFromUTF32(chars32, TwoByteString::kMaxElements + 1),
8061 "expects argument 'length' to be in the range"); 7824 "expects argument 'length' to be in the range");
8062 } 7825 }
8063 7826
8064
8065 TEST_CASE(NewString_Null) { 7827 TEST_CASE(NewString_Null) {
8066 Dart_Handle str = Dart_NewStringFromUTF8(NULL, 0); 7828 Dart_Handle str = Dart_NewStringFromUTF8(NULL, 0);
8067 EXPECT_VALID(str); 7829 EXPECT_VALID(str);
8068 EXPECT(Dart_IsString(str)); 7830 EXPECT(Dart_IsString(str));
8069 intptr_t len = -1; 7831 intptr_t len = -1;
8070 EXPECT_VALID(Dart_StringLength(str, &len)); 7832 EXPECT_VALID(Dart_StringLength(str, &len));
8071 EXPECT_EQ(0, len); 7833 EXPECT_EQ(0, len);
8072 7834
8073 str = Dart_NewStringFromUTF16(NULL, 0); 7835 str = Dart_NewStringFromUTF16(NULL, 0);
8074 EXPECT_VALID(str); 7836 EXPECT_VALID(str);
8075 EXPECT(Dart_IsString(str)); 7837 EXPECT(Dart_IsString(str));
8076 len = -1; 7838 len = -1;
8077 EXPECT_VALID(Dart_StringLength(str, &len)); 7839 EXPECT_VALID(Dart_StringLength(str, &len));
8078 EXPECT_EQ(0, len); 7840 EXPECT_EQ(0, len);
8079 7841
8080 str = Dart_NewStringFromUTF32(NULL, 0); 7842 str = Dart_NewStringFromUTF32(NULL, 0);
8081 EXPECT_VALID(str); 7843 EXPECT_VALID(str);
8082 EXPECT(Dart_IsString(str)); 7844 EXPECT(Dart_IsString(str));
8083 len = -1; 7845 len = -1;
8084 EXPECT_VALID(Dart_StringLength(str, &len)); 7846 EXPECT_VALID(Dart_StringLength(str, &len));
8085 EXPECT_EQ(0, len); 7847 EXPECT_EQ(0, len);
8086 } 7848 }
8087 7849
8088
8089 // Try to allocate a peer with a handles to objects of prohibited 7850 // Try to allocate a peer with a handles to objects of prohibited
8090 // subtypes. 7851 // subtypes.
8091 TEST_CASE(InvalidGetSetPeer) { 7852 TEST_CASE(InvalidGetSetPeer) {
8092 void* out = &out; 7853 void* out = &out;
8093 EXPECT(Dart_IsError(Dart_GetPeer(Dart_Null(), &out))); 7854 EXPECT(Dart_IsError(Dart_GetPeer(Dart_Null(), &out)));
8094 EXPECT(out == &out); 7855 EXPECT(out == &out);
8095 EXPECT(Dart_IsError(Dart_SetPeer(Dart_Null(), &out))); 7856 EXPECT(Dart_IsError(Dart_SetPeer(Dart_Null(), &out)));
8096 out = &out; 7857 out = &out;
8097 EXPECT(Dart_IsError(Dart_GetPeer(Dart_True(), &out))); 7858 EXPECT(Dart_IsError(Dart_GetPeer(Dart_True(), &out)));
8098 EXPECT(out == &out); 7859 EXPECT(out == &out);
(...skipping 11 matching lines...) Expand all
8110 Dart_Handle big = Dart_NewIntegerFromHexCString("0x10000000000000000"); 7871 Dart_Handle big = Dart_NewIntegerFromHexCString("0x10000000000000000");
8111 EXPECT(Dart_IsError(Dart_GetPeer(big, &out))); 7872 EXPECT(Dart_IsError(Dart_GetPeer(big, &out)));
8112 EXPECT(out == &out); 7873 EXPECT(out == &out);
8113 EXPECT(Dart_IsError(Dart_SetPeer(big, &out))); 7874 EXPECT(Dart_IsError(Dart_SetPeer(big, &out)));
8114 Dart_Handle dbl = Dart_NewDouble(0.0); 7875 Dart_Handle dbl = Dart_NewDouble(0.0);
8115 EXPECT(Dart_IsError(Dart_GetPeer(dbl, &out))); 7876 EXPECT(Dart_IsError(Dart_GetPeer(dbl, &out)));
8116 EXPECT(out == &out); 7877 EXPECT(out == &out);
8117 EXPECT(Dart_IsError(Dart_SetPeer(dbl, &out))); 7878 EXPECT(Dart_IsError(Dart_SetPeer(dbl, &out)));
8118 } 7879 }
8119 7880
8120
8121 // Allocates an object in new space and assigns it a peer. Removes 7881 // Allocates an object in new space and assigns it a peer. Removes
8122 // the peer and checks that the count of peer objects is decremented 7882 // the peer and checks that the count of peer objects is decremented
8123 // by one. 7883 // by one.
8124 TEST_CASE(OneNewSpacePeer) { 7884 TEST_CASE(OneNewSpacePeer) {
8125 Isolate* isolate = Isolate::Current(); 7885 Isolate* isolate = Isolate::Current();
8126 Dart_Handle str = NewString("a string"); 7886 Dart_Handle str = NewString("a string");
8127 EXPECT_VALID(str); 7887 EXPECT_VALID(str);
8128 EXPECT(Dart_IsString(str)); 7888 EXPECT(Dart_IsString(str));
8129 EXPECT_EQ(0, isolate->heap()->PeerCount()); 7889 EXPECT_EQ(0, isolate->heap()->PeerCount());
8130 void* out = &out; 7890 void* out = &out;
8131 EXPECT_VALID(Dart_GetPeer(str, &out)); 7891 EXPECT_VALID(Dart_GetPeer(str, &out));
8132 EXPECT(out == NULL); 7892 EXPECT(out == NULL);
8133 int peer = 1234; 7893 int peer = 1234;
8134 EXPECT_VALID(Dart_SetPeer(str, &peer)); 7894 EXPECT_VALID(Dart_SetPeer(str, &peer));
8135 EXPECT_EQ(1, isolate->heap()->PeerCount()); 7895 EXPECT_EQ(1, isolate->heap()->PeerCount());
8136 out = &out; 7896 out = &out;
8137 EXPECT_VALID(Dart_GetPeer(str, &out)); 7897 EXPECT_VALID(Dart_GetPeer(str, &out));
8138 EXPECT(out == reinterpret_cast<void*>(&peer)); 7898 EXPECT(out == reinterpret_cast<void*>(&peer));
8139 EXPECT_VALID(Dart_SetPeer(str, NULL)); 7899 EXPECT_VALID(Dart_SetPeer(str, NULL));
8140 out = &out; 7900 out = &out;
8141 EXPECT_VALID(Dart_GetPeer(str, &out)); 7901 EXPECT_VALID(Dart_GetPeer(str, &out));
8142 EXPECT(out == NULL); 7902 EXPECT(out == NULL);
8143 EXPECT_EQ(0, isolate->heap()->PeerCount()); 7903 EXPECT_EQ(0, isolate->heap()->PeerCount());
8144 } 7904 }
8145 7905
8146
8147 // Allocates an object in new space and assigns it a peer. Allows the 7906 // Allocates an object in new space and assigns it a peer. Allows the
8148 // peer referent to be garbage collected and checks that the count of 7907 // peer referent to be garbage collected and checks that the count of
8149 // peer objects is decremented by one. 7908 // peer objects is decremented by one.
8150 TEST_CASE(CollectOneNewSpacePeer) { 7909 TEST_CASE(CollectOneNewSpacePeer) {
8151 Isolate* isolate = Isolate::Current(); 7910 Isolate* isolate = Isolate::Current();
8152 Dart_EnterScope(); 7911 Dart_EnterScope();
8153 { 7912 {
8154 CHECK_API_SCOPE(thread); 7913 CHECK_API_SCOPE(thread);
8155 HANDLESCOPE(thread); 7914 HANDLESCOPE(thread);
8156 Dart_Handle str = NewString("a string"); 7915 Dart_Handle str = NewString("a string");
(...skipping 19 matching lines...) Expand all
8176 EXPECT(out == reinterpret_cast<void*>(&peer)); 7935 EXPECT(out == reinterpret_cast<void*>(&peer));
8177 } 7936 }
8178 Dart_ExitScope(); 7937 Dart_ExitScope();
8179 { 7938 {
8180 TransitionNativeToVM transition(thread); 7939 TransitionNativeToVM transition(thread);
8181 isolate->heap()->CollectGarbage(Heap::kNew); 7940 isolate->heap()->CollectGarbage(Heap::kNew);
8182 EXPECT_EQ(0, isolate->heap()->PeerCount()); 7941 EXPECT_EQ(0, isolate->heap()->PeerCount());
8183 } 7942 }
8184 } 7943 }
8185 7944
8186
8187 // Allocates two objects in new space and assigns them peers. Removes 7945 // Allocates two objects in new space and assigns them peers. Removes
8188 // the peers and checks that the count of peer objects is decremented 7946 // the peers and checks that the count of peer objects is decremented
8189 // by two. 7947 // by two.
8190 TEST_CASE(TwoNewSpacePeers) { 7948 TEST_CASE(TwoNewSpacePeers) {
8191 Isolate* isolate = Isolate::Current(); 7949 Isolate* isolate = Isolate::Current();
8192 Dart_Handle s1 = NewString("s1"); 7950 Dart_Handle s1 = NewString("s1");
8193 EXPECT_VALID(s1); 7951 EXPECT_VALID(s1);
8194 EXPECT(Dart_IsString(s1)); 7952 EXPECT(Dart_IsString(s1));
8195 void* o1 = &o1; 7953 void* o1 = &o1;
8196 EXPECT_VALID(Dart_GetPeer(s1, &o1)); 7954 EXPECT_VALID(Dart_GetPeer(s1, &o1));
(...skipping 19 matching lines...) Expand all
8216 EXPECT_VALID(Dart_SetPeer(s1, NULL)); 7974 EXPECT_VALID(Dart_SetPeer(s1, NULL));
8217 EXPECT_EQ(1, isolate->heap()->PeerCount()); 7975 EXPECT_EQ(1, isolate->heap()->PeerCount());
8218 EXPECT(Dart_GetPeer(s1, &o1)); 7976 EXPECT(Dart_GetPeer(s1, &o1));
8219 EXPECT(o1 == NULL); 7977 EXPECT(o1 == NULL);
8220 EXPECT_VALID(Dart_SetPeer(s2, NULL)); 7978 EXPECT_VALID(Dart_SetPeer(s2, NULL));
8221 EXPECT_EQ(0, isolate->heap()->PeerCount()); 7979 EXPECT_EQ(0, isolate->heap()->PeerCount());
8222 EXPECT(Dart_GetPeer(s2, &o2)); 7980 EXPECT(Dart_GetPeer(s2, &o2));
8223 EXPECT(o2 == NULL); 7981 EXPECT(o2 == NULL);
8224 } 7982 }
8225 7983
8226
8227 // Allocates two objects in new space and assigns them a peer. Allow 7984 // Allocates two objects in new space and assigns them a peer. Allow
8228 // the peer referents to be garbage collected and check that the count 7985 // the peer referents to be garbage collected and check that the count
8229 // of peer objects is decremented by two. 7986 // of peer objects is decremented by two.
8230 TEST_CASE(CollectTwoNewSpacePeers) { 7987 TEST_CASE(CollectTwoNewSpacePeers) {
8231 Isolate* isolate = Isolate::Current(); 7988 Isolate* isolate = Isolate::Current();
8232 Dart_EnterScope(); 7989 Dart_EnterScope();
8233 { 7990 {
8234 CHECK_API_SCOPE(thread); 7991 CHECK_API_SCOPE(thread);
8235 HANDLESCOPE(thread); 7992 HANDLESCOPE(thread);
8236 Dart_Handle s1 = NewString("s1"); 7993 Dart_Handle s1 = NewString("s1");
(...skipping 22 matching lines...) Expand all
8259 EXPECT(o2 == reinterpret_cast<void*>(&p2)); 8016 EXPECT(o2 == reinterpret_cast<void*>(&p2));
8260 } 8017 }
8261 Dart_ExitScope(); 8018 Dart_ExitScope();
8262 { 8019 {
8263 TransitionNativeToVM transition(thread); 8020 TransitionNativeToVM transition(thread);
8264 isolate->heap()->CollectGarbage(Heap::kNew); 8021 isolate->heap()->CollectGarbage(Heap::kNew);
8265 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8022 EXPECT_EQ(0, isolate->heap()->PeerCount());
8266 } 8023 }
8267 } 8024 }
8268 8025
8269
8270 // Allocates several objects in new space. Performs successive 8026 // Allocates several objects in new space. Performs successive
8271 // garbage collections and checks that the peer count is stable. 8027 // garbage collections and checks that the peer count is stable.
8272 TEST_CASE(CopyNewSpacePeers) { 8028 TEST_CASE(CopyNewSpacePeers) {
8273 const int kPeerCount = 10; 8029 const int kPeerCount = 10;
8274 Isolate* isolate = Isolate::Current(); 8030 Isolate* isolate = Isolate::Current();
8275 Dart_Handle s[kPeerCount]; 8031 Dart_Handle s[kPeerCount];
8276 for (int i = 0; i < kPeerCount; ++i) { 8032 for (int i = 0; i < kPeerCount; ++i) {
8277 s[i] = NewString("a string"); 8033 s[i] = NewString("a string");
8278 EXPECT_VALID(s[i]); 8034 EXPECT_VALID(s[i]);
8279 EXPECT(Dart_IsString(s[i])); 8035 EXPECT(Dart_IsString(s[i]));
(...skipping 13 matching lines...) Expand all
8293 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount()); 8049 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount());
8294 { 8050 {
8295 TransitionNativeToVM transition(thread); 8051 TransitionNativeToVM transition(thread);
8296 isolate->heap()->CollectGarbage(Heap::kNew); 8052 isolate->heap()->CollectGarbage(Heap::kNew);
8297 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount()); 8053 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount());
8298 isolate->heap()->CollectGarbage(Heap::kNew); 8054 isolate->heap()->CollectGarbage(Heap::kNew);
8299 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount()); 8055 EXPECT_EQ(kPeerCount, isolate->heap()->PeerCount());
8300 } 8056 }
8301 } 8057 }
8302 8058
8303
8304 // Allocates an object in new space and assigns it a peer. Promotes 8059 // Allocates an object in new space and assigns it a peer. Promotes
8305 // the peer to old space. Removes the peer and check that the count 8060 // the peer to old space. Removes the peer and check that the count
8306 // of peer objects is decremented by one. 8061 // of peer objects is decremented by one.
8307 TEST_CASE(OnePromotedPeer) { 8062 TEST_CASE(OnePromotedPeer) {
8308 Isolate* isolate = Isolate::Current(); 8063 Isolate* isolate = Isolate::Current();
8309 Dart_Handle str = NewString("a string"); 8064 Dart_Handle str = NewString("a string");
8310 EXPECT_VALID(str); 8065 EXPECT_VALID(str);
8311 EXPECT(Dart_IsString(str)); 8066 EXPECT(Dart_IsString(str));
8312 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8067 EXPECT_EQ(0, isolate->heap()->PeerCount());
8313 void* out = &out; 8068 void* out = &out;
(...skipping 20 matching lines...) Expand all
8334 EXPECT_VALID(Dart_GetPeer(str, &out)); 8089 EXPECT_VALID(Dart_GetPeer(str, &out));
8335 EXPECT(out == reinterpret_cast<void*>(&peer)); 8090 EXPECT(out == reinterpret_cast<void*>(&peer));
8336 EXPECT_EQ(1, isolate->heap()->PeerCount()); 8091 EXPECT_EQ(1, isolate->heap()->PeerCount());
8337 EXPECT_VALID(Dart_SetPeer(str, NULL)); 8092 EXPECT_VALID(Dart_SetPeer(str, NULL));
8338 out = &out; 8093 out = &out;
8339 EXPECT_VALID(Dart_GetPeer(str, &out)); 8094 EXPECT_VALID(Dart_GetPeer(str, &out));
8340 EXPECT(out == NULL); 8095 EXPECT(out == NULL);
8341 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8096 EXPECT_EQ(0, isolate->heap()->PeerCount());
8342 } 8097 }
8343 8098
8344
8345 // Allocates an object in old space and assigns it a peer. Removes 8099 // Allocates an object in old space and assigns it a peer. Removes
8346 // the peer and checks that the count of peer objects is decremented 8100 // the peer and checks that the count of peer objects is decremented
8347 // by one. 8101 // by one.
8348 TEST_CASE(OneOldSpacePeer) { 8102 TEST_CASE(OneOldSpacePeer) {
8349 Isolate* isolate = Isolate::Current(); 8103 Isolate* isolate = Isolate::Current();
8350 Dart_Handle str = Api::NewHandle(thread, String::New("str", Heap::kOld)); 8104 Dart_Handle str = Api::NewHandle(thread, String::New("str", Heap::kOld));
8351 EXPECT_VALID(str); 8105 EXPECT_VALID(str);
8352 EXPECT(Dart_IsString(str)); 8106 EXPECT(Dart_IsString(str));
8353 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8107 EXPECT_EQ(0, isolate->heap()->PeerCount());
8354 void* out = &out; 8108 void* out = &out;
(...skipping 12 matching lines...) Expand all
8367 } 8121 }
8368 EXPECT_VALID(Dart_GetPeer(str, &out)); 8122 EXPECT_VALID(Dart_GetPeer(str, &out));
8369 EXPECT(out == reinterpret_cast<void*>(&peer)); 8123 EXPECT(out == reinterpret_cast<void*>(&peer));
8370 EXPECT_VALID(Dart_SetPeer(str, NULL)); 8124 EXPECT_VALID(Dart_SetPeer(str, NULL));
8371 out = &out; 8125 out = &out;
8372 EXPECT_VALID(Dart_GetPeer(str, &out)); 8126 EXPECT_VALID(Dart_GetPeer(str, &out));
8373 EXPECT(out == NULL); 8127 EXPECT(out == NULL);
8374 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8128 EXPECT_EQ(0, isolate->heap()->PeerCount());
8375 } 8129 }
8376 8130
8377
8378 // Allocates an object in old space and assigns it a peer. Allow the 8131 // Allocates an object in old space and assigns it a peer. Allow the
8379 // peer referent to be garbage collected and check that the count of 8132 // peer referent to be garbage collected and check that the count of
8380 // peer objects is decremented by one. 8133 // peer objects is decremented by one.
8381 TEST_CASE(CollectOneOldSpacePeer) { 8134 TEST_CASE(CollectOneOldSpacePeer) {
8382 Isolate* isolate = Isolate::Current(); 8135 Isolate* isolate = Isolate::Current();
8383 Dart_EnterScope(); 8136 Dart_EnterScope();
8384 { 8137 {
8385 Thread* T = Thread::Current(); 8138 Thread* T = Thread::Current();
8386 CHECK_API_SCOPE(T); 8139 CHECK_API_SCOPE(T);
8387 HANDLESCOPE(T); 8140 HANDLESCOPE(T);
(...skipping 19 matching lines...) Expand all
8407 EXPECT(out == reinterpret_cast<void*>(&peer)); 8160 EXPECT(out == reinterpret_cast<void*>(&peer));
8408 } 8161 }
8409 Dart_ExitScope(); 8162 Dart_ExitScope();
8410 { 8163 {
8411 TransitionNativeToVM transition(thread); 8164 TransitionNativeToVM transition(thread);
8412 isolate->heap()->CollectGarbage(Heap::kOld); 8165 isolate->heap()->CollectGarbage(Heap::kOld);
8413 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8166 EXPECT_EQ(0, isolate->heap()->PeerCount());
8414 } 8167 }
8415 } 8168 }
8416 8169
8417
8418 // Allocates two objects in old space and assigns them peers. Removes 8170 // Allocates two objects in old space and assigns them peers. Removes
8419 // the peers and checks that the count of peer objects is decremented 8171 // the peers and checks that the count of peer objects is decremented
8420 // by two. 8172 // by two.
8421 TEST_CASE(TwoOldSpacePeers) { 8173 TEST_CASE(TwoOldSpacePeers) {
8422 Isolate* isolate = Isolate::Current(); 8174 Isolate* isolate = Isolate::Current();
8423 Dart_Handle s1 = Api::NewHandle(thread, String::New("s1", Heap::kOld)); 8175 Dart_Handle s1 = Api::NewHandle(thread, String::New("s1", Heap::kOld));
8424 EXPECT_VALID(s1); 8176 EXPECT_VALID(s1);
8425 EXPECT(Dart_IsString(s1)); 8177 EXPECT(Dart_IsString(s1));
8426 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8178 EXPECT_EQ(0, isolate->heap()->PeerCount());
8427 void* o1 = &o1; 8179 void* o1 = &o1;
(...skipping 23 matching lines...) Expand all
8451 o1 = &o1; 8203 o1 = &o1;
8452 EXPECT(Dart_GetPeer(s1, &o1)); 8204 EXPECT(Dart_GetPeer(s1, &o1));
8453 EXPECT(o1 == NULL); 8205 EXPECT(o1 == NULL);
8454 EXPECT_VALID(Dart_SetPeer(s2, NULL)); 8206 EXPECT_VALID(Dart_SetPeer(s2, NULL));
8455 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8207 EXPECT_EQ(0, isolate->heap()->PeerCount());
8456 o2 = &o2; 8208 o2 = &o2;
8457 EXPECT_VALID(Dart_GetPeer(s2, &o2)); 8209 EXPECT_VALID(Dart_GetPeer(s2, &o2));
8458 EXPECT(o2 == NULL); 8210 EXPECT(o2 == NULL);
8459 } 8211 }
8460 8212
8461
8462 // Allocates two objects in old space and assigns them a peer. Allows 8213 // Allocates two objects in old space and assigns them a peer. Allows
8463 // the peer referents to be garbage collected and checks that the 8214 // the peer referents to be garbage collected and checks that the
8464 // count of peer objects is decremented by two. 8215 // count of peer objects is decremented by two.
8465 TEST_CASE(CollectTwoOldSpacePeers) { 8216 TEST_CASE(CollectTwoOldSpacePeers) {
8466 Isolate* isolate = Isolate::Current(); 8217 Isolate* isolate = Isolate::Current();
8467 Dart_EnterScope(); 8218 Dart_EnterScope();
8468 { 8219 {
8469 Thread* T = Thread::Current(); 8220 Thread* T = Thread::Current();
8470 CHECK_API_SCOPE(T); 8221 CHECK_API_SCOPE(T);
8471 HANDLESCOPE(T); 8222 HANDLESCOPE(T);
(...skipping 25 matching lines...) Expand all
8497 EXPECT(o2 == reinterpret_cast<void*>(&p2)); 8248 EXPECT(o2 == reinterpret_cast<void*>(&p2));
8498 } 8249 }
8499 Dart_ExitScope(); 8250 Dart_ExitScope();
8500 { 8251 {
8501 TransitionNativeToVM transition(thread); 8252 TransitionNativeToVM transition(thread);
8502 isolate->heap()->CollectGarbage(Heap::kOld); 8253 isolate->heap()->CollectGarbage(Heap::kOld);
8503 EXPECT_EQ(0, isolate->heap()->PeerCount()); 8254 EXPECT_EQ(0, isolate->heap()->PeerCount());
8504 } 8255 }
8505 } 8256 }
8506 8257
8507
8508 // Test API call to make strings external. 8258 // Test API call to make strings external.
8509 static void MakeExternalCback(void* peer) { 8259 static void MakeExternalCback(void* peer) {
8510 *static_cast<int*>(peer) *= 2; 8260 *static_cast<int*>(peer) *= 2;
8511 } 8261 }
8512 8262
8513
8514 TEST_CASE(MakeExternalString) { 8263 TEST_CASE(MakeExternalString) {
8515 const bool saved_flag = FLAG_support_externalizable_strings; 8264 const bool saved_flag = FLAG_support_externalizable_strings;
8516 FLAG_support_externalizable_strings = true; 8265 FLAG_support_externalizable_strings = true;
8517 8266
8518 static int peer8 = 40; 8267 static int peer8 = 40;
8519 static int peer16 = 41; 8268 static int peer16 = 41;
8520 static int canonical_str_peer = 42; 8269 static int canonical_str_peer = 42;
8521 intptr_t length = 0; 8270 intptr_t length = 0;
8522 intptr_t expected_length = 0; 8271 intptr_t expected_length = 0;
8523 { 8272 {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
8689 Isolate::Current()->heap()->CollectAllGarbage(); 8438 Isolate::Current()->heap()->CollectAllGarbage();
8690 GCTestHelper::WaitForGCTasks(); 8439 GCTestHelper::WaitForGCTasks();
8691 } 8440 }
8692 EXPECT_EQ(80, peer8); 8441 EXPECT_EQ(80, peer8);
8693 EXPECT_EQ(82, peer16); 8442 EXPECT_EQ(82, peer16);
8694 EXPECT_EQ(42, canonical_str_peer); // "*" Symbol is not removed on GC. 8443 EXPECT_EQ(42, canonical_str_peer); // "*" Symbol is not removed on GC.
8695 8444
8696 FLAG_support_externalizable_strings = saved_flag; 8445 FLAG_support_externalizable_strings = saved_flag;
8697 } 8446 }
8698 8447
8699
8700 TEST_CASE(ExternalizeConstantStrings) { 8448 TEST_CASE(ExternalizeConstantStrings) {
8701 const bool saved_flag = FLAG_support_externalizable_strings; 8449 const bool saved_flag = FLAG_support_externalizable_strings;
8702 FLAG_support_externalizable_strings = true; 8450 FLAG_support_externalizable_strings = true;
8703 8451
8704 const char* kScriptChars = 8452 const char* kScriptChars =
8705 "String testMain() {\n" 8453 "String testMain() {\n"
8706 " return 'constant string';\n" 8454 " return 'constant string';\n"
8707 "}\n"; 8455 "}\n";
8708 8456
8709 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 8457 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
8710 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 8458 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
8711 const char* expected_str = "constant string"; 8459 const char* expected_str = "constant string";
8712 const intptr_t kExpectedLen = 15; 8460 const intptr_t kExpectedLen = 15;
8713 uint8_t ext_str[kExpectedLen]; 8461 uint8_t ext_str[kExpectedLen];
8714 Dart_Handle str = 8462 Dart_Handle str =
8715 Dart_MakeExternalString(result, ext_str, kExpectedLen, NULL, NULL); 8463 Dart_MakeExternalString(result, ext_str, kExpectedLen, NULL, NULL);
8716 8464
8717 EXPECT(Dart_IsExternalString(str)); 8465 EXPECT(Dart_IsExternalString(str));
8718 for (intptr_t i = 0; i < kExpectedLen; i++) { 8466 for (intptr_t i = 0; i < kExpectedLen; i++) {
8719 EXPECT_EQ(expected_str[i], ext_str[i]); 8467 EXPECT_EQ(expected_str[i], ext_str[i]);
8720 } 8468 }
8721 8469
8722 FLAG_support_externalizable_strings = saved_flag; 8470 FLAG_support_externalizable_strings = saved_flag;
8723 } 8471 }
8724 8472
8725
8726 TEST_CASE(LazyLoadDeoptimizes) { 8473 TEST_CASE(LazyLoadDeoptimizes) {
8727 const char* kLoadFirst = 8474 const char* kLoadFirst =
8728 "library L;\n" 8475 "library L;\n"
8729 "start(a) {\n" 8476 "start(a) {\n"
8730 " var obj = (a == 1) ? createB() : new A();\n" 8477 " var obj = (a == 1) ? createB() : new A();\n"
8731 " for (int i = 0; i < 4000; i++) {\n" 8478 " for (int i = 0; i < 4000; i++) {\n"
8732 " var res = obj.foo();\n" 8479 " var res = obj.foo();\n"
8733 " if (a == 1) { if (res != 1) throw 'Error'; }\n" 8480 " if (a == 1) { if (res != 1) throw 'Error'; }\n"
8734 " else if (res != 2) throw 'Error'; \n" 8481 " else if (res != 2) throw 'Error'; \n"
8735 " }\n" 8482 " }\n"
(...skipping 22 matching lines...) Expand all
8758 Dart_Handle url = NewString(TestCase::url()); 8505 Dart_Handle url = NewString(TestCase::url());
8759 Dart_LoadSource(TestCase::lib(), url, Dart_Null(), source, 0, 0); 8506 Dart_LoadSource(TestCase::lib(), url, Dart_Null(), source, 0, 0);
8760 result = Dart_FinalizeLoading(false); 8507 result = Dart_FinalizeLoading(false);
8761 EXPECT_VALID(result); 8508 EXPECT_VALID(result);
8762 8509
8763 dart_args[0] = Dart_NewInteger(1); 8510 dart_args[0] = Dart_NewInteger(1);
8764 result = Dart_Invoke(lib1, NewString("start"), 1, dart_args); 8511 result = Dart_Invoke(lib1, NewString("start"), 1, dart_args);
8765 EXPECT_VALID(result); 8512 EXPECT_VALID(result);
8766 } 8513 }
8767 8514
8768
8769 // Test external strings and optimized code. 8515 // Test external strings and optimized code.
8770 static void ExternalStringDeoptimize_Finalize(void* peer) { 8516 static void ExternalStringDeoptimize_Finalize(void* peer) {
8771 delete[] reinterpret_cast<char*>(peer); 8517 delete[] reinterpret_cast<char*>(peer);
8772 } 8518 }
8773 8519
8774
8775 static void A_change_str_native(Dart_NativeArguments args) { 8520 static void A_change_str_native(Dart_NativeArguments args) {
8776 Dart_EnterScope(); 8521 Dart_EnterScope();
8777 Dart_Handle str = Dart_GetNativeArgument(args, 0); 8522 Dart_Handle str = Dart_GetNativeArgument(args, 0);
8778 EXPECT(Dart_IsString(str)); 8523 EXPECT(Dart_IsString(str));
8779 void* peer; 8524 void* peer;
8780 Dart_Handle str_arg = Dart_GetNativeStringArgument(args, 0, &peer); 8525 Dart_Handle str_arg = Dart_GetNativeStringArgument(args, 0, &peer);
8781 EXPECT(Dart_IsString(str_arg)); 8526 EXPECT(Dart_IsString(str_arg));
8782 EXPECT(!peer); 8527 EXPECT(!peer);
8783 intptr_t size = 0; 8528 intptr_t size = 0;
8784 EXPECT_VALID(Dart_StringStorageSize(str, &size)); 8529 EXPECT_VALID(Dart_StringStorageSize(str, &size));
8785 intptr_t arg_size = 0; 8530 intptr_t arg_size = 0;
8786 EXPECT_VALID(Dart_StringStorageSize(str_arg, &arg_size)); 8531 EXPECT_VALID(Dart_StringStorageSize(str_arg, &arg_size));
8787 EXPECT_EQ(size, arg_size); 8532 EXPECT_EQ(size, arg_size);
8788 char* str_data = new char[size]; 8533 char* str_data = new char[size];
8789 Dart_Handle result = Dart_MakeExternalString( 8534 Dart_Handle result = Dart_MakeExternalString(
8790 str, str_data, size, str_data, &ExternalStringDeoptimize_Finalize); 8535 str, str_data, size, str_data, &ExternalStringDeoptimize_Finalize);
8791 EXPECT_VALID(result); 8536 EXPECT_VALID(result);
8792 EXPECT(Dart_IsExternalString(result)); 8537 EXPECT(Dart_IsExternalString(result));
8793 Dart_ExitScope(); 8538 Dart_ExitScope();
8794 } 8539 }
8795 8540
8796
8797 static Dart_NativeFunction ExternalStringDeoptimize_native_lookup( 8541 static Dart_NativeFunction ExternalStringDeoptimize_native_lookup(
8798 Dart_Handle name, 8542 Dart_Handle name,
8799 int argument_count, 8543 int argument_count,
8800 bool* auto_setup_scope) { 8544 bool* auto_setup_scope) {
8801 ASSERT(auto_setup_scope != NULL); 8545 ASSERT(auto_setup_scope != NULL);
8802 *auto_setup_scope = true; 8546 *auto_setup_scope = true;
8803 return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native); 8547 return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native);
8804 } 8548 }
8805 8549
8806
8807 // Do not use guarding mechanism on externalizable classes, since their class 8550 // Do not use guarding mechanism on externalizable classes, since their class
8808 // can change on the fly, 8551 // can change on the fly,
8809 TEST_CASE(GuardExternalizedString) { 8552 TEST_CASE(GuardExternalizedString) {
8810 const bool saved_flag = FLAG_support_externalizable_strings; 8553 const bool saved_flag = FLAG_support_externalizable_strings;
8811 FLAG_support_externalizable_strings = true; 8554 FLAG_support_externalizable_strings = true;
8812 8555
8813 const char* kScriptChars = 8556 const char* kScriptChars =
8814 "main() {\n" 8557 "main() {\n"
8815 " var a = new A('hello');\n" 8558 " var a = new A('hello');\n"
8816 " var res = runOne(a);\n" 8559 " var res = runOne(a);\n"
(...skipping 21 matching lines...) Expand all
8838 kScriptChars, &ExternalStringDeoptimize_native_lookup); 8581 kScriptChars, &ExternalStringDeoptimize_native_lookup);
8839 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8582 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
8840 int64_t value = 0; 8583 int64_t value = 0;
8841 result = Dart_IntegerToInt64(result, &value); 8584 result = Dart_IntegerToInt64(result, &value);
8842 EXPECT_VALID(result); 8585 EXPECT_VALID(result);
8843 EXPECT_EQ(10640000, value); 8586 EXPECT_EQ(10640000, value);
8844 8587
8845 FLAG_support_externalizable_strings = saved_flag; 8588 FLAG_support_externalizable_strings = saved_flag;
8846 } 8589 }
8847 8590
8848
8849 TEST_CASE(ExternalStringDeoptimize) { 8591 TEST_CASE(ExternalStringDeoptimize) {
8850 const bool saved_flag = FLAG_support_externalizable_strings; 8592 const bool saved_flag = FLAG_support_externalizable_strings;
8851 FLAG_support_externalizable_strings = true; 8593 FLAG_support_externalizable_strings = true;
8852 8594
8853 const char* kScriptChars = 8595 const char* kScriptChars =
8854 "String str = 'A';\n" 8596 "String str = 'A';\n"
8855 "class A {\n" 8597 "class A {\n"
8856 " static change_str(String s) native 'A_change_str';\n" 8598 " static change_str(String s) native 'A_change_str';\n"
8857 "}\n" 8599 "}\n"
8858 "sum_chars(String s, bool b) {\n" 8600 "sum_chars(String s, bool b) {\n"
(...skipping 15 matching lines...) Expand all
8874 kScriptChars, &ExternalStringDeoptimize_native_lookup); 8616 kScriptChars, &ExternalStringDeoptimize_native_lookup);
8875 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8617 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
8876 int64_t value = 0; 8618 int64_t value = 0;
8877 result = Dart_IntegerToInt64(result, &value); 8619 result = Dart_IntegerToInt64(result, &value);
8878 EXPECT_VALID(result); 8620 EXPECT_VALID(result);
8879 EXPECT_EQ(260, value); 8621 EXPECT_EQ(260, value);
8880 8622
8881 FLAG_support_externalizable_strings = saved_flag; 8623 FLAG_support_externalizable_strings = saved_flag;
8882 } 8624 }
8883 8625
8884
8885 TEST_CASE(ExternalStringPolymorphicDeoptimize) { 8626 TEST_CASE(ExternalStringPolymorphicDeoptimize) {
8886 const bool saved_flag = FLAG_support_externalizable_strings; 8627 const bool saved_flag = FLAG_support_externalizable_strings;
8887 FLAG_support_externalizable_strings = true; 8628 FLAG_support_externalizable_strings = true;
8888 8629
8889 const char* kScriptChars = 8630 const char* kScriptChars =
8890 "const strA = 'AAAA';\n" 8631 "const strA = 'AAAA';\n"
8891 "class A {\n" 8632 "class A {\n"
8892 " static change_str(String s) native 'A_change_str';\n" 8633 " static change_str(String s) native 'A_change_str';\n"
8893 "}\n" 8634 "}\n"
8894 "compare(a, b, [i = 0]) {\n" 8635 "compare(a, b, [i = 0]) {\n"
(...skipping 16 matching lines...) Expand all
8911 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8652 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
8912 EXPECT_VALID(result); 8653 EXPECT_VALID(result);
8913 bool value = false; 8654 bool value = false;
8914 result = Dart_BooleanValue(result, &value); 8655 result = Dart_BooleanValue(result, &value);
8915 EXPECT_VALID(result); 8656 EXPECT_VALID(result);
8916 EXPECT(value); 8657 EXPECT(value);
8917 8658
8918 FLAG_support_externalizable_strings = saved_flag; 8659 FLAG_support_externalizable_strings = saved_flag;
8919 } 8660 }
8920 8661
8921
8922 TEST_CASE(ExternalStringLoadElimination) { 8662 TEST_CASE(ExternalStringLoadElimination) {
8923 const bool saved_flag = FLAG_support_externalizable_strings; 8663 const bool saved_flag = FLAG_support_externalizable_strings;
8924 FLAG_support_externalizable_strings = true; 8664 FLAG_support_externalizable_strings = true;
8925 8665
8926 const char* kScriptChars = 8666 const char* kScriptChars =
8927 "class A {\n" 8667 "class A {\n"
8928 " static change_str(String s) native 'A_change_str';\n" 8668 " static change_str(String s) native 'A_change_str';\n"
8929 "}\n" 8669 "}\n"
8930 "double_char0(str) {\n" 8670 "double_char0(str) {\n"
8931 " return str.codeUnitAt(0) + str.codeUnitAt(0);\n" 8671 " return str.codeUnitAt(0) + str.codeUnitAt(0);\n"
(...skipping 10 matching lines...) Expand all
8942 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8682 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
8943 EXPECT_VALID(result); 8683 EXPECT_VALID(result);
8944 bool value = false; 8684 bool value = false;
8945 result = Dart_BooleanValue(result, &value); 8685 result = Dart_BooleanValue(result, &value);
8946 EXPECT_VALID(result); 8686 EXPECT_VALID(result);
8947 EXPECT(value); 8687 EXPECT(value);
8948 8688
8949 FLAG_support_externalizable_strings = saved_flag; 8689 FLAG_support_externalizable_strings = saved_flag;
8950 } 8690 }
8951 8691
8952
8953 TEST_CASE(ExternalStringGuardFieldDeoptimize) { 8692 TEST_CASE(ExternalStringGuardFieldDeoptimize) {
8954 const bool saved_flag = FLAG_support_externalizable_strings; 8693 const bool saved_flag = FLAG_support_externalizable_strings;
8955 FLAG_support_externalizable_strings = true; 8694 FLAG_support_externalizable_strings = true;
8956 8695
8957 const char* kScriptChars = 8696 const char* kScriptChars =
8958 "const strA = 'AAAA';\n" 8697 "const strA = 'AAAA';\n"
8959 "class A {\n" 8698 "class A {\n"
8960 " static change_str(String s) native 'A_change_str';\n" 8699 " static change_str(String s) native 'A_change_str';\n"
8961 "}\n" 8700 "}\n"
8962 "class G { var f = 'A'; }\n" 8701 "class G { var f = 'A'; }\n"
(...skipping 21 matching lines...) Expand all
8984 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8723 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
8985 EXPECT_VALID(result); 8724 EXPECT_VALID(result);
8986 bool value = false; 8725 bool value = false;
8987 result = Dart_BooleanValue(result, &value); 8726 result = Dart_BooleanValue(result, &value);
8988 EXPECT_VALID(result); 8727 EXPECT_VALID(result);
8989 EXPECT(value); 8728 EXPECT(value);
8990 8729
8991 FLAG_support_externalizable_strings = saved_flag; 8730 FLAG_support_externalizable_strings = saved_flag;
8992 } 8731 }
8993 8732
8994
8995 TEST_CASE(ExternalStringStaticFieldDeoptimize) { 8733 TEST_CASE(ExternalStringStaticFieldDeoptimize) {
8996 const bool saved_flag = FLAG_support_externalizable_strings; 8734 const bool saved_flag = FLAG_support_externalizable_strings;
8997 FLAG_support_externalizable_strings = true; 8735 FLAG_support_externalizable_strings = true;
8998 8736
8999 const char* kScriptChars = 8737 const char* kScriptChars =
9000 "const strA = 'AAAA';\n" 8738 "const strA = 'AAAA';\n"
9001 "class A {\n" 8739 "class A {\n"
9002 " static change_str(String s) native 'A_change_str';\n" 8740 " static change_str(String s) native 'A_change_str';\n"
9003 "}\n" 8741 "}\n"
9004 "class G { static final f = strA; }\n" 8742 "class G { static final f = strA; }\n"
(...skipping 16 matching lines...) Expand all
9021 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8759 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9022 EXPECT_VALID(result); 8760 EXPECT_VALID(result);
9023 bool value = false; 8761 bool value = false;
9024 result = Dart_BooleanValue(result, &value); 8762 result = Dart_BooleanValue(result, &value);
9025 EXPECT_VALID(result); 8763 EXPECT_VALID(result);
9026 EXPECT(value); 8764 EXPECT(value);
9027 8765
9028 FLAG_support_externalizable_strings = saved_flag; 8766 FLAG_support_externalizable_strings = saved_flag;
9029 } 8767 }
9030 8768
9031
9032 TEST_CASE(ExternalStringTrimDoubleParse) { 8769 TEST_CASE(ExternalStringTrimDoubleParse) {
9033 const bool saved_flag = FLAG_support_externalizable_strings; 8770 const bool saved_flag = FLAG_support_externalizable_strings;
9034 FLAG_support_externalizable_strings = true; 8771 FLAG_support_externalizable_strings = true;
9035 8772
9036 const char* kScriptChars = 8773 const char* kScriptChars =
9037 "String str = 'A';\n" 8774 "String str = 'A';\n"
9038 "class A {\n" 8775 "class A {\n"
9039 " static change_str(String s) native 'A_change_str';\n" 8776 " static change_str(String s) native 'A_change_str';\n"
9040 "}\n" 8777 "}\n"
9041 "main() {\n" 8778 "main() {\n"
9042 " var externalOneByteString = ' 0.2\\xA0 ';\n;" 8779 " var externalOneByteString = ' 0.2\\xA0 ';\n;"
9043 " A.change_str(externalOneByteString);\n" 8780 " A.change_str(externalOneByteString);\n"
9044 " var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n" 8781 " var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n"
9045 " A.change_str(externalTwoByteString);\n" 8782 " A.change_str(externalTwoByteString);\n"
9046 " var x = double.parse(externalOneByteString);\n" 8783 " var x = double.parse(externalOneByteString);\n"
9047 " var y = double.parse(externalTwoByteString);\n" 8784 " var y = double.parse(externalTwoByteString);\n"
9048 " return ((x + y) * 10).toInt();\n" 8785 " return ((x + y) * 10).toInt();\n"
9049 "}\n"; 8786 "}\n";
9050 Dart_Handle lib = TestCase::LoadTestScript( 8787 Dart_Handle lib = TestCase::LoadTestScript(
9051 kScriptChars, &ExternalStringDeoptimize_native_lookup); 8788 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9052 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8789 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9053 int64_t value = 0; 8790 int64_t value = 0;
9054 result = Dart_IntegerToInt64(result, &value); 8791 result = Dart_IntegerToInt64(result, &value);
9055 EXPECT_VALID(result); 8792 EXPECT_VALID(result);
9056 EXPECT_EQ(8, value); 8793 EXPECT_EQ(8, value);
9057 8794
9058 FLAG_support_externalizable_strings = saved_flag; 8795 FLAG_support_externalizable_strings = saved_flag;
9059 } 8796 }
9060 8797
9061
9062 TEST_CASE(ExternalStringDoubleParse) { 8798 TEST_CASE(ExternalStringDoubleParse) {
9063 const bool saved_flag = FLAG_support_externalizable_strings; 8799 const bool saved_flag = FLAG_support_externalizable_strings;
9064 FLAG_support_externalizable_strings = true; 8800 FLAG_support_externalizable_strings = true;
9065 8801
9066 const char* kScriptChars = 8802 const char* kScriptChars =
9067 "String str = 'A';\n" 8803 "String str = 'A';\n"
9068 "class A {\n" 8804 "class A {\n"
9069 " static change_str(String s) native 'A_change_str';\n" 8805 " static change_str(String s) native 'A_change_str';\n"
9070 "}\n" 8806 "}\n"
9071 "main() {\n" 8807 "main() {\n"
9072 " var externalOneByteString = '0.2';\n;" 8808 " var externalOneByteString = '0.2';\n;"
9073 " A.change_str(externalOneByteString);\n" 8809 " A.change_str(externalOneByteString);\n"
9074 " var externalTwoByteString = '0.6';\n" 8810 " var externalTwoByteString = '0.6';\n"
9075 " A.change_str(externalTwoByteString);\n" 8811 " A.change_str(externalTwoByteString);\n"
9076 " var x = double.parse(externalOneByteString);\n" 8812 " var x = double.parse(externalOneByteString);\n"
9077 " var y = double.parse(externalTwoByteString);\n" 8813 " var y = double.parse(externalTwoByteString);\n"
9078 " return ((x + y) * 10).toInt();\n" 8814 " return ((x + y) * 10).toInt();\n"
9079 "}\n"; 8815 "}\n";
9080 Dart_Handle lib = TestCase::LoadTestScript( 8816 Dart_Handle lib = TestCase::LoadTestScript(
9081 kScriptChars, &ExternalStringDeoptimize_native_lookup); 8817 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9082 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 8818 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9083 int64_t value = 0; 8819 int64_t value = 0;
9084 result = Dart_IntegerToInt64(result, &value); 8820 result = Dart_IntegerToInt64(result, &value);
9085 EXPECT_VALID(result); 8821 EXPECT_VALID(result);
9086 EXPECT_EQ(8, value); 8822 EXPECT_EQ(8, value);
9087 8823
9088 FLAG_support_externalizable_strings = saved_flag; 8824 FLAG_support_externalizable_strings = saved_flag;
9089 } 8825 }
9090 8826
9091
9092 TEST_CASE(ExternalStringIndexOf) { 8827 TEST_CASE(ExternalStringIndexOf) {
9093 const char* kScriptChars = 8828 const char* kScriptChars =
9094 "main(String pattern) {\n" 8829 "main(String pattern) {\n"
9095 " var str = 'Hello World';\n" 8830 " var str = 'Hello World';\n"
9096 " return str.indexOf(pattern);\n" 8831 " return str.indexOf(pattern);\n"
9097 "}\n"; 8832 "}\n";
9098 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 8833 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9099 8834
9100 uint8_t data8[] = {'W'}; 8835 uint8_t data8[] = {'W'};
9101 Dart_Handle ext8 = 8836 Dart_Handle ext8 =
9102 Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL); 8837 Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL);
9103 EXPECT_VALID(ext8); 8838 EXPECT_VALID(ext8);
9104 EXPECT(Dart_IsString(ext8)); 8839 EXPECT(Dart_IsString(ext8));
9105 EXPECT(Dart_IsExternalString(ext8)); 8840 EXPECT(Dart_IsExternalString(ext8));
9106 8841
9107 Dart_Handle dart_args[1]; 8842 Dart_Handle dart_args[1];
9108 dart_args[0] = ext8; 8843 dart_args[0] = ext8;
9109 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 1, dart_args); 8844 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 1, dart_args);
9110 int64_t value = 0; 8845 int64_t value = 0;
9111 result = Dart_IntegerToInt64(result, &value); 8846 result = Dart_IntegerToInt64(result, &value);
9112 EXPECT_VALID(result); 8847 EXPECT_VALID(result);
9113 EXPECT_EQ(6, value); 8848 EXPECT_EQ(6, value);
9114 } 8849 }
9115 8850
9116
9117 TEST_CASE(StringFromExternalTypedData) { 8851 TEST_CASE(StringFromExternalTypedData) {
9118 const char* kScriptChars = 8852 const char* kScriptChars =
9119 "test(external) {\n" 8853 "test(external) {\n"
9120 " var str1 = new String.fromCharCodes(external);\n" 8854 " var str1 = new String.fromCharCodes(external);\n"
9121 " var str2 = new String.fromCharCodes(new List.from(external));\n" 8855 " var str2 = new String.fromCharCodes(new List.from(external));\n"
9122 " if (str2 != str1) throw 'FAIL';\n" 8856 " if (str2 != str1) throw 'FAIL';\n"
9123 " return str1;\n" 8857 " return str1;\n"
9124 "}\n" 8858 "}\n"
9125 "testView8(external) {\n" 8859 "testView8(external) {\n"
9126 " return test(external.buffer.asUint8List());\n" 8860 " return test(external.buffer.asUint8List());\n"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
9184 Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args); 8918 Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args);
9185 EXPECT_VALID(result); 8919 EXPECT_VALID(result);
9186 EXPECT(Dart_IsString(result)); 8920 EXPECT(Dart_IsString(result));
9187 8921
9188 result = Dart_Invoke(lib, NewString("testView16"), 1, dart_args); 8922 result = Dart_Invoke(lib, NewString("testView16"), 1, dart_args);
9189 EXPECT_VALID(result); 8923 EXPECT_VALID(result);
9190 EXPECT(Dart_IsString(result)); 8924 EXPECT(Dart_IsString(result));
9191 } 8925 }
9192 } 8926 }
9193 8927
9194
9195 #ifndef PRODUCT 8928 #ifndef PRODUCT
9196 8929
9197
9198 TEST_CASE(Timeline_Dart_TimelineDuration) { 8930 TEST_CASE(Timeline_Dart_TimelineDuration) {
9199 Isolate* isolate = Isolate::Current(); 8931 Isolate* isolate = Isolate::Current();
9200 // Grab embedder stream. 8932 // Grab embedder stream.
9201 TimelineStream* stream = Timeline::GetEmbedderStream(); 8933 TimelineStream* stream = Timeline::GetEmbedderStream();
9202 // Make sure it is enabled. 8934 // Make sure it is enabled.
9203 stream->set_enabled(true); 8935 stream->set_enabled(true);
9204 // Add a duration event. 8936 // Add a duration event.
9205 Dart_TimelineEvent("testDurationEvent", 0, 1, Dart_Timeline_Event_Duration, 0, 8937 Dart_TimelineEvent("testDurationEvent", 0, 1, Dart_Timeline_Event_Duration, 0,
9206 NULL, NULL); 8938 NULL, NULL);
9207 // Check that it is in the output. 8939 // Check that it is in the output.
9208 TimelineEventRecorder* recorder = Timeline::recorder(); 8940 TimelineEventRecorder* recorder = Timeline::recorder();
9209 Timeline::ReclaimCachedBlocksFromThreads(); 8941 Timeline::ReclaimCachedBlocksFromThreads();
9210 JSONStream js; 8942 JSONStream js;
9211 IsolateTimelineEventFilter filter(isolate->main_port()); 8943 IsolateTimelineEventFilter filter(isolate->main_port());
9212 recorder->PrintJSON(&js, &filter); 8944 recorder->PrintJSON(&js, &filter);
9213 EXPECT_SUBSTRING("testDurationEvent", js.ToCString()); 8945 EXPECT_SUBSTRING("testDurationEvent", js.ToCString());
9214 } 8946 }
9215 8947
9216
9217 TEST_CASE(Timeline_Dart_TimelineInstant) { 8948 TEST_CASE(Timeline_Dart_TimelineInstant) {
9218 Isolate* isolate = Isolate::Current(); 8949 Isolate* isolate = Isolate::Current();
9219 // Grab embedder stream. 8950 // Grab embedder stream.
9220 TimelineStream* stream = Timeline::GetEmbedderStream(); 8951 TimelineStream* stream = Timeline::GetEmbedderStream();
9221 // Make sure it is enabled. 8952 // Make sure it is enabled.
9222 stream->set_enabled(true); 8953 stream->set_enabled(true);
9223 Dart_TimelineEvent("testInstantEvent", 0, 1, Dart_Timeline_Event_Instant, 0, 8954 Dart_TimelineEvent("testInstantEvent", 0, 1, Dart_Timeline_Event_Instant, 0,
9224 NULL, NULL); 8955 NULL, NULL);
9225 // Check that it is in the output. 8956 // Check that it is in the output.
9226 TimelineEventRecorder* recorder = Timeline::recorder(); 8957 TimelineEventRecorder* recorder = Timeline::recorder();
9227 Timeline::ReclaimCachedBlocksFromThreads(); 8958 Timeline::ReclaimCachedBlocksFromThreads();
9228 JSONStream js; 8959 JSONStream js;
9229 IsolateTimelineEventFilter filter(isolate->main_port()); 8960 IsolateTimelineEventFilter filter(isolate->main_port());
9230 recorder->PrintJSON(&js, &filter); 8961 recorder->PrintJSON(&js, &filter);
9231 EXPECT_SUBSTRING("testInstantEvent", js.ToCString()); 8962 EXPECT_SUBSTRING("testInstantEvent", js.ToCString());
9232 } 8963 }
9233 8964
9234
9235 TEST_CASE(Timeline_Dart_TimelineAsyncDisabled) { 8965 TEST_CASE(Timeline_Dart_TimelineAsyncDisabled) {
9236 // Grab embedder stream. 8966 // Grab embedder stream.
9237 TimelineStream* stream = Timeline::GetEmbedderStream(); 8967 TimelineStream* stream = Timeline::GetEmbedderStream();
9238 // Make sure it is disabled. 8968 // Make sure it is disabled.
9239 stream->set_enabled(false); 8969 stream->set_enabled(false);
9240 int64_t async_id = 99; 8970 int64_t async_id = 99;
9241 Dart_TimelineEvent("testAsyncEvent", 0, async_id, 8971 Dart_TimelineEvent("testAsyncEvent", 0, async_id,
9242 Dart_Timeline_Event_Async_Begin, 0, NULL, NULL); 8972 Dart_Timeline_Event_Async_Begin, 0, NULL, NULL);
9243 // Check that testAsync is not in the output. 8973 // Check that testAsync is not in the output.
9244 TimelineEventRecorder* recorder = Timeline::recorder(); 8974 TimelineEventRecorder* recorder = Timeline::recorder();
9245 Timeline::ReclaimCachedBlocksFromThreads(); 8975 Timeline::ReclaimCachedBlocksFromThreads();
9246 JSONStream js; 8976 JSONStream js;
9247 TimelineEventFilter filter; 8977 TimelineEventFilter filter;
9248 recorder->PrintJSON(&js, &filter); 8978 recorder->PrintJSON(&js, &filter);
9249 EXPECT_NOTSUBSTRING("testAsyncEvent", js.ToCString()); 8979 EXPECT_NOTSUBSTRING("testAsyncEvent", js.ToCString());
9250 } 8980 }
9251 8981
9252
9253 TEST_CASE(Timeline_Dart_TimelineAsync) { 8982 TEST_CASE(Timeline_Dart_TimelineAsync) {
9254 Isolate* isolate = Isolate::Current(); 8983 Isolate* isolate = Isolate::Current();
9255 // Grab embedder stream. 8984 // Grab embedder stream.
9256 TimelineStream* stream = Timeline::GetEmbedderStream(); 8985 TimelineStream* stream = Timeline::GetEmbedderStream();
9257 // Make sure it is enabled. 8986 // Make sure it is enabled.
9258 stream->set_enabled(true); 8987 stream->set_enabled(true);
9259 int64_t async_id = 99; 8988 int64_t async_id = 99;
9260 Dart_TimelineEvent("testAsyncEvent", 0, async_id, 8989 Dart_TimelineEvent("testAsyncEvent", 0, async_id,
9261 Dart_Timeline_Event_Async_Begin, 0, NULL, NULL); 8990 Dart_Timeline_Event_Async_Begin, 0, NULL, NULL);
9262 8991
9263 // Check that it is in the output. 8992 // Check that it is in the output.
9264 TimelineEventRecorder* recorder = Timeline::recorder(); 8993 TimelineEventRecorder* recorder = Timeline::recorder();
9265 Timeline::ReclaimCachedBlocksFromThreads(); 8994 Timeline::ReclaimCachedBlocksFromThreads();
9266 JSONStream js; 8995 JSONStream js;
9267 IsolateTimelineEventFilter filter(isolate->main_port()); 8996 IsolateTimelineEventFilter filter(isolate->main_port());
9268 recorder->PrintJSON(&js, &filter); 8997 recorder->PrintJSON(&js, &filter);
9269 EXPECT_SUBSTRING("testAsyncEvent", js.ToCString()); 8998 EXPECT_SUBSTRING("testAsyncEvent", js.ToCString());
9270 } 8999 }
9271 9000
9272
9273 struct AppendData { 9001 struct AppendData {
9274 uint8_t* buffer; 9002 uint8_t* buffer;
9275 intptr_t buffer_length; 9003 intptr_t buffer_length;
9276 }; 9004 };
9277 9005
9278
9279 static void AppendStreamConsumer(Dart_StreamConsumer_State state, 9006 static void AppendStreamConsumer(Dart_StreamConsumer_State state,
9280 const char* stream_name, 9007 const char* stream_name,
9281 const uint8_t* buffer, 9008 const uint8_t* buffer,
9282 intptr_t buffer_length, 9009 intptr_t buffer_length,
9283 void* user_data) { 9010 void* user_data) {
9284 if (state == Dart_StreamConsumer_kFinish) { 9011 if (state == Dart_StreamConsumer_kFinish) {
9285 return; 9012 return;
9286 } 9013 }
9287 AppendData* data = reinterpret_cast<AppendData*>(user_data); 9014 AppendData* data = reinterpret_cast<AppendData*>(user_data);
9288 if (state == Dart_StreamConsumer_kStart) { 9015 if (state == Dart_StreamConsumer_kStart) {
9289 // Initialize append data. 9016 // Initialize append data.
9290 data->buffer = NULL; 9017 data->buffer = NULL;
9291 data->buffer_length = 0; 9018 data->buffer_length = 0;
9292 return; 9019 return;
9293 } 9020 }
9294 ASSERT(state == Dart_StreamConsumer_kData); 9021 ASSERT(state == Dart_StreamConsumer_kData);
9295 9022
9296 // Grow buffer. 9023 // Grow buffer.
9297 data->buffer = reinterpret_cast<uint8_t*>( 9024 data->buffer = reinterpret_cast<uint8_t*>(
9298 realloc(data->buffer, data->buffer_length + buffer_length)); 9025 realloc(data->buffer, data->buffer_length + buffer_length));
9299 // Copy new data. 9026 // Copy new data.
9300 memmove(&data->buffer[data->buffer_length], buffer, buffer_length); 9027 memmove(&data->buffer[data->buffer_length], buffer, buffer_length);
9301 // Update length. 9028 // Update length.
9302 data->buffer_length += buffer_length; 9029 data->buffer_length += buffer_length;
9303 } 9030 }
9304 9031
9305
9306 TEST_CASE(Timeline_Dart_TimelineGetTrace) { 9032 TEST_CASE(Timeline_Dart_TimelineGetTrace) {
9307 const char* kScriptChars = 9033 const char* kScriptChars =
9308 "foo() => 'a';\n" 9034 "foo() => 'a';\n"
9309 "main() => foo();\n"; 9035 "main() => foo();\n";
9310 9036
9311 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 9037 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9312 9038
9313 const char* buffer = NULL; 9039 const char* buffer = NULL;
9314 intptr_t buffer_length = 0; 9040 intptr_t buffer_length = 0;
9315 bool success = false; 9041 bool success = false;
(...skipping 23 matching lines...) Expand all
9339 9065
9340 // Heartbeat test. 9066 // Heartbeat test.
9341 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer); 9067 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
9342 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer); 9068 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
9343 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer); 9069 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
9344 9070
9345 // Free buffer allocated by AppendStreamConsumer 9071 // Free buffer allocated by AppendStreamConsumer
9346 free(data.buffer); 9072 free(data.buffer);
9347 } 9073 }
9348 9074
9349
9350 TEST_CASE(Timeline_Dart_TimelineGetTraceOnlyDartEvents) { 9075 TEST_CASE(Timeline_Dart_TimelineGetTraceOnlyDartEvents) {
9351 const char* kScriptChars = 9076 const char* kScriptChars =
9352 "import 'dart:developer';\n" 9077 "import 'dart:developer';\n"
9353 "" 9078 ""
9354 "main() {\n" 9079 "main() {\n"
9355 " Timeline.startSync('DART_NAME');\n" 9080 " Timeline.startSync('DART_NAME');\n"
9356 " Timeline.finishSync();\n" 9081 " Timeline.finishSync();\n"
9357 "}\n"; 9082 "}\n";
9358 9083
9359 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 9084 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
(...skipping 27 matching lines...) Expand all
9387 EXPECT(buffer[buffer_length - 2] == '}'); 9112 EXPECT(buffer[buffer_length - 2] == '}');
9388 9113
9389 // Heartbeat test. 9114 // Heartbeat test.
9390 EXPECT_SUBSTRING("\"cat\":\"Dart\"", buffer); 9115 EXPECT_SUBSTRING("\"cat\":\"Dart\"", buffer);
9391 EXPECT_SUBSTRING("\"name\":\"DART_NAME\"", buffer); 9116 EXPECT_SUBSTRING("\"name\":\"DART_NAME\"", buffer);
9392 9117
9393 // Free buffer allocated by AppendStreamConsumer 9118 // Free buffer allocated by AppendStreamConsumer
9394 free(data.buffer); 9119 free(data.buffer);
9395 } 9120 }
9396 9121
9397
9398 TEST_CASE(Timeline_Dart_TimelineGetTraceWithDartEvents) { 9122 TEST_CASE(Timeline_Dart_TimelineGetTraceWithDartEvents) {
9399 const char* kScriptChars = 9123 const char* kScriptChars =
9400 "import 'dart:developer';\n" 9124 "import 'dart:developer';\n"
9401 "\n" 9125 "\n"
9402 "main() {\n" 9126 "main() {\n"
9403 " Timeline.startSync('DART_NAME');\n" 9127 " Timeline.startSync('DART_NAME');\n"
9404 " Timeline.finishSync();\n" 9128 " Timeline.finishSync();\n"
9405 "}\n"; 9129 "}\n";
9406 9130
9407 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 9131 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
9480 9204
9481 // Heartbeat test. 9205 // Heartbeat test.
9482 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer); 9206 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
9483 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer); 9207 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
9484 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer); 9208 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
9485 9209
9486 // Free buffer allocated by AppendStreamConsumer 9210 // Free buffer allocated by AppendStreamConsumer
9487 free(data.buffer); 9211 free(data.buffer);
9488 } 9212 }
9489 9213
9490
9491 static const char* arg_names[] = {"arg0"}; 9214 static const char* arg_names[] = {"arg0"};
9492 9215
9493
9494 static const char* arg_values[] = {"value0"}; 9216 static const char* arg_values[] = {"value0"};
9495 9217
9496
9497 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) { 9218 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) {
9498 const char* kScriptChars = 9219 const char* kScriptChars =
9499 "bar() => 'z';\n" 9220 "bar() => 'z';\n"
9500 "foo() => 'a';\n" 9221 "foo() => 'a';\n"
9501 "main() => foo();\n"; 9222 "main() => foo();\n";
9502 9223
9503 // Enable all streams. 9224 // Enable all streams.
9504 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL | 9225 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL |
9505 DART_TIMELINE_STREAM_VM); 9226 DART_TIMELINE_STREAM_VM);
9506 Dart_Handle lib; 9227 Dart_Handle lib;
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
9604 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer); 9325 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
9605 9326
9606 // Heartbeat test for new events. 9327 // Heartbeat test for new events.
9607 EXPECT_SUBSTRING("\"name\":\"TestVMDuration2\"", buffer); 9328 EXPECT_SUBSTRING("\"name\":\"TestVMDuration2\"", buffer);
9608 EXPECT_SUBSTRING("\"function\":\"::_bar\"", buffer); 9329 EXPECT_SUBSTRING("\"function\":\"::_bar\"", buffer);
9609 9330
9610 // Free buffer allocated by AppendStreamConsumer 9331 // Free buffer allocated by AppendStreamConsumer
9611 free(data.buffer); 9332 free(data.buffer);
9612 } 9333 }
9613 9334
9614
9615 class GlobalTimelineThreadData { 9335 class GlobalTimelineThreadData {
9616 public: 9336 public:
9617 GlobalTimelineThreadData() 9337 GlobalTimelineThreadData()
9618 : monitor_(new Monitor()), data_(new AppendData()), running_(true) {} 9338 : monitor_(new Monitor()), data_(new AppendData()), running_(true) {}
9619 9339
9620 ~GlobalTimelineThreadData() { 9340 ~GlobalTimelineThreadData() {
9621 delete monitor_; 9341 delete monitor_;
9622 monitor_ = NULL; 9342 monitor_ = NULL;
9623 free(data_->buffer); 9343 free(data_->buffer);
9624 data_->buffer = NULL; 9344 data_->buffer = NULL;
9625 data_->buffer_length = 0; 9345 data_->buffer_length = 0;
9626 delete data_; 9346 delete data_;
9627 data_ = NULL; 9347 data_ = NULL;
9628 } 9348 }
9629 9349
9630 Monitor* monitor() const { return monitor_; } 9350 Monitor* monitor() const { return monitor_; }
9631 bool running() const { return running_; } 9351 bool running() const { return running_; }
9632 AppendData* data() const { return data_; } 9352 AppendData* data() const { return data_; }
9633 uint8_t* buffer() const { return data_->buffer; } 9353 uint8_t* buffer() const { return data_->buffer; }
9634 intptr_t buffer_length() const { return data_->buffer_length; } 9354 intptr_t buffer_length() const { return data_->buffer_length; }
9635 9355
9636 void set_running(bool running) { running_ = running; } 9356 void set_running(bool running) { running_ = running; }
9637 9357
9638 private: 9358 private:
9639 Monitor* monitor_; 9359 Monitor* monitor_;
9640 AppendData* data_; 9360 AppendData* data_;
9641 bool running_; 9361 bool running_;
9642 }; 9362 };
9643 9363
9644
9645 static void GlobalTimelineThread(uword parameter) { 9364 static void GlobalTimelineThread(uword parameter) {
9646 GlobalTimelineThreadData* data = 9365 GlobalTimelineThreadData* data =
9647 reinterpret_cast<GlobalTimelineThreadData*>(parameter); 9366 reinterpret_cast<GlobalTimelineThreadData*>(parameter);
9648 Thread* T = Thread::Current(); 9367 Thread* T = Thread::Current();
9649 // When there is no current Thread, then Zone allocation will fail. 9368 // When there is no current Thread, then Zone allocation will fail.
9650 EXPECT(T == NULL); 9369 EXPECT(T == NULL);
9651 { 9370 {
9652 MonitorLocker ml(data->monitor()); 9371 MonitorLocker ml(data->monitor());
9653 bool success = 9372 bool success =
9654 Dart_GlobalTimelineGetTrace(AppendStreamConsumer, data->data()); 9373 Dart_GlobalTimelineGetTrace(AppendStreamConsumer, data->data());
9655 EXPECT(success); 9374 EXPECT(success);
9656 data->set_running(false); 9375 data->set_running(false);
9657 ml.Notify(); 9376 ml.Notify();
9658 } 9377 }
9659 } 9378 }
9660 9379
9661
9662 // This test is the same as the one above except that the calls to 9380 // This test is the same as the one above except that the calls to
9663 // Dart_GlobalTimelineGetTrace are made from a fresh thread. This ensures that 9381 // Dart_GlobalTimelineGetTrace are made from a fresh thread. This ensures that
9664 // we can call the function from a thread for which we have not set up a 9382 // we can call the function from a thread for which we have not set up a
9665 // Thread object. 9383 // Thread object.
9666 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace_Threaded) { 9384 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace_Threaded) {
9667 const char* kScriptChars = 9385 const char* kScriptChars =
9668 "bar() => 'z';\n" 9386 "bar() => 'z';\n"
9669 "foo() => 'a';\n" 9387 "foo() => 'a';\n"
9670 "main() => foo();\n"; 9388 "main() => foo();\n";
9671 9389
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
9764 static bool stop_called = false; 9482 static bool stop_called = false;
9765 9483
9766 static void StartRecording() { 9484 static void StartRecording() {
9767 start_called = true; 9485 start_called = true;
9768 } 9486 }
9769 9487
9770 static void StopRecording() { 9488 static void StopRecording() {
9771 stop_called = true; 9489 stop_called = true;
9772 } 9490 }
9773 9491
9774
9775 TEST_CASE(Timeline_Dart_EmbedderTimelineStartStopRecording) { 9492 TEST_CASE(Timeline_Dart_EmbedderTimelineStartStopRecording) {
9776 Dart_SetEmbedderTimelineCallbacks(StartRecording, StopRecording); 9493 Dart_SetEmbedderTimelineCallbacks(StartRecording, StopRecording);
9777 9494
9778 EXPECT(!start_called); 9495 EXPECT(!start_called);
9779 EXPECT(!stop_called); 9496 EXPECT(!stop_called);
9780 Timeline::SetStreamEmbedderEnabled(true); 9497 Timeline::SetStreamEmbedderEnabled(true);
9781 EXPECT(start_called); 9498 EXPECT(start_called);
9782 EXPECT(!stop_called); 9499 EXPECT(!stop_called);
9783 9500
9784 start_called = false; 9501 start_called = false;
9785 stop_called = false; 9502 stop_called = false;
9786 EXPECT(!start_called); 9503 EXPECT(!start_called);
9787 EXPECT(!stop_called); 9504 EXPECT(!stop_called);
9788 Timeline::SetStreamEmbedderEnabled(false); 9505 Timeline::SetStreamEmbedderEnabled(false);
9789 EXPECT(!start_called); 9506 EXPECT(!start_called);
9790 EXPECT(stop_called); 9507 EXPECT(stop_called);
9791 } 9508 }
9792 9509
9793
9794 TEST_CASE(Dart_LoadLibraryPatch_1) { 9510 TEST_CASE(Dart_LoadLibraryPatch_1) {
9795 const char* kScriptChars1 = 9511 const char* kScriptChars1 =
9796 "class A {\n" 9512 "class A {\n"
9797 " int foo() { return 10; }\n" 9513 " int foo() { return 10; }\n"
9798 " external int zoo();\n" 9514 " external int zoo();\n"
9799 " external static int moo();\n" 9515 " external static int moo();\n"
9800 "}\n" 9516 "}\n"
9801 "main() { new A().foo(); }\n" 9517 "main() { new A().foo(); }\n"
9802 "foozoo() { new A().zoo(); }\n" 9518 "foozoo() { new A().zoo(); }\n"
9803 "foomoo() { A.moo(); }\n"; 9519 "foomoo() { A.moo(); }\n";
(...skipping 12 matching lines...) Expand all
9816 result = Dart_LibraryLoadPatch(lib, url, source); 9532 result = Dart_LibraryLoadPatch(lib, url, source);
9817 EXPECT_VALID(result); 9533 EXPECT_VALID(result);
9818 result = Dart_FinalizeLoading(false); 9534 result = Dart_FinalizeLoading(false);
9819 EXPECT_VALID(result); 9535 EXPECT_VALID(result);
9820 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL); 9536 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
9821 EXPECT_VALID(result); 9537 EXPECT_VALID(result);
9822 result = Dart_Invoke(lib, NewString("foomoo"), 0, NULL); 9538 result = Dart_Invoke(lib, NewString("foomoo"), 0, NULL);
9823 EXPECT_VALID(result); 9539 EXPECT_VALID(result);
9824 } 9540 }
9825 9541
9826
9827 TEST_CASE(Dart_LoadLibraryPatch_Error1) { 9542 TEST_CASE(Dart_LoadLibraryPatch_Error1) {
9828 const char* kScriptChars1 = 9543 const char* kScriptChars1 =
9829 "class A {\n" 9544 "class A {\n"
9830 " int foo() { return 10; }\n" 9545 " int foo() { return 10; }\n"
9831 " external int zoo();\n" 9546 " external int zoo();\n"
9832 "}\n" 9547 "}\n"
9833 "main() { new A().foo(); }\n" 9548 "main() { new A().foo(); }\n"
9834 "foozoo() { new A().zoo(); }\n"; 9549 "foozoo() { new A().zoo(); }\n";
9835 9550
9836 const char* kScriptChars2 = 9551 const char* kScriptChars2 =
(...skipping 10 matching lines...) Expand all
9847 // We don't expect to be able to patch in this case as new fields 9562 // We don't expect to be able to patch in this case as new fields
9848 // are being added. 9563 // are being added.
9849 result = Dart_LibraryLoadPatch(lib, url, source); 9564 result = Dart_LibraryLoadPatch(lib, url, source);
9850 EXPECT_VALID(result); 9565 EXPECT_VALID(result);
9851 result = Dart_FinalizeLoading(false); 9566 result = Dart_FinalizeLoading(false);
9852 EXPECT_VALID(result); 9567 EXPECT_VALID(result);
9853 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL); 9568 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
9854 EXPECT(Dart_IsError(result)); 9569 EXPECT(Dart_IsError(result));
9855 } 9570 }
9856 9571
9857
9858 TEST_CASE(Dart_LoadLibraryPatch_Error2) { 9572 TEST_CASE(Dart_LoadLibraryPatch_Error2) {
9859 const char* kScriptChars1 = 9573 const char* kScriptChars1 =
9860 "class A {\n" 9574 "class A {\n"
9861 " int foo() { return 10; }\n" 9575 " int foo() { return 10; }\n"
9862 " int zoo() { return 20; }\n" 9576 " int zoo() { return 20; }\n"
9863 "}\n" 9577 "}\n"
9864 "main() { new A().foo(); }\n" 9578 "main() { new A().foo(); }\n"
9865 "foozoo() { new A().zoo(); }\n"; 9579 "foozoo() { new A().zoo(); }\n";
9866 9580
9867 const char* kScriptChars2 = 9581 const char* kScriptChars2 =
(...skipping 10 matching lines...) Expand all
9878 // method is being patched. 9592 // method is being patched.
9879 result = Dart_LibraryLoadPatch(lib, url, source); 9593 result = Dart_LibraryLoadPatch(lib, url, source);
9880 EXPECT_VALID(result); 9594 EXPECT_VALID(result);
9881 result = Dart_FinalizeLoading(false); 9595 result = Dart_FinalizeLoading(false);
9882 EXPECT_VALID(result); 9596 EXPECT_VALID(result);
9883 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL); 9597 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
9884 EXPECT(Dart_IsError(result)); 9598 EXPECT(Dart_IsError(result));
9885 OS::Print("Patched class executed\n"); 9599 OS::Print("Patched class executed\n");
9886 } 9600 }
9887 9601
9888
9889 TEST_CASE(Dart_LoadLibraryPatch_Error3) { 9602 TEST_CASE(Dart_LoadLibraryPatch_Error3) {
9890 const char* kScriptChars1 = 9603 const char* kScriptChars1 =
9891 "class A {\n" 9604 "class A {\n"
9892 " int foo() { return 10; }\n" 9605 " int foo() { return 10; }\n"
9893 " external int zoo();\n" 9606 " external int zoo();\n"
9894 "}\n" 9607 "}\n"
9895 "main() { new A().foo(); }\n" 9608 "main() { new A().foo(); }\n"
9896 "foozoo() { new A().zoo(); }\n"; 9609 "foozoo() { new A().zoo(); }\n";
9897 9610
9898 const char* kScriptChars2 = 9611 const char* kScriptChars2 =
(...skipping 15 matching lines...) Expand all
9914 EXPECT_VALID(result); 9627 EXPECT_VALID(result);
9915 result = Dart_FinalizeLoading(false); 9628 result = Dart_FinalizeLoading(false);
9916 EXPECT_VALID(result); 9629 EXPECT_VALID(result);
9917 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL); 9630 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
9918 EXPECT(Dart_IsError(result)); 9631 EXPECT(Dart_IsError(result));
9919 } 9632 }
9920 9633
9921 #endif // !PRODUCT 9634 #endif // !PRODUCT
9922 9635
9923 } // namespace dart 9636 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/dart_api_impl.cc ('k') | runtime/vm/dart_api_message.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698