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

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

Issue 2481873005: clang-format runtime/vm (Closed)
Patch Set: Merge Created 4 years, 1 month 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 "bin/builtin.h" 5 #include "bin/builtin.h"
6 #include "vm/compiler.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"
(...skipping 19 matching lines...) Expand all
30 TEST_CASE(ErrorHandleBasics) { 30 TEST_CASE(ErrorHandleBasics) {
31 const char* kScriptChars = 31 const char* kScriptChars =
32 "void testMain() {\n" 32 "void testMain() {\n"
33 " throw new Exception(\"bad news\");\n" 33 " throw new Exception(\"bad news\");\n"
34 "}\n"; 34 "}\n";
35 35
36 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 36 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
37 37
38 Dart_Handle instance = Dart_True(); 38 Dart_Handle instance = Dart_True();
39 Dart_Handle error = Api::NewError("myerror"); 39 Dart_Handle error = Api::NewError("myerror");
40 Dart_Handle exception = Dart_Invoke(lib, 40 Dart_Handle exception = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
41 NewString("testMain"),
42 0,
43 NULL);
44 41
45 EXPECT_VALID(instance); 42 EXPECT_VALID(instance);
46 EXPECT(Dart_IsError(error)); 43 EXPECT(Dart_IsError(error));
47 EXPECT(Dart_IsError(exception)); 44 EXPECT(Dart_IsError(exception));
48 45
49 EXPECT(!Dart_ErrorHasException(instance)); 46 EXPECT(!Dart_ErrorHasException(instance));
50 EXPECT(!Dart_ErrorHasException(error)); 47 EXPECT(!Dart_ErrorHasException(error));
51 EXPECT(Dart_ErrorHasException(exception)); 48 EXPECT(Dart_ErrorHasException(exception));
52 49
53 EXPECT_STREQ("", Dart_GetError(instance)); 50 EXPECT_STREQ("", Dart_GetError(instance));
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 87
91 Dart_Handle function_name; 88 Dart_Handle function_name;
92 Dart_Handle script_url; 89 Dart_Handle script_url;
93 intptr_t line_number = 0; 90 intptr_t line_number = 0;
94 intptr_t column_number = 0; 91 intptr_t column_number = 0;
95 const char* cstr = ""; 92 const char* cstr = "";
96 93
97 Dart_ActivationFrame frame; 94 Dart_ActivationFrame frame;
98 result = Dart_GetActivationFrame(stacktrace, 0, &frame); 95 result = Dart_GetActivationFrame(stacktrace, 0, &frame);
99 EXPECT_VALID(result); 96 EXPECT_VALID(result);
100 result = Dart_ActivationFrameInfo( 97 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
101 frame, &function_name, &script_url, &line_number, &column_number); 98 &line_number, &column_number);
102 EXPECT_VALID(result); 99 EXPECT_VALID(result);
103 Dart_StringToCString(function_name, &cstr); 100 Dart_StringToCString(function_name, &cstr);
104 EXPECT_STREQ("bar", cstr); 101 EXPECT_STREQ("bar", cstr);
105 Dart_StringToCString(script_url, &cstr); 102 Dart_StringToCString(script_url, &cstr);
106 EXPECT_STREQ("test-lib", cstr); 103 EXPECT_STREQ("test-lib", cstr);
107 EXPECT_EQ(1, line_number); 104 EXPECT_EQ(1, line_number);
108 EXPECT_EQ(10, column_number); 105 EXPECT_EQ(10, column_number);
109 106
110 result = Dart_GetActivationFrame(stacktrace, 1, &frame); 107 result = Dart_GetActivationFrame(stacktrace, 1, &frame);
111 EXPECT_VALID(result); 108 EXPECT_VALID(result);
112 result = Dart_ActivationFrameInfo( 109 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
113 frame, &function_name, &script_url, &line_number, &column_number); 110 &line_number, &column_number);
114 EXPECT_VALID(result); 111 EXPECT_VALID(result);
115 Dart_StringToCString(function_name, &cstr); 112 Dart_StringToCString(function_name, &cstr);
116 EXPECT_STREQ("foo", cstr); 113 EXPECT_STREQ("foo", cstr);
117 Dart_StringToCString(script_url, &cstr); 114 Dart_StringToCString(script_url, &cstr);
118 EXPECT_STREQ("test-lib", cstr); 115 EXPECT_STREQ("test-lib", cstr);
119 EXPECT_EQ(2, line_number); 116 EXPECT_EQ(2, line_number);
120 EXPECT_EQ(10, column_number); 117 EXPECT_EQ(10, column_number);
121 118
122 result = Dart_GetActivationFrame(stacktrace, 2, &frame); 119 result = Dart_GetActivationFrame(stacktrace, 2, &frame);
123 EXPECT_VALID(result); 120 EXPECT_VALID(result);
124 result = Dart_ActivationFrameInfo( 121 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
125 frame, &function_name, &script_url, &line_number, &column_number); 122 &line_number, &column_number);
126 EXPECT_VALID(result); 123 EXPECT_VALID(result);
127 Dart_StringToCString(function_name, &cstr); 124 Dart_StringToCString(function_name, &cstr);
128 EXPECT_STREQ("testMain", cstr); 125 EXPECT_STREQ("testMain", cstr);
129 Dart_StringToCString(script_url, &cstr); 126 Dart_StringToCString(script_url, &cstr);
130 EXPECT_STREQ("test-lib", cstr); 127 EXPECT_STREQ("test-lib", cstr);
131 EXPECT_EQ(3, line_number); 128 EXPECT_EQ(3, line_number);
132 EXPECT_EQ(15, column_number); 129 EXPECT_EQ(15, column_number);
133 130
134 // Out-of-bounds frames. 131 // Out-of-bounds frames.
135 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 132 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
(...skipping 28 matching lines...) Expand all
164 Dart_Handle function_name; 161 Dart_Handle function_name;
165 Dart_Handle script_url; 162 Dart_Handle script_url;
166 intptr_t line_number = 0; 163 intptr_t line_number = 0;
167 intptr_t column_number = 0; 164 intptr_t column_number = 0;
168 const char* cstr = ""; 165 const char* cstr = "";
169 166
170 // Top frame at positioned at throw. 167 // Top frame at positioned at throw.
171 Dart_ActivationFrame frame; 168 Dart_ActivationFrame frame;
172 result = Dart_GetActivationFrame(stacktrace, 0, &frame); 169 result = Dart_GetActivationFrame(stacktrace, 0, &frame);
173 EXPECT_VALID(result); 170 EXPECT_VALID(result);
174 result = Dart_ActivationFrameInfo( 171 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
175 frame, &function_name, &script_url, &line_number, &column_number); 172 &line_number, &column_number);
176 EXPECT_VALID(result); 173 EXPECT_VALID(result);
177 Dart_StringToCString(function_name, &cstr); 174 Dart_StringToCString(function_name, &cstr);
178 EXPECT_STREQ("foo", cstr); 175 EXPECT_STREQ("foo", cstr);
179 Dart_StringToCString(script_url, &cstr); 176 Dart_StringToCString(script_url, &cstr);
180 EXPECT_STREQ("test-lib", cstr); 177 EXPECT_STREQ("test-lib", cstr);
181 EXPECT_EQ(1, line_number); 178 EXPECT_EQ(1, line_number);
182 EXPECT_EQ(20, column_number); 179 EXPECT_EQ(20, column_number);
183 180
184 // Middle frames positioned at the recursive call. 181 // Middle frames positioned at the recursive call.
185 for (intptr_t frame_index = 1; 182 for (intptr_t frame_index = 1; frame_index < (frame_count - 1);
186 frame_index < (frame_count - 1);
187 frame_index++) { 183 frame_index++) {
188 result = Dart_GetActivationFrame(stacktrace, frame_index, &frame); 184 result = Dart_GetActivationFrame(stacktrace, frame_index, &frame);
189 EXPECT_VALID(result); 185 EXPECT_VALID(result);
190 result = Dart_ActivationFrameInfo( 186 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
191 frame, &function_name, &script_url, &line_number, &column_number); 187 &line_number, &column_number);
192 EXPECT_VALID(result); 188 EXPECT_VALID(result);
193 Dart_StringToCString(function_name, &cstr); 189 Dart_StringToCString(function_name, &cstr);
194 EXPECT_STREQ("foo", cstr); 190 EXPECT_STREQ("foo", cstr);
195 Dart_StringToCString(script_url, &cstr); 191 Dart_StringToCString(script_url, &cstr);
196 EXPECT_STREQ("test-lib", cstr); 192 EXPECT_STREQ("test-lib", cstr);
197 EXPECT_EQ(1, line_number); 193 EXPECT_EQ(1, line_number);
198 EXPECT_EQ(40, column_number); 194 EXPECT_EQ(40, column_number);
199 } 195 }
200 196
201 // Bottom frame positioned at testMain(). 197 // Bottom frame positioned at testMain().
202 result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame); 198 result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame);
203 EXPECT_VALID(result); 199 EXPECT_VALID(result);
204 result = Dart_ActivationFrameInfo( 200 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
205 frame, &function_name, &script_url, &line_number, &column_number); 201 &line_number, &column_number);
206 EXPECT_VALID(result); 202 EXPECT_VALID(result);
207 Dart_StringToCString(function_name, &cstr); 203 Dart_StringToCString(function_name, &cstr);
208 EXPECT_STREQ("testMain", cstr); 204 EXPECT_STREQ("testMain", cstr);
209 Dart_StringToCString(script_url, &cstr); 205 Dart_StringToCString(script_url, &cstr);
210 EXPECT_STREQ("test-lib", cstr); 206 EXPECT_STREQ("test-lib", cstr);
211 EXPECT_EQ(2, line_number); 207 EXPECT_EQ(2, line_number);
212 EXPECT_EQ(15, column_number); 208 EXPECT_EQ(15, column_number);
213 209
214 // Out-of-bounds frames. 210 // Out-of-bounds frames.
215 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 211 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
(...skipping 27 matching lines...) Expand all
243 Dart_Handle function_name; 239 Dart_Handle function_name;
244 Dart_Handle script_url; 240 Dart_Handle script_url;
245 intptr_t line_number = 0; 241 intptr_t line_number = 0;
246 intptr_t column_number = 0; 242 intptr_t column_number = 0;
247 const char* cstr = ""; 243 const char* cstr = "";
248 244
249 // Top frame at recursive call. 245 // Top frame at recursive call.
250 Dart_ActivationFrame frame; 246 Dart_ActivationFrame frame;
251 result = Dart_GetActivationFrame(stacktrace, 0, &frame); 247 result = Dart_GetActivationFrame(stacktrace, 0, &frame);
252 EXPECT_VALID(result); 248 EXPECT_VALID(result);
253 result = Dart_ActivationFrameInfo( 249 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
254 frame, &function_name, &script_url, &line_number, &column_number); 250 &line_number, &column_number);
255 EXPECT_VALID(result); 251 EXPECT_VALID(result);
256 Dart_StringToCString(function_name, &cstr); 252 Dart_StringToCString(function_name, &cstr);
257 EXPECT_STREQ("C.foo", cstr); 253 EXPECT_STREQ("C.foo", cstr);
258 Dart_StringToCString(script_url, &cstr); 254 Dart_StringToCString(script_url, &cstr);
259 EXPECT_STREQ("test-lib", cstr); 255 EXPECT_STREQ("test-lib", cstr);
260 EXPECT_EQ(2, line_number); 256 EXPECT_EQ(2, line_number);
261 EXPECT_EQ(13, column_number); 257 EXPECT_EQ(13, column_number);
262 258
263 // Out-of-bounds frames. 259 // Out-of-bounds frames.
264 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 260 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 Dart_Handle function_name; 300 Dart_Handle function_name;
305 Dart_Handle script_url; 301 Dart_Handle script_url;
306 intptr_t line_number = 0; 302 intptr_t line_number = 0;
307 intptr_t column_number = 0; 303 intptr_t column_number = 0;
308 const char* cstr = ""; 304 const char* cstr = "";
309 305
310 // Top frame is inspectStack(). 306 // Top frame is inspectStack().
311 Dart_ActivationFrame frame; 307 Dart_ActivationFrame frame;
312 result = Dart_GetActivationFrame(stacktrace, 0, &frame); 308 result = Dart_GetActivationFrame(stacktrace, 0, &frame);
313 EXPECT_VALID(result); 309 EXPECT_VALID(result);
314 result = Dart_ActivationFrameInfo( 310 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
315 frame, &function_name, &script_url, &line_number, &column_number); 311 &line_number, &column_number);
316 EXPECT_VALID(result); 312 EXPECT_VALID(result);
317 Dart_StringToCString(function_name, &cstr); 313 Dart_StringToCString(function_name, &cstr);
318 EXPECT_STREQ("inspectStack", cstr); 314 EXPECT_STREQ("inspectStack", cstr);
319 Dart_StringToCString(script_url, &cstr); 315 Dart_StringToCString(script_url, &cstr);
320 EXPECT_STREQ("test-lib", cstr); 316 EXPECT_STREQ("test-lib", cstr);
321 EXPECT_EQ(1, line_number); 317 EXPECT_EQ(1, line_number);
322 EXPECT_EQ(47, column_number); 318 EXPECT_EQ(47, column_number);
323 319
324 // Second frame is foo() positioned at call to inspectStack(). 320 // Second frame is foo() positioned at call to inspectStack().
325 result = Dart_GetActivationFrame(stacktrace, 1, &frame); 321 result = Dart_GetActivationFrame(stacktrace, 1, &frame);
326 EXPECT_VALID(result); 322 EXPECT_VALID(result);
327 result = Dart_ActivationFrameInfo( 323 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
328 frame, &function_name, &script_url, &line_number, &column_number); 324 &line_number, &column_number);
329 EXPECT_VALID(result); 325 EXPECT_VALID(result);
330 Dart_StringToCString(function_name, &cstr); 326 Dart_StringToCString(function_name, &cstr);
331 EXPECT_STREQ("foo", cstr); 327 EXPECT_STREQ("foo", cstr);
332 Dart_StringToCString(script_url, &cstr); 328 Dart_StringToCString(script_url, &cstr);
333 EXPECT_STREQ("test-lib", cstr); 329 EXPECT_STREQ("test-lib", cstr);
334 EXPECT_EQ(2, line_number); 330 EXPECT_EQ(2, line_number);
335 EXPECT_EQ(20, column_number); 331 EXPECT_EQ(20, column_number);
336 332
337 // Middle frames positioned at the recursive call. 333 // Middle frames positioned at the recursive call.
338 for (intptr_t frame_index = 2; 334 for (intptr_t frame_index = 2; frame_index < (frame_count - 1);
339 frame_index < (frame_count - 1);
340 frame_index++) { 335 frame_index++) {
341 result = Dart_GetActivationFrame(stacktrace, frame_index, &frame); 336 result = Dart_GetActivationFrame(stacktrace, frame_index, &frame);
342 EXPECT_VALID(result); 337 EXPECT_VALID(result);
343 result = Dart_ActivationFrameInfo( 338 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
344 frame, &function_name, &script_url, &line_number, &column_number); 339 &line_number, &column_number);
345 EXPECT_VALID(result); 340 EXPECT_VALID(result);
346 Dart_StringToCString(function_name, &cstr); 341 Dart_StringToCString(function_name, &cstr);
347 EXPECT_STREQ("foo", cstr); 342 EXPECT_STREQ("foo", cstr);
348 Dart_StringToCString(script_url, &cstr); 343 Dart_StringToCString(script_url, &cstr);
349 EXPECT_STREQ("test-lib", cstr); 344 EXPECT_STREQ("test-lib", cstr);
350 EXPECT_EQ(2, line_number); 345 EXPECT_EQ(2, line_number);
351 EXPECT_EQ(37, column_number); 346 EXPECT_EQ(37, column_number);
352 } 347 }
353 348
354 // Bottom frame positioned at testMain(). 349 // Bottom frame positioned at testMain().
355 result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame); 350 result = Dart_GetActivationFrame(stacktrace, frame_count - 1, &frame);
356 EXPECT_VALID(result); 351 EXPECT_VALID(result);
357 result = Dart_ActivationFrameInfo( 352 result = Dart_ActivationFrameInfo(frame, &function_name, &script_url,
358 frame, &function_name, &script_url, &line_number, &column_number); 353 &line_number, &column_number);
359 EXPECT_VALID(result); 354 EXPECT_VALID(result);
360 Dart_StringToCString(function_name, &cstr); 355 Dart_StringToCString(function_name, &cstr);
361 EXPECT_STREQ("testMain", cstr); 356 EXPECT_STREQ("testMain", cstr);
362 Dart_StringToCString(script_url, &cstr); 357 Dart_StringToCString(script_url, &cstr);
363 EXPECT_STREQ("test-lib", cstr); 358 EXPECT_STREQ("test-lib", cstr);
364 EXPECT_EQ(3, line_number); 359 EXPECT_EQ(3, line_number);
365 EXPECT_EQ(15, column_number); 360 EXPECT_EQ(15, column_number);
366 361
367 // Out-of-bounds frames. 362 // Out-of-bounds frames.
368 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame); 363 result = Dart_GetActivationFrame(stacktrace, frame_count, &frame);
369 EXPECT(Dart_IsError(result)); 364 EXPECT(Dart_IsError(result));
370 result = Dart_GetActivationFrame(stacktrace, -1, &frame); 365 result = Dart_GetActivationFrame(stacktrace, -1, &frame);
371 EXPECT(Dart_IsError(result)); 366 EXPECT(Dart_IsError(result));
372 367
373 Dart_SetReturnValue(args, Dart_NewInteger(42)); 368 Dart_SetReturnValue(args, Dart_NewInteger(42));
374 Dart_ExitScope(); 369 Dart_ExitScope();
375 } 370 }
376 371
377 372
378 static Dart_NativeFunction CurrentStackTraceNativeLookup( 373 static Dart_NativeFunction CurrentStackTraceNativeLookup(
379 Dart_Handle name, int argument_count, bool* auto_setup_scope) { 374 Dart_Handle name,
375 int argument_count,
376 bool* auto_setup_scope) {
380 ASSERT(auto_setup_scope != NULL); 377 ASSERT(auto_setup_scope != NULL);
381 *auto_setup_scope = true; 378 *auto_setup_scope = true;
382 return reinterpret_cast<Dart_NativeFunction>(&CurrentStackTraceNative); 379 return reinterpret_cast<Dart_NativeFunction>(&CurrentStackTraceNative);
383 } 380 }
384 381
385 382
386 TEST_CASE(CurrentStacktraceInfo) { 383 TEST_CASE(CurrentStacktraceInfo) {
387 const char* kScriptChars = 384 const char* kScriptChars =
388 "inspectStack() native 'CurrentStackTraceNatve';\n" 385 "inspectStack() native 'CurrentStackTraceNatve';\n"
389 "foo(n) => n == 1 ? inspectStack() : foo(n-1);\n" 386 "foo(n) => n == 1 ? inspectStack() : foo(n-1);\n"
390 "testMain() => foo(50);\n"; 387 "testMain() => foo(50);\n";
391 388
392 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, 389 Dart_Handle lib =
393 &CurrentStackTraceNativeLookup); 390 TestCase::LoadTestScript(kScriptChars, &CurrentStackTraceNativeLookup);
394 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 391 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
395 EXPECT_VALID(result); 392 EXPECT_VALID(result);
396 EXPECT(Dart_IsInteger(result)); 393 EXPECT(Dart_IsInteger(result));
397 int64_t value = 0; 394 int64_t value = 0;
398 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 395 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
399 EXPECT_EQ(42, value); 396 EXPECT_EQ(42, value);
400 } 397 }
401 398
402 399
403 #endif // !PRODUCT 400 #endif // !PRODUCT
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 EXPECT_STREQ("FatalError", Dart_GetError(fatal_error)); 451 EXPECT_STREQ("FatalError", Dart_GetError(fatal_error));
455 } 452 }
456 453
457 454
458 TEST_CASE(UnhandleExceptionError) { 455 TEST_CASE(UnhandleExceptionError) {
459 const char* exception_cstr = ""; 456 const char* exception_cstr = "";
460 457
461 // Test with an API Error. 458 // Test with an API Error.
462 const char* kApiError = "Api Error Exception Test."; 459 const char* kApiError = "Api Error Exception Test.";
463 Dart_Handle api_error = Api::NewHandle( 460 Dart_Handle api_error = Api::NewHandle(
464 thread, 461 thread, ApiError::New(String::Handle(String::New(kApiError))));
465 ApiError::New(String::Handle(String::New(kApiError))));
466 Dart_Handle exception_error = Dart_NewUnhandledExceptionError(api_error); 462 Dart_Handle exception_error = Dart_NewUnhandledExceptionError(api_error);
467 EXPECT(!Dart_IsApiError(exception_error)); 463 EXPECT(!Dart_IsApiError(exception_error));
468 EXPECT(Dart_IsUnhandledExceptionError(exception_error)); 464 EXPECT(Dart_IsUnhandledExceptionError(exception_error));
469 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error))); 465 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error)));
470 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error), 466 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error),
471 &exception_cstr)); 467 &exception_cstr));
472 EXPECT_STREQ(kApiError, exception_cstr); 468 EXPECT_STREQ(kApiError, exception_cstr);
473 469
474 // Test with a Compilation Error. 470 // Test with a Compilation Error.
475 const char* kCompileError = "CompileError Exception Test."; 471 const char* kCompileError = "CompileError Exception Test.";
476 const String& compile_message = 472 const String& compile_message = String::Handle(String::New(kCompileError));
477 String::Handle(String::New(kCompileError));
478 Dart_Handle compile_error = 473 Dart_Handle compile_error =
479 Api::NewHandle(thread, LanguageError::New(compile_message)); 474 Api::NewHandle(thread, LanguageError::New(compile_message));
480 exception_error = Dart_NewUnhandledExceptionError(compile_error); 475 exception_error = Dart_NewUnhandledExceptionError(compile_error);
481 EXPECT(!Dart_IsApiError(exception_error)); 476 EXPECT(!Dart_IsApiError(exception_error));
482 EXPECT(Dart_IsUnhandledExceptionError(exception_error)); 477 EXPECT(Dart_IsUnhandledExceptionError(exception_error));
483 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error))); 478 EXPECT(Dart_IsString(Dart_ErrorGetException(exception_error)));
484 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error), 479 EXPECT_VALID(Dart_StringToCString(Dart_ErrorGetException(exception_error),
485 &exception_cstr)); 480 &exception_cstr));
486 EXPECT_STREQ(kCompileError, exception_cstr); 481 EXPECT_STREQ(kCompileError, exception_cstr);
487 482
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 UNREACHABLE(); 522 UNREACHABLE();
528 } else { 523 } else {
529 result = Dart_PropagateError(result); 524 result = Dart_PropagateError(result);
530 EXPECT_VALID(result); // We do not expect to reach here. 525 EXPECT_VALID(result); // We do not expect to reach here.
531 UNREACHABLE(); 526 UNREACHABLE();
532 } 527 }
533 } 528 }
534 529
535 530
536 static Dart_NativeFunction PropagateError_native_lookup( 531 static Dart_NativeFunction PropagateError_native_lookup(
537 Dart_Handle name, int argument_count, bool* auto_setup_scope) { 532 Dart_Handle name,
533 int argument_count,
534 bool* auto_setup_scope) {
538 ASSERT(auto_setup_scope != NULL); 535 ASSERT(auto_setup_scope != NULL);
539 *auto_setup_scope = true; 536 *auto_setup_scope = true;
540 return reinterpret_cast<Dart_NativeFunction>(&PropagateErrorNative); 537 return reinterpret_cast<Dart_NativeFunction>(&PropagateErrorNative);
541 } 538 }
542 539
543 540
544 TEST_CASE(Dart_PropagateError) { 541 TEST_CASE(Dart_PropagateError) {
545 const char* kScriptChars = 542 const char* kScriptChars =
546 "raiseCompileError() {\n" 543 "raiseCompileError() {\n"
547 " return missing_semicolon\n" 544 " return missing_semicolon\n"
548 "}\n" 545 "}\n"
549 "\n" 546 "\n"
550 "void throwException() {\n" 547 "void throwException() {\n"
551 " throw new Exception('myException');\n" 548 " throw new Exception('myException');\n"
552 "}\n" 549 "}\n"
553 "\n" 550 "\n"
554 "void nativeFunc(closure) native 'Test_nativeFunc';\n" 551 "void nativeFunc(closure) native 'Test_nativeFunc';\n"
555 "\n" 552 "\n"
556 "void Func1() {\n" 553 "void Func1() {\n"
557 " nativeFunc(() => raiseCompileError());\n" 554 " nativeFunc(() => raiseCompileError());\n"
558 "}\n" 555 "}\n"
559 "\n" 556 "\n"
560 "void Func2() {\n" 557 "void Func2() {\n"
561 " nativeFunc(() => throwException());\n" 558 " nativeFunc(() => throwException());\n"
562 "}\n"; 559 "}\n";
563 Dart_Handle lib = TestCase::LoadTestScript( 560 Dart_Handle lib =
564 kScriptChars, &PropagateError_native_lookup); 561 TestCase::LoadTestScript(kScriptChars, &PropagateError_native_lookup);
565 Dart_Handle result; 562 Dart_Handle result;
566 563
567 // Use Dart_PropagateError to propagate the error. 564 // Use Dart_PropagateError to propagate the error.
568 use_throw_exception = false; 565 use_throw_exception = false;
569 use_set_return = false; 566 use_set_return = false;
570 567
571 result = Dart_Invoke(lib, NewString("Func1"), 0, NULL); 568 result = Dart_Invoke(lib, NewString("Func1"), 0, NULL);
572 EXPECT(Dart_IsError(result)); 569 EXPECT(Dart_IsError(result));
573 EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result)); 570 EXPECT_SUBSTRING("semicolon expected", Dart_GetError(result));
574 571
(...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 EXPECT_VALID(result); 1036 EXPECT_VALID(result);
1040 int64_t value; 1037 int64_t value;
1041 result = Dart_IntegerToInt64(result, &value); 1038 result = Dart_IntegerToInt64(result, &value);
1042 EXPECT_VALID(result); 1039 EXPECT_VALID(result);
1043 EXPECT_EQ(i, value); 1040 EXPECT_EQ(i, value);
1044 } 1041 }
1045 } 1042 }
1046 1043
1047 1044
1048 TEST_CASE(IsString) { 1045 TEST_CASE(IsString) {
1049 uint8_t latin1[] = { 'o', 'n', 'e', 0xC2, 0xA2 }; 1046 uint8_t latin1[] = {'o', 'n', 'e', 0xC2, 0xA2};
1050 1047
1051 Dart_Handle latin1str = Dart_NewStringFromUTF8(latin1, ARRAY_SIZE(latin1)); 1048 Dart_Handle latin1str = Dart_NewStringFromUTF8(latin1, ARRAY_SIZE(latin1));
1052 EXPECT_VALID(latin1str); 1049 EXPECT_VALID(latin1str);
1053 EXPECT(Dart_IsString(latin1str)); 1050 EXPECT(Dart_IsString(latin1str));
1054 EXPECT(Dart_IsStringLatin1(latin1str)); 1051 EXPECT(Dart_IsStringLatin1(latin1str));
1055 EXPECT(!Dart_IsExternalString(latin1str)); 1052 EXPECT(!Dart_IsExternalString(latin1str));
1056 intptr_t len = -1; 1053 intptr_t len = -1;
1057 EXPECT_VALID(Dart_StringLength(latin1str, &len)); 1054 EXPECT_VALID(Dart_StringLength(latin1str, &len));
1058 EXPECT_EQ(4, len); 1055 EXPECT_EQ(4, len);
1059 intptr_t char_size; 1056 intptr_t char_size;
1060 intptr_t str_len; 1057 intptr_t str_len;
1061 void* peer; 1058 void* peer;
1062 EXPECT_VALID(Dart_StringGetProperties(latin1str, 1059 EXPECT_VALID(
1063 &char_size, 1060 Dart_StringGetProperties(latin1str, &char_size, &str_len, &peer));
1064 &str_len,
1065 &peer));
1066 EXPECT_EQ(1, char_size); 1061 EXPECT_EQ(1, char_size);
1067 EXPECT_EQ(4, str_len); 1062 EXPECT_EQ(4, str_len);
1068 EXPECT(!peer); 1063 EXPECT(!peer);
1069 1064
1070 uint8_t data8[] = { 'o', 'n', 'e', 0x7F }; 1065 uint8_t data8[] = {'o', 'n', 'e', 0x7F};
1071 1066
1072 Dart_Handle str8 = Dart_NewStringFromUTF8(data8, ARRAY_SIZE(data8)); 1067 Dart_Handle str8 = Dart_NewStringFromUTF8(data8, ARRAY_SIZE(data8));
1073 EXPECT_VALID(str8); 1068 EXPECT_VALID(str8);
1074 EXPECT(Dart_IsString(str8)); 1069 EXPECT(Dart_IsString(str8));
1075 EXPECT(Dart_IsStringLatin1(str8)); 1070 EXPECT(Dart_IsStringLatin1(str8));
1076 EXPECT(!Dart_IsExternalString(str8)); 1071 EXPECT(!Dart_IsExternalString(str8));
1077 1072
1078 uint8_t latin1_array[] = {0, 0, 0, 0, 0}; 1073 uint8_t latin1_array[] = {0, 0, 0, 0, 0};
1079 len = 5; 1074 len = 5;
1080 Dart_Handle result = Dart_StringToLatin1(str8, latin1_array, &len); 1075 Dart_Handle result = Dart_StringToLatin1(str8, latin1_array, &len);
1081 EXPECT_VALID(result); 1076 EXPECT_VALID(result);
1082 EXPECT_EQ(4, len); 1077 EXPECT_EQ(4, len);
1083 EXPECT(latin1_array != NULL); 1078 EXPECT(latin1_array != NULL);
1084 for (intptr_t i = 0; i < len; i++) { 1079 for (intptr_t i = 0; i < len; i++) {
1085 EXPECT_EQ(data8[i], latin1_array[i]); 1080 EXPECT_EQ(data8[i], latin1_array[i]);
1086 } 1081 }
1087 1082
1088 Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), 1083 Dart_Handle ext8 =
1089 data8, NULL); 1084 Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL);
1090 EXPECT_VALID(ext8); 1085 EXPECT_VALID(ext8);
1091 EXPECT(Dart_IsString(ext8)); 1086 EXPECT(Dart_IsString(ext8));
1092 EXPECT(Dart_IsExternalString(ext8)); 1087 EXPECT(Dart_IsExternalString(ext8));
1093 EXPECT_VALID(Dart_StringGetProperties(ext8, 1088 EXPECT_VALID(Dart_StringGetProperties(ext8, &char_size, &str_len, &peer));
1094 &char_size,
1095 &str_len,
1096 &peer));
1097 EXPECT_EQ(1, char_size); 1089 EXPECT_EQ(1, char_size);
1098 EXPECT_EQ(4, str_len); 1090 EXPECT_EQ(4, str_len);
1099 EXPECT_EQ(data8, peer); 1091 EXPECT_EQ(data8, peer);
1100 1092
1101 uint16_t data16[] = { 't', 'w', 'o', 0xFFFF }; 1093 uint16_t data16[] = {'t', 'w', 'o', 0xFFFF};
1102 1094
1103 Dart_Handle str16 = Dart_NewStringFromUTF16(data16, ARRAY_SIZE(data16)); 1095 Dart_Handle str16 = Dart_NewStringFromUTF16(data16, ARRAY_SIZE(data16));
1104 EXPECT_VALID(str16); 1096 EXPECT_VALID(str16);
1105 EXPECT(Dart_IsString(str16)); 1097 EXPECT(Dart_IsString(str16));
1106 EXPECT(!Dart_IsStringLatin1(str16)); 1098 EXPECT(!Dart_IsStringLatin1(str16));
1107 EXPECT(!Dart_IsExternalString(str16)); 1099 EXPECT(!Dart_IsExternalString(str16));
1108 EXPECT_VALID(Dart_StringGetProperties(str16, 1100 EXPECT_VALID(Dart_StringGetProperties(str16, &char_size, &str_len, &peer));
1109 &char_size,
1110 &str_len,
1111 &peer));
1112 EXPECT_EQ(2, char_size); 1101 EXPECT_EQ(2, char_size);
1113 EXPECT_EQ(4, str_len); 1102 EXPECT_EQ(4, str_len);
1114 EXPECT(!peer); 1103 EXPECT(!peer);
1115 1104
1116 Dart_Handle ext16 = Dart_NewExternalUTF16String(data16, ARRAY_SIZE(data16), 1105 Dart_Handle ext16 =
1117 data16, NULL); 1106 Dart_NewExternalUTF16String(data16, ARRAY_SIZE(data16), data16, NULL);
1118 EXPECT_VALID(ext16); 1107 EXPECT_VALID(ext16);
1119 EXPECT(Dart_IsString(ext16)); 1108 EXPECT(Dart_IsString(ext16));
1120 EXPECT(Dart_IsExternalString(ext16)); 1109 EXPECT(Dart_IsExternalString(ext16));
1121 EXPECT_VALID(Dart_StringGetProperties(ext16, 1110 EXPECT_VALID(Dart_StringGetProperties(ext16, &char_size, &str_len, &peer));
1122 &char_size,
1123 &str_len,
1124 &peer));
1125 EXPECT_EQ(2, char_size); 1111 EXPECT_EQ(2, char_size);
1126 EXPECT_EQ(4, str_len); 1112 EXPECT_EQ(4, str_len);
1127 EXPECT_EQ(data16, peer); 1113 EXPECT_EQ(data16, peer);
1128 1114
1129 int32_t data32[] = { 'f', 'o', 'u', 'r', 0x10FFFF }; 1115 int32_t data32[] = {'f', 'o', 'u', 'r', 0x10FFFF};
1130 1116
1131 Dart_Handle str32 = Dart_NewStringFromUTF32(data32, ARRAY_SIZE(data32)); 1117 Dart_Handle str32 = Dart_NewStringFromUTF32(data32, ARRAY_SIZE(data32));
1132 EXPECT_VALID(str32); 1118 EXPECT_VALID(str32);
1133 EXPECT(Dart_IsString(str32)); 1119 EXPECT(Dart_IsString(str32));
1134 EXPECT(!Dart_IsExternalString(str32)); 1120 EXPECT(!Dart_IsExternalString(str32));
1135 } 1121 }
1136 1122
1137 1123
1138 TEST_CASE(NewString) { 1124 TEST_CASE(NewString) {
1139 const char* ascii = "string"; 1125 const char* ascii = "string";
1140 Dart_Handle ascii_str = NewString(ascii); 1126 Dart_Handle ascii_str = NewString(ascii);
1141 EXPECT_VALID(ascii_str); 1127 EXPECT_VALID(ascii_str);
1142 EXPECT(Dart_IsString(ascii_str)); 1128 EXPECT(Dart_IsString(ascii_str));
1143 1129
1144 const char* null = NULL; 1130 const char* null = NULL;
1145 Dart_Handle null_str = NewString(null); 1131 Dart_Handle null_str = NewString(null);
1146 EXPECT(Dart_IsError(null_str)); 1132 EXPECT(Dart_IsError(null_str));
1147 1133
1148 uint8_t data[] = { 0xE4, 0xBA, 0x8c }; // U+4E8C. 1134 uint8_t data[] = {0xE4, 0xBA, 0x8c}; // U+4E8C.
1149 Dart_Handle utf8_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data)); 1135 Dart_Handle utf8_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data));
1150 EXPECT_VALID(utf8_str); 1136 EXPECT_VALID(utf8_str);
1151 EXPECT(Dart_IsString(utf8_str)); 1137 EXPECT(Dart_IsString(utf8_str));
1152 1138
1153 uint8_t invalid[] = { 0xE4, 0xBA }; // underflow. 1139 uint8_t invalid[] = {0xE4, 0xBA}; // underflow.
1154 Dart_Handle invalid_str = Dart_NewStringFromUTF8(invalid, 1140 Dart_Handle invalid_str =
1155 ARRAY_SIZE(invalid)); 1141 Dart_NewStringFromUTF8(invalid, ARRAY_SIZE(invalid));
1156 EXPECT(Dart_IsError(invalid_str)); 1142 EXPECT(Dart_IsError(invalid_str));
1157 } 1143 }
1158 1144
1159 1145
1160 TEST_CASE(MalformedStringToUTF8) { 1146 TEST_CASE(MalformedStringToUTF8) {
1161 // 1D11E = treble clef 1147 // 1D11E = treble clef
1162 // [0] should be high surrogate D834 1148 // [0] should be high surrogate D834
1163 // [1] should be low surrogate DD1E 1149 // [1] should be low surrogate DD1E
1164 // Strings are allowed to have individual or out of order surrogates, even 1150 // Strings are allowed to have individual or out of order surrogates, even
1165 // if that doesn't make sense as renderable characters. 1151 // if that doesn't make sense as renderable characters.
(...skipping 19 matching lines...) Expand all
1185 EXPECT_EQ(180, static_cast<intptr_t>(utf8_encoded[1])); 1171 EXPECT_EQ(180, static_cast<intptr_t>(utf8_encoded[1]));
1186 EXPECT_EQ(158, static_cast<intptr_t>(utf8_encoded[2])); 1172 EXPECT_EQ(158, static_cast<intptr_t>(utf8_encoded[2]));
1187 1173
1188 Dart_Handle str2 = Dart_NewStringFromUTF8(utf8_encoded, utf8_length); 1174 Dart_Handle str2 = Dart_NewStringFromUTF8(utf8_encoded, utf8_length);
1189 EXPECT_VALID(str2); // Standalone low surrogate, but still valid 1175 EXPECT_VALID(str2); // Standalone low surrogate, but still valid
1190 1176
1191 Dart_Handle reversed = Dart_Invoke(lib, NewString("reversed"), 0, NULL); 1177 Dart_Handle reversed = Dart_Invoke(lib, NewString("reversed"), 0, NULL);
1192 EXPECT_VALID(reversed); // This is also allowed. 1178 EXPECT_VALID(reversed); // This is also allowed.
1193 uint8_t* utf8_encoded_reversed = NULL; 1179 uint8_t* utf8_encoded_reversed = NULL;
1194 intptr_t utf8_length_reversed = 0; 1180 intptr_t utf8_length_reversed = 0;
1195 result = Dart_StringToUTF8(reversed, 1181 result = Dart_StringToUTF8(reversed, &utf8_encoded_reversed,
1196 &utf8_encoded_reversed, &utf8_length_reversed); 1182 &utf8_length_reversed);
1197 EXPECT_VALID(result); 1183 EXPECT_VALID(result);
1198 EXPECT_EQ(6, utf8_length_reversed); 1184 EXPECT_EQ(6, utf8_length_reversed);
1199 uint8_t expected[6] = {237, 180, 158, 237, 160, 180}; 1185 uint8_t expected[6] = {237, 180, 158, 237, 160, 180};
1200 for (int i = 0; i < 6; i++) { 1186 for (int i = 0; i < 6; i++) {
1201 EXPECT_EQ(expected[i], utf8_encoded_reversed[i]); 1187 EXPECT_EQ(expected[i], utf8_encoded_reversed[i]);
1202 } 1188 }
1203 } 1189 }
1204 1190
1205 1191
1206 // Helper class to ensure new gen GC is triggered without any side effects. 1192 // Helper class to ensure new gen GC is triggered without any side effects.
(...skipping 23 matching lines...) Expand all
1230 } 1216 }
1231 1217
1232 1218
1233 TEST_CASE(ExternalStringCallback) { 1219 TEST_CASE(ExternalStringCallback) {
1234 int peer8 = 40; 1220 int peer8 = 40;
1235 int peer16 = 41; 1221 int peer16 = 41;
1236 1222
1237 { 1223 {
1238 Dart_EnterScope(); 1224 Dart_EnterScope();
1239 1225
1240 uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' }; 1226 uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'};
1241 Dart_Handle obj8 = Dart_NewExternalLatin1String( 1227 Dart_Handle obj8 = Dart_NewExternalLatin1String(
1242 data8, 1228 data8, ARRAY_SIZE(data8), &peer8, ExternalStringCallbackFinalizer);
1243 ARRAY_SIZE(data8),
1244 &peer8,
1245 ExternalStringCallbackFinalizer);
1246 EXPECT_VALID(obj8); 1229 EXPECT_VALID(obj8);
1247 1230
1248 uint16_t data16[] = { 'h', 'e', 'l', 'l', 'o' }; 1231 uint16_t data16[] = {'h', 'e', 'l', 'l', 'o'};
1249 Dart_Handle obj16 = Dart_NewExternalUTF16String( 1232 Dart_Handle obj16 = Dart_NewExternalUTF16String(
1250 data16, 1233 data16, ARRAY_SIZE(data16), &peer16, ExternalStringCallbackFinalizer);
1251 ARRAY_SIZE(data16),
1252 &peer16,
1253 ExternalStringCallbackFinalizer);
1254 EXPECT_VALID(obj16); 1234 EXPECT_VALID(obj16);
1255 1235
1256 Dart_ExitScope(); 1236 Dart_ExitScope();
1257 } 1237 }
1258 1238
1259 { 1239 {
1260 TransitionNativeToVM transition(thread); 1240 TransitionNativeToVM transition(thread);
1261 EXPECT_EQ(40, peer8); 1241 EXPECT_EQ(40, peer8);
1262 EXPECT_EQ(41, peer16); 1242 EXPECT_EQ(41, peer16);
1263 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 1243 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
1264 GCTestHelper::WaitForGCTasks(); 1244 GCTestHelper::WaitForGCTasks();
1265 EXPECT_EQ(40, peer8); 1245 EXPECT_EQ(40, peer8);
1266 EXPECT_EQ(41, peer16); 1246 EXPECT_EQ(41, peer16);
1267 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 1247 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
1268 GCTestHelper::WaitForGCTasks(); 1248 GCTestHelper::WaitForGCTasks();
1269 EXPECT_EQ(80, peer8); 1249 EXPECT_EQ(80, peer8);
1270 EXPECT_EQ(82, peer16); 1250 EXPECT_EQ(82, peer16);
1271 } 1251 }
1272 } 1252 }
1273 1253
1274 1254
1275 TEST_CASE(ExternalStringPretenure) { 1255 TEST_CASE(ExternalStringPretenure) {
1276 { 1256 {
1277 Dart_EnterScope(); 1257 Dart_EnterScope();
1278 static const uint8_t big_data8[16*MB] = {0, }; 1258 static const uint8_t big_data8[16 * MB] = {
1259 0,
1260 };
1279 Dart_Handle big8 = Dart_NewExternalLatin1String( 1261 Dart_Handle big8 = Dart_NewExternalLatin1String(
1280 big_data8, 1262 big_data8, ARRAY_SIZE(big_data8), NULL, NULL);
1281 ARRAY_SIZE(big_data8),
1282 NULL,
1283 NULL);
1284 EXPECT_VALID(big8); 1263 EXPECT_VALID(big8);
1285 static const uint16_t big_data16[16*MB/2] = {0, }; 1264 static const uint16_t big_data16[16 * MB / 2] = {
1265 0,
1266 };
1286 Dart_Handle big16 = Dart_NewExternalUTF16String( 1267 Dart_Handle big16 = Dart_NewExternalUTF16String(
1287 big_data16, 1268 big_data16, ARRAY_SIZE(big_data16), NULL, NULL);
1288 ARRAY_SIZE(big_data16),
1289 NULL,
1290 NULL);
1291 static const uint8_t small_data8[] = {'f', 'o', 'o'}; 1269 static const uint8_t small_data8[] = {'f', 'o', 'o'};
1292 Dart_Handle small8 = Dart_NewExternalLatin1String( 1270 Dart_Handle small8 = Dart_NewExternalLatin1String(
1293 small_data8, 1271 small_data8, ARRAY_SIZE(small_data8), NULL, NULL);
1294 ARRAY_SIZE(small_data8),
1295 NULL,
1296 NULL);
1297 EXPECT_VALID(small8); 1272 EXPECT_VALID(small8);
1298 static const uint16_t small_data16[] = {'b', 'a', 'r'}; 1273 static const uint16_t small_data16[] = {'b', 'a', 'r'};
1299 Dart_Handle small16 = Dart_NewExternalUTF16String( 1274 Dart_Handle small16 = Dart_NewExternalUTF16String(
1300 small_data16, 1275 small_data16, ARRAY_SIZE(small_data16), NULL, NULL);
1301 ARRAY_SIZE(small_data16),
1302 NULL,
1303 NULL);
1304 EXPECT_VALID(small16); 1276 EXPECT_VALID(small16);
1305 { 1277 {
1306 CHECK_API_SCOPE(thread); 1278 CHECK_API_SCOPE(thread);
1307 HANDLESCOPE(thread); 1279 HANDLESCOPE(thread);
1308 String& handle = String::Handle(); 1280 String& handle = String::Handle();
1309 handle ^= Api::UnwrapHandle(big8); 1281 handle ^= Api::UnwrapHandle(big8);
1310 EXPECT(handle.IsOld()); 1282 EXPECT(handle.IsOld());
1311 handle ^= Api::UnwrapHandle(big16); 1283 handle ^= Api::UnwrapHandle(big16);
1312 EXPECT(handle.IsOld()); 1284 EXPECT(handle.IsOld());
1313 handle ^= Api::UnwrapHandle(small8); 1285 handle ^= Api::UnwrapHandle(small8);
1314 EXPECT(handle.IsNew()); 1286 EXPECT(handle.IsNew());
1315 handle ^= Api::UnwrapHandle(small16); 1287 handle ^= Api::UnwrapHandle(small16);
1316 EXPECT(handle.IsNew()); 1288 EXPECT(handle.IsNew());
1317 } 1289 }
1318 Dart_ExitScope(); 1290 Dart_ExitScope();
1319 } 1291 }
1320 } 1292 }
1321 1293
1322 1294
1323 TEST_CASE(ExternalTypedDataPretenure) { 1295 TEST_CASE(ExternalTypedDataPretenure) {
1324 { 1296 {
1325 Dart_EnterScope(); 1297 Dart_EnterScope();
1326 static const int kBigLength = 16*MB/8; 1298 static const int kBigLength = 16 * MB / 8;
1327 int64_t* big_data = new int64_t[kBigLength](); 1299 int64_t* big_data = new int64_t[kBigLength]();
1328 Dart_Handle big = Dart_NewExternalTypedData( 1300 Dart_Handle big =
1329 Dart_TypedData_kInt64, 1301 Dart_NewExternalTypedData(Dart_TypedData_kInt64, big_data, kBigLength);
1330 big_data,
1331 kBigLength);
1332 EXPECT_VALID(big); 1302 EXPECT_VALID(big);
1333 static const int kSmallLength = 16*KB/8; 1303 static const int kSmallLength = 16 * KB / 8;
1334 int64_t* small_data = new int64_t[kSmallLength](); 1304 int64_t* small_data = new int64_t[kSmallLength]();
1335 Dart_Handle small = Dart_NewExternalTypedData( 1305 Dart_Handle small = Dart_NewExternalTypedData(Dart_TypedData_kInt64,
1336 Dart_TypedData_kInt64, 1306 small_data, kSmallLength);
1337 small_data,
1338 kSmallLength);
1339 EXPECT_VALID(small); 1307 EXPECT_VALID(small);
1340 { 1308 {
1341 CHECK_API_SCOPE(thread); 1309 CHECK_API_SCOPE(thread);
1342 HANDLESCOPE(thread); 1310 HANDLESCOPE(thread);
1343 ExternalTypedData& handle = ExternalTypedData::Handle(); 1311 ExternalTypedData& handle = ExternalTypedData::Handle();
1344 handle ^= Api::UnwrapHandle(big); 1312 handle ^= Api::UnwrapHandle(big);
1345 EXPECT(handle.IsOld()); 1313 EXPECT(handle.IsOld());
1346 handle ^= Api::UnwrapHandle(small); 1314 handle ^= Api::UnwrapHandle(small);
1347 EXPECT(handle.IsNew()); 1315 EXPECT(handle.IsNew());
1348 } 1316 }
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1469 // Check if we can get a range of values. 1437 // Check if we can get a range of values.
1470 result = Dart_ListGetRange(list_access_test_obj, 8, 4, NULL); 1438 result = Dart_ListGetRange(list_access_test_obj, 8, 4, NULL);
1471 EXPECT(Dart_IsError(result)); 1439 EXPECT(Dart_IsError(result));
1472 const int kRangeOffset = 1; 1440 const int kRangeOffset = 1;
1473 const int kRangeLength = 2; 1441 const int kRangeLength = 2;
1474 Dart_Handle values[kRangeLength]; 1442 Dart_Handle values[kRangeLength];
1475 1443
1476 result = Dart_ListGetRange(list_access_test_obj, 8, 4, values); 1444 result = Dart_ListGetRange(list_access_test_obj, 8, 4, values);
1477 EXPECT(Dart_IsError(result)); 1445 EXPECT(Dart_IsError(result));
1478 1446
1479 result = Dart_ListGetRange( 1447 result = Dart_ListGetRange(list_access_test_obj, kRangeOffset, kRangeLength,
1480 list_access_test_obj, kRangeOffset, kRangeLength, values); 1448 values);
1481 EXPECT_VALID(result); 1449 EXPECT_VALID(result);
1482 1450
1483 result = Dart_IntegerToInt64(values[0], &value); 1451 result = Dart_IntegerToInt64(values[0], &value);
1484 EXPECT_VALID(result); 1452 EXPECT_VALID(result);
1485 EXPECT_EQ(20, value); 1453 EXPECT_EQ(20, value);
1486 1454
1487 result = Dart_IntegerToInt64(values[1], &value); 1455 result = Dart_IntegerToInt64(values[1], &value);
1488 EXPECT_VALID(result); 1456 EXPECT_VALID(result);
1489 EXPECT_EQ(30, value); 1457 EXPECT_EQ(30, value);
1490 1458
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1672 Dart_Handle dart_args[1]; 1640 Dart_Handle dart_args[1];
1673 dart_args[0] = Dart_NewInteger(kSize); 1641 dart_args[0] = Dart_NewInteger(kSize);
1674 Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args); 1642 Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
1675 EXPECT_VALID(view_obj); 1643 EXPECT_VALID(view_obj);
1676 // Test that the API considers it a TypedData object. 1644 // Test that the API considers it a TypedData object.
1677 EXPECT(Dart_IsTypedData(view_obj)); 1645 EXPECT(Dart_IsTypedData(view_obj));
1678 } 1646 }
1679 1647
1680 1648
1681 TEST_CASE(TypedDataAccess) { 1649 TEST_CASE(TypedDataAccess) {
1682 EXPECT_EQ(Dart_TypedData_kInvalid, 1650 EXPECT_EQ(Dart_TypedData_kInvalid, Dart_GetTypeOfTypedData(Dart_True()));
1683 Dart_GetTypeOfTypedData(Dart_True()));
1684 EXPECT_EQ(Dart_TypedData_kInvalid, 1651 EXPECT_EQ(Dart_TypedData_kInvalid,
1685 Dart_GetTypeOfExternalTypedData(Dart_False())); 1652 Dart_GetTypeOfExternalTypedData(Dart_False()));
1686 Dart_Handle byte_array1 = Dart_NewTypedData(Dart_TypedData_kUint8, 10); 1653 Dart_Handle byte_array1 = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
1687 EXPECT_VALID(byte_array1); 1654 EXPECT_VALID(byte_array1);
1688 EXPECT_EQ(Dart_TypedData_kUint8, 1655 EXPECT_EQ(Dart_TypedData_kUint8, Dart_GetTypeOfTypedData(byte_array1));
1689 Dart_GetTypeOfTypedData(byte_array1));
1690 EXPECT_EQ(Dart_TypedData_kInvalid, 1656 EXPECT_EQ(Dart_TypedData_kInvalid,
1691 Dart_GetTypeOfExternalTypedData(byte_array1)); 1657 Dart_GetTypeOfExternalTypedData(byte_array1));
1692 EXPECT(Dart_IsList(byte_array1)); 1658 EXPECT(Dart_IsList(byte_array1));
1693 EXPECT(!Dart_IsTypedData(Dart_True())); 1659 EXPECT(!Dart_IsTypedData(Dart_True()));
1694 EXPECT(Dart_IsTypedData(byte_array1)); 1660 EXPECT(Dart_IsTypedData(byte_array1));
1695 EXPECT(!Dart_IsByteBuffer(byte_array1)); 1661 EXPECT(!Dart_IsByteBuffer(byte_array1));
1696 1662
1697 intptr_t length = 0; 1663 intptr_t length = 0;
1698 Dart_Handle result = Dart_ListLength(byte_array1, &length); 1664 Dart_Handle result = Dart_ListLength(byte_array1, &length);
1699 EXPECT_VALID(result); 1665 EXPECT_VALID(result);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1732 } 1698 }
1733 for (intptr_t i = 0; i < 10; ++i) { 1699 for (intptr_t i = 0; i < 10; ++i) {
1734 // Get through the List API. 1700 // Get through the List API.
1735 Dart_Handle e1 = Dart_ListGetAt(byte_array1, i); 1701 Dart_Handle e1 = Dart_ListGetAt(byte_array1, i);
1736 Dart_Handle e2 = Dart_ListGetAt(byte_array2, i); 1702 Dart_Handle e2 = Dart_ListGetAt(byte_array2, i);
1737 is_equal = false; 1703 is_equal = false;
1738 Dart_ObjectEquals(e1, e2, &is_equal); 1704 Dart_ObjectEquals(e1, e2, &is_equal);
1739 EXPECT(is_equal); 1705 EXPECT(is_equal);
1740 } 1706 }
1741 1707
1742 uint8_t data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 1708 uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
1743 for (intptr_t i = 0; i < 10; ++i) { 1709 for (intptr_t i = 0; i < 10; ++i) {
1744 EXPECT_VALID(Dart_ListSetAt(byte_array1, i, Dart_NewInteger(10 - i))); 1710 EXPECT_VALID(Dart_ListSetAt(byte_array1, i, Dart_NewInteger(10 - i)));
1745 } 1711 }
1746 Dart_ListGetAsBytes(byte_array1, 0, data, 10); 1712 Dart_ListGetAsBytes(byte_array1, 0, data, 10);
1747 for (intptr_t i = 0; i < 10; ++i) { 1713 for (intptr_t i = 0; i < 10; ++i) {
1748 Dart_Handle integer_obj = Dart_ListGetAt(byte_array1, i); 1714 Dart_Handle integer_obj = Dart_ListGetAt(byte_array1, i);
1749 EXPECT_VALID(integer_obj); 1715 EXPECT_VALID(integer_obj);
1750 int64_t int64_t_value = -1; 1716 int64_t int64_t_value = -1;
1751 EXPECT_VALID(Dart_IntegerToInt64(integer_obj, &int64_t_value)); 1717 EXPECT_VALID(Dart_IntegerToInt64(integer_obj, &int64_t_value));
1752 EXPECT_EQ(10 - i, int64_t_value); 1718 EXPECT_EQ(10 - i, int64_t_value);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 Dart_SetNativeResolver(lib, &ByteDataNativeResolver, NULL); 1815 Dart_SetNativeResolver(lib, &ByteDataNativeResolver, NULL);
1850 EXPECT_VALID(result); 1816 EXPECT_VALID(result);
1851 1817
1852 // Invoke 'main' function. 1818 // Invoke 'main' function.
1853 result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1819 result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1854 EXPECT_VALID(result); 1820 EXPECT_VALID(result);
1855 } 1821 }
1856 1822
1857 1823
1858 static const intptr_t kExtLength = 16; 1824 static const intptr_t kExtLength = 16;
1859 static int8_t data[kExtLength] = { 0x41, 0x42, 0x41, 0x42, 1825 static int8_t data[kExtLength] = {
1860 0x41, 0x42, 0x41, 0x42, 1826 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42,
1861 0x41, 0x42, 0x41, 0x42, 1827 0x41, 0x42, 0x41, 0x42, 0x41, 0x42, 0x41, 0x42,
1862 0x41, 0x42, 0x41, 0x42, }; 1828 };
1863 1829
1864 static void ExternalByteDataNativeFunction(Dart_NativeArguments args) { 1830 static void ExternalByteDataNativeFunction(Dart_NativeArguments args) {
1865 Dart_EnterScope(); 1831 Dart_EnterScope();
1866 Dart_Handle external_byte_data = Dart_NewExternalTypedData( 1832 Dart_Handle external_byte_data =
1867 Dart_TypedData_kByteData, data, 16); 1833 Dart_NewExternalTypedData(Dart_TypedData_kByteData, data, 16);
1868 EXPECT_VALID(external_byte_data); 1834 EXPECT_VALID(external_byte_data);
1869 EXPECT_EQ(Dart_TypedData_kByteData, 1835 EXPECT_EQ(Dart_TypedData_kByteData,
1870 Dart_GetTypeOfTypedData(external_byte_data)); 1836 Dart_GetTypeOfTypedData(external_byte_data));
1871 Dart_SetReturnValue(args, external_byte_data); 1837 Dart_SetReturnValue(args, external_byte_data);
1872 Dart_ExitScope(); 1838 Dart_ExitScope();
1873 } 1839 }
1874 1840
1875 1841
1876 static Dart_NativeFunction ExternalByteDataNativeResolver( 1842 static Dart_NativeFunction ExternalByteDataNativeResolver(
1877 Dart_Handle name, int arg_count, bool* auto_setup_scope) { 1843 Dart_Handle name,
1844 int arg_count,
1845 bool* auto_setup_scope) {
1878 ASSERT(auto_setup_scope != NULL); 1846 ASSERT(auto_setup_scope != NULL);
1879 *auto_setup_scope = true; 1847 *auto_setup_scope = true;
1880 return &ExternalByteDataNativeFunction; 1848 return &ExternalByteDataNativeFunction;
1881 } 1849 }
1882 1850
1883 1851
1884 TEST_CASE(ExternalByteDataAccess) { 1852 TEST_CASE(ExternalByteDataAccess) {
1885 // TODO(asiva): Once we have getInt16LE and getInt16BE support use the 1853 // TODO(asiva): Once we have getInt16LE and getInt16BE support use the
1886 // appropriate getter instead of the host endian format used now. 1854 // appropriate getter instead of the host endian format used now.
1887 const char* kScriptChars = 1855 const char* kScriptChars =
(...skipping 18 matching lines...) Expand all
1906 " a.setInt8(i + 1, 0x28);" 1874 " a.setInt8(i + 1, 0x28);"
1907 " }" 1875 " }"
1908 " for (int i = 0; i < length; i+=2) {" 1876 " for (int i = 0; i < length; i+=2) {"
1909 " Expect.equals(0x2824, a.getInt16(i, Endianness.LITTLE_ENDIAN));" 1877 " Expect.equals(0x2824, a.getInt16(i, Endianness.LITTLE_ENDIAN));"
1910 " }" 1878 " }"
1911 " return a;" 1879 " return a;"
1912 "}\n"; 1880 "}\n";
1913 // Create a test library and Load up a test script in it. 1881 // Create a test library and Load up a test script in it.
1914 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 1882 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
1915 1883
1916 Dart_Handle result = Dart_SetNativeResolver(lib, 1884 Dart_Handle result =
1917 &ExternalByteDataNativeResolver, 1885 Dart_SetNativeResolver(lib, &ExternalByteDataNativeResolver, NULL);
1918 NULL);
1919 EXPECT_VALID(result); 1886 EXPECT_VALID(result);
1920 1887
1921 // Invoke 'main' function. 1888 // Invoke 'main' function.
1922 result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1889 result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1923 EXPECT_VALID(result); 1890 EXPECT_VALID(result);
1924 1891
1925 for (intptr_t i = 0; i < kExtLength; i+=2) { 1892 for (intptr_t i = 0; i < kExtLength; i += 2) {
1926 EXPECT_EQ(0x24, data[i]); 1893 EXPECT_EQ(0x24, data[i]);
1927 EXPECT_EQ(0x28, data[i+1]); 1894 EXPECT_EQ(0x28, data[i + 1]);
1928 } 1895 }
1929 } 1896 }
1930 1897
1931 1898
1932 #ifndef PRODUCT 1899 #ifndef PRODUCT
1933 1900
1934 1901
1935 static const intptr_t kOptExtLength = 16; 1902 static const intptr_t kOptExtLength = 16;
1936 static int8_t opt_data[kOptExtLength] = { 0x01, 0x02, 0x03, 0x04, 1903 static int8_t opt_data[kOptExtLength] = {
1937 0x05, 0x06, 0x07, 0x08, 1904 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
1938 0x09, 0x0a, 0x0b, 0x0c, 1905 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
1939 0x0d, 0x0e, 0x0f, 0x10, }; 1906 };
1940 1907
1941 static void OptExternalByteDataNativeFunction(Dart_NativeArguments args) { 1908 static void OptExternalByteDataNativeFunction(Dart_NativeArguments args) {
1942 Dart_EnterScope(); 1909 Dart_EnterScope();
1943 Dart_Handle external_byte_data = Dart_NewExternalTypedData( 1910 Dart_Handle external_byte_data =
1944 Dart_TypedData_kByteData, opt_data, 16); 1911 Dart_NewExternalTypedData(Dart_TypedData_kByteData, opt_data, 16);
1945 EXPECT_VALID(external_byte_data); 1912 EXPECT_VALID(external_byte_data);
1946 EXPECT_EQ(Dart_TypedData_kByteData, 1913 EXPECT_EQ(Dart_TypedData_kByteData,
1947 Dart_GetTypeOfTypedData(external_byte_data)); 1914 Dart_GetTypeOfTypedData(external_byte_data));
1948 Dart_SetReturnValue(args, external_byte_data); 1915 Dart_SetReturnValue(args, external_byte_data);
1949 Dart_ExitScope(); 1916 Dart_ExitScope();
1950 } 1917 }
1951 1918
1952 1919
1953 static Dart_NativeFunction OptExternalByteDataNativeResolver( 1920 static Dart_NativeFunction OptExternalByteDataNativeResolver(
1954 Dart_Handle name, int arg_count, bool* auto_setup_scope) { 1921 Dart_Handle name,
1922 int arg_count,
1923 bool* auto_setup_scope) {
1955 ASSERT(auto_setup_scope != NULL); 1924 ASSERT(auto_setup_scope != NULL);
1956 *auto_setup_scope = true; 1925 *auto_setup_scope = true;
1957 return &OptExternalByteDataNativeFunction; 1926 return &OptExternalByteDataNativeFunction;
1958 } 1927 }
1959 1928
1960 1929
1961 TEST_CASE(OptimizedExternalByteDataAccess) { 1930 TEST_CASE(OptimizedExternalByteDataAccess) {
1962 const char* kScriptChars = 1931 const char* kScriptChars =
1963 "import 'dart:typed_data';\n" 1932 "import 'dart:typed_data';\n"
1964 "class Expect {\n" 1933 "class Expect {\n"
(...skipping 15 matching lines...) Expand all
1980 " var a = createExternalByteData();" 1949 " var a = createExternalByteData();"
1981 " Expect.equals(length, a.lengthInBytes);" 1950 " Expect.equals(length, a.lengthInBytes);"
1982 " for (int i = 0; i < 20; i++) {" 1951 " for (int i = 0; i < 20; i++) {"
1983 " access(a);" 1952 " access(a);"
1984 " }" 1953 " }"
1985 " return a;" 1954 " return a;"
1986 "}\n"; 1955 "}\n";
1987 // Create a test library and Load up a test script in it. 1956 // Create a test library and Load up a test script in it.
1988 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 1957 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
1989 1958
1990 Dart_Handle result = Dart_SetNativeResolver( 1959 Dart_Handle result =
1991 lib, &OptExternalByteDataNativeResolver, NULL); 1960 Dart_SetNativeResolver(lib, &OptExternalByteDataNativeResolver, NULL);
1992 EXPECT_VALID(result); 1961 EXPECT_VALID(result);
1993 1962
1994 // Invoke 'main' function. 1963 // Invoke 'main' function.
1995 int old_oct = FLAG_optimization_counter_threshold; 1964 int old_oct = FLAG_optimization_counter_threshold;
1996 FLAG_optimization_counter_threshold = 5; 1965 FLAG_optimization_counter_threshold = 5;
1997 result = Dart_Invoke(lib, NewString("main"), 0, NULL); 1966 result = Dart_Invoke(lib, NewString("main"), 0, NULL);
1998 EXPECT_VALID(result); 1967 EXPECT_VALID(result);
1999 FLAG_optimization_counter_threshold = old_oct; 1968 FLAG_optimization_counter_threshold = old_oct;
2000 } 1969 }
2001 1970
2002 1971
2003 #endif // !PRODUCT 1972 #endif // !PRODUCT
2004 1973
2005 1974
2006 static void TestTypedDataDirectAccess() { 1975 static void TestTypedDataDirectAccess() {
2007 Dart_Handle str = Dart_NewStringFromCString("junk"); 1976 Dart_Handle str = Dart_NewStringFromCString("junk");
2008 Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10); 1977 Dart_Handle byte_array = Dart_NewTypedData(Dart_TypedData_kUint8, 10);
2009 EXPECT_VALID(byte_array); 1978 EXPECT_VALID(byte_array);
2010 Dart_Handle result; 1979 Dart_Handle result;
2011 result = Dart_TypedDataAcquireData(byte_array, NULL, NULL, NULL); 1980 result = Dart_TypedDataAcquireData(byte_array, NULL, NULL, NULL);
2012 EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'type'" 1981 EXPECT_ERROR(result,
2013 " to be non-null."); 1982 "Dart_TypedDataAcquireData expects argument 'type'"
1983 " to be non-null.");
2014 Dart_TypedData_Type type; 1984 Dart_TypedData_Type type;
2015 result = Dart_TypedDataAcquireData(byte_array, &type, NULL, NULL); 1985 result = Dart_TypedDataAcquireData(byte_array, &type, NULL, NULL);
2016 EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'data'" 1986 EXPECT_ERROR(result,
2017 " to be non-null."); 1987 "Dart_TypedDataAcquireData expects argument 'data'"
1988 " to be non-null.");
2018 void* data; 1989 void* data;
2019 result = Dart_TypedDataAcquireData(byte_array, &type, &data, NULL); 1990 result = Dart_TypedDataAcquireData(byte_array, &type, &data, NULL);
2020 EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'len'" 1991 EXPECT_ERROR(result,
2021 " to be non-null."); 1992 "Dart_TypedDataAcquireData expects argument 'len'"
1993 " to be non-null.");
2022 intptr_t len; 1994 intptr_t len;
2023 result = Dart_TypedDataAcquireData(Dart_Null(), &type, &data, &len); 1995 result = Dart_TypedDataAcquireData(Dart_Null(), &type, &data, &len);
2024 EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'object'" 1996 EXPECT_ERROR(result,
2025 " to be non-null."); 1997 "Dart_TypedDataAcquireData expects argument 'object'"
1998 " to be non-null.");
2026 result = Dart_TypedDataAcquireData(str, &type, &data, &len); 1999 result = Dart_TypedDataAcquireData(str, &type, &data, &len);
2027 EXPECT_ERROR(result, "Dart_TypedDataAcquireData expects argument 'object'" 2000 EXPECT_ERROR(result,
2028 " to be of type 'TypedData'."); 2001 "Dart_TypedDataAcquireData expects argument 'object'"
2002 " to be of type 'TypedData'.");
2029 2003
2030 result = Dart_TypedDataReleaseData(Dart_Null()); 2004 result = Dart_TypedDataReleaseData(Dart_Null());
2031 EXPECT_ERROR(result, "Dart_TypedDataReleaseData expects argument 'object'" 2005 EXPECT_ERROR(result,
2032 " to be non-null."); 2006 "Dart_TypedDataReleaseData expects argument 'object'"
2007 " to be non-null.");
2033 result = Dart_TypedDataReleaseData(str); 2008 result = Dart_TypedDataReleaseData(str);
2034 EXPECT_ERROR(result, "Dart_TypedDataReleaseData expects argument 'object'" 2009 EXPECT_ERROR(result,
2035 " to be of type 'TypedData'."); 2010 "Dart_TypedDataReleaseData expects argument 'object'"
2011 " to be of type 'TypedData'.");
2036 } 2012 }
2037 2013
2038 2014
2039 TEST_CASE(TypedDataDirectAccessUnverified) { 2015 TEST_CASE(TypedDataDirectAccessUnverified) {
2040 FLAG_verify_acquired_data = false; 2016 FLAG_verify_acquired_data = false;
2041 TestTypedDataDirectAccess(); 2017 TestTypedDataDirectAccess();
2042 } 2018 }
2043 2019
2044 2020
2045 TEST_CASE(TypedDataDirectAccessVerified) { 2021 TEST_CASE(TypedDataDirectAccessVerified) {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2127 // Create a test library and Load up a test script in it. 2103 // Create a test library and Load up a test script in it.
2128 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 2104 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
2129 2105
2130 // Test with an regular typed data object. 2106 // Test with an regular typed data object.
2131 Dart_Handle list_access_test_obj; 2107 Dart_Handle list_access_test_obj;
2132 list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL); 2108 list_access_test_obj = Dart_Invoke(lib, NewString("main"), 0, NULL);
2133 EXPECT_VALID(list_access_test_obj); 2109 EXPECT_VALID(list_access_test_obj);
2134 TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kInt8, false); 2110 TestDirectAccess(lib, list_access_test_obj, Dart_TypedData_kInt8, false);
2135 2111
2136 // Test with an external typed data object. 2112 // Test with an external typed data object.
2137 uint8_t data[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 2113 uint8_t data[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2138 intptr_t data_length = ARRAY_SIZE(data); 2114 intptr_t data_length = ARRAY_SIZE(data);
2139 Dart_Handle ext_list_access_test_obj; 2115 Dart_Handle ext_list_access_test_obj;
2140 ext_list_access_test_obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8, 2116 ext_list_access_test_obj =
2141 data, data_length); 2117 Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length);
2142 EXPECT_VALID(ext_list_access_test_obj); 2118 EXPECT_VALID(ext_list_access_test_obj);
2143 TestDirectAccess(lib, ext_list_access_test_obj, Dart_TypedData_kUint8, true); 2119 TestDirectAccess(lib, ext_list_access_test_obj, Dart_TypedData_kUint8, true);
2144 } 2120 }
2145 2121
2146 2122
2147 TEST_CASE(TypedDataDirectAccess1Unverified) { 2123 TEST_CASE(TypedDataDirectAccess1Unverified) {
2148 FLAG_verify_acquired_data = false; 2124 FLAG_verify_acquired_data = false;
2149 TestTypedDataDirectAccess1(); 2125 TestTypedDataDirectAccess1();
2150 } 2126 }
2151 2127
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
2309 EXPECT_VALID(Dart_ListSetAt(obj, i, value)); 2285 EXPECT_VALID(Dart_ListSetAt(obj, i, value));
2310 } 2286 }
2311 // Read them back through the underlying array. 2287 // Read them back through the underlying array.
2312 for (intptr_t i = 0; i < data_length; ++i) { 2288 for (intptr_t i = 0; i < data_length; ++i) {
2313 EXPECT_EQ(33 * i, data[i]); 2289 EXPECT_EQ(33 * i, data[i]);
2314 } 2290 }
2315 } 2291 }
2316 2292
2317 2293
2318 TEST_CASE(ExternalTypedDataAccess) { 2294 TEST_CASE(ExternalTypedDataAccess) {
2319 uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 }; 2295 uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
2320 intptr_t data_length = ARRAY_SIZE(data); 2296 intptr_t data_length = ARRAY_SIZE(data);
2321 2297
2322 Dart_Handle obj = Dart_NewExternalTypedData( 2298 Dart_Handle obj =
2323 Dart_TypedData_kUint8, data, data_length); 2299 Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, data_length);
2324 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8, data, data_length); 2300 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8, data, data_length);
2325 } 2301 }
2326 2302
2327 2303
2328 TEST_CASE(ExternalClampedTypedDataAccess) { 2304 TEST_CASE(ExternalClampedTypedDataAccess) {
2329 uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 }; 2305 uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
2330 intptr_t data_length = ARRAY_SIZE(data); 2306 intptr_t data_length = ARRAY_SIZE(data);
2331 2307
2332 Dart_Handle obj = Dart_NewExternalTypedData( 2308 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped,
2333 Dart_TypedData_kUint8Clamped, data, data_length); 2309 data, data_length);
2334 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8Clamped, 2310 ExternalTypedDataAccessTests(obj, Dart_TypedData_kUint8Clamped, data,
2335 data, data_length); 2311 data_length);
2336 } 2312 }
2337 2313
2338 2314
2339 TEST_CASE(ExternalUint8ClampedArrayAccess) { 2315 TEST_CASE(ExternalUint8ClampedArrayAccess) {
2340 const char* kScriptChars = 2316 const char* kScriptChars =
2341 "testClamped(List a) {\n" 2317 "testClamped(List a) {\n"
2342 " if (a[1] != 11) return false;\n" 2318 " if (a[1] != 11) return false;\n"
2343 " a[1] = 3;\n" 2319 " a[1] = 3;\n"
2344 " if (a[1] != 3) return false;\n" 2320 " if (a[1] != 3) return false;\n"
2345 " a[1] = -12;\n" 2321 " a[1] = -12;\n"
2346 " if (a[1] != 0) return false;\n" 2322 " if (a[1] != 0) return false;\n"
2347 " a[1] = 1200;\n" 2323 " a[1] = 1200;\n"
2348 " if (a[1] != 255) return false;\n" 2324 " if (a[1] != 255) return false;\n"
2349 " return true;\n" 2325 " return true;\n"
2350 "}\n"; 2326 "}\n";
2351 2327
2352 uint8_t data[] = { 0, 11, 22, 33, 44, 55, 66, 77 }; 2328 uint8_t data[] = {0, 11, 22, 33, 44, 55, 66, 77};
2353 intptr_t data_length = ARRAY_SIZE(data); 2329 intptr_t data_length = ARRAY_SIZE(data);
2354 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped, 2330 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8Clamped,
2355 data, data_length); 2331 data, data_length);
2356 EXPECT_VALID(obj); 2332 EXPECT_VALID(obj);
2357 Dart_Handle result; 2333 Dart_Handle result;
2358 // Create a test library and Load up a test script in it. 2334 // Create a test library and Load up a test script in it.
2359 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 2335 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
2360 Dart_Handle args[1]; 2336 Dart_Handle args[1];
2361 args[0] = obj; 2337 args[0] = obj;
2362 result = Dart_Invoke(lib, NewString("testClamped"), 1, args); 2338 result = Dart_Invoke(lib, NewString("testClamped"), 1, args);
2363 2339
2364 // Check that result is true. 2340 // Check that result is true.
2365 EXPECT_VALID(result); 2341 EXPECT_VALID(result);
2366 EXPECT(Dart_IsBoolean(result)); 2342 EXPECT(Dart_IsBoolean(result));
2367 bool value = false; 2343 bool value = false;
2368 result = Dart_BooleanValue(result, &value); 2344 result = Dart_BooleanValue(result, &value);
2369 EXPECT_VALID(result); 2345 EXPECT_VALID(result);
2370 EXPECT(value); 2346 EXPECT(value);
2371 } 2347 }
2372 2348
2373 2349
2374 static void NopCallback(void* isolate_callback_data, 2350 static void NopCallback(void* isolate_callback_data,
2375 Dart_WeakPersistentHandle handle, 2351 Dart_WeakPersistentHandle handle,
2376 void* peer) { 2352 void* peer) {}
2377 }
2378 2353
2379 2354
2380 static void UnreachedCallback(void* isolate_callback_data, 2355 static void UnreachedCallback(void* isolate_callback_data,
2381 Dart_WeakPersistentHandle handle, 2356 Dart_WeakPersistentHandle handle,
2382 void* peer) { 2357 void* peer) {
2383 UNREACHABLE(); 2358 UNREACHABLE();
2384 } 2359 }
2385 2360
2386 2361
2387 static void ExternalTypedDataFinalizer(void* isolate_callback_data, 2362 static void ExternalTypedDataFinalizer(void* isolate_callback_data,
2388 Dart_WeakPersistentHandle handle, 2363 Dart_WeakPersistentHandle handle,
2389 void* peer) { 2364 void* peer) {
2390 *static_cast<int*>(peer) = 42; 2365 *static_cast<int*>(peer) = 42;
2391 } 2366 }
2392 2367
2393 2368
2394 TEST_CASE(ExternalTypedDataCallback) { 2369 TEST_CASE(ExternalTypedDataCallback) {
2395 int peer = 0; 2370 int peer = 0;
2396 { 2371 {
2397 Dart_EnterScope(); 2372 Dart_EnterScope();
2398 uint8_t data[] = { 1, 2, 3, 4 }; 2373 uint8_t data[] = {1, 2, 3, 4};
2399 Dart_Handle obj = Dart_NewExternalTypedData( 2374 Dart_Handle obj = Dart_NewExternalTypedData(Dart_TypedData_kUint8, data,
2400 Dart_TypedData_kUint8, 2375 ARRAY_SIZE(data));
2401 data, 2376 Dart_NewWeakPersistentHandle(obj, &peer, sizeof(data),
2402 ARRAY_SIZE(data)); 2377 ExternalTypedDataFinalizer);
2403 Dart_NewWeakPersistentHandle(
2404 obj, &peer, sizeof(data), ExternalTypedDataFinalizer);
2405 EXPECT_VALID(obj); 2378 EXPECT_VALID(obj);
2406 Dart_ExitScope(); 2379 Dart_ExitScope();
2407 } 2380 }
2408 { 2381 {
2409 TransitionNativeToVM transition(thread); 2382 TransitionNativeToVM transition(thread);
2410 EXPECT(peer == 0); 2383 EXPECT(peer == 0);
2411 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2384 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2412 GCTestHelper::WaitForGCTasks(); 2385 GCTestHelper::WaitForGCTasks();
2413 EXPECT(peer == 0); 2386 EXPECT(peer == 0);
2414 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 2387 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2461 EXPECT_EQ(len, 10); 2434 EXPECT_EQ(len, 10);
2462 float* float_data = reinterpret_cast<float*>(raw_data); 2435 float* float_data = reinterpret_cast<float*>(raw_data);
2463 for (int i = 0; i < len * 4; i++) { 2436 for (int i = 0; i < len * 4; i++) {
2464 EXPECT_EQ(0.0, float_data[i]); 2437 EXPECT_EQ(0.0, float_data[i]);
2465 } 2438 }
2466 EXPECT_VALID(Dart_TypedDataReleaseData(obj)); 2439 EXPECT_VALID(Dart_TypedDataReleaseData(obj));
2467 } 2440 }
2468 2441
2469 2442
2470 TEST_CASE(Float32x4List) { 2443 TEST_CASE(Float32x4List) {
2471 const char* kScriptChars = 2444 const char* kScriptChars =
2472 "import 'dart:typed_data';\n" 2445 "import 'dart:typed_data';\n"
2473 "Float32x4List float32x4() {\n" 2446 "Float32x4List float32x4() {\n"
2474 " return new Float32x4List(10);\n" 2447 " return new Float32x4List(10);\n"
2475 "}\n"; 2448 "}\n";
2476 // Create a test library and Load up a test script in it. 2449 // Create a test library and Load up a test script in it.
2477 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 2450 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
2478 2451
2479 Dart_Handle obj = Dart_Invoke(lib, NewString("float32x4"), 0, NULL); 2452 Dart_Handle obj = Dart_Invoke(lib, NewString("float32x4"), 0, NULL);
2480 EXPECT_VALID(obj); 2453 EXPECT_VALID(obj);
2481 CheckFloat32x4Data(obj); 2454 CheckFloat32x4Data(obj);
2482 2455
2483 obj = Dart_NewTypedData(Dart_TypedData_kFloat32x4, 10); 2456 obj = Dart_NewTypedData(Dart_TypedData_kFloat32x4, 10);
2484 EXPECT_VALID(obj); 2457 EXPECT_VALID(obj);
2485 CheckFloat32x4Data(obj); 2458 CheckFloat32x4Data(obj);
2486 2459
2487 int peer = 0; 2460 int peer = 0;
2488 float data[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2461 float data[] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
2489 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2462 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
2490 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2463 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
2491 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; 2464 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
2492 // Push a scope so that we can collect the local handle created as part of 2465 // Push a scope so that we can collect the local handle created as part of
2493 // Dart_NewExternalTypedData. 2466 // Dart_NewExternalTypedData.
2494 Dart_EnterScope(); 2467 Dart_EnterScope();
2495 { 2468 {
2496 Dart_Handle lcl = Dart_NewExternalTypedData( 2469 Dart_Handle lcl =
2497 Dart_TypedData_kFloat32x4, data, 10); 2470 Dart_NewExternalTypedData(Dart_TypedData_kFloat32x4, data, 10);
2498 Dart_NewWeakPersistentHandle( 2471 Dart_NewWeakPersistentHandle(lcl, &peer, sizeof(data),
2499 lcl, &peer, sizeof(data), ExternalTypedDataFinalizer); 2472 ExternalTypedDataFinalizer);
2500 CheckFloat32x4Data(lcl); 2473 CheckFloat32x4Data(lcl);
2501 } 2474 }
2502 Dart_ExitScope(); 2475 Dart_ExitScope();
2503 { 2476 {
2504 TransitionNativeToVM transition(thread); 2477 TransitionNativeToVM transition(thread);
2505 Isolate::Current()->heap()->CollectGarbage(Heap::kNew); 2478 Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
2506 GCTestHelper::WaitForGCTasks(); 2479 GCTestHelper::WaitForGCTasks();
2507 EXPECT(peer == 42); 2480 EXPECT(peer == 42);
2508 } 2481 }
2509 } 2482 }
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
2686 if (handle == weak_new_ref) { 2659 if (handle == weak_new_ref) {
2687 weak_new_ref = NULL; 2660 weak_new_ref = NULL;
2688 } else if (handle == weak_old_ref) { 2661 } else if (handle == weak_old_ref) {
2689 weak_old_ref = NULL; 2662 weak_old_ref = NULL;
2690 } 2663 }
2691 } 2664 }
2692 2665
2693 2666
2694 TEST_CASE(WeakPersistentHandle) { 2667 TEST_CASE(WeakPersistentHandle) {
2695 Dart_Handle local_new_ref = Dart_Null(); 2668 Dart_Handle local_new_ref = Dart_Null();
2696 weak_new_ref = Dart_NewWeakPersistentHandle( 2669 weak_new_ref = Dart_NewWeakPersistentHandle(local_new_ref, NULL, 0,
2697 local_new_ref, NULL, 0, WeakPersistentHandleCallback); 2670 WeakPersistentHandleCallback);
2698 2671
2699 Dart_Handle local_old_ref = Dart_Null(); 2672 Dart_Handle local_old_ref = Dart_Null();
2700 weak_old_ref = Dart_NewWeakPersistentHandle( 2673 weak_old_ref = Dart_NewWeakPersistentHandle(local_old_ref, NULL, 0,
2701 local_old_ref, NULL, 0, WeakPersistentHandleCallback); 2674 WeakPersistentHandleCallback);
2702 2675
2703 { 2676 {
2704 Dart_EnterScope(); 2677 Dart_EnterScope();
2705 2678
2706 // Create an object in new space. 2679 // Create an object in new space.
2707 Dart_Handle new_ref = NewString("new string"); 2680 Dart_Handle new_ref = NewString("new string");
2708 EXPECT_VALID(new_ref); 2681 EXPECT_VALID(new_ref);
2709 2682
2710 // Create an object in old space. 2683 // Create an object in old space.
2711 Dart_Handle old_ref; 2684 Dart_Handle old_ref;
2712 { 2685 {
2713 CHECK_API_SCOPE(thread); 2686 CHECK_API_SCOPE(thread);
2714 HANDLESCOPE(thread); 2687 HANDLESCOPE(thread);
2715 old_ref = Api::NewHandle(thread, String::New("old string", Heap::kOld)); 2688 old_ref = Api::NewHandle(thread, String::New("old string", Heap::kOld));
2716 EXPECT_VALID(old_ref); 2689 EXPECT_VALID(old_ref);
2717 } 2690 }
2718 2691
2719 // Create a weak ref to the new space object. 2692 // Create a weak ref to the new space object.
2720 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, 2693 weak_new_ref = Dart_NewWeakPersistentHandle(new_ref, NULL, 0,
2721 NULL,
2722 0,
2723 WeakPersistentHandleCallback); 2694 WeakPersistentHandleCallback);
2724 EXPECT_VALID(AsHandle(weak_new_ref)); 2695 EXPECT_VALID(AsHandle(weak_new_ref));
2725 EXPECT(!Dart_IsNull(AsHandle(weak_new_ref))); 2696 EXPECT(!Dart_IsNull(AsHandle(weak_new_ref)));
2726 2697
2727 // Create a weak ref to the old space object. 2698 // Create a weak ref to the old space object.
2728 weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, 2699 weak_old_ref = Dart_NewWeakPersistentHandle(old_ref, NULL, 0,
2729 NULL,
2730 0,
2731 WeakPersistentHandleCallback); 2700 WeakPersistentHandleCallback);
2732 EXPECT_VALID(AsHandle(weak_old_ref)); 2701 EXPECT_VALID(AsHandle(weak_old_ref));
2733 EXPECT(!Dart_IsNull(AsHandle(weak_old_ref))); 2702 EXPECT(!Dart_IsNull(AsHandle(weak_old_ref)));
2734 2703
2735 { 2704 {
2736 TransitionNativeToVM transition(thread); 2705 TransitionNativeToVM transition(thread);
2737 // Garbage collect new space. 2706 // Garbage collect new space.
2738 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); 2707 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
2739 } 2708 }
2740 2709
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2815 } 2784 }
2816 } 2785 }
2817 2786
2818 2787
2819 TEST_CASE(WeakPersistentHandleErrors) { 2788 TEST_CASE(WeakPersistentHandleErrors) {
2820 Dart_EnterScope(); 2789 Dart_EnterScope();
2821 2790
2822 // NULL callback. 2791 // NULL callback.
2823 Dart_Handle obj1 = NewString("new string"); 2792 Dart_Handle obj1 = NewString("new string");
2824 EXPECT_VALID(obj1); 2793 EXPECT_VALID(obj1);
2825 Dart_WeakPersistentHandle ref1 = Dart_NewWeakPersistentHandle( 2794 Dart_WeakPersistentHandle ref1 =
2826 obj1, NULL, 0, NULL); 2795 Dart_NewWeakPersistentHandle(obj1, NULL, 0, NULL);
2827 EXPECT_EQ(ref1, static_cast<void*>(NULL)); 2796 EXPECT_EQ(ref1, static_cast<void*>(NULL));
2828 2797
2829 // Immediate object. 2798 // Immediate object.
2830 Dart_Handle obj2 = Dart_NewInteger(0); 2799 Dart_Handle obj2 = Dart_NewInteger(0);
2831 EXPECT_VALID(obj2); 2800 EXPECT_VALID(obj2);
2832 Dart_WeakPersistentHandle ref2 = Dart_NewWeakPersistentHandle( 2801 Dart_WeakPersistentHandle ref2 =
2833 obj2, NULL, 0, WeakPersistentHandleCallback); 2802 Dart_NewWeakPersistentHandle(obj2, NULL, 0, WeakPersistentHandleCallback);
2834 EXPECT_EQ(ref2, static_cast<void*>(NULL)); 2803 EXPECT_EQ(ref2, static_cast<void*>(NULL));
2835 2804
2836 Dart_ExitScope(); 2805 Dart_ExitScope();
2837 } 2806 }
2838 2807
2839 2808
2840 static void WeakPersistentHandlePeerFinalizer(void* isolate_callback_data, 2809 static void WeakPersistentHandlePeerFinalizer(void* isolate_callback_data,
2841 Dart_WeakPersistentHandle handle, 2810 Dart_WeakPersistentHandle handle,
2842 void* peer) { 2811 void* peer) {
2843 *static_cast<int*>(peer) = 42; 2812 *static_cast<int*>(peer) = 42;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2893 EXPECT(peer == 0); 2862 EXPECT(peer == 0);
2894 } 2863 }
2895 } 2864 }
2896 2865
2897 2866
2898 UNIT_TEST_CASE(WeakPersistentHandlesCallbackShutdown) { 2867 UNIT_TEST_CASE(WeakPersistentHandlesCallbackShutdown) {
2899 TestCase::CreateTestIsolate(); 2868 TestCase::CreateTestIsolate();
2900 Dart_EnterScope(); 2869 Dart_EnterScope();
2901 Dart_Handle ref = Dart_True(); 2870 Dart_Handle ref = Dart_True();
2902 int peer = 1234; 2871 int peer = 1234;
2903 Dart_NewWeakPersistentHandle(ref, 2872 Dart_NewWeakPersistentHandle(ref, &peer, 0,
2904 &peer,
2905 0,
2906 WeakPersistentHandlePeerFinalizer); 2873 WeakPersistentHandlePeerFinalizer);
2907 Dart_ExitScope(); 2874 Dart_ExitScope();
2908 Dart_ShutdownIsolate(); 2875 Dart_ShutdownIsolate();
2909 EXPECT(peer == 42); 2876 EXPECT(peer == 42);
2910 } 2877 }
2911 2878
2912 2879
2913 TEST_CASE(WeakPersistentHandleExternalAllocationSize) { 2880 TEST_CASE(WeakPersistentHandleExternalAllocationSize) {
2914 Heap* heap = Isolate::Current()->heap(); 2881 Heap* heap = Isolate::Current()->heap();
2915 EXPECT(heap->ExternalInWords(Heap::kNew) == 0); 2882 EXPECT(heap->ExternalInWords(Heap::kNew) == 0);
2916 EXPECT(heap->ExternalInWords(Heap::kOld) == 0); 2883 EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
2917 Dart_WeakPersistentHandle weak1 = NULL; 2884 Dart_WeakPersistentHandle weak1 = NULL;
2918 static const intptr_t kWeak1ExternalSize = 1 * KB; 2885 static const intptr_t kWeak1ExternalSize = 1 * KB;
2919 { 2886 {
2920 Dart_EnterScope(); 2887 Dart_EnterScope();
2921 Dart_Handle obj = NewString("weakly referenced string"); 2888 Dart_Handle obj = NewString("weakly referenced string");
2922 EXPECT_VALID(obj); 2889 EXPECT_VALID(obj);
2923 weak1 = Dart_NewWeakPersistentHandle(obj, 2890 weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize,
2924 NULL,
2925 kWeak1ExternalSize,
2926 NopCallback); 2891 NopCallback);
2927 EXPECT_VALID(AsHandle(weak1)); 2892 EXPECT_VALID(AsHandle(weak1));
2928 Dart_ExitScope(); 2893 Dart_ExitScope();
2929 } 2894 }
2930 Dart_PersistentHandle strong_ref = NULL; 2895 Dart_PersistentHandle strong_ref = NULL;
2931 Dart_WeakPersistentHandle weak2 = NULL; 2896 Dart_WeakPersistentHandle weak2 = NULL;
2932 static const intptr_t kWeak2ExternalSize = 2 * KB; 2897 static const intptr_t kWeak2ExternalSize = 2 * KB;
2933 { 2898 {
2934 Dart_EnterScope(); 2899 Dart_EnterScope();
2935 Dart_Handle obj = NewString("strongly referenced string"); 2900 Dart_Handle obj = NewString("strongly referenced string");
2936 EXPECT_VALID(obj); 2901 EXPECT_VALID(obj);
2937 strong_ref = Dart_NewPersistentHandle(obj); 2902 strong_ref = Dart_NewPersistentHandle(obj);
2938 weak2 = Dart_NewWeakPersistentHandle(obj, 2903 weak2 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak2ExternalSize,
2939 NULL,
2940 kWeak2ExternalSize,
2941 NopCallback); 2904 NopCallback);
2942 EXPECT_VALID(AsHandle(strong_ref)); 2905 EXPECT_VALID(AsHandle(strong_ref));
2943 Dart_ExitScope(); 2906 Dart_ExitScope();
2944 } 2907 }
2945 { 2908 {
2946 TransitionNativeToVM transition(thread); 2909 TransitionNativeToVM transition(thread);
2947 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 2910 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
2948 EXPECT(heap->ExternalInWords(Heap::kNew) == 2911 EXPECT(heap->ExternalInWords(Heap::kNew) ==
2949 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize); 2912 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize);
2950 // Collect weakly referenced string, and promote strongly referenced string. 2913 // Collect weakly referenced string, and promote strongly referenced string.
(...skipping 20 matching lines...) Expand all
2971 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); 2934 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
2972 Heap* heap = Isolate::Current()->heap(); 2935 Heap* heap = Isolate::Current()->heap();
2973 Dart_WeakPersistentHandle weak1 = NULL; 2936 Dart_WeakPersistentHandle weak1 = NULL;
2974 // Large enough to exceed any new space limit. Not actually allocated. 2937 // Large enough to exceed any new space limit. Not actually allocated.
2975 const intptr_t kWeak1ExternalSize = 500 * MB; 2938 const intptr_t kWeak1ExternalSize = 500 * MB;
2976 { 2939 {
2977 Dart_EnterScope(); 2940 Dart_EnterScope();
2978 Dart_Handle obj = NewString("weakly referenced string"); 2941 Dart_Handle obj = NewString("weakly referenced string");
2979 EXPECT_VALID(obj); 2942 EXPECT_VALID(obj);
2980 // Triggers a scavenge immediately, since kWeak1ExternalSize is above limit. 2943 // Triggers a scavenge immediately, since kWeak1ExternalSize is above limit.
2981 weak1 = Dart_NewWeakPersistentHandle(obj, 2944 weak1 = Dart_NewWeakPersistentHandle(obj, NULL, kWeak1ExternalSize,
2982 NULL,
2983 kWeak1ExternalSize,
2984 NopCallback); 2945 NopCallback);
2985 EXPECT_VALID(AsHandle(weak1)); 2946 EXPECT_VALID(AsHandle(weak1));
2986 // ... but the object is still alive and not yet promoted, so external size 2947 // ... but the object is still alive and not yet promoted, so external size
2987 // in new space is still above the limit. Thus, even the following tiny 2948 // in new space is still above the limit. Thus, even the following tiny
2988 // external allocation will trigger another scavenge. 2949 // external allocation will trigger another scavenge.
2989 Dart_WeakPersistentHandle trigger = 2950 Dart_WeakPersistentHandle trigger =
2990 Dart_NewWeakPersistentHandle(obj, NULL, 1, NopCallback); 2951 Dart_NewWeakPersistentHandle(obj, NULL, 1, NopCallback);
2991 EXPECT_VALID(AsHandle(trigger)); 2952 EXPECT_VALID(AsHandle(trigger));
2992 Dart_DeleteWeakPersistentHandle(isolate, trigger); 2953 Dart_DeleteWeakPersistentHandle(isolate, trigger);
2993 // After the two scavenges above, 'obj' should now be promoted, hence its 2954 // After the two scavenges above, 'obj' should now be promoted, hence its
2994 // external size charged to old space. 2955 // external size charged to old space.
2995 { 2956 {
2996 CHECK_API_SCOPE(thread); 2957 CHECK_API_SCOPE(thread);
2997 HANDLESCOPE(thread); 2958 HANDLESCOPE(thread);
2998 String& handle = String::Handle(thread->zone()); 2959 String& handle = String::Handle(thread->zone());
2999 handle ^= Api::UnwrapHandle(obj); 2960 handle ^= Api::UnwrapHandle(obj);
3000 EXPECT(handle.IsOld()); 2961 EXPECT(handle.IsOld());
(...skipping 18 matching lines...) Expand all
3019 Dart_EnterScope(); 2980 Dart_EnterScope();
3020 Dart_Handle live = Api::NewHandle(thread, String::New("live", Heap::kOld)); 2981 Dart_Handle live = Api::NewHandle(thread, String::New("live", Heap::kOld));
3021 EXPECT_VALID(live); 2982 EXPECT_VALID(live);
3022 Dart_WeakPersistentHandle weak = NULL; 2983 Dart_WeakPersistentHandle weak = NULL;
3023 EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld)); 2984 EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld));
3024 const intptr_t kSmallExternalSize = 1 * KB; 2985 const intptr_t kSmallExternalSize = 1 * KB;
3025 { 2986 {
3026 Dart_EnterScope(); 2987 Dart_EnterScope();
3027 Dart_Handle dead = Api::NewHandle(thread, String::New("dead", Heap::kOld)); 2988 Dart_Handle dead = Api::NewHandle(thread, String::New("dead", Heap::kOld));
3028 EXPECT_VALID(dead); 2989 EXPECT_VALID(dead);
3029 weak = Dart_NewWeakPersistentHandle(dead, 2990 weak = Dart_NewWeakPersistentHandle(dead, NULL, kSmallExternalSize,
3030 NULL,
3031 kSmallExternalSize,
3032 NopCallback); 2991 NopCallback);
3033 EXPECT_VALID(AsHandle(weak)); 2992 EXPECT_VALID(AsHandle(weak));
3034 Dart_ExitScope(); 2993 Dart_ExitScope();
3035 } 2994 }
3036 EXPECT_EQ(kSmallExternalSize, 2995 EXPECT_EQ(kSmallExternalSize,
3037 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize); 2996 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
3038 // Large enough to trigger GC in old space. Not actually allocated. 2997 // Large enough to trigger GC in old space. Not actually allocated.
3039 const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB; 2998 const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB;
3040 Dart_NewWeakPersistentHandle(live, 2999 Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
3041 NULL,
3042 kHugeExternalSize,
3043 NopCallback);
3044 // Expect small garbage to be collected. 3000 // Expect small garbage to be collected.
3045 EXPECT_EQ(kHugeExternalSize, 3001 EXPECT_EQ(kHugeExternalSize,
3046 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize); 3002 isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
3047 Dart_ExitScope(); 3003 Dart_ExitScope();
3048 } 3004 }
3049 3005
3050 3006
3051 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOddReferents) { 3007 TEST_CASE(WeakPersistentHandleExternalAllocationSizeOddReferents) {
3052 Heap* heap = Isolate::Current()->heap(); 3008 Heap* heap = Isolate::Current()->heap();
3053 Dart_WeakPersistentHandle weak1 = NULL; 3009 Dart_WeakPersistentHandle weak1 = NULL;
3054 static const intptr_t kWeak1ExternalSize = 1 * KB; 3010 static const intptr_t kWeak1ExternalSize = 1 * KB;
3055 Dart_WeakPersistentHandle weak2 = NULL; 3011 Dart_WeakPersistentHandle weak2 = NULL;
3056 static const intptr_t kWeak2ExternalSize = 2 * KB; 3012 static const intptr_t kWeak2ExternalSize = 2 * KB;
3057 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld)); 3013 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
3058 { 3014 {
3059 Dart_EnterScope(); 3015 Dart_EnterScope();
3060 Dart_Handle dart_true = Dart_True(); // VM heap object. 3016 Dart_Handle dart_true = Dart_True(); // VM heap object.
3061 EXPECT_VALID(dart_true); 3017 EXPECT_VALID(dart_true);
3062 weak1 = Dart_NewWeakPersistentHandle( 3018 weak1 = Dart_NewWeakPersistentHandle(dart_true, NULL, kWeak1ExternalSize,
3063 dart_true, NULL, kWeak1ExternalSize, UnreachedCallback); 3019 UnreachedCallback);
3064 EXPECT_VALID(AsHandle(weak1)); 3020 EXPECT_VALID(AsHandle(weak1));
3065 Dart_Handle zero = Dart_False(); // VM heap object. 3021 Dart_Handle zero = Dart_False(); // VM heap object.
3066 EXPECT_VALID(zero); 3022 EXPECT_VALID(zero);
3067 weak2 = Dart_NewWeakPersistentHandle( 3023 weak2 = Dart_NewWeakPersistentHandle(zero, NULL, kWeak2ExternalSize,
3068 zero, NULL, kWeak2ExternalSize, UnreachedCallback); 3024 UnreachedCallback);
3069 EXPECT_VALID(AsHandle(weak2)); 3025 EXPECT_VALID(AsHandle(weak2));
3070 // Both should be charged to old space. 3026 // Both should be charged to old space.
3071 EXPECT(heap->ExternalInWords(Heap::kOld) == 3027 EXPECT(heap->ExternalInWords(Heap::kOld) ==
3072 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize); 3028 (kWeak1ExternalSize + kWeak2ExternalSize) / kWordSize);
3073 Dart_ExitScope(); 3029 Dart_ExitScope();
3074 } 3030 }
3075 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current()); 3031 Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
3076 Dart_DeleteWeakPersistentHandle(isolate, weak1); 3032 Dart_DeleteWeakPersistentHandle(isolate, weak1);
3077 Dart_DeleteWeakPersistentHandle(isolate, weak2); 3033 Dart_DeleteWeakPersistentHandle(isolate, weak2);
3078 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld)); 3034 EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
(...skipping 25 matching lines...) Expand all
3104 3060
3105 TEST_CASE(ImplicitReferencesOldSpace) { 3061 TEST_CASE(ImplicitReferencesOldSpace) {
3106 Dart_PersistentHandle strong = NULL; 3062 Dart_PersistentHandle strong = NULL;
3107 Dart_WeakPersistentHandle strong_weak = NULL; 3063 Dart_WeakPersistentHandle strong_weak = NULL;
3108 3064
3109 Dart_EnterScope(); 3065 Dart_EnterScope();
3110 { 3066 {
3111 CHECK_API_SCOPE(thread); 3067 CHECK_API_SCOPE(thread);
3112 HANDLESCOPE(thread); 3068 HANDLESCOPE(thread);
3113 3069
3114 Dart_Handle local = Api::NewHandle( 3070 Dart_Handle local =
3115 thread, String::New("strongly reachable", Heap::kOld)); 3071 Api::NewHandle(thread, String::New("strongly reachable", Heap::kOld));
3116 strong = Dart_NewPersistentHandle(local); 3072 strong = Dart_NewPersistentHandle(local);
3117 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); 3073 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback);
3118 3074
3119 EXPECT(!Dart_IsNull(AsHandle(strong))); 3075 EXPECT(!Dart_IsNull(AsHandle(strong)));
3120 EXPECT_VALID(AsHandle(strong)); 3076 EXPECT_VALID(AsHandle(strong));
3121 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); 3077 EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
3122 EXPECT_VALID(AsHandle(strong_weak)); 3078 EXPECT_VALID(AsHandle(strong_weak));
3123 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) 3079 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak)))
3124 3080
3125 weak1 = Dart_NewWeakPersistentHandle( 3081 weak1 = Dart_NewWeakPersistentHandle(
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3171 TEST_CASE(ImplicitReferencesNewSpace) { 3127 TEST_CASE(ImplicitReferencesNewSpace) {
3172 Dart_PersistentHandle strong = NULL; 3128 Dart_PersistentHandle strong = NULL;
3173 Dart_WeakPersistentHandle strong_weak = NULL; 3129 Dart_WeakPersistentHandle strong_weak = NULL;
3174 3130
3175 3131
3176 Dart_EnterScope(); 3132 Dart_EnterScope();
3177 { 3133 {
3178 CHECK_API_SCOPE(thread); 3134 CHECK_API_SCOPE(thread);
3179 HANDLESCOPE(thread); 3135 HANDLESCOPE(thread);
3180 3136
3181 Dart_Handle local = Api::NewHandle( 3137 Dart_Handle local =
3182 thread, String::New("strongly reachable", Heap::kOld)); 3138 Api::NewHandle(thread, String::New("strongly reachable", Heap::kOld));
3183 strong = Dart_NewPersistentHandle(local); 3139 strong = Dart_NewPersistentHandle(local);
3184 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback); 3140 strong_weak = Dart_NewWeakPersistentHandle(local, NULL, 0, NopCallback);
3185 3141
3186 EXPECT(!Dart_IsNull(AsHandle(strong))); 3142 EXPECT(!Dart_IsNull(AsHandle(strong)));
3187 EXPECT_VALID(AsHandle(strong)); 3143 EXPECT_VALID(AsHandle(strong));
3188 EXPECT(!Dart_IsNull(AsHandle(strong_weak))); 3144 EXPECT(!Dart_IsNull(AsHandle(strong_weak)));
3189 EXPECT_VALID(AsHandle(strong_weak)); 3145 EXPECT_VALID(AsHandle(strong_weak));
3190 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak))) 3146 EXPECT(Dart_IdentityEquals(AsHandle(strong), AsHandle(strong_weak)))
3191 3147
3192 weak1 = Dart_NewWeakPersistentHandle( 3148 weak1 = Dart_NewWeakPersistentHandle(
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3243 3199
3244 3200
3245 static void PrologueCallbackTimes3() { 3201 static void PrologueCallbackTimes3() {
3246 global_prologue_callback_status *= 3; 3202 global_prologue_callback_status *= 3;
3247 } 3203 }
3248 3204
3249 3205
3250 static int global_epilogue_callback_status; 3206 static int global_epilogue_callback_status;
3251 3207
3252 3208
3253 static void EpilogueCallbackNOP() { 3209 static void EpilogueCallbackNOP() {}
3254 }
3255 3210
3256 3211
3257 static void EpilogueCallbackTimes4() { 3212 static void EpilogueCallbackTimes4() {
3258 global_epilogue_callback_status *= 4; 3213 global_epilogue_callback_status *= 4;
3259 } 3214 }
3260 3215
3261 3216
3262 static void EpilogueCallbackTimes5() { 3217 static void EpilogueCallbackTimes5() {
3263 global_epilogue_callback_status *= 5; 3218 global_epilogue_callback_status *= 5;
3264 } 3219 }
3265 3220
3266 3221
3267 TEST_CASE(SetGarbageCollectionCallbacks) { 3222 TEST_CASE(SetGarbageCollectionCallbacks) {
3268 // GC callback addition testing. 3223 // GC callback addition testing.
3269 3224
3270 // Add GC callbacks. 3225 // Add GC callbacks.
3271 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2, 3226 EXPECT_VALID(
3272 &EpilogueCallbackTimes4)); 3227 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
3273 3228
3274 // Add the same callbacks again. This is an error. 3229 // Add the same callbacks again. This is an error.
3275 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, 3230 EXPECT(Dart_IsError(
3276 &EpilogueCallbackTimes4))); 3231 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4)));
3277 3232
3278 // Add another callback. This is an error. 3233 // Add another callback. This is an error.
3279 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes3, 3234 EXPECT(Dart_IsError(
3280 &EpilogueCallbackTimes5))); 3235 Dart_SetGcCallbacks(&PrologueCallbackTimes3, &EpilogueCallbackTimes5)));
3281 3236
3282 // GC callback removal testing. 3237 // GC callback removal testing.
3283 3238
3284 // Remove GC callbacks. 3239 // Remove GC callbacks.
3285 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL)); 3240 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
3286 3241
3287 // Remove GC callbacks whennone exist. This is an error. 3242 // Remove GC callbacks whennone exist. This is an error.
3288 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, NULL))); 3243 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, NULL)));
3289 3244
3290 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2, 3245 EXPECT_VALID(
3291 &EpilogueCallbackTimes4)); 3246 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
3292 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, NULL))); 3247 EXPECT(Dart_IsError(Dart_SetGcCallbacks(&PrologueCallbackTimes2, NULL)));
3293 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, &EpilogueCallbackTimes4))); 3248 EXPECT(Dart_IsError(Dart_SetGcCallbacks(NULL, &EpilogueCallbackTimes4)));
3294 } 3249 }
3295 3250
3296 3251
3297 TEST_CASE(SingleGarbageCollectionCallback) { 3252 TEST_CASE(SingleGarbageCollectionCallback) {
3298 // Add a prologue callback. 3253 // Add a prologue callback.
3299 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2, 3254 EXPECT_VALID(
3300 &EpilogueCallbackNOP)); 3255 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackNOP));
3301 3256
3302 { 3257 {
3303 TransitionNativeToVM transition(thread); 3258 TransitionNativeToVM transition(thread);
3304 3259
3305 // Garbage collect new space ignoring callbacks. This should not 3260 // Garbage collect new space ignoring callbacks. This should not
3306 // invoke the prologue callback. No status values should change. 3261 // invoke the prologue callback. No status values should change.
3307 global_prologue_callback_status = 3; 3262 global_prologue_callback_status = 3;
3308 global_epilogue_callback_status = 7; 3263 global_epilogue_callback_status = 7;
3309 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); 3264 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
3310 EXPECT_EQ(3, global_prologue_callback_status); 3265 EXPECT_EQ(3, global_prologue_callback_status);
3311 EXPECT_EQ(7, global_epilogue_callback_status); 3266 EXPECT_EQ(7, global_epilogue_callback_status);
3312 3267
3313 // Garbage collect new space invoking callbacks. This should 3268 // Garbage collect new space invoking callbacks. This should
3314 // invoke the prologue callback. No status values should change. 3269 // invoke the prologue callback. No status values should change.
3315 global_prologue_callback_status = 3; 3270 global_prologue_callback_status = 3;
3316 global_epilogue_callback_status = 7; 3271 global_epilogue_callback_status = 7;
3317 GCTestHelper::CollectNewSpace(Heap::kInvokeApiCallbacks); 3272 GCTestHelper::CollectNewSpace(Heap::kInvokeApiCallbacks);
3318 EXPECT_EQ(6, global_prologue_callback_status); 3273 EXPECT_EQ(6, global_prologue_callback_status);
3319 EXPECT_EQ(7, global_epilogue_callback_status); 3274 EXPECT_EQ(7, global_epilogue_callback_status);
3320 3275
3321 // Garbage collect old space ignoring callbacks. This should invoke 3276 // Garbage collect old space ignoring callbacks. This should invoke
3322 // the prologue callback. The prologue status value should change. 3277 // the prologue callback. The prologue status value should change.
3323 global_prologue_callback_status = 3; 3278 global_prologue_callback_status = 3;
3324 global_epilogue_callback_status = 7; 3279 global_epilogue_callback_status = 7;
3325 Isolate::Current()->heap()->CollectGarbage(Heap::kOld, 3280 Isolate::Current()->heap()->CollectGarbage(
3326 Heap::kIgnoreApiCallbacks, 3281 Heap::kOld, Heap::kIgnoreApiCallbacks, Heap::kGCTestCase);
3327 Heap::kGCTestCase);
3328 EXPECT_EQ(3, global_prologue_callback_status); 3282 EXPECT_EQ(3, global_prologue_callback_status);
3329 EXPECT_EQ(7, global_epilogue_callback_status); 3283 EXPECT_EQ(7, global_epilogue_callback_status);
3330 3284
3331 // Garbage collect old space. This should invoke the prologue 3285 // Garbage collect old space. This should invoke the prologue
3332 // callback. The prologue status value should change. 3286 // callback. The prologue status value should change.
3333 global_prologue_callback_status = 3; 3287 global_prologue_callback_status = 3;
3334 global_epilogue_callback_status = 7; 3288 global_epilogue_callback_status = 7;
3335 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 3289 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3336 EXPECT_EQ(6, global_prologue_callback_status); 3290 EXPECT_EQ(6, global_prologue_callback_status);
3337 EXPECT_EQ(7, global_epilogue_callback_status); 3291 EXPECT_EQ(7, global_epilogue_callback_status);
3338 3292
3339 // Garbage collect old space again. Callbacks are persistent so the 3293 // Garbage collect old space again. Callbacks are persistent so the
3340 // prologue status value should change again. 3294 // prologue status value should change again.
3341 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 3295 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3342 EXPECT_EQ(12, global_prologue_callback_status); 3296 EXPECT_EQ(12, global_prologue_callback_status);
3343 EXPECT_EQ(7, global_epilogue_callback_status); 3297 EXPECT_EQ(7, global_epilogue_callback_status);
3344 } 3298 }
3345 3299
3346 // Add an epilogue callback. 3300 // Add an epilogue callback.
3347 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL)); 3301 EXPECT_VALID(Dart_SetGcCallbacks(NULL, NULL));
3348 EXPECT_VALID(Dart_SetGcCallbacks(&PrologueCallbackTimes2, 3302 EXPECT_VALID(
3349 &EpilogueCallbackTimes4)); 3303 Dart_SetGcCallbacks(&PrologueCallbackTimes2, &EpilogueCallbackTimes4));
3350 3304
3351 { 3305 {
3352 TransitionNativeToVM transition(thread); 3306 TransitionNativeToVM transition(thread);
3353 // Garbage collect new space. This should not invoke the prologue 3307 // Garbage collect new space. This should not invoke the prologue
3354 // or the epilogue callback. No status values should change. 3308 // or the epilogue callback. No status values should change.
3355 global_prologue_callback_status = 3; 3309 global_prologue_callback_status = 3;
3356 global_epilogue_callback_status = 7; 3310 global_epilogue_callback_status = 7;
3357 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks); 3311 GCTestHelper::CollectNewSpace(Heap::kIgnoreApiCallbacks);
3358 EXPECT_EQ(3, global_prologue_callback_status); 3312 EXPECT_EQ(3, global_prologue_callback_status);
3359 EXPECT_EQ(7, global_epilogue_callback_status); 3313 EXPECT_EQ(7, global_epilogue_callback_status);
3360 3314
3361 // Garbage collect new space. This should invoke the prologue and 3315 // Garbage collect new space. This should invoke the prologue and
3362 // the epilogue callback. The prologue and epilogue status values 3316 // the epilogue callback. The prologue and epilogue status values
3363 // should change. 3317 // should change.
3364 GCTestHelper::CollectNewSpace(Heap::kInvokeApiCallbacks); 3318 GCTestHelper::CollectNewSpace(Heap::kInvokeApiCallbacks);
3365 EXPECT_EQ(6, global_prologue_callback_status); 3319 EXPECT_EQ(6, global_prologue_callback_status);
3366 EXPECT_EQ(28, global_epilogue_callback_status); 3320 EXPECT_EQ(28, global_epilogue_callback_status);
3367 3321
3368 // Garbage collect old space. This should invoke the prologue and 3322 // Garbage collect old space. This should invoke the prologue and
3369 // the epilogue callbacks. The prologue and epilogue status values 3323 // the epilogue callbacks. The prologue and epilogue status values
3370 // should change. 3324 // should change.
3371 global_prologue_callback_status = 3; 3325 global_prologue_callback_status = 3;
3372 global_epilogue_callback_status = 7; 3326 global_epilogue_callback_status = 7;
3373 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 3327 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3374 EXPECT_EQ(6, global_prologue_callback_status); 3328 EXPECT_EQ(6, global_prologue_callback_status);
3375 EXPECT_EQ(28, global_epilogue_callback_status); 3329 EXPECT_EQ(28, global_epilogue_callback_status);
3376 3330
3377 // Garbage collect old space again without invoking callbacks. 3331 // Garbage collect old space again without invoking callbacks.
3378 // Nothing should change. 3332 // Nothing should change.
3379 Isolate::Current()->heap()->CollectGarbage(Heap::kOld, 3333 Isolate::Current()->heap()->CollectGarbage(
3380 Heap::kIgnoreApiCallbacks, 3334 Heap::kOld, Heap::kIgnoreApiCallbacks, Heap::kGCTestCase);
3381 Heap::kGCTestCase);
3382 EXPECT_EQ(6, global_prologue_callback_status); 3335 EXPECT_EQ(6, global_prologue_callback_status);
3383 EXPECT_EQ(28, global_epilogue_callback_status); 3336 EXPECT_EQ(28, global_epilogue_callback_status);
3384 3337
3385 // Garbage collect old space again. Callbacks are persistent so the 3338 // Garbage collect old space again. Callbacks are persistent so the
3386 // prologue and epilogue status values should change again. 3339 // prologue and epilogue status values should change again.
3387 Isolate::Current()->heap()->CollectGarbage(Heap::kOld); 3340 Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
3388 EXPECT_EQ(12, global_prologue_callback_status); 3341 EXPECT_EQ(12, global_prologue_callback_status);
3389 EXPECT_EQ(112, global_epilogue_callback_status); 3342 EXPECT_EQ(112, global_epilogue_callback_status);
3390 } 3343 }
3391 3344
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
3536 Dart_ShutdownIsolate(); 3489 Dart_ShutdownIsolate();
3537 EXPECT(NULL == Dart_CurrentIsolate()); 3490 EXPECT(NULL == Dart_CurrentIsolate());
3538 } 3491 }
3539 3492
3540 3493
3541 UNIT_TEST_CASE(CurrentIsolateData) { 3494 UNIT_TEST_CASE(CurrentIsolateData) {
3542 intptr_t mydata = 12345; 3495 intptr_t mydata = 12345;
3543 char* err; 3496 char* err;
3544 Dart_Isolate isolate = 3497 Dart_Isolate isolate =
3545 Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL, 3498 Dart_CreateIsolate(NULL, NULL, bin::isolate_snapshot_buffer, NULL,
3546 reinterpret_cast<void*>(mydata), 3499 reinterpret_cast<void*>(mydata), &err);
3547 &err);
3548 EXPECT(isolate != NULL); 3500 EXPECT(isolate != NULL);
3549 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_CurrentIsolateData())); 3501 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_CurrentIsolateData()));
3550 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_IsolateData(isolate))); 3502 EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_IsolateData(isolate)));
3551 Dart_ShutdownIsolate(); 3503 Dart_ShutdownIsolate();
3552 } 3504 }
3553 3505
3554 3506
3555 UNIT_TEST_CASE(IsolateSetCheckedMode) { 3507 UNIT_TEST_CASE(IsolateSetCheckedMode) {
3556 const char* kScriptChars = 3508 const char* kScriptChars =
3557 "int bad1() {\n" 3509 "int bad1() {\n"
3558 " int foo = 'string';\n" 3510 " int foo = 'string';\n"
3559 " return foo;\n" 3511 " return foo;\n"
3560 "}\n" 3512 "}\n"
3561 "\n" 3513 "\n"
3562 "int good1() {\n" 3514 "int good1() {\n"
3563 " int five = 5;\n" 3515 " int five = 5;\n"
3564 " return five;" 3516 " return five;"
3565 "}\n"; 3517 "}\n";
3566 3518
3567 // Create an isolate with checked mode flags. 3519 // Create an isolate with checked mode flags.
3568 Dart_IsolateFlags api_flags; 3520 Dart_IsolateFlags api_flags;
3569 api_flags.version = DART_FLAGS_CURRENT_VERSION; 3521 api_flags.version = DART_FLAGS_CURRENT_VERSION;
3570 api_flags.enable_type_checks = true; 3522 api_flags.enable_type_checks = true;
3571 api_flags.enable_asserts = true; 3523 api_flags.enable_asserts = true;
3572 api_flags.enable_error_on_bad_type = true; 3524 api_flags.enable_error_on_bad_type = true;
3573 api_flags.enable_error_on_bad_override = true; 3525 api_flags.enable_error_on_bad_override = true;
3574 3526
3575 char* err; 3527 char* err;
3576 Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, 3528 Dart_Isolate isolate = Dart_CreateIsolate(
3577 bin::isolate_snapshot_buffer, 3529 NULL, NULL, bin::isolate_snapshot_buffer, &api_flags, NULL, &err);
3578 &api_flags,
3579 NULL, &err);
3580 if (isolate == NULL) { 3530 if (isolate == NULL) {
3581 OS::Print("Creation of isolate failed '%s'\n", err); 3531 OS::Print("Creation of isolate failed '%s'\n", err);
3582 free(err); 3532 free(err);
3583 } 3533 }
3584 EXPECT(isolate != NULL); 3534 EXPECT(isolate != NULL);
3585 3535
3586 { 3536 {
3587 Dart_EnterScope(); 3537 Dart_EnterScope();
3588 Dart_Handle url = NewString(TestCase::url()); 3538 Dart_Handle url = NewString(TestCase::url());
3589 Dart_Handle source = NewString(kScriptChars); 3539 Dart_Handle source = NewString(kScriptChars);
3590 Dart_Handle result = Dart_SetLibraryTagHandler(TestCase::library_handler); 3540 Dart_Handle result = Dart_SetLibraryTagHandler(TestCase::library_handler);
3591 EXPECT_VALID(result); 3541 EXPECT_VALID(result);
3592 Dart_Handle lib = Dart_LoadScript(url, Dart_Null(), source, 0, 0); 3542 Dart_Handle lib = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
3593 EXPECT_VALID(lib); 3543 EXPECT_VALID(lib);
3594 result = Dart_FinalizeLoading(false); 3544 result = Dart_FinalizeLoading(false);
3595 EXPECT_VALID(result); 3545 EXPECT_VALID(result);
3596 result = Dart_Invoke(lib, NewString("bad1"), 0, NULL); 3546 result = Dart_Invoke(lib, NewString("bad1"), 0, NULL);
3597 EXPECT_ERROR(result, "Unhandled exception:\n" 3547 EXPECT_ERROR(result,
3598 "type 'String' is not a subtype of type 'int' of 'foo'"); 3548 "Unhandled exception:\n"
3549 "type 'String' is not a subtype of type 'int' of 'foo'");
3599 3550
3600 result = Dart_Invoke(lib, NewString("good1"), 0, NULL); 3551 result = Dart_Invoke(lib, NewString("good1"), 0, NULL);
3601 EXPECT_VALID(result); 3552 EXPECT_VALID(result);
3602 Dart_ExitScope(); 3553 Dart_ExitScope();
3603 } 3554 }
3604 3555
3605 EXPECT(isolate != NULL); 3556 EXPECT(isolate != NULL);
3606 3557
3607 // Shutdown the isolate. 3558 // Shutdown the isolate.
3608 Dart_ShutdownIsolate(); 3559 Dart_ShutdownIsolate();
3609 } 3560 }
3610 3561
3611 3562
3612 TEST_CASE(DebugName) { 3563 TEST_CASE(DebugName) {
3613 Dart_Handle debug_name = Dart_DebugName(); 3564 Dart_Handle debug_name = Dart_DebugName();
3614 EXPECT_VALID(debug_name); 3565 EXPECT_VALID(debug_name);
3615 EXPECT(Dart_IsString(debug_name)); 3566 EXPECT(Dart_IsString(debug_name));
3616 } 3567 }
3617 3568
3618 3569
3619 static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) { 3570 static void MyMessageNotifyCallback(Dart_Isolate dest_isolate) {}
3620 }
3621 3571
3622 3572
3623 UNIT_TEST_CASE(SetMessageCallbacks) { 3573 UNIT_TEST_CASE(SetMessageCallbacks) {
3624 Dart_Isolate dart_isolate = TestCase::CreateTestIsolate(); 3574 Dart_Isolate dart_isolate = TestCase::CreateTestIsolate();
3625 Dart_SetMessageNotifyCallback(&MyMessageNotifyCallback); 3575 Dart_SetMessageNotifyCallback(&MyMessageNotifyCallback);
3626 Isolate* isolate = reinterpret_cast<Isolate*>(dart_isolate); 3576 Isolate* isolate = reinterpret_cast<Isolate*>(dart_isolate);
3627 EXPECT_EQ(&MyMessageNotifyCallback, isolate->message_notify_callback()); 3577 EXPECT_EQ(&MyMessageNotifyCallback, isolate->message_notify_callback());
3628 Dart_ShutdownIsolate(); 3578 Dart_ShutdownIsolate();
3629 } 3579 }
3630 3580
3631 3581
3632 TEST_CASE(SetStickyError) { 3582 TEST_CASE(SetStickyError) {
3633 const char* kScriptChars = 3583 const char* kScriptChars = "main() => throw 'HI';";
3634 "main() => throw 'HI';";
3635 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 3584 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
3636 Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL); 3585 Dart_Handle retobj = Dart_Invoke(lib, NewString("main"), 0, NULL);
3637 EXPECT(Dart_IsError(retobj)); 3586 EXPECT(Dart_IsError(retobj));
3638 EXPECT(Dart_IsUnhandledExceptionError(retobj)); 3587 EXPECT(Dart_IsUnhandledExceptionError(retobj));
3639 EXPECT(!Dart_HasStickyError()); 3588 EXPECT(!Dart_HasStickyError());
3640 EXPECT(Dart_GetStickyError() == Dart_Null()); 3589 EXPECT(Dart_GetStickyError() == Dart_Null());
3641 Dart_SetStickyError(retobj); 3590 Dart_SetStickyError(retobj);
3642 EXPECT(Dart_HasStickyError()); 3591 EXPECT(Dart_HasStickyError());
3643 EXPECT(Dart_GetStickyError() != Dart_Null()); 3592 EXPECT(Dart_GetStickyError() != Dart_Null());
3644 Dart_SetStickyError(Dart_Null()); 3593 Dart_SetStickyError(Dart_Null());
(...skipping 18 matching lines...) Expand all
3663 "\n" 3612 "\n"
3664 "abstract class MyInterface1 implements MyInterface0 {\n" 3613 "abstract class MyInterface1 implements MyInterface0 {\n"
3665 "}\n" 3614 "}\n"
3666 "MyClass0 getMyClass0() { return new MyClass0(); }\n" 3615 "MyClass0 getMyClass0() { return new MyClass0(); }\n"
3667 "MyClass1 getMyClass1() { return new MyClass1(); }\n" 3616 "MyClass1 getMyClass1() { return new MyClass1(); }\n"
3668 "MyClass2 getMyClass2() { return new MyClass2(); }\n" 3617 "MyClass2 getMyClass2() { return new MyClass2(); }\n"
3669 "Type getMyClass0Type() { return new MyClass0().runtimeType; }\n" 3618 "Type getMyClass0Type() { return new MyClass0().runtimeType; }\n"
3670 "Type getMyClass1Type() { return new MyClass1().runtimeType; }\n" 3619 "Type getMyClass1Type() { return new MyClass1().runtimeType; }\n"
3671 "Type getMyClass2Type() { return new MyClass2().runtimeType; }\n"; 3620 "Type getMyClass2Type() { return new MyClass2().runtimeType; }\n";
3672 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 3621 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
3673 bool instanceof = false; 3622 bool instanceOf = false;
3674 3623
3675 // First get the type objects of these non parameterized types. 3624 // First get the type objects of these non parameterized types.
3676 Dart_Handle type0 = Dart_GetType(lib, NewString("MyClass0"), 0, NULL); 3625 Dart_Handle type0 = Dart_GetType(lib, NewString("MyClass0"), 0, NULL);
3677 EXPECT_VALID(type0); 3626 EXPECT_VALID(type0);
3678 Dart_Handle type1 = Dart_GetType(lib, NewString("MyClass1"), 0, NULL); 3627 Dart_Handle type1 = Dart_GetType(lib, NewString("MyClass1"), 0, NULL);
3679 EXPECT_VALID(type1); 3628 EXPECT_VALID(type1);
3680 Dart_Handle type2 = Dart_GetType(lib, NewString("MyClass2"), 0, NULL); 3629 Dart_Handle type2 = Dart_GetType(lib, NewString("MyClass2"), 0, NULL);
3681 EXPECT_VALID(type2); 3630 EXPECT_VALID(type2);
3682 Dart_Handle type3 = Dart_GetType(lib, NewString("MyInterface0"), 0, NULL); 3631 Dart_Handle type3 = Dart_GetType(lib, NewString("MyInterface0"), 0, NULL);
3683 EXPECT_VALID(type3); 3632 EXPECT_VALID(type3);
3684 Dart_Handle type4 = Dart_GetType(lib, NewString("MyInterface1"), 0, NULL); 3633 Dart_Handle type4 = Dart_GetType(lib, NewString("MyInterface1"), 0, NULL);
3685 EXPECT_VALID(type4); 3634 EXPECT_VALID(type4);
3686 3635
3687 // Now create objects of these non parameterized types and check 3636 // Now create objects of these non parameterized types and check
3688 // that the validity of the type of the created object. 3637 // that the validity of the type of the created object.
3689 // MyClass0 type. 3638 // MyClass0 type.
3690 Dart_Handle type0_obj = Dart_Invoke(lib, NewString("getMyClass0"), 0, NULL); 3639 Dart_Handle type0_obj = Dart_Invoke(lib, NewString("getMyClass0"), 0, NULL);
3691 EXPECT_VALID(type0_obj); 3640 EXPECT_VALID(type0_obj);
3692 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type0, &instanceof)); 3641 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type0, &instanceOf));
3693 EXPECT(instanceof); 3642 EXPECT(instanceOf);
3694 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type1, &instanceof)); 3643 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type1, &instanceOf));
3695 EXPECT(!instanceof); 3644 EXPECT(!instanceOf);
3696 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type2, &instanceof)); 3645 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type2, &instanceOf));
3697 EXPECT(!instanceof); 3646 EXPECT(!instanceOf);
3698 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type3, &instanceof)); 3647 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type3, &instanceOf));
3699 EXPECT(!instanceof); 3648 EXPECT(!instanceOf);
3700 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type4, &instanceof)); 3649 EXPECT_VALID(Dart_ObjectIsType(type0_obj, type4, &instanceOf));
3701 EXPECT(!instanceof); 3650 EXPECT(!instanceOf);
3702 type0_obj = Dart_Invoke(lib, NewString("getMyClass0Type"), 0, NULL); 3651 type0_obj = Dart_Invoke(lib, NewString("getMyClass0Type"), 0, NULL);
3703 EXPECT_VALID(type0_obj); 3652 EXPECT_VALID(type0_obj);
3704 EXPECT(Dart_IdentityEquals(type0, type0_obj)); 3653 EXPECT(Dart_IdentityEquals(type0, type0_obj));
3705 3654
3706 // MyClass1 type. 3655 // MyClass1 type.
3707 Dart_Handle type1_obj = Dart_Invoke(lib, NewString("getMyClass1"), 0, NULL); 3656 Dart_Handle type1_obj = Dart_Invoke(lib, NewString("getMyClass1"), 0, NULL);
3708 EXPECT_VALID(type1_obj); 3657 EXPECT_VALID(type1_obj);
3709 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type1, &instanceof)); 3658 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type1, &instanceOf));
3710 EXPECT(instanceof); 3659 EXPECT(instanceOf);
3711 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type0, &instanceof)); 3660 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type0, &instanceOf));
3712 EXPECT(!instanceof); 3661 EXPECT(!instanceOf);
3713 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type2, &instanceof)); 3662 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type2, &instanceOf));
3714 EXPECT(!instanceof); 3663 EXPECT(!instanceOf);
3715 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type3, &instanceof)); 3664 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type3, &instanceOf));
3716 EXPECT(instanceof); 3665 EXPECT(instanceOf);
3717 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type4, &instanceof)); 3666 EXPECT_VALID(Dart_ObjectIsType(type1_obj, type4, &instanceOf));
3718 EXPECT(instanceof); 3667 EXPECT(instanceOf);
3719 type1_obj = Dart_Invoke(lib, NewString("getMyClass1Type"), 0, NULL); 3668 type1_obj = Dart_Invoke(lib, NewString("getMyClass1Type"), 0, NULL);
3720 EXPECT_VALID(type1_obj); 3669 EXPECT_VALID(type1_obj);
3721 EXPECT(Dart_IdentityEquals(type1, type1_obj)); 3670 EXPECT(Dart_IdentityEquals(type1, type1_obj));
3722 3671
3723 // MyClass2 type. 3672 // MyClass2 type.
3724 Dart_Handle type2_obj = Dart_Invoke(lib, NewString("getMyClass2"), 0, NULL); 3673 Dart_Handle type2_obj = Dart_Invoke(lib, NewString("getMyClass2"), 0, NULL);
3725 EXPECT_VALID(type2_obj); 3674 EXPECT_VALID(type2_obj);
3726 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type2, &instanceof)); 3675 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type2, &instanceOf));
3727 EXPECT(instanceof); 3676 EXPECT(instanceOf);
3728 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type0, &instanceof)); 3677 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type0, &instanceOf));
3729 EXPECT(!instanceof); 3678 EXPECT(!instanceOf);
3730 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type1, &instanceof)); 3679 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type1, &instanceOf));
3731 EXPECT(!instanceof); 3680 EXPECT(!instanceOf);
3732 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type3, &instanceof)); 3681 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type3, &instanceOf));
3733 EXPECT(instanceof); 3682 EXPECT(instanceOf);
3734 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type4, &instanceof)); 3683 EXPECT_VALID(Dart_ObjectIsType(type2_obj, type4, &instanceOf));
3735 EXPECT(instanceof); 3684 EXPECT(instanceOf);
3736 type2_obj = Dart_Invoke(lib, NewString("getMyClass2Type"), 0, NULL); 3685 type2_obj = Dart_Invoke(lib, NewString("getMyClass2Type"), 0, NULL);
3737 EXPECT_VALID(type2_obj); 3686 EXPECT_VALID(type2_obj);
3738 EXPECT(Dart_IdentityEquals(type2, type2_obj)); 3687 EXPECT(Dart_IdentityEquals(type2, type2_obj));
3739 } 3688 }
3740 3689
3741 3690
3742 TEST_CASE(TypeGetParameterizedTypes) { 3691 TEST_CASE(TypeGetParameterizedTypes) {
3743 const char* kScriptChars = 3692 const char* kScriptChars =
3744 "class MyClass0<A, B> {\n" 3693 "class MyClass0<A, B> {\n"
3745 "}\n" 3694 "}\n"
(...skipping 18 matching lines...) Expand all
3764 "Type getMyClass0_1Type() {\n" 3713 "Type getMyClass0_1Type() {\n"
3765 " return new MyClass0<double, int>().runtimeType;\n" 3714 " return new MyClass0<double, int>().runtimeType;\n"
3766 "}\n" 3715 "}\n"
3767 "MyClass1 getMyClass1_1() {\n" 3716 "MyClass1 getMyClass1_1() {\n"
3768 " return new MyClass1<List<int>, List<double>>();\n" 3717 " return new MyClass1<List<int>, List<double>>();\n"
3769 "}\n" 3718 "}\n"
3770 "Type getMyClass1_1Type() {\n" 3719 "Type getMyClass1_1Type() {\n"
3771 " return new MyClass1<List<int>, List<double>>().runtimeType;\n" 3720 " return new MyClass1<List<int>, List<double>>().runtimeType;\n"
3772 "}\n"; 3721 "}\n";
3773 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 3722 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
3774 bool instanceof = false; 3723 bool instanceOf = false;
3775 3724
3776 // First get type objects of some of the basic types used in the test. 3725 // First get type objects of some of the basic types used in the test.
3777 Dart_Handle int_type = Dart_GetType(lib, NewString("int"), 0, NULL); 3726 Dart_Handle int_type = Dart_GetType(lib, NewString("int"), 0, NULL);
3778 EXPECT_VALID(int_type); 3727 EXPECT_VALID(int_type);
3779 Dart_Handle double_type = Dart_GetType(lib, NewString("double"), 0, NULL); 3728 Dart_Handle double_type = Dart_GetType(lib, NewString("double"), 0, NULL);
3780 EXPECT_VALID(double_type); 3729 EXPECT_VALID(double_type);
3781 Dart_Handle list_type = Dart_GetType(lib, NewString("List"), 0, NULL); 3730 Dart_Handle list_type = Dart_GetType(lib, NewString("List"), 0, NULL);
3782 EXPECT_VALID(list_type); 3731 EXPECT_VALID(list_type);
3783 Dart_Handle type_args = Dart_NewList(1); 3732 Dart_Handle type_args = Dart_NewList(1);
3784 EXPECT_VALID(Dart_ListSetAt(type_args, 0, int_type)); 3733 EXPECT_VALID(Dart_ListSetAt(type_args, 0, int_type));
3785 Dart_Handle list_int_type = Dart_GetType(lib, 3734 Dart_Handle list_int_type =
3786 NewString("List"), 3735 Dart_GetType(lib, NewString("List"), 1, &type_args);
3787 1,
3788 &type_args);
3789 EXPECT_VALID(list_int_type); 3736 EXPECT_VALID(list_int_type);
3790 3737
3791 // Now instantiate MyClass0 and MyClass1 types with the same type arguments 3738 // Now instantiate MyClass0 and MyClass1 types with the same type arguments
3792 // used in the code above. 3739 // used in the code above.
3793 type_args = Dart_NewList(2); 3740 type_args = Dart_NewList(2);
3794 EXPECT_VALID(Dart_ListSetAt(type_args, 0, int_type)); 3741 EXPECT_VALID(Dart_ListSetAt(type_args, 0, int_type));
3795 EXPECT_VALID(Dart_ListSetAt(type_args, 1, double_type)); 3742 EXPECT_VALID(Dart_ListSetAt(type_args, 1, double_type));
3796 Dart_Handle myclass0_type = Dart_GetType(lib, 3743 Dart_Handle myclass0_type =
3797 NewString("MyClass0"), 3744 Dart_GetType(lib, NewString("MyClass0"), 2, &type_args);
3798 2,
3799 &type_args);
3800 EXPECT_VALID(myclass0_type); 3745 EXPECT_VALID(myclass0_type);
3801 3746
3802 type_args = Dart_NewList(2); 3747 type_args = Dart_NewList(2);
3803 EXPECT_VALID(Dart_ListSetAt(type_args, 0, list_int_type)); 3748 EXPECT_VALID(Dart_ListSetAt(type_args, 0, list_int_type));
3804 EXPECT_VALID(Dart_ListSetAt(type_args, 1, list_type)); 3749 EXPECT_VALID(Dart_ListSetAt(type_args, 1, list_type));
3805 Dart_Handle myclass1_type = Dart_GetType(lib, 3750 Dart_Handle myclass1_type =
3806 NewString("MyClass1"), 3751 Dart_GetType(lib, NewString("MyClass1"), 2, &type_args);
3807 2,
3808 &type_args);
3809 EXPECT_VALID(myclass1_type); 3752 EXPECT_VALID(myclass1_type);
3810 3753
3811 // Now create objects of the type and validate the object type matches 3754 // Now create objects of the type and validate the object type matches
3812 // the one returned above. Also get the runtime type of the object and 3755 // the one returned above. Also get the runtime type of the object and
3813 // verify that it matches the type returned above. 3756 // verify that it matches the type returned above.
3814 // MyClass0<int, double> type. 3757 // MyClass0<int, double> type.
3815 Dart_Handle type0_obj = Dart_Invoke(lib, NewString("getMyClass0"), 0, NULL); 3758 Dart_Handle type0_obj = Dart_Invoke(lib, NewString("getMyClass0"), 0, NULL);
3816 EXPECT_VALID(type0_obj); 3759 EXPECT_VALID(type0_obj);
3817 EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceof)); 3760 EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceOf));
3818 EXPECT(instanceof); 3761 EXPECT(instanceOf);
3819 type0_obj = Dart_Invoke(lib, NewString("getMyClass0Type"), 0, NULL); 3762 type0_obj = Dart_Invoke(lib, NewString("getMyClass0Type"), 0, NULL);
3820 EXPECT_VALID(type0_obj); 3763 EXPECT_VALID(type0_obj);
3821 EXPECT(Dart_IdentityEquals(type0_obj, myclass0_type)); 3764 EXPECT(Dart_IdentityEquals(type0_obj, myclass0_type));
3822 3765
3823 // MyClass1<List<int>, List> type. 3766 // MyClass1<List<int>, List> type.
3824 Dart_Handle type1_obj = Dart_Invoke(lib, NewString("getMyClass1"), 0, NULL); 3767 Dart_Handle type1_obj = Dart_Invoke(lib, NewString("getMyClass1"), 0, NULL);
3825 EXPECT_VALID(type1_obj); 3768 EXPECT_VALID(type1_obj);
3826 EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceof)); 3769 EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceOf));
3827 EXPECT(instanceof); 3770 EXPECT(instanceOf);
3828 type1_obj = Dart_Invoke(lib, NewString("getMyClass1Type"), 0, NULL); 3771 type1_obj = Dart_Invoke(lib, NewString("getMyClass1Type"), 0, NULL);
3829 EXPECT_VALID(type1_obj); 3772 EXPECT_VALID(type1_obj);
3830 EXPECT(Dart_IdentityEquals(type1_obj, myclass1_type)); 3773 EXPECT(Dart_IdentityEquals(type1_obj, myclass1_type));
3831 3774
3832 // MyClass0<double, int> type. 3775 // MyClass0<double, int> type.
3833 type0_obj = Dart_Invoke(lib, NewString("getMyClass0_1"), 0, NULL); 3776 type0_obj = Dart_Invoke(lib, NewString("getMyClass0_1"), 0, NULL);
3834 EXPECT_VALID(type0_obj); 3777 EXPECT_VALID(type0_obj);
3835 EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceof)); 3778 EXPECT_VALID(Dart_ObjectIsType(type0_obj, myclass0_type, &instanceOf));
3836 EXPECT(!instanceof); 3779 EXPECT(!instanceOf);
3837 type0_obj = Dart_Invoke(lib, NewString("getMyClass0_1Type"), 0, NULL); 3780 type0_obj = Dart_Invoke(lib, NewString("getMyClass0_1Type"), 0, NULL);
3838 EXPECT_VALID(type0_obj); 3781 EXPECT_VALID(type0_obj);
3839 EXPECT(!Dart_IdentityEquals(type0_obj, myclass0_type)); 3782 EXPECT(!Dart_IdentityEquals(type0_obj, myclass0_type));
3840 3783
3841 // MyClass1<List<int>, List<double>> type. 3784 // MyClass1<List<int>, List<double>> type.
3842 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1"), 0, NULL); 3785 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1"), 0, NULL);
3843 EXPECT_VALID(type1_obj); 3786 EXPECT_VALID(type1_obj);
3844 EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceof)); 3787 EXPECT_VALID(Dart_ObjectIsType(type1_obj, myclass1_type, &instanceOf));
3845 EXPECT(instanceof); 3788 EXPECT(instanceOf);
3846 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1Type"), 0, NULL); 3789 type1_obj = Dart_Invoke(lib, NewString("getMyClass1_1Type"), 0, NULL);
3847 EXPECT_VALID(type1_obj); 3790 EXPECT_VALID(type1_obj);
3848 EXPECT(!Dart_IdentityEquals(type1_obj, myclass1_type)); 3791 EXPECT(!Dart_IdentityEquals(type1_obj, myclass1_type));
3849 } 3792 }
3850 3793
3851 3794
3852 static void TestFieldOk(Dart_Handle container, 3795 static void TestFieldOk(Dart_Handle container,
3853 Dart_Handle name, 3796 Dart_Handle name,
3854 bool final, 3797 bool final,
3855 const char* initial_value) { 3798 const char* initial_value) {
(...skipping 24 matching lines...) Expand all
3880 EXPECT_VALID(result); 3823 EXPECT_VALID(result);
3881 EXPECT_VALID(Dart_StringToCString(result, &value)); 3824 EXPECT_VALID(Dart_StringToCString(result, &value));
3882 if (final) { 3825 if (final) {
3883 EXPECT_STREQ(initial_value, value); 3826 EXPECT_STREQ(initial_value, value);
3884 } else { 3827 } else {
3885 EXPECT_STREQ(buffer, value); 3828 EXPECT_STREQ(buffer, value);
3886 } 3829 }
3887 } 3830 }
3888 3831
3889 3832
3890 static void TestFieldNotFound(Dart_Handle container, 3833 static void TestFieldNotFound(Dart_Handle container, Dart_Handle name) {
3891 Dart_Handle name) {
3892 EXPECT(Dart_IsError(Dart_GetField(container, name))); 3834 EXPECT(Dart_IsError(Dart_GetField(container, name)));
3893 EXPECT(Dart_IsError(Dart_SetField(container, name, Dart_Null()))); 3835 EXPECT(Dart_IsError(Dart_SetField(container, name, Dart_Null())));
3894 } 3836 }
3895 3837
3896 3838
3897 TEST_CASE(FieldAccess) { 3839 TEST_CASE(FieldAccess) {
3898 const char* kScriptChars = 3840 const char* kScriptChars =
3899 "class BaseFields {\n" 3841 "class BaseFields {\n"
3900 " BaseFields()\n" 3842 " BaseFields()\n"
3901 " : this.inherited_fld = 'inherited' {\n" 3843 " : this.inherited_fld = 'inherited' {\n"
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
4140 4082
4141 // Hidden imported top-level get/set field. Not found at any level. 4083 // Hidden imported top-level get/set field. Not found at any level.
4142 name = NewString("_imported_getset_fld"); 4084 name = NewString("_imported_getset_fld");
4143 TestFieldNotFound(type, name); 4085 TestFieldNotFound(type, name);
4144 TestFieldNotFound(instance, name); 4086 TestFieldNotFound(instance, name);
4145 TestFieldNotFound(lib, name); 4087 TestFieldNotFound(lib, name);
4146 } 4088 }
4147 4089
4148 4090
4149 TEST_CASE(SetField_FunnyValue) { 4091 TEST_CASE(SetField_FunnyValue) {
4150 const char* kScriptChars = 4092 const char* kScriptChars = "var top;\n";
4151 "var top;\n";
4152 4093
4153 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 4094 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
4154 Dart_Handle name = NewString("top"); 4095 Dart_Handle name = NewString("top");
4155 bool value; 4096 bool value;
4156 4097
4157 // Test that you can set the field to a good value. 4098 // Test that you can set the field to a good value.
4158 EXPECT_VALID(Dart_SetField(lib, name, Dart_True())); 4099 EXPECT_VALID(Dart_SetField(lib, name, Dart_True()));
4159 Dart_Handle result = Dart_GetField(lib, name); 4100 Dart_Handle result = Dart_GetField(lib, name);
4160 EXPECT_VALID(result); 4101 EXPECT_VALID(result);
4161 EXPECT(Dart_IsBoolean(result)); 4102 EXPECT(Dart_IsBoolean(result));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4206 "}\n" 4147 "}\n"
4207 "NativeFields testMain() {\n" 4148 "NativeFields testMain() {\n"
4208 " NativeFields obj = new NativeFields(10, 20);\n" 4149 " NativeFields obj = new NativeFields(10, 20);\n"
4209 " return obj;\n" 4150 " return obj;\n"
4210 "}\n"; 4151 "}\n";
4211 Dart_Handle result; 4152 Dart_Handle result;
4212 4153
4213 const int kNumNativeFields = 4; 4154 const int kNumNativeFields = 4;
4214 4155
4215 // Create a test library. 4156 // Create a test library.
4216 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL, 4157 Dart_Handle lib =
4217 USER_TEST_URI, false); 4158 TestCase::LoadTestScript(kScriptChars, NULL, USER_TEST_URI, false);
4218 4159
4219 // Create a native wrapper class with native fields. 4160 // Create a native wrapper class with native fields.
4220 result = Dart_CreateNativeWrapperClass( 4161 result = Dart_CreateNativeWrapperClass(lib, NewString("NativeFieldsWrapper"),
4221 lib, 4162 kNumNativeFields);
4222 NewString("NativeFieldsWrapper"),
4223 kNumNativeFields);
4224 EXPECT_VALID(result); 4163 EXPECT_VALID(result);
4225 result = Dart_FinalizeLoading(false); 4164 result = Dart_FinalizeLoading(false);
4226 EXPECT_VALID(result); 4165 EXPECT_VALID(result);
4227 4166
4228 // Load up a test script in the test library. 4167 // Load up a test script in the test library.
4229 4168
4230 // Invoke a function which returns an object of type NativeFields. 4169 // Invoke a function which returns an object of type NativeFields.
4231 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4170 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4232 EXPECT_VALID(result); 4171 EXPECT_VALID(result);
4233 CHECK_API_SCOPE(thread); 4172 CHECK_API_SCOPE(thread);
4234 HANDLESCOPE(thread); 4173 HANDLESCOPE(thread);
4235 Instance& obj = Instance::Handle(); 4174 Instance& obj = Instance::Handle();
4236 obj ^= Api::UnwrapHandle(result); 4175 obj ^= Api::UnwrapHandle(result);
4237 const Class& cls = Class::Handle(obj.clazz()); 4176 const Class& cls = Class::Handle(obj.clazz());
4238 // We expect the newly created "NativeFields" object to have 4177 // We expect the newly created "NativeFields" object to have
4239 // 2 dart instance fields (fld1, fld2) and a reference to the native fields. 4178 // 2 dart instance fields (fld1, fld2) and a reference to the native fields.
4240 // Hence the size of an instance of "NativeFields" should be 4179 // Hence the size of an instance of "NativeFields" should be
4241 // (1 + 2) * kWordSize + size of object header. 4180 // (1 + 2) * kWordSize + size of object header.
4242 // We check to make sure the instance size computed by the VM matches 4181 // We check to make sure the instance size computed by the VM matches
4243 // our expectations. 4182 // our expectations.
4244 intptr_t header_size = sizeof(RawObject); 4183 intptr_t header_size = sizeof(RawObject);
4245 EXPECT_EQ(Utils::RoundUp(((1 + 2) * kWordSize) + header_size, 4184 EXPECT_EQ(
4246 kObjectAlignment), 4185 Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment),
4247 cls.instance_size()); 4186 cls.instance_size());
4248 EXPECT_EQ(kNumNativeFields, cls.num_native_fields()); 4187 EXPECT_EQ(kNumNativeFields, cls.num_native_fields());
4249 } 4188 }
4250 4189
4251 4190
4252 TEST_CASE(InjectNativeFields2) { 4191 TEST_CASE(InjectNativeFields2) {
4253 const char* kScriptChars = 4192 const char* kScriptChars =
4254 "class NativeFields extends NativeFieldsWrapper {\n" 4193 "class NativeFields extends NativeFieldsWrapper {\n"
4255 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4194 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4256 " int fld1;\n" 4195 " int fld1;\n"
4257 " final int fld2;\n" 4196 " final int fld2;\n"
4258 " static int fld3;\n" 4197 " static int fld3;\n"
4259 " static const int fld4 = 10;\n" 4198 " static const int fld4 = 10;\n"
4260 "}\n" 4199 "}\n"
4261 "NativeFields testMain() {\n" 4200 "NativeFields testMain() {\n"
4262 " NativeFields obj = new NativeFields(10, 20);\n" 4201 " NativeFields obj = new NativeFields(10, 20);\n"
4263 " return obj;\n" 4202 " return obj;\n"
4264 "}\n"; 4203 "}\n";
4265 Dart_Handle result; 4204 Dart_Handle result;
4266 // Create a test library and Load up a test script in it. 4205 // Create a test library and Load up a test script in it.
4267 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL, 4206 Dart_Handle lib =
4268 USER_TEST_URI, false); 4207 TestCase::LoadTestScript(kScriptChars, NULL, USER_TEST_URI, false);
4269 4208
4270 // Invoke a function which returns an object of type NativeFields. 4209 // Invoke a function which returns an object of type NativeFields.
4271 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4210 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4272 4211
4273 // We expect this to fail as class "NativeFields" extends 4212 // We expect this to fail as class "NativeFields" extends
4274 // "NativeFieldsWrapper" and there is no definition of it either 4213 // "NativeFieldsWrapper" and there is no definition of it either
4275 // in the dart code or through the native field injection mechanism. 4214 // in the dart code or through the native field injection mechanism.
4276 EXPECT(Dart_IsError(result)); 4215 EXPECT(Dart_IsError(result));
4277 } 4216 }
4278 4217
4279 4218
4280 TEST_CASE(InjectNativeFields3) { 4219 TEST_CASE(InjectNativeFields3) {
4281 const char* kScriptChars = 4220 const char* kScriptChars =
4282 "import 'dart:nativewrappers';" 4221 "import 'dart:nativewrappers';"
4283 "class NativeFields extends NativeFieldWrapperClass2 {\n" 4222 "class NativeFields extends NativeFieldWrapperClass2 {\n"
4284 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4223 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4285 " int fld1;\n" 4224 " int fld1;\n"
4286 " final int fld2;\n" 4225 " final int fld2;\n"
4287 " static int fld3;\n" 4226 " static int fld3;\n"
4288 " static const int fld4 = 10;\n" 4227 " static const int fld4 = 10;\n"
4289 "}\n" 4228 "}\n"
4290 "NativeFields testMain() {\n" 4229 "NativeFields testMain() {\n"
4291 " NativeFields obj = new NativeFields(10, 20);\n" 4230 " NativeFields obj = new NativeFields(10, 20);\n"
4292 " return obj;\n" 4231 " return obj;\n"
4293 "}\n"; 4232 "}\n";
4294 Dart_Handle result; 4233 Dart_Handle result;
4295 const int kNumNativeFields = 2; 4234 const int kNumNativeFields = 2;
4296 4235
4297 // Load up a test script in the test library. 4236 // Load up a test script in the test library.
4298 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, 4237 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
4299 native_field_lookup);
4300 4238
4301 // Invoke a function which returns an object of type NativeFields. 4239 // Invoke a function which returns an object of type NativeFields.
4302 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4240 result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4303 EXPECT_VALID(result); 4241 EXPECT_VALID(result);
4304 CHECK_API_SCOPE(thread); 4242 CHECK_API_SCOPE(thread);
4305 HANDLESCOPE(thread); 4243 HANDLESCOPE(thread);
4306 Instance& obj = Instance::Handle(); 4244 Instance& obj = Instance::Handle();
4307 obj ^= Api::UnwrapHandle(result); 4245 obj ^= Api::UnwrapHandle(result);
4308 const Class& cls = Class::Handle(obj.clazz()); 4246 const Class& cls = Class::Handle(obj.clazz());
4309 // We expect the newly created "NativeFields" object to have 4247 // We expect the newly created "NativeFields" object to have
4310 // 2 dart instance fields (fld1, fld2) and a reference to the native fields. 4248 // 2 dart instance fields (fld1, fld2) and a reference to the native fields.
4311 // Hence the size of an instance of "NativeFields" should be 4249 // Hence the size of an instance of "NativeFields" should be
4312 // (1 + 2) * kWordSize + size of object header. 4250 // (1 + 2) * kWordSize + size of object header.
4313 // We check to make sure the instance size computed by the VM matches 4251 // We check to make sure the instance size computed by the VM matches
4314 // our expectations. 4252 // our expectations.
4315 intptr_t header_size = sizeof(RawObject); 4253 intptr_t header_size = sizeof(RawObject);
4316 EXPECT_EQ(Utils::RoundUp(((1 + 2) * kWordSize) + header_size, 4254 EXPECT_EQ(
4317 kObjectAlignment), 4255 Utils::RoundUp(((1 + 2) * kWordSize) + header_size, kObjectAlignment),
4318 cls.instance_size()); 4256 cls.instance_size());
4319 EXPECT_EQ(kNumNativeFields, cls.num_native_fields()); 4257 EXPECT_EQ(kNumNativeFields, cls.num_native_fields());
4320 } 4258 }
4321 4259
4322 4260
4323 TEST_CASE(InjectNativeFields4) { 4261 TEST_CASE(InjectNativeFields4) {
4324 const char* kScriptChars = 4262 const char* kScriptChars =
4325 "import 'dart:nativewrappers';" 4263 "import 'dart:nativewrappers';"
4326 "class NativeFields extends NativeFieldWrapperClass2 {\n" 4264 "class NativeFields extends NativeFieldWrapperClass2 {\n"
4327 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n" 4265 " NativeFields(int i, int j) : fld1 = i, fld2 = j {}\n"
4328 " int fld1;\n" 4266 " int fld1;\n"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4362 4300
4363 void TestNativeFieldsAccess_init(Dart_NativeArguments args) { 4301 void TestNativeFieldsAccess_init(Dart_NativeArguments args) {
4364 Dart_Handle receiver = Dart_GetNativeArgument(args, 0); 4302 Dart_Handle receiver = Dart_GetNativeArgument(args, 0);
4365 Dart_SetNativeInstanceField(receiver, 0, kNativeField1Value); 4303 Dart_SetNativeInstanceField(receiver, 0, kNativeField1Value);
4366 Dart_SetNativeInstanceField(receiver, 1, kNativeField2Value); 4304 Dart_SetNativeInstanceField(receiver, 1, kNativeField2Value);
4367 } 4305 }
4368 4306
4369 4307
4370 void TestNativeFieldsAccess_access(Dart_NativeArguments args) { 4308 void TestNativeFieldsAccess_access(Dart_NativeArguments args) {
4371 intptr_t field_values[kTestNumNativeFields]; 4309 intptr_t field_values[kTestNumNativeFields];
4372 Dart_Handle result = Dart_GetNativeFieldsOfArgument(args, 4310 Dart_Handle result = Dart_GetNativeFieldsOfArgument(
4373 0, 4311 args, 0, kTestNumNativeFields, field_values);
4374 kTestNumNativeFields,
4375 field_values);
4376 EXPECT_VALID(result); 4312 EXPECT_VALID(result);
4377 EXPECT_EQ(kNativeField1Value, field_values[0]); 4313 EXPECT_EQ(kNativeField1Value, field_values[0]);
4378 EXPECT_EQ(kNativeField2Value, field_values[1]); 4314 EXPECT_EQ(kNativeField2Value, field_values[1]);
4379 result = Dart_GetNativeFieldsOfArgument(args, 4315 result = Dart_GetNativeFieldsOfArgument(args, 1, kTestNumNativeFields,
4380 1,
4381 kTestNumNativeFields,
4382 field_values); 4316 field_values);
4383 EXPECT_VALID(result); 4317 EXPECT_VALID(result);
4384 EXPECT_EQ(0, field_values[0]); 4318 EXPECT_EQ(0, field_values[0]);
4385 EXPECT_EQ(0, field_values[1]); 4319 EXPECT_EQ(0, field_values[1]);
4386 } 4320 }
4387 4321
4388 4322
4389 static Dart_NativeFunction TestNativeFieldsAccess_lookup(Dart_Handle name, 4323 static Dart_NativeFunction TestNativeFieldsAccess_lookup(Dart_Handle name,
4390 int argument_count, 4324 int argument_count,
4391 bool* auto_scope) { 4325 bool* auto_scope) {
(...skipping 29 matching lines...) Expand all
4421 " int accessNativeFlds(int i) native 'TestNativeFieldsAccess_access';\n" 4355 " int accessNativeFlds(int i) native 'TestNativeFieldsAccess_access';\n"
4422 "}\n" 4356 "}\n"
4423 "NativeFields testMain() {\n" 4357 "NativeFields testMain() {\n"
4424 " NativeFields obj = new NativeFields(10, 20);\n" 4358 " NativeFields obj = new NativeFields(10, 20);\n"
4425 " obj.initNativeFlds();\n" 4359 " obj.initNativeFlds();\n"
4426 " obj.accessNativeFlds(null);\n" 4360 " obj.accessNativeFlds(null);\n"
4427 " return obj;\n" 4361 " return obj;\n"
4428 "}\n"; 4362 "}\n";
4429 4363
4430 // Load up a test script in the test library. 4364 // Load up a test script in the test library.
4431 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, 4365 Dart_Handle lib =
4432 TestNativeFieldsAccess_lookup); 4366 TestCase::LoadTestScript(kScriptChars, TestNativeFieldsAccess_lookup);
4433 4367
4434 // Invoke a function which returns an object of type NativeFields. 4368 // Invoke a function which returns an object of type NativeFields.
4435 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4369 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4436 EXPECT_VALID(result); 4370 EXPECT_VALID(result);
4437 } 4371 }
4438 4372
4439 4373
4440 TEST_CASE(InjectNativeFieldsSuperClass) { 4374 TEST_CASE(InjectNativeFieldsSuperClass) {
4441 const char* kScriptChars = 4375 const char* kScriptChars =
4442 "import 'dart:nativewrappers';" 4376 "import 'dart:nativewrappers';"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4476 EXPECT(Dart_IsNull(result)); 4410 EXPECT(Dart_IsNull(result));
4477 result = Dart_GetField(retobj, NewString("fld1")); 4411 result = Dart_GetField(retobj, NewString("fld1"));
4478 EXPECT_VALID(result); 4412 EXPECT_VALID(result);
4479 int64_t value = 0; 4413 int64_t value = 0;
4480 result = Dart_IntegerToInt64(result, &value); 4414 result = Dart_IntegerToInt64(result, &value);
4481 EXPECT_EQ(10, value); 4415 EXPECT_EQ(10, value);
4482 result = Dart_GetField(retobj, NewString("fld2")); 4416 result = Dart_GetField(retobj, NewString("fld2"));
4483 EXPECT_VALID(result); 4417 EXPECT_VALID(result);
4484 result = Dart_IntegerToInt64(result, &value); 4418 result = Dart_IntegerToInt64(result, &value);
4485 EXPECT_EQ(20, value); 4419 EXPECT_EQ(20, value);
4486 result = Dart_SetField(retobj, 4420 result = Dart_SetField(retobj, NewString("fld2"), Dart_NewInteger(40));
4487 NewString("fld2"),
4488 Dart_NewInteger(40));
4489 EXPECT(Dart_IsError(result)); 4421 EXPECT(Dart_IsError(result));
4490 result = Dart_SetField(retobj, 4422 result = Dart_SetField(retobj, NewString("fld1"), Dart_NewInteger(40));
4491 NewString("fld1"),
4492 Dart_NewInteger(40));
4493 EXPECT_VALID(result); 4423 EXPECT_VALID(result);
4494 result = Dart_GetField(retobj, NewString("fld1")); 4424 result = Dart_GetField(retobj, NewString("fld1"));
4495 EXPECT_VALID(result); 4425 EXPECT_VALID(result);
4496 result = Dart_IntegerToInt64(result, &value); 4426 result = Dart_IntegerToInt64(result, &value);
4497 EXPECT_EQ(40, value); 4427 EXPECT_EQ(40, value);
4498 4428
4499 // Now access and set various native instance fields of the returned object. 4429 // Now access and set various native instance fields of the returned object.
4500 const int kNativeFld0 = 0; 4430 const int kNativeFld0 = 0;
4501 const int kNativeFld1 = 1; 4431 const int kNativeFld1 = 1;
4502 const int kNativeFld2 = 2; 4432 const int kNativeFld2 = 2;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4557 " static int fld3;\n" 4487 " static int fld3;\n"
4558 " static const int fld4 = 10;\n" 4488 " static const int fld4 = 10;\n"
4559 "}\n" 4489 "}\n"
4560 "NativeFields testMain() {\n" 4490 "NativeFields testMain() {\n"
4561 " NativeFields obj = new NativeFields(10, 20);\n" 4491 " NativeFields obj = new NativeFields(10, 20);\n"
4562 " return obj;\n" 4492 " return obj;\n"
4563 "}\n"; 4493 "}\n";
4564 const int kNumNativeFields = 4; 4494 const int kNumNativeFields = 4;
4565 4495
4566 // Create a test library. 4496 // Create a test library.
4567 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, 4497 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup,
4568 native_field_lookup, 4498 USER_TEST_URI, false);
4569 USER_TEST_URI,
4570 false);
4571 4499
4572 // Create a native wrapper class with native fields. 4500 // Create a native wrapper class with native fields.
4573 Dart_Handle result = Dart_CreateNativeWrapperClass( 4501 Dart_Handle result = Dart_CreateNativeWrapperClass(
4574 lib, 4502 lib, NewString("NativeFieldsWrapper"), kNumNativeFields);
4575 NewString("NativeFieldsWrapper"),
4576 kNumNativeFields);
4577 EXPECT_VALID(result); 4503 EXPECT_VALID(result);
4578 result = Dart_FinalizeLoading(false); 4504 result = Dart_FinalizeLoading(false);
4579 EXPECT_VALID(result); 4505 EXPECT_VALID(result);
4580 4506
4581 // Load up a test script in it. 4507 // Load up a test script in it.
4582 4508
4583 // Invoke a function which returns an object of type NativeFields. 4509 // Invoke a function which returns an object of type NativeFields.
4584 Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4510 Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4585 EXPECT_VALID(retobj); 4511 EXPECT_VALID(retobj);
4586 4512
(...skipping 23 matching lines...) Expand all
4610 " int fld1;\n" 4536 " int fld1;\n"
4611 " final int fld2;\n" 4537 " final int fld2;\n"
4612 " static int fld3;\n" 4538 " static int fld3;\n"
4613 " static const int fld4 = 10;\n" 4539 " static const int fld4 = 10;\n"
4614 "}\n" 4540 "}\n"
4615 "NativeFields testMain() {\n" 4541 "NativeFields testMain() {\n"
4616 " NativeFields obj = new NativeFields(10, 20);\n" 4542 " NativeFields obj = new NativeFields(10, 20);\n"
4617 " return obj;\n" 4543 " return obj;\n"
4618 "}\n"; 4544 "}\n";
4619 // Load up a test script in the test library. 4545 // Load up a test script in the test library.
4620 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, 4546 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, native_field_lookup);
4621 native_field_lookup);
4622 4547
4623 // Invoke a function which returns an object of type NativeFields. 4548 // Invoke a function which returns an object of type NativeFields.
4624 Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 4549 Dart_Handle retobj = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
4625 EXPECT_VALID(retobj); 4550 EXPECT_VALID(retobj);
4626 4551
4627 // Now access and set various instance fields of the returned object. 4552 // Now access and set various instance fields of the returned object.
4628 TestNativeFields(retobj); 4553 TestNativeFields(retobj);
4629 } 4554 }
4630 4555
4631 4556
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
4763 int64_t value = 0; 4688 int64_t value = 0;
4764 result = Dart_IntegerToInt64(result, &value); 4689 result = Dart_IntegerToInt64(result, &value);
4765 EXPECT_EQ(7, value); 4690 EXPECT_EQ(7, value);
4766 4691
4767 result = Dart_GetField(type, NewString("fld2")); 4692 result = Dart_GetField(type, NewString("fld2"));
4768 EXPECT_VALID(result); 4693 EXPECT_VALID(result);
4769 result = Dart_IntegerToInt64(result, &value); 4694 result = Dart_IntegerToInt64(result, &value);
4770 EXPECT_EQ(11, value); 4695 EXPECT_EQ(11, value);
4771 4696
4772 // Overwrite fld2 4697 // Overwrite fld2
4773 result = Dart_SetField(type, 4698 result = Dart_SetField(type, NewString("fld2"), Dart_NewInteger(13));
4774 NewString("fld2"),
4775 Dart_NewInteger(13));
4776 EXPECT_VALID(result); 4699 EXPECT_VALID(result);
4777 4700
4778 // We now get the new value for fld2, not the initializer 4701 // We now get the new value for fld2, not the initializer
4779 result = Dart_GetField(type, NewString("fld2")); 4702 result = Dart_GetField(type, NewString("fld2"));
4780 EXPECT_VALID(result); 4703 EXPECT_VALID(result);
4781 result = Dart_IntegerToInt64(result, &value); 4704 result = Dart_IntegerToInt64(result, &value);
4782 EXPECT_EQ(13, value); 4705 EXPECT_EQ(13, value);
4783 } 4706 }
4784 4707
4785 4708
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
4864 Dart_Handle intf = Dart_GetType(lib, NewString("MyInterface"), 0, NULL); 4787 Dart_Handle intf = Dart_GetType(lib, NewString("MyInterface"), 0, NULL);
4865 EXPECT_VALID(intf); 4788 EXPECT_VALID(intf);
4866 Dart_Handle args[1]; 4789 Dart_Handle args[1];
4867 args[0] = Dart_NewInteger(11); 4790 args[0] = Dart_NewInteger(11);
4868 Dart_Handle bad_args[1]; 4791 Dart_Handle bad_args[1];
4869 bad_args[0] = Dart_NewApiError("myerror"); 4792 bad_args[0] = Dart_NewApiError("myerror");
4870 4793
4871 // Allocate and Invoke the unnamed constructor passing in Dart_Null. 4794 // Allocate and Invoke the unnamed constructor passing in Dart_Null.
4872 Dart_Handle result = Dart_New(type, Dart_Null(), 0, NULL); 4795 Dart_Handle result = Dart_New(type, Dart_Null(), 0, NULL);
4873 EXPECT_VALID(result); 4796 EXPECT_VALID(result);
4874 bool instanceof = false; 4797 bool instanceOf = false;
4875 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4798 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
4876 EXPECT(instanceof); 4799 EXPECT(instanceOf);
4877 int64_t int_value = 0; 4800 int64_t int_value = 0;
4878 Dart_Handle foo = Dart_GetField(result, NewString("foo")); 4801 Dart_Handle foo = Dart_GetField(result, NewString("foo"));
4879 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4802 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4880 EXPECT_EQ(7, int_value); 4803 EXPECT_EQ(7, int_value);
4881 4804
4882 // Allocate without a constructor. 4805 // Allocate without a constructor.
4883 Dart_Handle obj = Dart_Allocate(type); 4806 Dart_Handle obj = Dart_Allocate(type);
4884 EXPECT_VALID(obj); 4807 EXPECT_VALID(obj);
4885 instanceof = false; 4808 instanceOf = false;
4886 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof)); 4809 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
4887 EXPECT(instanceof); 4810 EXPECT(instanceOf);
4888 foo = Dart_GetField(obj, NewString("foo")); 4811 foo = Dart_GetField(obj, NewString("foo"));
4889 EXPECT(Dart_IsNull(foo)); 4812 EXPECT(Dart_IsNull(foo));
4890 4813
4891 // Allocate and Invoke the unnamed constructor passing in an empty string. 4814 // Allocate and Invoke the unnamed constructor passing in an empty string.
4892 result = Dart_New(type, Dart_EmptyString(), 0, NULL); 4815 result = Dart_New(type, Dart_EmptyString(), 0, NULL);
4893 EXPECT_VALID(result); 4816 EXPECT_VALID(result);
4894 instanceof = false; 4817 instanceOf = false;
4895 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4818 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
4896 EXPECT(instanceof); 4819 EXPECT(instanceOf);
4897 int_value = 0; 4820 int_value = 0;
4898 foo = Dart_GetField(result, NewString("foo")); 4821 foo = Dart_GetField(result, NewString("foo"));
4899 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4822 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4900 EXPECT_EQ(7, int_value); 4823 EXPECT_EQ(7, int_value);
4901 4824
4902 // Allocate object and invoke the unnamed constructor with an empty string. 4825 // Allocate object and invoke the unnamed constructor with an empty string.
4903 obj = Dart_Allocate(type); 4826 obj = Dart_Allocate(type);
4904 EXPECT_VALID(obj); 4827 EXPECT_VALID(obj);
4905 instanceof = false; 4828 instanceOf = false;
4906 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof)); 4829 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
4907 EXPECT(instanceof); 4830 EXPECT(instanceOf);
4908 // Use the empty string to invoke the unnamed constructor. 4831 // Use the empty string to invoke the unnamed constructor.
4909 result = Dart_InvokeConstructor(obj, Dart_EmptyString(), 0, NULL); 4832 result = Dart_InvokeConstructor(obj, Dart_EmptyString(), 0, NULL);
4910 EXPECT_VALID(result); 4833 EXPECT_VALID(result);
4911 int_value = 0; 4834 int_value = 0;
4912 foo = Dart_GetField(result, NewString("foo")); 4835 foo = Dart_GetField(result, NewString("foo"));
4913 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4836 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4914 EXPECT_EQ(7, int_value); 4837 EXPECT_EQ(7, int_value);
4915 // use Dart_Null to invoke the unnamed constructor. 4838 // use Dart_Null to invoke the unnamed constructor.
4916 result = Dart_InvokeConstructor(obj, Dart_Null(), 0, NULL); 4839 result = Dart_InvokeConstructor(obj, Dart_Null(), 0, NULL);
4917 EXPECT_VALID(result); 4840 EXPECT_VALID(result);
4918 int_value = 0; 4841 int_value = 0;
4919 foo = Dart_GetField(result, NewString("foo")); 4842 foo = Dart_GetField(result, NewString("foo"));
4920 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4843 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4921 EXPECT_EQ(7, int_value); 4844 EXPECT_EQ(7, int_value);
4922 4845
4923 // Invoke a named constructor. 4846 // Invoke a named constructor.
4924 result = Dart_New(type, NewString("named"), 1, args); 4847 result = Dart_New(type, NewString("named"), 1, args);
4925 EXPECT_VALID(result); 4848 EXPECT_VALID(result);
4926 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4849 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
4927 EXPECT(instanceof); 4850 EXPECT(instanceOf);
4928 int_value = 0; 4851 int_value = 0;
4929 foo = Dart_GetField(result, NewString("foo")); 4852 foo = Dart_GetField(result, NewString("foo"));
4930 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4853 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4931 EXPECT_EQ(11, int_value); 4854 EXPECT_EQ(11, int_value);
4932 4855
4933 // Allocate object and invoke a named constructor. 4856 // Allocate object and invoke a named constructor.
4934 obj = Dart_Allocate(type); 4857 obj = Dart_Allocate(type);
4935 EXPECT_VALID(obj); 4858 EXPECT_VALID(obj);
4936 instanceof = false; 4859 instanceOf = false;
4937 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof)); 4860 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
4938 EXPECT(instanceof); 4861 EXPECT(instanceOf);
4939 result = Dart_InvokeConstructor(obj, NewString("named"), 1, args); 4862 result = Dart_InvokeConstructor(obj, NewString("named"), 1, args);
4940 EXPECT_VALID(result); 4863 EXPECT_VALID(result);
4941 int_value = 0; 4864 int_value = 0;
4942 foo = Dart_GetField(result, NewString("foo")); 4865 foo = Dart_GetField(result, NewString("foo"));
4943 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4866 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4944 EXPECT_EQ(11, int_value); 4867 EXPECT_EQ(11, int_value);
4945 4868
4946 // Invoke a hidden named constructor. 4869 // Invoke a hidden named constructor.
4947 result = Dart_New(type, NewString("_hidden"), 1, args); 4870 result = Dart_New(type, NewString("_hidden"), 1, args);
4948 EXPECT_VALID(result); 4871 EXPECT_VALID(result);
4949 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4872 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
4950 EXPECT(instanceof); 4873 EXPECT(instanceOf);
4951 int_value = 0; 4874 int_value = 0;
4952 foo = Dart_GetField(result, NewString("foo")); 4875 foo = Dart_GetField(result, NewString("foo"));
4953 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4876 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4954 EXPECT_EQ(-11, int_value); 4877 EXPECT_EQ(-11, int_value);
4955 4878
4956 // Allocate object and invoke a hidden named constructor. 4879 // Allocate object and invoke a hidden named constructor.
4957 obj = Dart_Allocate(type); 4880 obj = Dart_Allocate(type);
4958 EXPECT_VALID(obj); 4881 EXPECT_VALID(obj);
4959 instanceof = false; 4882 instanceOf = false;
4960 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof)); 4883 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
4961 EXPECT(instanceof); 4884 EXPECT(instanceOf);
4962 result = Dart_InvokeConstructor(obj, NewString("_hidden"), 1, args); 4885 result = Dart_InvokeConstructor(obj, NewString("_hidden"), 1, args);
4963 EXPECT_VALID(result); 4886 EXPECT_VALID(result);
4964 int_value = 0; 4887 int_value = 0;
4965 foo = Dart_GetField(result, NewString("foo")); 4888 foo = Dart_GetField(result, NewString("foo"));
4966 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4889 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4967 EXPECT_EQ(-11, int_value); 4890 EXPECT_EQ(-11, int_value);
4968 4891
4969 // Allocate object and Invoke a constructor which throws an exception. 4892 // Allocate object and Invoke a constructor which throws an exception.
4970 obj = Dart_Allocate(type); 4893 obj = Dart_Allocate(type);
4971 EXPECT_VALID(obj); 4894 EXPECT_VALID(obj);
4972 instanceof = false; 4895 instanceOf = false;
4973 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceof)); 4896 EXPECT_VALID(Dart_ObjectIsType(obj, type, &instanceOf));
4974 EXPECT(instanceof); 4897 EXPECT(instanceOf);
4975 result = Dart_InvokeConstructor(obj, NewString("exception"), 1, args); 4898 result = Dart_InvokeConstructor(obj, NewString("exception"), 1, args);
4976 EXPECT_ERROR(result, "ConstructorDeath"); 4899 EXPECT_ERROR(result, "ConstructorDeath");
4977 4900
4978 // Invoke a factory constructor. 4901 // Invoke a factory constructor.
4979 result = Dart_New(type, NewString("multiply"), 1, args); 4902 result = Dart_New(type, NewString("multiply"), 1, args);
4980 EXPECT_VALID(result); 4903 EXPECT_VALID(result);
4981 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4904 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
4982 EXPECT(instanceof); 4905 EXPECT(instanceOf);
4983 int_value = 0; 4906 int_value = 0;
4984 foo = Dart_GetField(result, NewString("foo")); 4907 foo = Dart_GetField(result, NewString("foo"));
4985 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4908 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
4986 EXPECT_EQ(1100, int_value); 4909 EXPECT_EQ(1100, int_value);
4987 4910
4988 // Invoke a factory constructor which returns null. 4911 // Invoke a factory constructor which returns null.
4989 result = Dart_New(type, NewString("nullo"), 0, NULL); 4912 result = Dart_New(type, NewString("nullo"), 0, NULL);
4990 EXPECT_VALID(result); 4913 EXPECT_VALID(result);
4991 EXPECT(Dart_IsNull(result)); 4914 EXPECT(Dart_IsNull(result));
4992 4915
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5026 EXPECT_ERROR(result, 4949 EXPECT_ERROR(result,
5027 "Dart_New: could not find constructor 'MyClass.missing'."); 4950 "Dart_New: could not find constructor 'MyClass.missing'.");
5028 4951
5029 // Invoke a constructor which throws an exception. 4952 // Invoke a constructor which throws an exception.
5030 result = Dart_New(type, NewString("exception"), 1, args); 4953 result = Dart_New(type, NewString("exception"), 1, args);
5031 EXPECT_ERROR(result, "ConstructorDeath"); 4954 EXPECT_ERROR(result, "ConstructorDeath");
5032 4955
5033 // Invoke two-hop redirecting factory constructor. 4956 // Invoke two-hop redirecting factory constructor.
5034 result = Dart_New(intf, NewString("named"), 1, args); 4957 result = Dart_New(intf, NewString("named"), 1, args);
5035 EXPECT_VALID(result); 4958 EXPECT_VALID(result);
5036 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4959 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
5037 EXPECT(instanceof); 4960 EXPECT(instanceOf);
5038 int_value = 0; 4961 int_value = 0;
5039 foo = Dart_GetField(result, NewString("foo")); 4962 foo = Dart_GetField(result, NewString("foo"));
5040 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4963 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
5041 EXPECT_EQ(11, int_value); 4964 EXPECT_EQ(11, int_value);
5042 4965
5043 // Invoke one-hop redirecting factory constructor. 4966 // Invoke one-hop redirecting factory constructor.
5044 result = Dart_New(intf, NewString("multiply"), 1, args); 4967 result = Dart_New(intf, NewString("multiply"), 1, args);
5045 EXPECT_VALID(result); 4968 EXPECT_VALID(result);
5046 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4969 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
5047 EXPECT(instanceof); 4970 EXPECT(instanceOf);
5048 int_value = 0; 4971 int_value = 0;
5049 foo = Dart_GetField(result, NewString("foo")); 4972 foo = Dart_GetField(result, NewString("foo"));
5050 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value)); 4973 EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
5051 EXPECT_EQ(1100, int_value); 4974 EXPECT_EQ(1100, int_value);
5052 4975
5053 // Invoke a constructor that is missing in the interface. 4976 // Invoke a constructor that is missing in the interface.
5054 result = Dart_New(intf, Dart_Null(), 0, NULL); 4977 result = Dart_New(intf, Dart_Null(), 0, NULL);
5055 EXPECT_ERROR(result, 4978 EXPECT_ERROR(result, "Dart_New: could not find constructor 'MyInterface.'.");
5056 "Dart_New: could not find constructor 'MyInterface.'.");
5057 4979
5058 // Invoke abstract constructor that is present in the interface. 4980 // Invoke abstract constructor that is present in the interface.
5059 result = Dart_New(intf, NewString("notfound"), 1, args); 4981 result = Dart_New(intf, NewString("notfound"), 1, args);
5060 EXPECT_VALID(result); 4982 EXPECT_VALID(result);
5061 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceof)); 4983 EXPECT_VALID(Dart_ObjectIsType(result, type, &instanceOf));
5062 EXPECT(!instanceof); 4984 EXPECT(!instanceOf);
5063 } 4985 }
5064 4986
5065 4987
5066 TEST_CASE(New_Issue2971) { 4988 TEST_CASE(New_Issue2971) {
5067 // Issue 2971: We were unable to use Dart_New to construct an 4989 // Issue 2971: We were unable to use Dart_New to construct an
5068 // instance of List, due to problems implementing interface 4990 // instance of List, due to problems implementing interface
5069 // factories. 4991 // factories.
5070 Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core")); 4992 Dart_Handle core_lib = Dart_LookupLibrary(NewString("dart:core"));
5071 EXPECT_VALID(core_lib); 4993 EXPECT_VALID(core_lib);
5072 Dart_Handle list_type = Dart_GetType(core_lib, NewString("List"), 0, NULL); 4994 Dart_Handle list_type = Dart_GetType(core_lib, NewString("List"), 0, NULL);
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
5230 result = Dart_Invoke(type, name, 1, args); 5152 result = Dart_Invoke(type, name, 1, args);
5231 EXPECT_VALID(result); 5153 EXPECT_VALID(result);
5232 5154
5233 const char* str = NULL; 5155 const char* str = NULL;
5234 result = Dart_StringToCString(result, &str); 5156 result = Dart_StringToCString(result, &str);
5235 EXPECT_STREQ("hidden static !!!", str); 5157 EXPECT_STREQ("hidden static !!!", str);
5236 } 5158 }
5237 5159
5238 5160
5239 TEST_CASE(Invoke_FunnyArgs) { 5161 TEST_CASE(Invoke_FunnyArgs) {
5240 const char* kScriptChars = 5162 const char* kScriptChars = "test(arg) => 'hello $arg';\n";
5241 "test(arg) => 'hello $arg';\n";
5242 5163
5243 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 5164 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
5244 Dart_Handle func_name = NewString("test"); 5165 Dart_Handle func_name = NewString("test");
5245 Dart_Handle args[1]; 5166 Dart_Handle args[1];
5246 const char* str; 5167 const char* str;
5247 5168
5248 // Make sure that valid args yield valid results. 5169 // Make sure that valid args yield valid results.
5249 args[0] = NewString("!!!"); 5170 args[0] = NewString("!!!");
5250 Dart_Handle result = Dart_Invoke(lib, func_name, 1, args); 5171 Dart_Handle result = Dart_Invoke(lib, func_name, 1, args);
5251 EXPECT_VALID(result); 5172 EXPECT_VALID(result);
5252 result = Dart_StringToCString(result, &str); 5173 result = Dart_StringToCString(result, &str);
5253 EXPECT_STREQ("hello !!!", str); 5174 EXPECT_STREQ("hello !!!", str);
5254 5175
5255 // Make sure that null is legal. 5176 // Make sure that null is legal.
5256 args[0] = Dart_Null(); 5177 args[0] = Dart_Null();
5257 result = Dart_Invoke(lib, func_name, 1, args); 5178 result = Dart_Invoke(lib, func_name, 1, args);
5258 EXPECT_VALID(result); 5179 EXPECT_VALID(result);
5259 result = Dart_StringToCString(result, &str); 5180 result = Dart_StringToCString(result, &str);
5260 EXPECT_STREQ("hello null", str); 5181 EXPECT_STREQ("hello null", str);
5261 5182
5262 // Pass an error handle as the target. The error is propagated. 5183 // Pass an error handle as the target. The error is propagated.
5263 result = Dart_Invoke(Api::NewError("myerror"), 5184 result = Dart_Invoke(Api::NewError("myerror"), func_name, 1, args);
5264 func_name, 1, args);
5265 EXPECT(Dart_IsError(result)); 5185 EXPECT(Dart_IsError(result));
5266 EXPECT_STREQ("myerror", Dart_GetError(result)); 5186 EXPECT_STREQ("myerror", Dart_GetError(result));
5267 5187
5268 // Pass an error handle as the function name. The error is propagated. 5188 // Pass an error handle as the function name. The error is propagated.
5269 result = Dart_Invoke(lib, Api::NewError("myerror"), 1, args); 5189 result = Dart_Invoke(lib, Api::NewError("myerror"), 1, args);
5270 EXPECT(Dart_IsError(result)); 5190 EXPECT(Dart_IsError(result));
5271 EXPECT_STREQ("myerror", Dart_GetError(result)); 5191 EXPECT_STREQ("myerror", Dart_GetError(result));
5272 5192
5273 // Pass a non-instance handle as a parameter.. 5193 // Pass a non-instance handle as a parameter..
5274 args[0] = lib; 5194 args[0] = lib;
5275 result = Dart_Invoke(lib, func_name, 1, args); 5195 result = Dart_Invoke(lib, func_name, 1, args);
5276 EXPECT(Dart_IsError(result)); 5196 EXPECT(Dart_IsError(result));
5277 EXPECT_STREQ("Dart_Invoke expects arguments[0] to be an Instance handle.", 5197 EXPECT_STREQ("Dart_Invoke expects arguments[0] to be an Instance handle.",
5278 Dart_GetError(result)); 5198 Dart_GetError(result));
5279 5199
5280 // Pass an error handle as a parameter. The error is propagated. 5200 // Pass an error handle as a parameter. The error is propagated.
5281 args[0] = Api::NewError("myerror"); 5201 args[0] = Api::NewError("myerror");
5282 result = Dart_Invoke(lib, func_name, 1, args); 5202 result = Dart_Invoke(lib, func_name, 1, args);
5283 EXPECT(Dart_IsError(result)); 5203 EXPECT(Dart_IsError(result));
5284 EXPECT_STREQ("myerror", Dart_GetError(result)); 5204 EXPECT_STREQ("myerror", Dart_GetError(result));
5285 } 5205 }
5286 5206
5287 5207
5288 TEST_CASE(Invoke_Null) { 5208 TEST_CASE(Invoke_Null) {
5289 Dart_Handle result = Dart_Invoke(Dart_Null(), 5209 Dart_Handle result = Dart_Invoke(Dart_Null(), NewString("toString"), 0, NULL);
5290 NewString("toString"),
5291 0,
5292 NULL);
5293 EXPECT_VALID(result); 5210 EXPECT_VALID(result);
5294 EXPECT(Dart_IsString(result)); 5211 EXPECT(Dart_IsString(result));
5295 5212
5296 const char* value = ""; 5213 const char* value = "";
5297 EXPECT_VALID(Dart_StringToCString(result, &value)); 5214 EXPECT_VALID(Dart_StringToCString(result, &value));
5298 EXPECT_STREQ("null", value); 5215 EXPECT_STREQ("null", value);
5299 5216
5300 Dart_Handle function_name = NewString("NoNoNo"); 5217 Dart_Handle function_name = NewString("NoNoNo");
5301 result = Dart_Invoke(Dart_Null(), 5218 result = Dart_Invoke(Dart_Null(), function_name, 0, NULL);
5302 function_name,
5303 0,
5304 NULL);
5305 EXPECT(Dart_IsError(result)); 5219 EXPECT(Dart_IsError(result));
5306 EXPECT(Dart_ErrorHasException(result)); 5220 EXPECT(Dart_ErrorHasException(result));
5307 } 5221 }
5308 5222
5309 5223
5310 TEST_CASE(InvokeNoSuchMethod) { 5224 TEST_CASE(InvokeNoSuchMethod) {
5311 const char* kScriptChars = 5225 const char* kScriptChars =
5312 "import 'dart:_internal' as _internal;\n" 5226 "import 'dart:_internal' as _internal;\n"
5313 "class Expect {\n" 5227 "class Expect {\n"
5314 " static equals(a, b) {\n" 5228 " static equals(a, b) {\n"
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
5488 static Dart_NativeFunction native_lookup(Dart_Handle name, 5402 static Dart_NativeFunction native_lookup(Dart_Handle name,
5489 int argument_count, 5403 int argument_count,
5490 bool* auto_setup_scope) { 5404 bool* auto_setup_scope) {
5491 ASSERT(auto_setup_scope != NULL); 5405 ASSERT(auto_setup_scope != NULL);
5492 *auto_setup_scope = true; 5406 *auto_setup_scope = true;
5493 return reinterpret_cast<Dart_NativeFunction>(&ExceptionNative); 5407 return reinterpret_cast<Dart_NativeFunction>(&ExceptionNative);
5494 } 5408 }
5495 5409
5496 5410
5497 TEST_CASE(ThrowException) { 5411 TEST_CASE(ThrowException) {
5498 const char* kScriptChars = 5412 const char* kScriptChars = "int test() native \"ThrowException_native\";";
5499 "int test() native \"ThrowException_native\";";
5500 Dart_Handle result; 5413 Dart_Handle result;
5501 intptr_t size = thread->ZoneSizeInBytes(); 5414 intptr_t size = thread->ZoneSizeInBytes();
5502 Dart_EnterScope(); // Start a Dart API scope for invoking API functions. 5415 Dart_EnterScope(); // Start a Dart API scope for invoking API functions.
5503 5416
5504 // Load up a test script which extends the native wrapper class. 5417 // Load up a test script which extends the native wrapper class.
5505 Dart_Handle lib = TestCase::LoadTestScript( 5418 Dart_Handle lib = TestCase::LoadTestScript(
5506 kScriptChars, 5419 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
5507 reinterpret_cast<Dart_NativeEntryResolver>(native_lookup));
5508 5420
5509 // Throwing an exception here should result in an error. 5421 // Throwing an exception here should result in an error.
5510 result = Dart_ThrowException(NewString("This doesn't work")); 5422 result = Dart_ThrowException(NewString("This doesn't work"));
5511 EXPECT_ERROR(result, "No Dart frames on stack, cannot throw exception"); 5423 EXPECT_ERROR(result, "No Dart frames on stack, cannot throw exception");
5512 EXPECT(!Dart_ErrorHasException(result)); 5424 EXPECT(!Dart_ErrorHasException(result));
5513 5425
5514 // Invoke 'test' and check for an uncaught exception. 5426 // Invoke 'test' and check for an uncaught exception.
5515 result = Dart_Invoke(lib, NewString("test"), 0, NULL); 5427 result = Dart_Invoke(lib, NewString("test"), 0, NULL);
5516 EXPECT_ERROR(result, "Hello from ExceptionNative!"); 5428 EXPECT_ERROR(result, "Hello from ExceptionNative!");
5517 EXPECT(Dart_ErrorHasException(result)); 5429 EXPECT(Dart_ErrorHasException(result));
5518 5430
5519 Dart_ExitScope(); // Exit the Dart API scope. 5431 Dart_ExitScope(); // Exit the Dart API scope.
5520 EXPECT_EQ(size, thread->ZoneSizeInBytes()); 5432 EXPECT_EQ(size, thread->ZoneSizeInBytes());
5521 } 5433 }
5522 5434
5523 5435
5524 static intptr_t kNativeArgumentNativeField1Value = 30; 5436 static intptr_t kNativeArgumentNativeField1Value = 30;
5525 static intptr_t kNativeArgumentNativeField2Value = 40; 5437 static intptr_t kNativeArgumentNativeField2Value = 40;
5526 static intptr_t native_arg_str_peer = 100; 5438 static intptr_t native_arg_str_peer = 100;
5527 static void NativeArgumentCreate(Dart_NativeArguments args) { 5439 static void NativeArgumentCreate(Dart_NativeArguments args) {
5528 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url())); 5440 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
5529 Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL); 5441 Dart_Handle type = Dart_GetType(lib, NewString("MyObject"), 0, NULL);
5530 EXPECT_VALID(type); 5442 EXPECT_VALID(type);
5531 5443
5532 // Allocate without a constructor. 5444 // Allocate without a constructor.
5533 const int num_native_fields = 2; 5445 const int num_native_fields = 2;
5534 const intptr_t native_fields[] = { 5446 const intptr_t native_fields[] = {kNativeArgumentNativeField1Value,
5535 kNativeArgumentNativeField1Value, 5447 kNativeArgumentNativeField2Value};
5536 kNativeArgumentNativeField2Value
5537 };
5538 // Allocate and Setup native fields. 5448 // Allocate and Setup native fields.
5539 Dart_Handle obj = Dart_AllocateWithNativeFields(type, 5449 Dart_Handle obj =
5540 num_native_fields, 5450 Dart_AllocateWithNativeFields(type, num_native_fields, native_fields);
5541 native_fields);
5542 EXPECT_VALID(obj); 5451 EXPECT_VALID(obj);
5543 5452
5544 kNativeArgumentNativeField1Value *= 2; 5453 kNativeArgumentNativeField1Value *= 2;
5545 kNativeArgumentNativeField2Value *= 2; 5454 kNativeArgumentNativeField2Value *= 2;
5546 Dart_SetReturnValue(args, obj); 5455 Dart_SetReturnValue(args, obj);
5547 } 5456 }
5548 5457
5549 5458
5550 static void NativeArgumentAccess(Dart_NativeArguments args) { 5459 static void NativeArgumentAccess(Dart_NativeArguments args) {
5551 const int kNumNativeFields = 2; 5460 const int kNumNativeFields = 2;
5552 5461
5553 // Test different argument types with a valid descriptor set. 5462 // Test different argument types with a valid descriptor set.
5554 { 5463 {
5555 const char* cstr = NULL; 5464 const char* cstr = NULL;
5556 intptr_t native_fields1[kNumNativeFields]; 5465 intptr_t native_fields1[kNumNativeFields];
5557 intptr_t native_fields2[kNumNativeFields]; 5466 intptr_t native_fields2[kNumNativeFields];
5558 const Dart_NativeArgument_Descriptor arg_descriptors[9] = { 5467 const Dart_NativeArgument_Descriptor arg_descriptors[9] = {
5559 { Dart_NativeArgument_kNativeFields, 0 }, 5468 {Dart_NativeArgument_kNativeFields, 0},
5560 { Dart_NativeArgument_kInt32, 1 }, 5469 {Dart_NativeArgument_kInt32, 1},
5561 { Dart_NativeArgument_kUint64, 2 }, 5470 {Dart_NativeArgument_kUint64, 2},
5562 { Dart_NativeArgument_kBool, 3 }, 5471 {Dart_NativeArgument_kBool, 3},
5563 { Dart_NativeArgument_kDouble, 4 }, 5472 {Dart_NativeArgument_kDouble, 4},
5564 { Dart_NativeArgument_kString, 5 }, 5473 {Dart_NativeArgument_kString, 5},
5565 { Dart_NativeArgument_kString, 6 }, 5474 {Dart_NativeArgument_kString, 6},
5566 { Dart_NativeArgument_kNativeFields, 7 }, 5475 {Dart_NativeArgument_kNativeFields, 7},
5567 { Dart_NativeArgument_kInstance, 7 }, 5476 {Dart_NativeArgument_kInstance, 7},
5568 }; 5477 };
5569 Dart_NativeArgument_Value arg_values[9]; 5478 Dart_NativeArgument_Value arg_values[9];
5570 arg_values[0].as_native_fields.num_fields = kNumNativeFields; 5479 arg_values[0].as_native_fields.num_fields = kNumNativeFields;
5571 arg_values[0].as_native_fields.values = native_fields1; 5480 arg_values[0].as_native_fields.values = native_fields1;
5572 arg_values[7].as_native_fields.num_fields = kNumNativeFields; 5481 arg_values[7].as_native_fields.num_fields = kNumNativeFields;
5573 arg_values[7].as_native_fields.values = native_fields2; 5482 arg_values[7].as_native_fields.values = native_fields2;
5574 Dart_Handle result = Dart_GetNativeArguments(args, 5483 Dart_Handle result =
5575 9, 5484 Dart_GetNativeArguments(args, 9, arg_descriptors, arg_values);
5576 arg_descriptors,
5577 arg_values);
5578 EXPECT_VALID(result); 5485 EXPECT_VALID(result);
5579 5486
5580 EXPECT(arg_values[0].as_native_fields.values[0] == 30); 5487 EXPECT(arg_values[0].as_native_fields.values[0] == 30);
5581 EXPECT(arg_values[0].as_native_fields.values[1] == 40); 5488 EXPECT(arg_values[0].as_native_fields.values[1] == 40);
5582 5489
5583 EXPECT(arg_values[1].as_int32 == 77); 5490 EXPECT(arg_values[1].as_int32 == 77);
5584 5491
5585 EXPECT(arg_values[2].as_uint64 == 0xffffffffffffffffLL); 5492 EXPECT(arg_values[2].as_uint64 == 0xffffffffffffffffLL);
5586 5493
5587 EXPECT(arg_values[3].as_bool == true); 5494 EXPECT(arg_values[3].as_bool == true);
5588 5495
5589 EXPECT(arg_values[4].as_double == 3.14); 5496 EXPECT(arg_values[4].as_double == 3.14);
5590 5497
5591 EXPECT_VALID(arg_values[5].as_string.dart_str); 5498 EXPECT_VALID(arg_values[5].as_string.dart_str);
5592 EXPECT(Dart_IsString(arg_values[5].as_string.dart_str)); 5499 EXPECT(Dart_IsString(arg_values[5].as_string.dart_str));
5593 EXPECT_VALID(Dart_StringToCString(arg_values[5].as_string.dart_str, &cstr)); 5500 EXPECT_VALID(Dart_StringToCString(arg_values[5].as_string.dart_str, &cstr));
5594 EXPECT_STREQ("abcdefg", cstr); 5501 EXPECT_STREQ("abcdefg", cstr);
5595 EXPECT(arg_values[5].as_string.peer == NULL); 5502 EXPECT(arg_values[5].as_string.peer == NULL);
5596 5503
5597 EXPECT(arg_values[6].as_string.dart_str == NULL); 5504 EXPECT(arg_values[6].as_string.dart_str == NULL);
5598 EXPECT(arg_values[6].as_string.peer == 5505 EXPECT(arg_values[6].as_string.peer ==
5599 reinterpret_cast<void*>(&native_arg_str_peer)); 5506 reinterpret_cast<void*>(&native_arg_str_peer));
5600 5507
5601 EXPECT(arg_values[7].as_native_fields.values[0] == 60); 5508 EXPECT(arg_values[7].as_native_fields.values[0] == 60);
5602 EXPECT(arg_values[7].as_native_fields.values[1] == 80); 5509 EXPECT(arg_values[7].as_native_fields.values[1] == 80);
5603 5510
5604 EXPECT_VALID(arg_values[8].as_instance); 5511 EXPECT_VALID(arg_values[8].as_instance);
5605 EXPECT(Dart_IsInstance(arg_values[8].as_instance)); 5512 EXPECT(Dart_IsInstance(arg_values[8].as_instance));
5606 int field_count = 0; 5513 int field_count = 0;
5607 EXPECT_VALID(Dart_GetNativeInstanceFieldCount( 5514 EXPECT_VALID(Dart_GetNativeInstanceFieldCount(arg_values[8].as_instance,
5608 arg_values[8].as_instance, &field_count)); 5515 &field_count));
5609 EXPECT(field_count == 2); 5516 EXPECT(field_count == 2);
5610 } 5517 }
5611 5518
5612 // Test with an invalid descriptor set (invalid type). 5519 // Test with an invalid descriptor set (invalid type).
5613 { 5520 {
5614 const Dart_NativeArgument_Descriptor arg_descriptors[8] = { 5521 const Dart_NativeArgument_Descriptor arg_descriptors[8] = {
5615 { Dart_NativeArgument_kInt32, 1 }, 5522 {Dart_NativeArgument_kInt32, 1},
5616 { Dart_NativeArgument_kUint64, 2 }, 5523 {Dart_NativeArgument_kUint64, 2},
5617 { Dart_NativeArgument_kString, 3 }, 5524 {Dart_NativeArgument_kString, 3},
5618 { Dart_NativeArgument_kDouble, 4 }, 5525 {Dart_NativeArgument_kDouble, 4},
5619 { Dart_NativeArgument_kString, 5 }, 5526 {Dart_NativeArgument_kString, 5},
5620 { Dart_NativeArgument_kString, 6 }, 5527 {Dart_NativeArgument_kString, 6},
5621 { Dart_NativeArgument_kNativeFields, 0 }, 5528 {Dart_NativeArgument_kNativeFields, 0},
5622 { Dart_NativeArgument_kNativeFields, 7 }, 5529 {Dart_NativeArgument_kNativeFields, 7},
5623 }; 5530 };
5624 Dart_NativeArgument_Value arg_values[8]; 5531 Dart_NativeArgument_Value arg_values[8];
5625 Dart_Handle result = Dart_GetNativeArguments(args, 5532 Dart_Handle result =
5626 8, 5533 Dart_GetNativeArguments(args, 8, arg_descriptors, arg_values);
5627 arg_descriptors,
5628 arg_values);
5629 EXPECT(Dart_IsError(result)); 5534 EXPECT(Dart_IsError(result));
5630 } 5535 }
5631 5536
5632 // Test with an invalid range error. 5537 // Test with an invalid range error.
5633 { 5538 {
5634 const Dart_NativeArgument_Descriptor arg_descriptors[8] = { 5539 const Dart_NativeArgument_Descriptor arg_descriptors[8] = {
5635 { Dart_NativeArgument_kInt32, 2 }, 5540 {Dart_NativeArgument_kInt32, 2},
5636 { Dart_NativeArgument_kUint64, 2 }, 5541 {Dart_NativeArgument_kUint64, 2},
5637 { Dart_NativeArgument_kBool, 3 }, 5542 {Dart_NativeArgument_kBool, 3},
5638 { Dart_NativeArgument_kDouble, 4 }, 5543 {Dart_NativeArgument_kDouble, 4},
5639 { Dart_NativeArgument_kString, 5 }, 5544 {Dart_NativeArgument_kString, 5},
5640 { Dart_NativeArgument_kString, 6 }, 5545 {Dart_NativeArgument_kString, 6},
5641 { Dart_NativeArgument_kNativeFields, 0 }, 5546 {Dart_NativeArgument_kNativeFields, 0},
5642 { Dart_NativeArgument_kNativeFields, 7 }, 5547 {Dart_NativeArgument_kNativeFields, 7},
5643 }; 5548 };
5644 Dart_NativeArgument_Value arg_values[8]; 5549 Dart_NativeArgument_Value arg_values[8];
5645 Dart_Handle result = Dart_GetNativeArguments(args, 5550 Dart_Handle result =
5646 8, 5551 Dart_GetNativeArguments(args, 8, arg_descriptors, arg_values);
5647 arg_descriptors,
5648 arg_values);
5649 EXPECT(Dart_IsError(result)); 5552 EXPECT(Dart_IsError(result));
5650 } 5553 }
5651 5554
5652 Dart_SetIntegerReturnValue(args, 0); 5555 Dart_SetIntegerReturnValue(args, 0);
5653 } 5556 }
5654 5557
5655 5558
5656 static Dart_NativeFunction native_args_lookup(Dart_Handle name, 5559 static Dart_NativeFunction native_args_lookup(Dart_Handle name,
5657 int argument_count, 5560 int argument_count,
5658 bool* auto_scope_setup) { 5561 bool* auto_scope_setup) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5705 Dart_Handle lib = TestCase::LoadTestScript( 5608 Dart_Handle lib = TestCase::LoadTestScript(
5706 kScriptChars, 5609 kScriptChars,
5707 reinterpret_cast<Dart_NativeEntryResolver>(native_args_lookup)); 5610 reinterpret_cast<Dart_NativeEntryResolver>(native_args_lookup));
5708 5611
5709 intptr_t size; 5612 intptr_t size;
5710 Dart_Handle ascii_str = NewString("string"); 5613 Dart_Handle ascii_str = NewString("string");
5711 EXPECT_VALID(ascii_str); 5614 EXPECT_VALID(ascii_str);
5712 EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size)); 5615 EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size));
5713 uint8_t ext_ascii_str[10]; 5616 uint8_t ext_ascii_str[10];
5714 Dart_Handle extstr = Dart_MakeExternalString( 5617 Dart_Handle extstr = Dart_MakeExternalString(
5715 ascii_str, 5618 ascii_str, ext_ascii_str, size,
5716 ext_ascii_str, 5619 reinterpret_cast<void*>(&native_arg_str_peer), NULL);
5717 size,
5718 reinterpret_cast<void*>(&native_arg_str_peer),
5719 NULL);
5720 5620
5721 Dart_Handle args[1]; 5621 Dart_Handle args[1];
5722 args[0] = extstr; 5622 args[0] = extstr;
5723 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args); 5623 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args);
5724 EXPECT_VALID(result); 5624 EXPECT_VALID(result);
5725 EXPECT(Dart_IsInteger(result)); 5625 EXPECT(Dart_IsInteger(result));
5726 5626
5727 FLAG_support_externalizable_strings = saved_flag; 5627 FLAG_support_externalizable_strings = saved_flag;
5728 } 5628 }
5729 5629
(...skipping 19 matching lines...) Expand all
5749 const char* kScriptChars = 5649 const char* kScriptChars =
5750 "class MyObject {" 5650 "class MyObject {"
5751 " int method1(int i, int j) native 'Name_Does_Not_Matter';" 5651 " int method1(int i, int j) native 'Name_Does_Not_Matter';"
5752 "}" 5652 "}"
5753 "testMain() {" 5653 "testMain() {"
5754 " MyObject obj = new MyObject();" 5654 " MyObject obj = new MyObject();"
5755 " return obj.method1(77, 125);" 5655 " return obj.method1(77, 125);"
5756 "}"; 5656 "}";
5757 5657
5758 Dart_Handle lib = TestCase::LoadTestScript( 5658 Dart_Handle lib = TestCase::LoadTestScript(
5759 kScriptChars, 5659 kScriptChars, reinterpret_cast<Dart_NativeEntryResolver>(gnac_lookup));
5760 reinterpret_cast<Dart_NativeEntryResolver>(gnac_lookup));
5761 5660
5762 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL); 5661 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
5763 EXPECT_VALID(result); 5662 EXPECT_VALID(result);
5764 EXPECT(Dart_IsInteger(result)); 5663 EXPECT(Dart_IsInteger(result));
5765 5664
5766 int64_t value = 0; 5665 int64_t value = 0;
5767 result = Dart_IntegerToInt64(result, &value); 5666 result = Dart_IntegerToInt64(result, &value);
5768 EXPECT_VALID(result); 5667 EXPECT_VALID(result);
5769 EXPECT_EQ(3, value); 5668 EXPECT_EQ(3, value);
5770 } 5669 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
5852 5751
5853 // Fetch OtherClass and check if instanceOfTestObj is instance of it. 5752 // Fetch OtherClass and check if instanceOfTestObj is instance of it.
5854 Dart_Handle otherType = Dart_GetType(lib, NewString("OtherClass"), 0, NULL); 5753 Dart_Handle otherType = Dart_GetType(lib, NewString("OtherClass"), 0, NULL);
5855 EXPECT_VALID(otherType); 5754 EXPECT_VALID(otherType);
5856 5755
5857 result = Dart_ObjectIsType(instanceOfTestObj, otherType, &is_instance); 5756 result = Dart_ObjectIsType(instanceOfTestObj, otherType, &is_instance);
5858 EXPECT_VALID(result); 5757 EXPECT_VALID(result);
5859 EXPECT(!is_instance); 5758 EXPECT(!is_instance);
5860 5759
5861 // Check that primitives are not instances of InstanceOfTest class. 5760 // Check that primitives are not instances of InstanceOfTest class.
5862 result = Dart_ObjectIsType(NewString("a string"), otherType, 5761 result = Dart_ObjectIsType(NewString("a string"), otherType, &is_instance);
5863 &is_instance);
5864 EXPECT_VALID(result); 5762 EXPECT_VALID(result);
5865 EXPECT(!is_instance); 5763 EXPECT(!is_instance);
5866 5764
5867 result = Dart_ObjectIsType(Dart_NewInteger(42), otherType, &is_instance); 5765 result = Dart_ObjectIsType(Dart_NewInteger(42), otherType, &is_instance);
5868 EXPECT_VALID(result); 5766 EXPECT_VALID(result);
5869 EXPECT(!is_instance); 5767 EXPECT(!is_instance);
5870 5768
5871 result = Dart_ObjectIsType(Dart_NewBoolean(true), otherType, &is_instance); 5769 result = Dart_ObjectIsType(Dart_NewBoolean(true), otherType, &is_instance);
5872 EXPECT_VALID(result); 5770 EXPECT_VALID(result);
5873 EXPECT(!is_instance); 5771 EXPECT(!is_instance);
5874 5772
5875 // Check that null is not an instance of InstanceOfTest class. 5773 // Check that null is not an instance of InstanceOfTest class.
5876 Dart_Handle null = Dart_Invoke(otherType, 5774 Dart_Handle null = Dart_Invoke(otherType, NewString("returnNull"), 0, NULL);
5877 NewString("returnNull"),
5878 0,
5879 NULL);
5880 EXPECT_VALID(null); 5775 EXPECT_VALID(null);
5881 5776
5882 result = Dart_ObjectIsType(null, otherType, &is_instance); 5777 result = Dart_ObjectIsType(null, otherType, &is_instance);
5883 EXPECT_VALID(result); 5778 EXPECT_VALID(result);
5884 EXPECT(!is_instance); 5779 EXPECT(!is_instance);
5885 5780
5886 // Check that error is returned if null is passed as a class argument. 5781 // Check that error is returned if null is passed as a class argument.
5887 result = Dart_ObjectIsType(null, null, &is_instance); 5782 result = Dart_ObjectIsType(null, null, &is_instance);
5888 EXPECT(Dart_IsError(result)); 5783 EXPECT(Dart_IsError(result));
5889 } 5784 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
5959 result = Dart_Invoke(result, NewString("main"), 0, NULL); 5854 result = Dart_Invoke(result, NewString("main"), 0, NULL);
5960 EXPECT_VALID(result); 5855 EXPECT_VALID(result);
5961 EXPECT(Dart_IsInteger(result)); 5856 EXPECT(Dart_IsInteger(result));
5962 int64_t value = 0; 5857 int64_t value = 0;
5963 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 5858 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
5964 EXPECT_EQ(12345, value); 5859 EXPECT_EQ(12345, value);
5965 5860
5966 // Further calls to LoadScript are errors. 5861 // Further calls to LoadScript are errors.
5967 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0); 5862 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
5968 EXPECT(Dart_IsError(result)); 5863 EXPECT(Dart_IsError(result));
5969 EXPECT_STREQ("Dart_LoadScript: " 5864 EXPECT_STREQ(
5970 "A script has already been loaded from 'test-lib'.", 5865 "Dart_LoadScript: "
5971 Dart_GetError(result)); 5866 "A script has already been loaded from 'test-lib'.",
5867 Dart_GetError(result));
5972 } 5868 }
5973 5869
5974 5870
5975 TEST_CASE(RootLibrary) { 5871 TEST_CASE(RootLibrary) {
5976 const char* kScriptChars = 5872 const char* kScriptChars =
5977 "library testlib;" 5873 "library testlib;"
5978 "main() {" 5874 "main() {"
5979 " return 12345;" 5875 " return 12345;"
5980 "}"; 5876 "}";
5981 5877
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
6061 default: 5957 default:
6062 EXPECT(false); 5958 EXPECT(false);
6063 return Api::NewError("invalid callback"); 5959 return Api::NewError("invalid callback");
6064 } 5960 }
6065 index += 1; 5961 index += 1;
6066 return Api::Success(); 5962 return Api::Success();
6067 } 5963 }
6068 5964
6069 5965
6070 TEST_CASE(LoadScript_CompileError) { 5966 TEST_CASE(LoadScript_CompileError) {
6071 const char* kScriptChars = 5967 const char* kScriptChars = ")";
6072 ")";
6073 Dart_Handle url = NewString(TestCase::url()); 5968 Dart_Handle url = NewString(TestCase::url());
6074 Dart_Handle source = NewString(kScriptChars); 5969 Dart_Handle source = NewString(kScriptChars);
6075 Dart_Handle result = Dart_SetLibraryTagHandler(import_library_handler); 5970 Dart_Handle result = Dart_SetLibraryTagHandler(import_library_handler);
6076 EXPECT_VALID(result); 5971 EXPECT_VALID(result);
6077 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0); 5972 result = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
6078 EXPECT(Dart_IsError(result)); 5973 EXPECT(Dart_IsError(result));
6079 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'")); 5974 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'"));
6080 } 5975 }
6081 5976
6082 5977
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
6121 6016
6122 url = NewString("noodles.dart"); 6017 url = NewString("noodles.dart");
6123 result = Dart_LookupLibrary(url); 6018 result = Dart_LookupLibrary(url);
6124 EXPECT(Dart_IsError(result)); 6019 EXPECT(Dart_IsError(result));
6125 EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.", 6020 EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.",
6126 Dart_GetError(result)); 6021 Dart_GetError(result));
6127 } 6022 }
6128 6023
6129 6024
6130 TEST_CASE(LibraryName) { 6025 TEST_CASE(LibraryName) {
6131 const char* kLibrary1Chars = 6026 const char* kLibrary1Chars = "library library1_name;";
6132 "library library1_name;";
6133 Dart_Handle url = NewString("library1_url"); 6027 Dart_Handle url = NewString("library1_url");
6134 Dart_Handle source = NewString(kLibrary1Chars); 6028 Dart_Handle source = NewString(kLibrary1Chars);
6135 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6029 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6136 Dart_Handle error = Dart_NewApiError("incoming error"); 6030 Dart_Handle error = Dart_NewApiError("incoming error");
6137 EXPECT_VALID(lib); 6031 EXPECT_VALID(lib);
6138 6032
6139 Dart_Handle result = Dart_LibraryName(Dart_Null()); 6033 Dart_Handle result = Dart_LibraryName(Dart_Null());
6140 EXPECT(Dart_IsError(result)); 6034 EXPECT(Dart_IsError(result));
6141 EXPECT_STREQ("Dart_LibraryName expects argument 'library' to be non-null.", 6035 EXPECT_STREQ("Dart_LibraryName expects argument 'library' to be non-null.",
6142 Dart_GetError(result)); 6036 Dart_GetError(result));
(...skipping 14 matching lines...) Expand all
6157 const char* cstr = NULL; 6051 const char* cstr = NULL;
6158 EXPECT_VALID(Dart_StringToCString(result, &cstr)); 6052 EXPECT_VALID(Dart_StringToCString(result, &cstr));
6159 EXPECT_STREQ("library1_name", cstr); 6053 EXPECT_STREQ("library1_name", cstr);
6160 } 6054 }
6161 6055
6162 6056
6163 #ifndef PRODUCT 6057 #ifndef PRODUCT
6164 6058
6165 6059
6166 TEST_CASE(LibraryId) { 6060 TEST_CASE(LibraryId) {
6167 const char* kLibrary1Chars = 6061 const char* kLibrary1Chars = "library library1_name;";
6168 "library library1_name;";
6169 Dart_Handle url = NewString("library1_url"); 6062 Dart_Handle url = NewString("library1_url");
6170 Dart_Handle source = NewString(kLibrary1Chars); 6063 Dart_Handle source = NewString(kLibrary1Chars);
6171 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6064 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6172 Dart_Handle error = Dart_NewApiError("incoming error"); 6065 Dart_Handle error = Dart_NewApiError("incoming error");
6173 EXPECT_VALID(lib); 6066 EXPECT_VALID(lib);
6174 intptr_t libraryId = -1; 6067 intptr_t libraryId = -1;
6175 6068
6176 Dart_Handle result = Dart_LibraryId(Dart_Null(), &libraryId); 6069 Dart_Handle result = Dart_LibraryId(Dart_Null(), &libraryId);
6177 EXPECT(Dart_IsError(result)); 6070 EXPECT(Dart_IsError(result));
6178 EXPECT_STREQ("Dart_LibraryId expects argument 'library' to be non-null.", 6071 EXPECT_STREQ("Dart_LibraryId expects argument 'library' to be non-null.",
(...skipping 18 matching lines...) Expand all
6197 const char* cstr = NULL; 6090 const char* cstr = NULL;
6198 EXPECT_VALID(Dart_StringToCString(result, &cstr)); 6091 EXPECT_VALID(Dart_StringToCString(result, &cstr));
6199 EXPECT_STREQ("library1_name", cstr); 6092 EXPECT_STREQ("library1_name", cstr);
6200 } 6093 }
6201 6094
6202 6095
6203 #endif // !PRODUCT 6096 #endif // !PRODUCT
6204 6097
6205 6098
6206 TEST_CASE(LibraryUrl) { 6099 TEST_CASE(LibraryUrl) {
6207 const char* kLibrary1Chars = 6100 const char* kLibrary1Chars = "library library1_name;";
6208 "library library1_name;";
6209 Dart_Handle url = NewString("library1_url"); 6101 Dart_Handle url = NewString("library1_url");
6210 Dart_Handle source = NewString(kLibrary1Chars); 6102 Dart_Handle source = NewString(kLibrary1Chars);
6211 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6103 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6212 Dart_Handle error = Dart_NewApiError("incoming error"); 6104 Dart_Handle error = Dart_NewApiError("incoming error");
6213 EXPECT_VALID(lib); 6105 EXPECT_VALID(lib);
6214 6106
6215 Dart_Handle result = Dart_LibraryUrl(Dart_Null()); 6107 Dart_Handle result = Dart_LibraryUrl(Dart_Null());
6216 EXPECT(Dart_IsError(result)); 6108 EXPECT(Dart_IsError(result));
6217 EXPECT_STREQ("Dart_LibraryUrl expects argument 'library' to be non-null.", 6109 EXPECT_STREQ("Dart_LibraryUrl expects argument 'library' to be non-null.",
6218 Dart_GetError(result)); 6110 Dart_GetError(result));
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
6341 // Check list contents. 6233 // Check list contents.
6342 list_string = Dart_ToString(list); 6234 list_string = Dart_ToString(list);
6343 EXPECT_VALID(list_string); 6235 EXPECT_VALID(list_string);
6344 list_cstr = ""; 6236 list_cstr = "";
6345 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr)); 6237 EXPECT_VALID(Dart_StringToCString(list_string, &list_cstr));
6346 EXPECT_STREQ("[A2, B2, C2=, MyClass, _A2, _B2, _C2=]", list_cstr); 6238 EXPECT_STREQ("[A2, B2, C2=, MyClass, _A2, _B2, _C2=]", list_cstr);
6347 } 6239 }
6348 6240
6349 6241
6350 TEST_CASE(LibraryImportLibrary) { 6242 TEST_CASE(LibraryImportLibrary) {
6351 const char* kLibrary1Chars = 6243 const char* kLibrary1Chars = "library library1_name;";
6352 "library library1_name;"; 6244 const char* kLibrary2Chars = "library library2_name;";
6353 const char* kLibrary2Chars =
6354 "library library2_name;";
6355 Dart_Handle error = Dart_NewApiError("incoming error"); 6245 Dart_Handle error = Dart_NewApiError("incoming error");
6356 Dart_Handle result; 6246 Dart_Handle result;
6357 6247
6358 Dart_Handle url = NewString("library1_url"); 6248 Dart_Handle url = NewString("library1_url");
6359 Dart_Handle source = NewString(kLibrary1Chars); 6249 Dart_Handle source = NewString(kLibrary1Chars);
6360 Dart_Handle lib1 = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6250 Dart_Handle lib1 = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6361 EXPECT_VALID(lib1); 6251 EXPECT_VALID(lib1);
6362 6252
6363 url = NewString("library2_url"); 6253 url = NewString("library2_url");
6364 source = NewString(kLibrary2Chars); 6254 source = NewString(kLibrary2Chars);
6365 Dart_Handle lib2 = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6255 Dart_Handle lib2 = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6366 EXPECT_VALID(lib2); 6256 EXPECT_VALID(lib2);
6367 6257
6368 result = Dart_LibraryImportLibrary(Dart_Null(), lib2, Dart_Null()); 6258 result = Dart_LibraryImportLibrary(Dart_Null(), lib2, Dart_Null());
6369 EXPECT(Dart_IsError(result)); 6259 EXPECT(Dart_IsError(result));
6370 EXPECT_STREQ( 6260 EXPECT_STREQ(
6371 "Dart_LibraryImportLibrary expects argument 'library' to be non-null.", 6261 "Dart_LibraryImportLibrary expects argument 'library' to be non-null.",
6372 Dart_GetError(result)); 6262 Dart_GetError(result));
6373 6263
6374 result = Dart_LibraryImportLibrary(Dart_True(), lib2, Dart_Null()); 6264 result = Dart_LibraryImportLibrary(Dart_True(), lib2, Dart_Null());
6375 EXPECT(Dart_IsError(result)); 6265 EXPECT(Dart_IsError(result));
6376 EXPECT_STREQ("Dart_LibraryImportLibrary expects argument 'library' to be of " 6266 EXPECT_STREQ(
6377 "type Library.", 6267 "Dart_LibraryImportLibrary expects argument 'library' to be of "
6378 Dart_GetError(result)); 6268 "type Library.",
6269 Dart_GetError(result));
6379 6270
6380 result = Dart_LibraryImportLibrary(error, lib2, Dart_Null()); 6271 result = Dart_LibraryImportLibrary(error, lib2, Dart_Null());
6381 EXPECT(Dart_IsError(result)); 6272 EXPECT(Dart_IsError(result));
6382 EXPECT_STREQ("incoming error", Dart_GetError(result)); 6273 EXPECT_STREQ("incoming error", Dart_GetError(result));
6383 6274
6384 result = Dart_LibraryImportLibrary(lib1, Dart_Null(), Dart_Null()); 6275 result = Dart_LibraryImportLibrary(lib1, Dart_Null(), Dart_Null());
6385 EXPECT(Dart_IsError(result)); 6276 EXPECT(Dart_IsError(result));
6386 EXPECT_STREQ( 6277 EXPECT_STREQ(
6387 "Dart_LibraryImportLibrary expects argument 'import' to be non-null.", 6278 "Dart_LibraryImportLibrary expects argument 'import' to be non-null.",
6388 Dart_GetError(result)); 6279 Dart_GetError(result));
6389 6280
6390 result = Dart_LibraryImportLibrary(lib1, Dart_True(), Dart_Null()); 6281 result = Dart_LibraryImportLibrary(lib1, Dart_True(), Dart_Null());
6391 EXPECT(Dart_IsError(result)); 6282 EXPECT(Dart_IsError(result));
6392 EXPECT_STREQ("Dart_LibraryImportLibrary expects argument 'import' to be of " 6283 EXPECT_STREQ(
6393 "type Library.", 6284 "Dart_LibraryImportLibrary expects argument 'import' to be of "
6394 Dart_GetError(result)); 6285 "type Library.",
6286 Dart_GetError(result));
6395 6287
6396 result = Dart_LibraryImportLibrary(lib1, error, Dart_Null()); 6288 result = Dart_LibraryImportLibrary(lib1, error, Dart_Null());
6397 EXPECT(Dart_IsError(result)); 6289 EXPECT(Dart_IsError(result));
6398 EXPECT_STREQ("incoming error", Dart_GetError(result)); 6290 EXPECT_STREQ("incoming error", Dart_GetError(result));
6399 6291
6400 result = Dart_LibraryImportLibrary(lib1, lib2, Dart_Null()); 6292 result = Dart_LibraryImportLibrary(lib1, lib2, Dart_Null());
6401 EXPECT_VALID(result); 6293 EXPECT_VALID(result);
6402 } 6294 }
6403 6295
6404 6296
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
6437 method_name = NewString("foobar"); 6329 method_name = NewString("foobar");
6438 result = Dart_Invoke(lib2, method_name, 0, NULL); 6330 result = Dart_Invoke(lib2, method_name, 0, NULL);
6439 EXPECT_VALID(result); 6331 EXPECT_VALID(result);
6440 EXPECT(Dart_IsInteger(result)); 6332 EXPECT(Dart_IsInteger(result));
6441 int64_t value = 0; 6333 int64_t value = 0;
6442 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 6334 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
6443 EXPECT_EQ(42, value); 6335 EXPECT_EQ(42, value);
6444 } 6336 }
6445 6337
6446 6338
6447
6448 TEST_CASE(LoadLibrary) { 6339 TEST_CASE(LoadLibrary) {
6449 const char* kLibrary1Chars = 6340 const char* kLibrary1Chars = "library library1_name;";
6450 "library library1_name;";
6451 Dart_Handle error = Dart_NewApiError("incoming error"); 6341 Dart_Handle error = Dart_NewApiError("incoming error");
6452 Dart_Handle result; 6342 Dart_Handle result;
6453 6343
6454 Dart_Handle url = NewString("library1_url"); 6344 Dart_Handle url = NewString("library1_url");
6455 Dart_Handle source = NewString(kLibrary1Chars); 6345 Dart_Handle source = NewString(kLibrary1Chars);
6456 6346
6457 result = Dart_LoadLibrary(Dart_Null(), Dart_Null(), source, 0, 0); 6347 result = Dart_LoadLibrary(Dart_Null(), Dart_Null(), source, 0, 0);
6458 EXPECT(Dart_IsError(result)); 6348 EXPECT(Dart_IsError(result));
6459 EXPECT_STREQ("Dart_LoadLibrary expects argument 'url' to be non-null.", 6349 EXPECT_STREQ("Dart_LoadLibrary expects argument 'url' to be non-null.",
6460 Dart_GetError(result)); 6350 Dart_GetError(result));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
6513 ")"; 6403 ")";
6514 Dart_Handle url = NewString("library1_url"); 6404 Dart_Handle url = NewString("library1_url");
6515 Dart_Handle source = NewString(kLibrary1Chars); 6405 Dart_Handle source = NewString(kLibrary1Chars);
6516 Dart_Handle result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6406 Dart_Handle result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6517 EXPECT(Dart_IsError(result)); 6407 EXPECT(Dart_IsError(result));
6518 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'")); 6408 EXPECT(strstr(Dart_GetError(result), "unexpected token ')'"));
6519 } 6409 }
6520 6410
6521 6411
6522 TEST_CASE(LoadSource) { 6412 TEST_CASE(LoadSource) {
6523 const char* kLibrary1Chars = 6413 const char* kLibrary1Chars = "library library1_name;";
6524 "library library1_name;"; 6414 const char* kSourceChars = "part of library1_name;\n// Something innocuous";
6525 const char* kSourceChars = 6415 const char* kBadSourceChars = ")";
6526 "part of library1_name;\n// Something innocuous";
6527 const char* kBadSourceChars =
6528 ")";
6529 Dart_Handle error = Dart_NewApiError("incoming error"); 6416 Dart_Handle error = Dart_NewApiError("incoming error");
6530 Dart_Handle result; 6417 Dart_Handle result;
6531 6418
6532 // Load up a library. 6419 // Load up a library.
6533 Dart_Handle url = NewString("library1_url"); 6420 Dart_Handle url = NewString("library1_url");
6534 Dart_Handle source = NewString(kLibrary1Chars); 6421 Dart_Handle source = NewString(kLibrary1Chars);
6535 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6422 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6536 EXPECT_VALID(lib); 6423 EXPECT_VALID(lib);
6537 EXPECT(Dart_IsLibrary(lib)); 6424 EXPECT(Dart_IsLibrary(lib));
6538 6425
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
6656 result = Dart_Invoke(recv, NewString("bar"), 0, NULL); 6543 result = Dart_Invoke(recv, NewString("bar"), 0, NULL);
6657 EXPECT_VALID(result); 6544 EXPECT_VALID(result);
6658 EXPECT(Dart_IsString(result)); 6545 EXPECT(Dart_IsString(result));
6659 result_cstr = ""; 6546 result_cstr = "";
6660 EXPECT_VALID(Dart_StringToCString(result, &result_cstr)); 6547 EXPECT_VALID(Dart_StringToCString(result, &result_cstr));
6661 EXPECT_STREQ("bar", result_cstr); 6548 EXPECT_STREQ("bar", result_cstr);
6662 } 6549 }
6663 6550
6664 6551
6665 TEST_CASE(LoadPatch) { 6552 TEST_CASE(LoadPatch) {
6666 const char* kLibrary1Chars = 6553 const char* kLibrary1Chars = "library library1_name;";
6667 "library library1_name;";
6668 const char* kSourceChars = 6554 const char* kSourceChars =
6669 "part of library1_name;\n" 6555 "part of library1_name;\n"
6670 "external int foo();"; 6556 "external int foo();";
6671 const char* kPatchChars = 6557 const char* kPatchChars = "@patch int foo() => 42;";
6672 "@patch int foo() => 42;";
6673 6558
6674 // Load up a library. 6559 // Load up a library.
6675 Dart_Handle url = NewString("library1_url"); 6560 Dart_Handle url = NewString("library1_url");
6676 Dart_Handle source = NewString(kLibrary1Chars); 6561 Dart_Handle source = NewString(kLibrary1Chars);
6677 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6562 Dart_Handle lib = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6678 EXPECT_VALID(lib); 6563 EXPECT_VALID(lib);
6679 EXPECT(Dart_IsLibrary(lib)); 6564 EXPECT(Dart_IsLibrary(lib));
6680 6565
6681 url = NewString("source_url"); 6566 url = NewString("source_url");
6682 source = NewString(kSourceChars); 6567 source = NewString(kSourceChars);
(...skipping 14 matching lines...) Expand all
6697 EXPECT(Dart_IsInteger(result)); 6582 EXPECT(Dart_IsInteger(result));
6698 int64_t value = 0; 6583 int64_t value = 0;
6699 EXPECT_VALID(Dart_IntegerToInt64(result, &value)); 6584 EXPECT_VALID(Dart_IntegerToInt64(result, &value));
6700 EXPECT_EQ(42, value); 6585 EXPECT_EQ(42, value);
6701 } 6586 }
6702 6587
6703 TEST_CASE(LoadPatchSignatureMismatch) { 6588 TEST_CASE(LoadPatchSignatureMismatch) {
6704 // This tests the sort of APIs with intentional signature mismatches we need 6589 // This tests the sort of APIs with intentional signature mismatches we need
6705 // for typed Dart-JavaScript interop where we emulated JavaScript semantics 6590 // for typed Dart-JavaScript interop where we emulated JavaScript semantics
6706 // for optional arguments. 6591 // for optional arguments.
6707 const char* kLibrary1Chars = 6592 const char* kLibrary1Chars = "library library1_name;";
6708 "library library1_name;";
6709 const char* kSourceChars = 6593 const char* kSourceChars =
6710 "part of library1_name;\n" 6594 "part of library1_name;\n"
6711 "external int foo([int x]);\n" 6595 "external int foo([int x]);\n"
6712 "class Foo<T extends Foo> {\n" 6596 "class Foo<T extends Foo> {\n"
6713 " external static int addDefault10([int x, int y]);\n" 6597 " external static int addDefault10([int x, int y]);\n"
6714 "}"; 6598 "}";
6715 const char* kPatchChars = 6599 const char* kPatchChars =
6716 "const _UNDEFINED = const Object();\n" 6600 "const _UNDEFINED = const Object();\n"
6717 "@patch foo([x=_UNDEFINED]) => identical(x, _UNDEFINED) ? 42 : x;\n" 6601 "@patch foo([x=_UNDEFINED]) => identical(x, _UNDEFINED) ? 42 : x;\n"
6718 "@patch class Foo<T> {\n" 6602 "@patch class Foo<T> {\n"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
6827 int arg_count, 6711 int arg_count,
6828 bool* auto_setup_scope) { 6712 bool* auto_setup_scope) {
6829 ASSERT(auto_setup_scope != NULL); 6713 ASSERT(auto_setup_scope != NULL);
6830 *auto_setup_scope = false; 6714 *auto_setup_scope = false;
6831 return &PatchNativeFunction; 6715 return &PatchNativeFunction;
6832 } 6716 }
6833 6717
6834 6718
6835 TEST_CASE(ParsePatchLibrary) { 6719 TEST_CASE(ParsePatchLibrary) {
6836 const char* kLibraryChars = 6720 const char* kLibraryChars =
6837 "library patched_library;\n" 6721 "library patched_library;\n"
6838 "class A {\n" 6722 "class A {\n"
6839 " final fvalue;\n" 6723 " final fvalue;\n"
6840 " var _f;\n" 6724 " var _f;\n"
6841 " callFunc(x, y) => x(y);\n" 6725 " callFunc(x, y) => x(y);\n"
6842 " external void method(var value);\n" 6726 " external void method(var value);\n"
6843 " get field => _field;\n" 6727 " get field => _field;\n"
6844 "}\n" 6728 "}\n"
6845 "class B {\n" 6729 "class B {\n"
6846 " var val;\n" 6730 " var val;\n"
6847 " external B.named(x);\n" 6731 " external B.named(x);\n"
6848 " external B(v);\n" 6732 " external B(v);\n"
6849 "}\n" 6733 "}\n"
6850 "class C {\n" 6734 "class C {\n"
6851 " external int method();\n" 6735 " external int method();\n"
6852 "}\n" 6736 "}\n"
6853 "\n" 6737 "\n"
6854 "external int unpatched();\n" 6738 "external int unpatched();\n"
6855 "external int topLevel(var value);\n" 6739 "external int topLevel(var value);\n"
6856 "external int topLevel2(var value);\n" 6740 "external int topLevel2(var value);\n"
6857 "external int get topLevelGetter;\n" 6741 "external int get topLevelGetter;\n"
6858 "external void set topLevelSetter(int value);\n"; 6742 "external void set topLevelSetter(int value);\n";
6859 6743
6860 const char* kPatchChars = 6744 const char* kPatchChars =
6861 "@patch class A {\n" 6745 "@patch class A {\n"
6862 " var _g;\n" 6746 " var _g;\n"
6863 " A() : fvalue = 13;\n" 6747 " A() : fvalue = 13;\n"
6864 " get _field => _g;\n" 6748 " get _field => _g;\n"
6865 " @patch void method(var value) {\n" 6749 " @patch void method(var value) {\n"
6866 " int closeYourEyes(var eggs) { return eggs * -1; }\n" 6750 " int closeYourEyes(var eggs) { return eggs * -1; }\n"
6867 " value = callFunc(closeYourEyes, value);\n" 6751 " value = callFunc(closeYourEyes, value);\n"
6868 " _g = value * 5;\n" 6752 " _g = value * 5;\n"
6869 " }\n" 6753 " }\n"
6870 "}\n" 6754 "}\n"
6871 "@patch class B {\n" 6755 "@patch class B {\n"
6872 " B._internal(x) : val = x;\n" 6756 " B._internal(x) : val = x;\n"
6873 " @patch factory B.named(x) { return new B._internal(x); }\n" 6757 " @patch factory B.named(x) { return new B._internal(x); }\n"
6874 " @patch factory B(v) native \"const_B_factory\";\n" 6758 " @patch factory B(v) native \"const_B_factory\";\n"
6875 "}\n" 6759 "}\n"
6876 "var _topLevelValue = -1;\n" 6760 "var _topLevelValue = -1;\n"
6877 "@patch int topLevel(var value) => value * value;\n" 6761 "@patch int topLevel(var value) => value * value;\n"
6878 "@patch int set topLevelSetter(value) { _topLevelValue = value; }\n" 6762 "@patch int set topLevelSetter(value) { _topLevelValue = value; }\n"
6879 "@patch int get topLevelGetter => 2 * _topLevelValue;\n" 6763 "@patch int get topLevelGetter => 2 * _topLevelValue;\n"
6880 // Allow top level methods named patch. 6764 // Allow top level methods named patch.
6881 "patch(x) => x*3;\n" 6765 "patch(x) => x*3;\n"; // NOLINT
6882 ; // NOLINT
6883 6766
6884 const char* kPatchClassOnlyChars = 6767 const char* kPatchClassOnlyChars =
6885 "@patch class C {\n" 6768 "@patch class C {\n"
6886 " @patch int method() {\n" 6769 " @patch int method() {\n"
6887 " return 42;\n" 6770 " return 42;\n"
6888 " }\n" 6771 " }\n"
6889 "}\n" 6772 "}\n"; // NOLINT
6890 ; // NOLINT
6891 6773
6892 const char* kPatchNoClassChars = 6774 const char* kPatchNoClassChars = "@patch topLevel2(x) => x * 2;\n";
6893 "@patch topLevel2(x) => x * 2;\n";
6894 6775
6895 const char* kScriptChars = 6776 const char* kScriptChars =
6896 "import 'theLibrary';\n" 6777 "import 'theLibrary';\n"
6897 "e1() => unpatched();\n" 6778 "e1() => unpatched();\n"
6898 "m1() => topLevel(2);\n" 6779 "m1() => topLevel(2);\n"
6899 "m2() {\n" 6780 "m2() {\n"
6900 " topLevelSetter = 20;\n" 6781 " topLevelSetter = 20;\n"
6901 " return topLevelGetter;\n" 6782 " return topLevelGetter;\n"
6902 "}\n" 6783 "}\n"
6903 "m3() => patch(7);\n" 6784 "m3() => patch(7);\n"
6904 "m4() {\n" 6785 "m4() {\n"
6905 " var a = new A();\n" 6786 " var a = new A();\n"
6906 " a.method(5);\n" 6787 " a.method(5);\n"
6907 " return a.field;\n" 6788 " return a.field;\n"
6908 "}\n" 6789 "}\n"
6909 "m5() => new B(3);\n" 6790 "m5() => new B(3);\n"
6910 "m6() {\n" 6791 "m6() {\n"
6911 " var b = new B.named(8);\n" 6792 " var b = new B.named(8);\n"
6912 " return b.val;\n" 6793 " return b.val;\n"
6913 "}\n" 6794 "}\n"; // NOLINT
6914 ; // NOLINT
6915 6795
6916 bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary); 6796 bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
6917 bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary); 6797 bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
6918 6798
6919 Dart_Handle result = Dart_SetLibraryTagHandler(library_handler); 6799 Dart_Handle result = Dart_SetLibraryTagHandler(library_handler);
6920 EXPECT_VALID(result); 6800 EXPECT_VALID(result);
6921 6801
6922 Dart_Handle url = NewString("theLibrary"); 6802 Dart_Handle url = NewString("theLibrary");
6923 Dart_Handle source = NewString(kLibraryChars); 6803 Dart_Handle source = NewString(kLibraryChars);
6924 result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 6804 result = Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
6925 EXPECT_VALID(result); 6805 EXPECT_VALID(result);
6926 6806
6927 const char* patchNames[] = { "main library patch", 6807 const char* patchNames[] = {"main library patch", "patch class only",
6928 "patch class only", 6808 "patch no class"};
6929 "patch no class" }; 6809 const char* patches[] = {kPatchChars, kPatchClassOnlyChars,
6930 const char* patches[] = { kPatchChars, 6810 kPatchNoClassChars};
6931 kPatchClassOnlyChars,
6932 kPatchNoClassChars };
6933 const String& lib_url = String::Handle(String::New("theLibrary")); 6811 const String& lib_url = String::Handle(String::New("theLibrary"));
6934 6812
6935 const Library& lib = Library::Handle(Library::LookupLibrary(thread, lib_url)); 6813 const Library& lib = Library::Handle(Library::LookupLibrary(thread, lib_url));
6936 6814
6937 for (int i = 0; i < 3; i++) { 6815 for (int i = 0; i < 3; i++) {
6938 const String& patch_url = String::Handle(String::New(patchNames[i])); 6816 const String& patch_url = String::Handle(String::New(patchNames[i]));
6939 const String& patch_source = String::Handle(String::New(patches[i])); 6817 const String& patch_source = String::Handle(String::New(patches[i]));
6940 const Script& patch_script = Script::Handle(Script::New( 6818 const Script& patch_script = Script::Handle(
6941 patch_url, patch_source, RawScript::kPatchTag)); 6819 Script::New(patch_url, patch_source, RawScript::kPatchTag));
6942 6820
6943 const Error& err = Error::Handle(lib.Patch(patch_script)); 6821 const Error& err = Error::Handle(lib.Patch(patch_script));
6944 if (!err.IsNull()) { 6822 if (!err.IsNull()) {
6945 OS::Print("Patching error: %s\n", err.ToErrorCString()); 6823 OS::Print("Patching error: %s\n", err.ToErrorCString());
6946 EXPECT(false); 6824 EXPECT(false);
6947 } 6825 }
6948 } 6826 }
6949 result = Dart_SetNativeResolver(result, &PatchNativeResolver, NULL); 6827 result = Dart_SetNativeResolver(result, &PatchNativeResolver, NULL);
6950 EXPECT_VALID(result); 6828 EXPECT_VALID(result);
6951 6829
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
7065 EXPECT_VALID(type); 6943 EXPECT_VALID(type);
7066 6944
7067 result = Dart_SetNativeResolver(Dart_Null(), &MyNativeResolver1, NULL); 6945 result = Dart_SetNativeResolver(Dart_Null(), &MyNativeResolver1, NULL);
7068 EXPECT(Dart_IsError(result)); 6946 EXPECT(Dart_IsError(result));
7069 EXPECT_STREQ( 6947 EXPECT_STREQ(
7070 "Dart_SetNativeResolver expects argument 'library' to be non-null.", 6948 "Dart_SetNativeResolver expects argument 'library' to be non-null.",
7071 Dart_GetError(result)); 6949 Dart_GetError(result));
7072 6950
7073 result = Dart_SetNativeResolver(Dart_True(), &MyNativeResolver1, NULL); 6951 result = Dart_SetNativeResolver(Dart_True(), &MyNativeResolver1, NULL);
7074 EXPECT(Dart_IsError(result)); 6952 EXPECT(Dart_IsError(result));
7075 EXPECT_STREQ("Dart_SetNativeResolver expects argument 'library' to be of " 6953 EXPECT_STREQ(
7076 "type Library.", 6954 "Dart_SetNativeResolver expects argument 'library' to be of "
7077 Dart_GetError(result)); 6955 "type Library.",
6956 Dart_GetError(result));
7078 6957
7079 result = Dart_SetNativeResolver(error, &MyNativeResolver1, NULL); 6958 result = Dart_SetNativeResolver(error, &MyNativeResolver1, NULL);
7080 EXPECT(Dart_IsError(result)); 6959 EXPECT(Dart_IsError(result));
7081 EXPECT_STREQ("incoming error", Dart_GetError(result)); 6960 EXPECT_STREQ("incoming error", Dart_GetError(result));
7082 6961
7083 result = Dart_SetNativeResolver(lib, &MyNativeResolver1, NULL); 6962 result = Dart_SetNativeResolver(lib, &MyNativeResolver1, NULL);
7084 EXPECT_VALID(result); 6963 EXPECT_VALID(result);
7085 6964
7086 // Call a function and make sure native resolution works. 6965 // Call a function and make sure native resolution works.
7087 result = Dart_Invoke(type, NewString("foo"), 0, NULL); 6966 result = Dart_Invoke(type, NewString("foo"), 0, NULL);
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
7260 url = NewString("lib.dart"); 7139 url = NewString("lib.dart");
7261 source = NewString(kLibraryChars); 7140 source = NewString(kLibraryChars);
7262 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0); 7141 Dart_LoadLibrary(url, Dart_Null(), source, 0, 0);
7263 Dart_FinalizeLoading(false); 7142 Dart_FinalizeLoading(false);
7264 7143
7265 result = Dart_Invoke(result, NewString("main"), 0, NULL); 7144 result = Dart_Invoke(result, NewString("main"), 0, NULL);
7266 EXPECT_VALID(result); 7145 EXPECT_VALID(result);
7267 } 7146 }
7268 7147
7269 7148
7270 void NewNativePort_send123(Dart_Port dest_port_id, 7149 void NewNativePort_send123(Dart_Port dest_port_id, Dart_CObject* message) {
7271 Dart_CObject *message) {
7272 // Gets a send port message. 7150 // Gets a send port message.
7273 EXPECT_NOTNULL(message); 7151 EXPECT_NOTNULL(message);
7274 EXPECT_EQ(Dart_CObject_kArray, message->type); 7152 EXPECT_EQ(Dart_CObject_kArray, message->type);
7275 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 7153 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7276 7154
7277 // Post integer value. 7155 // Post integer value.
7278 Dart_CObject* response = 7156 Dart_CObject* response =
7279 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject))); 7157 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
7280 response->type = Dart_CObject_kInt32; 7158 response->type = Dart_CObject_kInt32;
7281 response->value.as_int32 = 123; 7159 response->value.as_int32 = 123;
7282 Dart_PostCObject( 7160 Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id,
7283 message->value.as_array.values[0]->value.as_send_port.id, response); 7161 response);
7284 } 7162 }
7285 7163
7286 7164
7287 void NewNativePort_send321(Dart_Port dest_port_id, 7165 void NewNativePort_send321(Dart_Port dest_port_id, Dart_CObject* message) {
7288 Dart_CObject* message) {
7289 // Gets a null message. 7166 // Gets a null message.
7290 EXPECT_NOTNULL(message); 7167 EXPECT_NOTNULL(message);
7291 EXPECT_EQ(Dart_CObject_kArray, message->type); 7168 EXPECT_EQ(Dart_CObject_kArray, message->type);
7292 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 7169 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7293 7170
7294 // Post integer value. 7171 // Post integer value.
7295 Dart_CObject* response = 7172 Dart_CObject* response =
7296 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject))); 7173 reinterpret_cast<Dart_CObject*>(Dart_ScopeAllocate(sizeof(Dart_CObject)));
7297 response->type = Dart_CObject_kInt32; 7174 response->type = Dart_CObject_kInt32;
7298 response->value.as_int32 = 321; 7175 response->value.as_int32 = 321;
7299 Dart_PostCObject( 7176 Dart_PostCObject(message->value.as_array.values[0]->value.as_send_port.id,
7300 message->value.as_array.values[0]->value.as_send_port.id, response); 7177 response);
7301 } 7178 }
7302 7179
7303 7180
7304 TEST_CASE(IllegalNewSendPort) { 7181 TEST_CASE(IllegalNewSendPort) {
7305 Dart_Handle error = Dart_NewSendPort(ILLEGAL_PORT); 7182 Dart_Handle error = Dart_NewSendPort(ILLEGAL_PORT);
7306 EXPECT(Dart_IsError(error)); 7183 EXPECT(Dart_IsError(error));
7307 EXPECT(Dart_IsApiError(error)); 7184 EXPECT(Dart_IsApiError(error));
7308 } 7185 }
7309 7186
7310 7187
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
7344 Dart_NewNativePort("Port321", NewNativePort_send321, true); 7221 Dart_NewNativePort("Port321", NewNativePort_send321, true);
7345 7222
7346 Dart_Handle send_port1 = Dart_NewSendPort(port_id1); 7223 Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
7347 EXPECT_VALID(send_port1); 7224 EXPECT_VALID(send_port1);
7348 Dart_Handle send_port2 = Dart_NewSendPort(port_id2); 7225 Dart_Handle send_port2 = Dart_NewSendPort(port_id2);
7349 EXPECT_VALID(send_port2); 7226 EXPECT_VALID(send_port2);
7350 7227
7351 // Test first port. 7228 // Test first port.
7352 Dart_Handle dart_args[1]; 7229 Dart_Handle dart_args[1];
7353 dart_args[0] = send_port1; 7230 dart_args[0] = send_port1;
7354 Dart_Handle result = 7231 Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7355 Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7356 EXPECT_VALID(result); 7232 EXPECT_VALID(result);
7357 result = Dart_RunLoop(); 7233 result = Dart_RunLoop();
7358 EXPECT(Dart_IsError(result)); 7234 EXPECT(Dart_IsError(result));
7359 EXPECT(Dart_ErrorHasException(result)); 7235 EXPECT(Dart_ErrorHasException(result));
7360 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result)); 7236 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
7361 7237
7362 // result second port. 7238 // result second port.
7363 dart_args[0] = send_port2; 7239 dart_args[0] = send_port2;
7364 result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args); 7240 result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7365 EXPECT_VALID(result); 7241 EXPECT_VALID(result);
7366 result = Dart_RunLoop(); 7242 result = Dart_RunLoop();
7367 EXPECT(Dart_IsError(result)); 7243 EXPECT(Dart_IsError(result));
7368 EXPECT(Dart_ErrorHasException(result)); 7244 EXPECT(Dart_ErrorHasException(result));
7369 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result)); 7245 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result));
7370 7246
7371 Dart_ExitScope(); 7247 Dart_ExitScope();
7372 7248
7373 // Delete the native ports. 7249 // Delete the native ports.
7374 EXPECT(Dart_CloseNativePort(port_id1)); 7250 EXPECT(Dart_CloseNativePort(port_id1));
7375 EXPECT(Dart_CloseNativePort(port_id2)); 7251 EXPECT(Dart_CloseNativePort(port_id2));
7376 } 7252 }
7377 7253
7378 7254
7379 void NewNativePort_sendInteger123(Dart_Port dest_port_id, 7255 void NewNativePort_sendInteger123(Dart_Port dest_port_id,
7380 Dart_CObject *message) { 7256 Dart_CObject* message) {
7381 // Gets a send port message. 7257 // Gets a send port message.
7382 EXPECT_NOTNULL(message); 7258 EXPECT_NOTNULL(message);
7383 EXPECT_EQ(Dart_CObject_kArray, message->type); 7259 EXPECT_EQ(Dart_CObject_kArray, message->type);
7384 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 7260 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7385 7261
7386 // Post integer value. 7262 // Post integer value.
7387 Dart_PostInteger( 7263 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7388 message->value.as_array.values[0]->value.as_send_port.id, 123); 7264 123);
7389 } 7265 }
7390 7266
7391 7267
7392 void NewNativePort_sendInteger321(Dart_Port dest_port_id, 7268 void NewNativePort_sendInteger321(Dart_Port dest_port_id,
7393 Dart_CObject* message) { 7269 Dart_CObject* message) {
7394 // Gets a null message. 7270 // Gets a null message.
7395 EXPECT_NOTNULL(message); 7271 EXPECT_NOTNULL(message);
7396 EXPECT_EQ(Dart_CObject_kArray, message->type); 7272 EXPECT_EQ(Dart_CObject_kArray, message->type);
7397 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type); 7273 EXPECT_EQ(Dart_CObject_kSendPort, message->value.as_array.values[0]->type);
7398 7274
7399 // Post integer value. 7275 // Post integer value.
7400 Dart_PostInteger( 7276 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7401 message->value.as_array.values[0]->value.as_send_port.id, 321); 7277 321);
7402 } 7278 }
7403 7279
7404 7280
7405 TEST_CASE(NativePortPostInteger) { 7281 TEST_CASE(NativePortPostInteger) {
7406 const char* kScriptChars = 7282 const char* kScriptChars =
7407 "import 'dart:isolate';\n" 7283 "import 'dart:isolate';\n"
7408 "void callPort(SendPort port) {\n" 7284 "void callPort(SendPort port) {\n"
7409 " var receivePort = new RawReceivePort();\n" 7285 " var receivePort = new RawReceivePort();\n"
7410 " var replyPort = receivePort.sendPort;\n" 7286 " var replyPort = receivePort.sendPort;\n"
7411 " port.send([replyPort]);\n" 7287 " port.send([replyPort]);\n"
(...skipping 11 matching lines...) Expand all
7423 Dart_NewNativePort("Port321", NewNativePort_sendInteger321, true); 7299 Dart_NewNativePort("Port321", NewNativePort_sendInteger321, true);
7424 7300
7425 Dart_Handle send_port1 = Dart_NewSendPort(port_id1); 7301 Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
7426 EXPECT_VALID(send_port1); 7302 EXPECT_VALID(send_port1);
7427 Dart_Handle send_port2 = Dart_NewSendPort(port_id2); 7303 Dart_Handle send_port2 = Dart_NewSendPort(port_id2);
7428 EXPECT_VALID(send_port2); 7304 EXPECT_VALID(send_port2);
7429 7305
7430 // Test first port. 7306 // Test first port.
7431 Dart_Handle dart_args[1]; 7307 Dart_Handle dart_args[1];
7432 dart_args[0] = send_port1; 7308 dart_args[0] = send_port1;
7433 Dart_Handle result = 7309 Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7434 Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7435 EXPECT_VALID(result); 7310 EXPECT_VALID(result);
7436 result = Dart_RunLoop(); 7311 result = Dart_RunLoop();
7437 EXPECT(Dart_IsError(result)); 7312 EXPECT(Dart_IsError(result));
7438 EXPECT(Dart_ErrorHasException(result)); 7313 EXPECT(Dart_ErrorHasException(result));
7439 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result)); 7314 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
7440 7315
7441 // result second port. 7316 // result second port.
7442 dart_args[0] = send_port2; 7317 dart_args[0] = send_port2;
7443 result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args); 7318 result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7444 EXPECT_VALID(result); 7319 EXPECT_VALID(result);
7445 result = Dart_RunLoop(); 7320 result = Dart_RunLoop();
7446 EXPECT(Dart_IsError(result)); 7321 EXPECT(Dart_IsError(result));
7447 EXPECT(Dart_ErrorHasException(result)); 7322 EXPECT(Dart_ErrorHasException(result));
7448 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result)); 7323 EXPECT_SUBSTRING("Exception: 321\n", Dart_GetError(result));
7449 7324
7450 Dart_ExitScope(); 7325 Dart_ExitScope();
7451 7326
7452 // Delete the native ports. 7327 // Delete the native ports.
7453 EXPECT(Dart_CloseNativePort(port_id1)); 7328 EXPECT(Dart_CloseNativePort(port_id1));
7454 EXPECT(Dart_CloseNativePort(port_id2)); 7329 EXPECT(Dart_CloseNativePort(port_id2));
7455 } 7330 }
7456 7331
7457 7332
7458 void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id, 7333 void NewNativePort_nativeReceiveNull(Dart_Port dest_port_id,
7459 Dart_CObject *message) { 7334 Dart_CObject* message) {
7460 EXPECT_NOTNULL(message); 7335 EXPECT_NOTNULL(message);
7461 7336
7462 if ((message->type == Dart_CObject_kArray) && 7337 if ((message->type == Dart_CObject_kArray) &&
7463 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) { 7338 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
7464 // Post integer value. 7339 // Post integer value.
7465 Dart_PostInteger( 7340 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7466 message->value.as_array.values[0]->value.as_send_port.id, 123); 7341 123);
7467 } else { 7342 } else {
7468 EXPECT_EQ(message->type, Dart_CObject_kNull); 7343 EXPECT_EQ(message->type, Dart_CObject_kNull);
7469 } 7344 }
7470 } 7345 }
7471 7346
7472 7347
7473 TEST_CASE(NativePortReceiveNull) { 7348 TEST_CASE(NativePortReceiveNull) {
7474 const char* kScriptChars = 7349 const char* kScriptChars =
7475 "import 'dart:isolate';\n" 7350 "import 'dart:isolate';\n"
7476 "void callPort(SendPort port) {\n" 7351 "void callPort(SendPort port) {\n"
(...skipping 10 matching lines...) Expand all
7487 Dart_EnterScope(); 7362 Dart_EnterScope();
7488 7363
7489 Dart_Port port_id1 = 7364 Dart_Port port_id1 =
7490 Dart_NewNativePort("PortNull", NewNativePort_nativeReceiveNull, true); 7365 Dart_NewNativePort("PortNull", NewNativePort_nativeReceiveNull, true);
7491 Dart_Handle send_port1 = Dart_NewSendPort(port_id1); 7366 Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
7492 EXPECT_VALID(send_port1); 7367 EXPECT_VALID(send_port1);
7493 7368
7494 // Test first port. 7369 // Test first port.
7495 Dart_Handle dart_args[1]; 7370 Dart_Handle dart_args[1];
7496 dart_args[0] = send_port1; 7371 dart_args[0] = send_port1;
7497 Dart_Handle result = 7372 Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7498 Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7499 EXPECT_VALID(result); 7373 EXPECT_VALID(result);
7500 result = Dart_RunLoop(); 7374 result = Dart_RunLoop();
7501 EXPECT(Dart_IsError(result)); 7375 EXPECT(Dart_IsError(result));
7502 EXPECT(Dart_ErrorHasException(result)); 7376 EXPECT(Dart_ErrorHasException(result));
7503 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result)); 7377 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
7504 7378
7505 Dart_ExitScope(); 7379 Dart_ExitScope();
7506 7380
7507 // Delete the native ports. 7381 // Delete the native ports.
7508 EXPECT(Dart_CloseNativePort(port_id1)); 7382 EXPECT(Dart_CloseNativePort(port_id1));
7509 } 7383 }
7510 7384
7511 7385
7512 void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id, 7386 void NewNativePort_nativeReceiveInteger(Dart_Port dest_port_id,
7513 Dart_CObject *message) { 7387 Dart_CObject* message) {
7514 EXPECT_NOTNULL(message); 7388 EXPECT_NOTNULL(message);
7515 7389
7516 if ((message->type == Dart_CObject_kArray) && 7390 if ((message->type == Dart_CObject_kArray) &&
7517 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) { 7391 (message->value.as_array.values[0]->type == Dart_CObject_kSendPort)) {
7518 // Post integer value. 7392 // Post integer value.
7519 Dart_PostInteger( 7393 Dart_PostInteger(message->value.as_array.values[0]->value.as_send_port.id,
7520 message->value.as_array.values[0]->value.as_send_port.id, 123); 7394 123);
7521 } else { 7395 } else {
7522 EXPECT_EQ(message->type, Dart_CObject_kInt32); 7396 EXPECT_EQ(message->type, Dart_CObject_kInt32);
7523 EXPECT_EQ(message->value.as_int32, 321); 7397 EXPECT_EQ(message->value.as_int32, 321);
7524 } 7398 }
7525 } 7399 }
7526 7400
7527 7401
7528 TEST_CASE(NativePortReceiveInteger) { 7402 TEST_CASE(NativePortReceiveInteger) {
7529 const char* kScriptChars = 7403 const char* kScriptChars =
7530 "import 'dart:isolate';\n" 7404 "import 'dart:isolate';\n"
(...skipping 11 matching lines...) Expand all
7542 Dart_EnterScope(); 7416 Dart_EnterScope();
7543 7417
7544 Dart_Port port_id1 = 7418 Dart_Port port_id1 =
7545 Dart_NewNativePort("PortNull", NewNativePort_nativeReceiveInteger, true); 7419 Dart_NewNativePort("PortNull", NewNativePort_nativeReceiveInteger, true);
7546 Dart_Handle send_port1 = Dart_NewSendPort(port_id1); 7420 Dart_Handle send_port1 = Dart_NewSendPort(port_id1);
7547 EXPECT_VALID(send_port1); 7421 EXPECT_VALID(send_port1);
7548 7422
7549 // Test first port. 7423 // Test first port.
7550 Dart_Handle dart_args[1]; 7424 Dart_Handle dart_args[1];
7551 dart_args[0] = send_port1; 7425 dart_args[0] = send_port1;
7552 Dart_Handle result = 7426 Dart_Handle result = Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7553 Dart_Invoke(lib, NewString("callPort"), 1, dart_args);
7554 EXPECT_VALID(result); 7427 EXPECT_VALID(result);
7555 result = Dart_RunLoop(); 7428 result = Dart_RunLoop();
7556 EXPECT(Dart_IsError(result)); 7429 EXPECT(Dart_IsError(result));
7557 EXPECT(Dart_ErrorHasException(result)); 7430 EXPECT(Dart_ErrorHasException(result));
7558 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result)); 7431 EXPECT_SUBSTRING("Exception: 123\n", Dart_GetError(result));
7559 7432
7560 Dart_ExitScope(); 7433 Dart_ExitScope();
7561 7434
7562 // Delete the native ports. 7435 // Delete the native ports.
7563 EXPECT(Dart_CloseNativePort(port_id1)); 7436 EXPECT(Dart_CloseNativePort(port_id1));
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
7607 bool retval = Dart_IsolateMakeRunnable(isolate); 7480 bool retval = Dart_IsolateMakeRunnable(isolate);
7608 EXPECT(retval); 7481 EXPECT(retval);
7609 return isolate; 7482 return isolate;
7610 } 7483 }
7611 7484
7612 7485
7613 // Common code for RunLoop_Success/RunLoop_Failure. 7486 // Common code for RunLoop_Success/RunLoop_Failure.
7614 static void RunLoopTest(bool throw_exception) { 7487 static void RunLoopTest(bool throw_exception) {
7615 Dart_IsolateCreateCallback saved = Isolate::CreateCallback(); 7488 Dart_IsolateCreateCallback saved = Isolate::CreateCallback();
7616 Isolate::SetCreateCallback(RunLoopTestCallback); 7489 Isolate::SetCreateCallback(RunLoopTestCallback);
7617 Dart_Isolate isolate = RunLoopTestCallback( 7490 Dart_Isolate isolate =
7618 NULL, NULL, NULL, NULL, NULL, NULL, NULL); 7491 RunLoopTestCallback(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
7619 7492
7620 Dart_EnterIsolate(isolate); 7493 Dart_EnterIsolate(isolate);
7621 Dart_EnterScope(); 7494 Dart_EnterScope();
7622 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url())); 7495 Dart_Handle lib = Dart_LookupLibrary(NewString(TestCase::url()));
7623 EXPECT_VALID(lib); 7496 EXPECT_VALID(lib);
7624 7497
7625 Dart_Handle result; 7498 Dart_Handle result;
7626 Dart_Handle args[1]; 7499 Dart_Handle args[1];
7627 args[0] = (throw_exception ? Dart_True() : Dart_False()); 7500 args[0] = (throw_exception ? Dart_True() : Dart_False());
7628 result = Dart_Invoke(lib, NewString("main"), 1, args); 7501 result = Dart_Invoke(lib, NewString("main"), 1, args);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
7664 MonitorLocker ml(sync); 7537 MonitorLocker ml(sync);
7665 main_entered = true; 7538 main_entered = true;
7666 ml.Notify(); 7539 ml.Notify();
7667 } 7540 }
7668 Dart_SetReturnValue(args, Dart_Null()); 7541 Dart_SetReturnValue(args, Dart_Null());
7669 Dart_ExitScope(); 7542 Dart_ExitScope();
7670 } 7543 }
7671 7544
7672 7545
7673 static Dart_NativeFunction IsolateInterruptTestNativeLookup( 7546 static Dart_NativeFunction IsolateInterruptTestNativeLookup(
7674 Dart_Handle name, int argument_count, bool* auto_setup_scope) { 7547 Dart_Handle name,
7548 int argument_count,
7549 bool* auto_setup_scope) {
7675 ASSERT(auto_setup_scope != NULL); 7550 ASSERT(auto_setup_scope != NULL);
7676 *auto_setup_scope = false; 7551 *auto_setup_scope = false;
7677 return reinterpret_cast<Dart_NativeFunction>(&MarkMainEntered); 7552 return reinterpret_cast<Dart_NativeFunction>(&MarkMainEntered);
7678 } 7553 }
7679 7554
7680 7555
7681 void BusyLoop_start(uword unused) { 7556 void BusyLoop_start(uword unused) {
7682 const char* kScriptChars = 7557 const char* kScriptChars =
7683 "class Native {\n" 7558 "class Native {\n"
7684 " static void markMainEntered() native 'MarkMainEntered';\n" 7559 " static void markMainEntered() native 'MarkMainEntered';\n"
7685 "}\n" 7560 "}\n"
7686 "\n" 7561 "\n"
7687 "void main() {\n" 7562 "void main() {\n"
7688 " Native.markMainEntered();\n" 7563 " Native.markMainEntered();\n"
7689 " while (true) {\n" // Infinite empty loop. 7564 " while (true) {\n" // Infinite empty loop.
7690 " }\n" 7565 " }\n"
7691 "}\n"; 7566 "}\n";
7692 7567
7693 // Tell the other thread that shared_isolate is created. 7568 // Tell the other thread that shared_isolate is created.
7694 Dart_Handle lib; 7569 Dart_Handle lib;
7695 { 7570 {
7696 MonitorLocker ml(sync); 7571 MonitorLocker ml(sync);
7697 char* error = NULL; 7572 char* error = NULL;
7698 shared_isolate = Dart_CreateIsolate(NULL, NULL, 7573 shared_isolate = Dart_CreateIsolate(
7699 bin::isolate_snapshot_buffer, 7574 NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, &error);
7700 NULL,
7701 NULL, &error);
7702 EXPECT(shared_isolate != NULL); 7575 EXPECT(shared_isolate != NULL);
7703 Dart_EnterScope(); 7576 Dart_EnterScope();
7704 Dart_Handle url = NewString(TestCase::url()); 7577 Dart_Handle url = NewString(TestCase::url());
7705 Dart_Handle source = NewString(kScriptChars); 7578 Dart_Handle source = NewString(kScriptChars);
7706 Dart_Handle result = Dart_SetLibraryTagHandler(TestCase::library_handler); 7579 Dart_Handle result = Dart_SetLibraryTagHandler(TestCase::library_handler);
7707 EXPECT_VALID(result); 7580 EXPECT_VALID(result);
7708 lib = Dart_LoadScript(url, Dart_Null(), source, 0, 0); 7581 lib = Dart_LoadScript(url, Dart_Null(), source, 0, 0);
7709 EXPECT_VALID(lib); 7582 EXPECT_VALID(lib);
7710 result = Dart_FinalizeLoading(false); 7583 result = Dart_FinalizeLoading(false);
7711 EXPECT_VALID(result); 7584 EXPECT_VALID(result);
7712 result = 7585 result =
7713 Dart_SetNativeResolver(lib, &IsolateInterruptTestNativeLookup, NULL); 7586 Dart_SetNativeResolver(lib, &IsolateInterruptTestNativeLookup, NULL);
7714 DART_CHECK_VALID(result); 7587 DART_CHECK_VALID(result);
7715 7588
7716 ml.Notify(); 7589 ml.Notify();
7717 } 7590 }
7718 7591
7719 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 7592 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
7720 EXPECT(Dart_IsError(result)); 7593 EXPECT(Dart_IsError(result));
7721 EXPECT(Dart_ErrorHasException(result)); 7594 EXPECT(Dart_ErrorHasException(result));
7722 EXPECT_SUBSTRING("Unhandled exception:\nfoo\n", 7595 EXPECT_SUBSTRING("Unhandled exception:\nfoo\n", Dart_GetError(result));
7723 Dart_GetError(result));
7724 7596
7725 Dart_ExitScope(); 7597 Dart_ExitScope();
7726 Dart_ShutdownIsolate(); 7598 Dart_ShutdownIsolate();
7727 7599
7728 // Tell the other thread that we are done. 7600 // Tell the other thread that we are done.
7729 { 7601 {
7730 MonitorLocker ml(sync); 7602 MonitorLocker ml(sync);
7731 shared_isolate = NULL; 7603 shared_isolate = NULL;
7732 ml.Notify(); 7604 ml.Notify();
7733 } 7605 }
7734 } 7606 }
7735 7607
7736 7608
7737 static void* saved_callback_data; 7609 static void* saved_callback_data;
7738 static void IsolateShutdownTestCallback(void* callback_data) { 7610 static void IsolateShutdownTestCallback(void* callback_data) {
7739 saved_callback_data = callback_data; 7611 saved_callback_data = callback_data;
7740 } 7612 }
7741 7613
7742 UNIT_TEST_CASE(IsolateShutdown) { 7614 UNIT_TEST_CASE(IsolateShutdown) {
7743 Dart_IsolateShutdownCallback saved = Isolate::ShutdownCallback(); 7615 Dart_IsolateShutdownCallback saved = Isolate::ShutdownCallback();
7744 Isolate::SetShutdownCallback(IsolateShutdownTestCallback); 7616 Isolate::SetShutdownCallback(IsolateShutdownTestCallback);
7745 7617
7746 saved_callback_data = NULL; 7618 saved_callback_data = NULL;
7747 7619
7748 void* my_data = reinterpret_cast<void*>(12345); 7620 void* my_data = reinterpret_cast<void*>(12345);
7749 7621
7750 // Create an isolate. 7622 // Create an isolate.
7751 char* err; 7623 char* err;
7752 Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, 7624 Dart_Isolate isolate = Dart_CreateIsolate(
7753 bin::isolate_snapshot_buffer, 7625 NULL, NULL, bin::isolate_snapshot_buffer, NULL, my_data, &err);
7754 NULL,
7755 my_data, &err);
7756 if (isolate == NULL) { 7626 if (isolate == NULL) {
7757 OS::Print("Creation of isolate failed '%s'\n", err); 7627 OS::Print("Creation of isolate failed '%s'\n", err);
7758 free(err); 7628 free(err);
7759 } 7629 }
7760 EXPECT(isolate != NULL); 7630 EXPECT(isolate != NULL);
7761 7631
7762 // The shutdown callback has not been called. 7632 // The shutdown callback has not been called.
7763 EXPECT_EQ(0, reinterpret_cast<intptr_t>(saved_callback_data)); 7633 EXPECT_EQ(0, reinterpret_cast<intptr_t>(saved_callback_data));
7764 7634
7765 // Shutdown the isolate. 7635 // Shutdown the isolate.
7766 Dart_ShutdownIsolate(); 7636 Dart_ShutdownIsolate();
7767 7637
7768 // The shutdown callback has been called. 7638 // The shutdown callback has been called.
7769 EXPECT_EQ(12345, reinterpret_cast<intptr_t>(saved_callback_data)); 7639 EXPECT_EQ(12345, reinterpret_cast<intptr_t>(saved_callback_data));
7770 7640
7771 Isolate::SetShutdownCallback(saved); 7641 Isolate::SetShutdownCallback(saved);
7772 } 7642 }
7773 7643
7774 static int64_t add_result = 0; 7644 static int64_t add_result = 0;
7775 static void IsolateShutdownRunDartCodeTestCallback(void* callback_data) { 7645 static void IsolateShutdownRunDartCodeTestCallback(void* callback_data) {
7776 Dart_EnterScope(); 7646 Dart_EnterScope();
7777 Dart_Handle lib = Dart_RootLibrary(); 7647 Dart_Handle lib = Dart_RootLibrary();
7778 EXPECT_VALID(lib); 7648 EXPECT_VALID(lib);
7779 Dart_Handle arg1 = Dart_NewInteger(90); 7649 Dart_Handle arg1 = Dart_NewInteger(90);
7780 EXPECT_VALID(arg1); 7650 EXPECT_VALID(arg1);
7781 Dart_Handle arg2 = Dart_NewInteger(9); 7651 Dart_Handle arg2 = Dart_NewInteger(9);
7782 EXPECT_VALID(arg2); 7652 EXPECT_VALID(arg2);
7783 Dart_Handle dart_args[2] = { arg1, arg2 }; 7653 Dart_Handle dart_args[2] = {arg1, arg2};
7784 Dart_Handle result = Dart_Invoke(lib, NewString("add"), 2, dart_args); 7654 Dart_Handle result = Dart_Invoke(lib, NewString("add"), 2, dart_args);
7785 EXPECT_VALID(result); 7655 EXPECT_VALID(result);
7786 result = Dart_IntegerToInt64(result, &add_result); 7656 result = Dart_IntegerToInt64(result, &add_result);
7787 EXPECT_VALID(result); 7657 EXPECT_VALID(result);
7788 Dart_ExitScope(); 7658 Dart_ExitScope();
7789 } 7659 }
7790 7660
7791 UNIT_TEST_CASE(IsolateShutdownRunDartCode) { 7661 UNIT_TEST_CASE(IsolateShutdownRunDartCode) {
7792 const char* kScriptChars = 7662 const char* kScriptChars =
7793 "int add(int a, int b) {\n" 7663 "int add(int a, int b) {\n"
7794 " return a + b;\n" 7664 " return a + b;\n"
7795 "}\n" 7665 "}\n"
7796 "\n" 7666 "\n"
7797 "void main() {\n" 7667 "void main() {\n"
7798 " add(4, 5);\n" 7668 " add(4, 5);\n"
7799 "}\n"; 7669 "}\n";
7800 7670
7801 // Create an isolate. 7671 // Create an isolate.
7802 char* err; 7672 char* err;
7803 Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, 7673 Dart_Isolate isolate = Dart_CreateIsolate(
7804 bin::isolate_snapshot_buffer, 7674 NULL, NULL, bin::isolate_snapshot_buffer, NULL, NULL, &err);
7805 NULL,
7806 NULL, &err);
7807 if (isolate == NULL) { 7675 if (isolate == NULL) {
7808 OS::Print("Creation of isolate failed '%s'\n", err); 7676 OS::Print("Creation of isolate failed '%s'\n", err);
7809 free(err); 7677 free(err);
7810 } 7678 }
7811 EXPECT(isolate != NULL); 7679 EXPECT(isolate != NULL);
7812 7680
7813 Isolate::SetShutdownCallback(IsolateShutdownRunDartCodeTestCallback); 7681 Isolate::SetShutdownCallback(IsolateShutdownRunDartCodeTestCallback);
7814 7682
7815 { 7683 {
7816 Dart_EnterScope(); 7684 Dart_EnterScope();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
7861 7729
7862 static void NativeFoo2(Dart_NativeArguments args) { 7730 static void NativeFoo2(Dart_NativeArguments args) {
7863 Dart_EnterScope(); 7731 Dart_EnterScope();
7864 intptr_t i = Dart_GetNativeArgumentCount(args); 7732 intptr_t i = Dart_GetNativeArgumentCount(args);
7865 EXPECT_EQ(2, i); 7733 EXPECT_EQ(2, i);
7866 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1); 7734 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
7867 EXPECT_VALID(arg1); 7735 EXPECT_VALID(arg1);
7868 int64_t value = 0; 7736 int64_t value = 0;
7869 EXPECT_VALID(Dart_IntegerToInt64(arg1, &value)); 7737 EXPECT_VALID(Dart_IntegerToInt64(arg1, &value));
7870 int64_t integer_value = 0; 7738 int64_t integer_value = 0;
7871 Dart_Handle result = Dart_GetNativeIntegerArgument(args, 7739 Dart_Handle result = Dart_GetNativeIntegerArgument(args, 1, &integer_value);
7872 1,
7873 &integer_value);
7874 EXPECT_VALID(result); 7740 EXPECT_VALID(result);
7875 EXPECT_EQ(value, integer_value); 7741 EXPECT_EQ(value, integer_value);
7876 double double_value; 7742 double double_value;
7877 result = Dart_GetNativeDoubleArgument(args, 1, &double_value); 7743 result = Dart_GetNativeDoubleArgument(args, 1, &double_value);
7878 EXPECT_VALID(result); 7744 EXPECT_VALID(result);
7879 bool bool_value; 7745 bool bool_value;
7880 result = Dart_GetNativeBooleanArgument(args, 1, &bool_value); 7746 result = Dart_GetNativeBooleanArgument(args, 1, &bool_value);
7881 EXPECT(Dart_IsError(result)); 7747 EXPECT(Dart_IsError(result));
7882 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1))); 7748 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1)));
7883 Dart_ExitScope(); 7749 Dart_ExitScope();
(...skipping 11 matching lines...) Expand all
7895 } 7761 }
7896 7762
7897 7763
7898 static void NativeFoo4(Dart_NativeArguments args) { 7764 static void NativeFoo4(Dart_NativeArguments args) {
7899 Dart_EnterScope(); 7765 Dart_EnterScope();
7900 intptr_t i = Dart_GetNativeArgumentCount(args); 7766 intptr_t i = Dart_GetNativeArgumentCount(args);
7901 EXPECT_EQ(4, i); 7767 EXPECT_EQ(4, i);
7902 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1); 7768 Dart_Handle arg1 = Dart_GetNativeArgument(args, 1);
7903 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2); 7769 Dart_Handle arg2 = Dart_GetNativeArgument(args, 2);
7904 Dart_Handle arg3 = Dart_GetNativeArgument(args, 3); 7770 Dart_Handle arg3 = Dart_GetNativeArgument(args, 3);
7905 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + 7771 Dart_SetReturnValue(
7906 GetValue(arg2) + 7772 args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3)));
7907 GetValue(arg3)));
7908 Dart_ExitScope(); 7773 Dart_ExitScope();
7909 } 7774 }
7910 7775
7911 7776
7912 static Dart_NativeFunction MyNativeClosureResolver(Dart_Handle name, 7777 static Dart_NativeFunction MyNativeClosureResolver(Dart_Handle name,
7913 int arg_count, 7778 int arg_count,
7914 bool* auto_setup_scope) { 7779 bool* auto_setup_scope) {
7915 ASSERT(auto_setup_scope != NULL); 7780 ASSERT(auto_setup_scope != NULL);
7916 *auto_setup_scope = false; 7781 *auto_setup_scope = false;
7917 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); 7782 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
8044 } 7909 }
8045 7910
8046 7911
8047 static void StaticNativeFoo4(Dart_NativeArguments args) { 7912 static void StaticNativeFoo4(Dart_NativeArguments args) {
8048 Dart_EnterScope(); 7913 Dart_EnterScope();
8049 intptr_t i = Dart_GetNativeArgumentCount(args); 7914 intptr_t i = Dart_GetNativeArgumentCount(args);
8050 EXPECT_EQ(3, i); 7915 EXPECT_EQ(3, i);
8051 Dart_Handle arg1 = Dart_GetNativeArgument(args, 0); 7916 Dart_Handle arg1 = Dart_GetNativeArgument(args, 0);
8052 Dart_Handle arg2 = Dart_GetNativeArgument(args, 1); 7917 Dart_Handle arg2 = Dart_GetNativeArgument(args, 1);
8053 Dart_Handle arg3 = Dart_GetNativeArgument(args, 2); 7918 Dart_Handle arg3 = Dart_GetNativeArgument(args, 2);
8054 Dart_SetReturnValue(args, Dart_NewInteger(GetValue(arg1) + 7919 Dart_SetReturnValue(
8055 GetValue(arg2) + 7920 args, Dart_NewInteger(GetValue(arg1) + GetValue(arg2) + GetValue(arg3)));
8056 GetValue(arg3)));
8057 Dart_ExitScope(); 7921 Dart_ExitScope();
8058 } 7922 }
8059 7923
8060 7924
8061 static Dart_NativeFunction MyStaticNativeClosureResolver( 7925 static Dart_NativeFunction MyStaticNativeClosureResolver(
8062 Dart_Handle name, int arg_count, bool* auto_setup_scope) { 7926 Dart_Handle name,
7927 int arg_count,
7928 bool* auto_setup_scope) {
8063 ASSERT(auto_setup_scope != NULL); 7929 ASSERT(auto_setup_scope != NULL);
8064 *auto_setup_scope = false; 7930 *auto_setup_scope = false;
8065 const Object& obj = Object::Handle(Api::UnwrapHandle(name)); 7931 const Object& obj = Object::Handle(Api::UnwrapHandle(name));
8066 if (!obj.IsString()) { 7932 if (!obj.IsString()) {
8067 return NULL; 7933 return NULL;
8068 } 7934 }
8069 const char* function_name = obj.ToCString(); 7935 const char* function_name = obj.ToCString();
8070 const char* kNativeFoo1 = "StaticNativeFoo1"; 7936 const char* kNativeFoo1 = "StaticNativeFoo1";
8071 const char* kNativeFoo2 = "StaticNativeFoo2"; 7937 const char* kNativeFoo2 = "StaticNativeFoo2";
8072 const char* kNativeFoo3 = "StaticNativeFoo3"; 7938 const char* kNativeFoo3 = "StaticNativeFoo3";
(...skipping 12 matching lines...) Expand all
8085 } 7951 }
8086 } 7952 }
8087 7953
8088 7954
8089 TEST_CASE(NativeStaticFunctionClosure) { 7955 TEST_CASE(NativeStaticFunctionClosure) {
8090 const char* kScriptChars = 7956 const char* kScriptChars =
8091 "class Test {" 7957 "class Test {"
8092 " static int foo1() native \"StaticNativeFoo1\";\n" 7958 " static int foo1() native \"StaticNativeFoo1\";\n"
8093 " static int foo2(int i) native \"StaticNativeFoo2\";\n" 7959 " static int foo2(int i) native \"StaticNativeFoo2\";\n"
8094 " static int foo3([int k = 10000, int l = 1])" 7960 " static int foo3([int k = 10000, int l = 1])"
8095 " native \"StaticNativeFoo3\";\n" 7961 " native \"StaticNativeFoo3\";\n"
8096 " static int foo4(int i, [int j = 10, int k = 1])" 7962 " static int foo4(int i, [int j = 10, int k = 1])"
8097 " native \"StaticNativeFoo4\";\n" 7963 " native \"StaticNativeFoo4\";\n"
8098 " int bar1() { var func = foo1; return func(); }\n" 7964 " int bar1() { var func = foo1; return func(); }\n"
8099 " int bar2(int i) { var func = foo2; return func(i); }\n" 7965 " int bar2(int i) { var func = foo2; return func(i); }\n"
8100 " int bar30() { var func = foo3; return func(); }\n" 7966 " int bar30() { var func = foo3; return func(); }\n"
8101 " int bar31(int i) { var func = foo3; return func(i); }\n" 7967 " int bar31(int i) { var func = foo3; return func(i); }\n"
8102 " int bar32(int i, int j) { var func = foo3; return func(i, j); }\n" 7968 " int bar32(int i, int j) { var func = foo3; return func(i, j); }\n"
8103 " int bar41(int i) {\n" 7969 " int bar41(int i) {\n"
8104 " var func = foo4; return func(i); }\n" 7970 " var func = foo4; return func(i); }\n"
8105 " int bar42(int i, int j) {\n" 7971 " int bar42(int i, int j) {\n"
8106 " var func = foo4; return func(i, j); }\n" 7972 " var func = foo4; return func(i, j); }\n"
8107 " int bar43(int i, int j, int k) {\n" 7973 " int bar43(int i, int j, int k) {\n"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
8163 } 8029 }
8164 8030
8165 8031
8166 TEST_CASE(RangeLimits) { 8032 TEST_CASE(RangeLimits) {
8167 uint8_t chars8[1] = {'a'}; 8033 uint8_t chars8[1] = {'a'};
8168 uint16_t chars16[1] = {'a'}; 8034 uint16_t chars16[1] = {'a'};
8169 int32_t chars32[1] = {'a'}; 8035 int32_t chars32[1] = {'a'};
8170 8036
8171 EXPECT_ERROR(Dart_NewList(-1), 8037 EXPECT_ERROR(Dart_NewList(-1),
8172 "expects argument 'length' to be in the range"); 8038 "expects argument 'length' to be in the range");
8173 EXPECT_ERROR(Dart_NewList(Array::kMaxElements+1), 8039 EXPECT_ERROR(Dart_NewList(Array::kMaxElements + 1),
8174 "expects argument 'length' to be in the range"); 8040 "expects argument 'length' to be in the range");
8175 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, -1), 8041 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, -1),
8176 "expects argument 'length' to be in the range"); 8042 "expects argument 'length' to be in the range");
8177 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, OneByteString::kMaxElements+1), 8043 EXPECT_ERROR(Dart_NewStringFromUTF8(chars8, OneByteString::kMaxElements + 1),
8178 "expects argument 'length' to be in the range"); 8044 "expects argument 'length' to be in the range");
8179 EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, -1), 8045 EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, -1),
8180 "expects argument 'length' to be in the range"); 8046 "expects argument 'length' to be in the range");
8181 EXPECT_ERROR(Dart_NewStringFromUTF16(chars16, TwoByteString::kMaxElements+1), 8047 EXPECT_ERROR(
8182 "expects argument 'length' to be in the range"); 8048 Dart_NewStringFromUTF16(chars16, TwoByteString::kMaxElements + 1),
8049 "expects argument 'length' to be in the range");
8183 EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, -1), 8050 EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, -1),
8184 "expects argument 'length' to be in the range"); 8051 "expects argument 'length' to be in the range");
8185 EXPECT_ERROR(Dart_NewStringFromUTF32(chars32, TwoByteString::kMaxElements+1), 8052 EXPECT_ERROR(
8186 "expects argument 'length' to be in the range"); 8053 Dart_NewStringFromUTF32(chars32, TwoByteString::kMaxElements + 1),
8054 "expects argument 'length' to be in the range");
8187 } 8055 }
8188 8056
8189 8057
8190 TEST_CASE(NewString_Null) { 8058 TEST_CASE(NewString_Null) {
8191 Dart_Handle str = Dart_NewStringFromUTF8(NULL, 0); 8059 Dart_Handle str = Dart_NewStringFromUTF8(NULL, 0);
8192 EXPECT_VALID(str); 8060 EXPECT_VALID(str);
8193 EXPECT(Dart_IsString(str)); 8061 EXPECT(Dart_IsString(str));
8194 intptr_t len = -1; 8062 intptr_t len = -1;
8195 EXPECT_VALID(Dart_StringLength(str, &len)); 8063 EXPECT_VALID(Dart_StringLength(str, &len));
8196 EXPECT_EQ(0, len); 8064 EXPECT_EQ(0, len);
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
8642 8510
8643 static int peer8 = 40; 8511 static int peer8 = 40;
8644 static int peer16 = 41; 8512 static int peer16 = 41;
8645 static int canonical_str_peer = 42; 8513 static int canonical_str_peer = 42;
8646 intptr_t length = 0; 8514 intptr_t length = 0;
8647 intptr_t expected_length = 0; 8515 intptr_t expected_length = 0;
8648 { 8516 {
8649 Dart_EnterScope(); 8517 Dart_EnterScope();
8650 8518
8651 // First test some negative conditions. 8519 // First test some negative conditions.
8652 uint8_t data8[] = { 'h', 'e', 'l', 'l', 'o' }; 8520 uint8_t data8[] = {'h', 'e', 'l', 'l', 'o'};
8653 const char* err = "string"; 8521 const char* err = "string";
8654 Dart_Handle err_str = NewString(err); 8522 Dart_Handle err_str = NewString(err);
8655 Dart_Handle ext_err_str = Dart_NewExternalLatin1String( 8523 Dart_Handle ext_err_str =
8656 data8, ARRAY_SIZE(data8), NULL, NULL); 8524 Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), NULL, NULL);
8657 Dart_Handle result = Dart_MakeExternalString(Dart_Null(), 8525 Dart_Handle result = Dart_MakeExternalString(Dart_Null(), data8,
8658 data8, 8526 ARRAY_SIZE(data8), NULL, NULL);
8659 ARRAY_SIZE(data8),
8660 NULL,
8661 NULL);
8662 EXPECT(Dart_IsError(result)); // Null string object passed in. 8527 EXPECT(Dart_IsError(result)); // Null string object passed in.
8663 result = Dart_MakeExternalString(err_str, 8528 result =
8664 NULL, 8529 Dart_MakeExternalString(err_str, NULL, ARRAY_SIZE(data8), NULL, NULL);
8665 ARRAY_SIZE(data8),
8666 NULL,
8667 NULL);
8668 EXPECT(Dart_IsError(result)); // Null array pointer passed in. 8530 EXPECT(Dart_IsError(result)); // Null array pointer passed in.
8669 result = Dart_MakeExternalString(err_str, 8531 result = Dart_MakeExternalString(err_str, data8, 1, NULL, NULL);
8670 data8,
8671 1,
8672 NULL,
8673 NULL);
8674 EXPECT(Dart_IsError(result)); // Invalid length passed in. 8532 EXPECT(Dart_IsError(result)); // Invalid length passed in.
8675 8533
8676 const intptr_t kLength = 10; 8534 const intptr_t kLength = 10;
8677 intptr_t size = 0; 8535 intptr_t size = 0;
8678 8536
8679 // Test with an external string. 8537 // Test with an external string.
8680 result = Dart_MakeExternalString(ext_err_str, 8538 result = Dart_MakeExternalString(ext_err_str, data8, ARRAY_SIZE(data8),
8681 data8, 8539 NULL, NULL);
8682 ARRAY_SIZE(data8),
8683 NULL,
8684 NULL);
8685 EXPECT(Dart_IsString(result)); 8540 EXPECT(Dart_IsString(result));
8686 EXPECT(Dart_IsExternalString(result)); 8541 EXPECT(Dart_IsExternalString(result));
8687 8542
8688 // Test with an empty string. 8543 // Test with an empty string.
8689 Dart_Handle empty_str = NewString(""); 8544 Dart_Handle empty_str = NewString("");
8690 EXPECT(Dart_IsString(empty_str)); 8545 EXPECT(Dart_IsString(empty_str));
8691 EXPECT(!Dart_IsExternalString(empty_str)); 8546 EXPECT(!Dart_IsExternalString(empty_str));
8692 uint8_t ext_empty_str[kLength]; 8547 uint8_t ext_empty_str[kLength];
8693 Dart_Handle str = Dart_MakeExternalString(empty_str, 8548 Dart_Handle str =
8694 ext_empty_str, 8549 Dart_MakeExternalString(empty_str, ext_empty_str, kLength, NULL, NULL);
8695 kLength,
8696 NULL,
8697 NULL);
8698 EXPECT(Dart_IsString(str)); 8550 EXPECT(Dart_IsString(str));
8699 EXPECT(Dart_IsString(empty_str)); 8551 EXPECT(Dart_IsString(empty_str));
8700 EXPECT(Dart_IsStringLatin1(str)); 8552 EXPECT(Dart_IsStringLatin1(str));
8701 EXPECT(Dart_IsStringLatin1(empty_str)); 8553 EXPECT(Dart_IsStringLatin1(empty_str));
8702 EXPECT(Dart_IsExternalString(str)); 8554 EXPECT(Dart_IsExternalString(str));
8703 EXPECT(Dart_IsExternalString(empty_str)); 8555 EXPECT(Dart_IsExternalString(empty_str));
8704 EXPECT_VALID(Dart_StringLength(str, &length)); 8556 EXPECT_VALID(Dart_StringLength(str, &length));
8705 EXPECT_EQ(0, length); 8557 EXPECT_EQ(0, length);
8706 8558
8707 // Test with single character canonical string, it should not become 8559 // Test with single character canonical string, it should not become
8708 // external string but the peer should be setup for it. 8560 // external string but the peer should be setup for it.
8709 Dart_Handle canonical_str = Api::NewHandle(thread, Symbols::New(thread, 8561 Dart_Handle canonical_str =
8710 "*")); 8562 Api::NewHandle(thread, Symbols::New(thread, "*"));
8711 EXPECT(Dart_IsString(canonical_str)); 8563 EXPECT(Dart_IsString(canonical_str));
8712 EXPECT(!Dart_IsExternalString(canonical_str)); 8564 EXPECT(!Dart_IsExternalString(canonical_str));
8713 uint8_t ext_canonical_str[kLength]; 8565 uint8_t ext_canonical_str[kLength];
8714 str = Dart_MakeExternalString(canonical_str, 8566 str = Dart_MakeExternalString(canonical_str, ext_canonical_str, kLength,
8715 ext_canonical_str, 8567 &canonical_str_peer, MakeExternalCback);
8716 kLength,
8717 &canonical_str_peer,
8718 MakeExternalCback);
8719 EXPECT(Dart_IsString(str)); 8568 EXPECT(Dart_IsString(str));
8720 EXPECT(!Dart_IsExternalString(canonical_str)); 8569 EXPECT(!Dart_IsExternalString(canonical_str));
8721 EXPECT_EQ(canonical_str, str); 8570 EXPECT_EQ(canonical_str, str);
8722 EXPECT(Dart_IsString(canonical_str)); 8571 EXPECT(Dart_IsString(canonical_str));
8723 EXPECT(!Dart_IsExternalString(canonical_str)); 8572 EXPECT(!Dart_IsExternalString(canonical_str));
8724 void* peer; 8573 void* peer;
8725 EXPECT_VALID(Dart_StringGetProperties(str, &size, &length, &peer)); 8574 EXPECT_VALID(Dart_StringGetProperties(str, &size, &length, &peer));
8726 EXPECT_EQ(1, size); 8575 EXPECT_EQ(1, size);
8727 EXPECT_EQ(1, length); 8576 EXPECT_EQ(1, length);
8728 EXPECT_EQ(reinterpret_cast<void*>(&canonical_str_peer), peer); 8577 EXPECT_EQ(reinterpret_cast<void*>(&canonical_str_peer), peer);
8729 8578
8730 // Test with a one byte ascii string. 8579 // Test with a one byte ascii string.
8731 const char* ascii = "?unseen"; 8580 const char* ascii = "?unseen";
8732 expected_length = strlen(ascii); 8581 expected_length = strlen(ascii);
8733 Dart_Handle ascii_str = NewString(ascii); 8582 Dart_Handle ascii_str = NewString(ascii);
8734 EXPECT_VALID(ascii_str); 8583 EXPECT_VALID(ascii_str);
8735 EXPECT(Dart_IsString(ascii_str)); 8584 EXPECT(Dart_IsString(ascii_str));
8736 EXPECT(Dart_IsStringLatin1(ascii_str)); 8585 EXPECT(Dart_IsStringLatin1(ascii_str));
8737 EXPECT(!Dart_IsExternalString(ascii_str)); 8586 EXPECT(!Dart_IsExternalString(ascii_str));
8738 EXPECT_VALID(Dart_StringLength(ascii_str, &length)); 8587 EXPECT_VALID(Dart_StringLength(ascii_str, &length));
8739 EXPECT_EQ(expected_length, length); 8588 EXPECT_EQ(expected_length, length);
8740 8589
8741 uint8_t ext_ascii_str[kLength]; 8590 uint8_t ext_ascii_str[kLength];
8742 EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size)); 8591 EXPECT_VALID(Dart_StringStorageSize(ascii_str, &size));
8743 str = Dart_MakeExternalString(ascii_str, 8592 str = Dart_MakeExternalString(ascii_str, ext_ascii_str, size, &peer8,
8744 ext_ascii_str,
8745 size,
8746 &peer8,
8747 MakeExternalCback); 8593 MakeExternalCback);
8748 EXPECT(Dart_IsString(str)); 8594 EXPECT(Dart_IsString(str));
8749 EXPECT(Dart_IsString(ascii_str)); 8595 EXPECT(Dart_IsString(ascii_str));
8750 EXPECT(Dart_IsStringLatin1(str)); 8596 EXPECT(Dart_IsStringLatin1(str));
8751 EXPECT(Dart_IsStringLatin1(ascii_str)); 8597 EXPECT(Dart_IsStringLatin1(ascii_str));
8752 EXPECT(Dart_IsExternalString(str)); 8598 EXPECT(Dart_IsExternalString(str));
8753 EXPECT(Dart_IsExternalString(ascii_str)); 8599 EXPECT(Dart_IsExternalString(ascii_str));
8754 EXPECT_VALID(Dart_StringLength(str, &length)); 8600 EXPECT_VALID(Dart_StringLength(str, &length));
8755 EXPECT_EQ(expected_length, length); 8601 EXPECT_EQ(expected_length, length);
8756 EXPECT_VALID(Dart_StringLength(ascii_str, &length)); 8602 EXPECT_VALID(Dart_StringLength(ascii_str, &length));
8757 EXPECT_EQ(expected_length, length); 8603 EXPECT_EQ(expected_length, length);
8758 EXPECT(Dart_IdentityEquals(str, ascii_str)); 8604 EXPECT(Dart_IdentityEquals(str, ascii_str));
8759 for (intptr_t i = 0; i < length; i++) { 8605 for (intptr_t i = 0; i < length; i++) {
8760 EXPECT_EQ(ascii[i], ext_ascii_str[i]); 8606 EXPECT_EQ(ascii[i], ext_ascii_str[i]);
8761 } 8607 }
8762 8608
8763 uint8_t data[] = { 0xE4, 0xBA, 0x8c }; // U+4E8C. 8609 uint8_t data[] = {0xE4, 0xBA, 0x8c}; // U+4E8C.
8764 expected_length = 1; 8610 expected_length = 1;
8765 Dart_Handle utf16_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data)); 8611 Dart_Handle utf16_str = Dart_NewStringFromUTF8(data, ARRAY_SIZE(data));
8766 EXPECT_VALID(utf16_str); 8612 EXPECT_VALID(utf16_str);
8767 EXPECT(Dart_IsString(utf16_str)); 8613 EXPECT(Dart_IsString(utf16_str));
8768 EXPECT(!Dart_IsStringLatin1(utf16_str)); 8614 EXPECT(!Dart_IsStringLatin1(utf16_str));
8769 EXPECT(!Dart_IsExternalString(utf16_str)); 8615 EXPECT(!Dart_IsExternalString(utf16_str));
8770 EXPECT_VALID(Dart_StringLength(utf16_str, &length)); 8616 EXPECT_VALID(Dart_StringLength(utf16_str, &length));
8771 EXPECT_EQ(expected_length, length); 8617 EXPECT_EQ(expected_length, length);
8772 8618
8773 // Test with a two byte string. 8619 // Test with a two byte string.
8774 uint16_t ext_utf16_str[kLength]; 8620 uint16_t ext_utf16_str[kLength];
8775 EXPECT_VALID(Dart_StringStorageSize(utf16_str, &size)); 8621 EXPECT_VALID(Dart_StringStorageSize(utf16_str, &size));
8776 str = Dart_MakeExternalString(utf16_str, 8622 str = Dart_MakeExternalString(utf16_str, ext_utf16_str, size, &peer16,
8777 ext_utf16_str,
8778 size,
8779 &peer16,
8780 MakeExternalCback); 8623 MakeExternalCback);
8781 EXPECT(Dart_IsString(str)); 8624 EXPECT(Dart_IsString(str));
8782 EXPECT(Dart_IsString(utf16_str)); 8625 EXPECT(Dart_IsString(utf16_str));
8783 EXPECT(!Dart_IsStringLatin1(str)); 8626 EXPECT(!Dart_IsStringLatin1(str));
8784 EXPECT(!Dart_IsStringLatin1(utf16_str)); 8627 EXPECT(!Dart_IsStringLatin1(utf16_str));
8785 EXPECT(Dart_IsExternalString(str)); 8628 EXPECT(Dart_IsExternalString(str));
8786 EXPECT(Dart_IsExternalString(utf16_str)); 8629 EXPECT(Dart_IsExternalString(utf16_str));
8787 EXPECT_VALID(Dart_StringLength(str, &length)); 8630 EXPECT_VALID(Dart_StringLength(str, &length));
8788 EXPECT_EQ(expected_length, length); 8631 EXPECT_EQ(expected_length, length);
8789 EXPECT_VALID(Dart_StringLength(utf16_str, &length)); 8632 EXPECT_VALID(Dart_StringLength(utf16_str, &length));
8790 EXPECT_EQ(expected_length, length); 8633 EXPECT_EQ(expected_length, length);
8791 EXPECT(Dart_IdentityEquals(str, utf16_str)); 8634 EXPECT(Dart_IdentityEquals(str, utf16_str));
8792 for (intptr_t i = 0; i < length; i++) { 8635 for (intptr_t i = 0; i < length; i++) {
8793 EXPECT_EQ(0x4e8c, ext_utf16_str[i]); 8636 EXPECT_EQ(0x4e8c, ext_utf16_str[i]);
8794 } 8637 }
8795 8638
8796 Zone* zone = thread->zone(); 8639 Zone* zone = thread->zone();
8797 // Test with a symbol (hash value should be preserved on externalization). 8640 // Test with a symbol (hash value should be preserved on externalization).
8798 const char* symbol_ascii = "?unseen"; 8641 const char* symbol_ascii = "?unseen";
8799 expected_length = strlen(symbol_ascii); 8642 expected_length = strlen(symbol_ascii);
8800 Dart_Handle symbol_str = Api::NewHandle(thread, 8643 Dart_Handle symbol_str = Api::NewHandle(
8801 Symbols::New(thread, symbol_ascii, expected_length)); 8644 thread, Symbols::New(thread, symbol_ascii, expected_length));
8802 EXPECT_VALID(symbol_str); 8645 EXPECT_VALID(symbol_str);
8803 EXPECT(Dart_IsString(symbol_str)); 8646 EXPECT(Dart_IsString(symbol_str));
8804 EXPECT(Dart_IsStringLatin1(symbol_str)); 8647 EXPECT(Dart_IsStringLatin1(symbol_str));
8805 EXPECT(!Dart_IsExternalString(symbol_str)); 8648 EXPECT(!Dart_IsExternalString(symbol_str));
8806 EXPECT_VALID(Dart_StringLength(symbol_str, &length)); 8649 EXPECT_VALID(Dart_StringLength(symbol_str, &length));
8807 EXPECT_EQ(expected_length, length); 8650 EXPECT_EQ(expected_length, length);
8808 EXPECT(Api::UnwrapStringHandle(zone, symbol_str).HasHash()); 8651 EXPECT(Api::UnwrapStringHandle(zone, symbol_str).HasHash());
8809 8652
8810 uint8_t ext_symbol_ascii[kLength]; 8653 uint8_t ext_symbol_ascii[kLength];
8811 EXPECT_VALID(Dart_StringStorageSize(symbol_str, &size)); 8654 EXPECT_VALID(Dart_StringStorageSize(symbol_str, &size));
8812 str = Dart_MakeExternalString(symbol_str, 8655 str = Dart_MakeExternalString(symbol_str, ext_symbol_ascii, size, &peer8,
8813 ext_symbol_ascii,
8814 size,
8815 &peer8,
8816 MakeExternalCback); 8656 MakeExternalCback);
8817 EXPECT(Api::UnwrapStringHandle(zone, str).HasHash()); 8657 EXPECT(Api::UnwrapStringHandle(zone, str).HasHash());
8818 EXPECT(Api::UnwrapStringHandle(zone, str).Hash() == 8658 EXPECT(Api::UnwrapStringHandle(zone, str).Hash() ==
8819 Api::UnwrapStringHandle(zone, symbol_str).Hash()); 8659 Api::UnwrapStringHandle(zone, symbol_str).Hash());
8820 EXPECT(Dart_IsString(str)); 8660 EXPECT(Dart_IsString(str));
8821 EXPECT(Dart_IsString(symbol_str)); 8661 EXPECT(Dart_IsString(symbol_str));
8822 EXPECT(Dart_IsStringLatin1(str)); 8662 EXPECT(Dart_IsStringLatin1(str));
8823 EXPECT(Dart_IsStringLatin1(symbol_str)); 8663 EXPECT(Dart_IsStringLatin1(symbol_str));
8824 EXPECT(Dart_IsExternalString(str)); 8664 EXPECT(Dart_IsExternalString(str));
8825 EXPECT(Dart_IsExternalString(symbol_str)); 8665 EXPECT(Dart_IsExternalString(symbol_str));
(...skipping 27 matching lines...) Expand all
8853 TEST_CASE(ExternalizeConstantStrings) { 8693 TEST_CASE(ExternalizeConstantStrings) {
8854 const bool saved_flag = FLAG_support_externalizable_strings; 8694 const bool saved_flag = FLAG_support_externalizable_strings;
8855 FLAG_support_externalizable_strings = true; 8695 FLAG_support_externalizable_strings = true;
8856 8696
8857 const char* kScriptChars = 8697 const char* kScriptChars =
8858 "String testMain() {\n" 8698 "String testMain() {\n"
8859 " return 'constant string';\n" 8699 " return 'constant string';\n"
8860 "}\n"; 8700 "}\n";
8861 8701
8862 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); 8702 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
8863 Dart_Handle result = Dart_Invoke(lib, 8703 Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
8864 NewString("testMain"),
8865 0,
8866 NULL);
8867 const char* expected_str = "constant string"; 8704 const char* expected_str = "constant string";
8868 const intptr_t kExpectedLen = 15; 8705 const intptr_t kExpectedLen = 15;
8869 uint8_t ext_str[kExpectedLen]; 8706 uint8_t ext_str[kExpectedLen];
8870 Dart_Handle str = Dart_MakeExternalString(result, 8707 Dart_Handle str =
8871 ext_str, 8708 Dart_MakeExternalString(result, ext_str, kExpectedLen, NULL, NULL);
8872 kExpectedLen,
8873 NULL,
8874 NULL);
8875 8709
8876 EXPECT(Dart_IsExternalString(str)); 8710 EXPECT(Dart_IsExternalString(str));
8877 for (intptr_t i = 0; i < kExpectedLen; i++) { 8711 for (intptr_t i = 0; i < kExpectedLen; i++) {
8878 EXPECT_EQ(expected_str[i], ext_str[i]); 8712 EXPECT_EQ(expected_str[i], ext_str[i]);
8879 } 8713 }
8880 8714
8881 FLAG_support_externalizable_strings = saved_flag; 8715 FLAG_support_externalizable_strings = saved_flag;
8882 } 8716 }
8883 8717
8884 8718
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
8938 void* peer; 8772 void* peer;
8939 Dart_Handle str_arg = Dart_GetNativeStringArgument(args, 0, &peer); 8773 Dart_Handle str_arg = Dart_GetNativeStringArgument(args, 0, &peer);
8940 EXPECT(Dart_IsString(str_arg)); 8774 EXPECT(Dart_IsString(str_arg));
8941 EXPECT(!peer); 8775 EXPECT(!peer);
8942 intptr_t size = 0; 8776 intptr_t size = 0;
8943 EXPECT_VALID(Dart_StringStorageSize(str, &size)); 8777 EXPECT_VALID(Dart_StringStorageSize(str, &size));
8944 intptr_t arg_size = 0; 8778 intptr_t arg_size = 0;
8945 EXPECT_VALID(Dart_StringStorageSize(str_arg, &arg_size)); 8779 EXPECT_VALID(Dart_StringStorageSize(str_arg, &arg_size));
8946 EXPECT_EQ(size, arg_size); 8780 EXPECT_EQ(size, arg_size);
8947 char* str_data = new char[size]; 8781 char* str_data = new char[size];
8948 Dart_Handle result = 8782 Dart_Handle result = Dart_MakeExternalString(
8949 Dart_MakeExternalString(str, 8783 str, str_data, size, str_data, &ExternalStringDeoptimize_Finalize);
8950 str_data,
8951 size,
8952 str_data,
8953 &ExternalStringDeoptimize_Finalize);
8954 EXPECT_VALID(result); 8784 EXPECT_VALID(result);
8955 EXPECT(Dart_IsExternalString(result)); 8785 EXPECT(Dart_IsExternalString(result));
8956 Dart_ExitScope(); 8786 Dart_ExitScope();
8957 } 8787 }
8958 8788
8959 8789
8960 static Dart_NativeFunction ExternalStringDeoptimize_native_lookup( 8790 static Dart_NativeFunction ExternalStringDeoptimize_native_lookup(
8961 Dart_Handle name, int argument_count, bool* auto_setup_scope) { 8791 Dart_Handle name,
8792 int argument_count,
8793 bool* auto_setup_scope) {
8962 ASSERT(auto_setup_scope != NULL); 8794 ASSERT(auto_setup_scope != NULL);
8963 *auto_setup_scope = true; 8795 *auto_setup_scope = true;
8964 return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native); 8796 return reinterpret_cast<Dart_NativeFunction>(&A_change_str_native);
8965 } 8797 }
8966 8798
8967 8799
8968 // Do not use guarding mechanism on externalizable classes, since their class 8800 // Do not use guarding mechanism on externalizable classes, since their class
8969 // can change on the fly, 8801 // can change on the fly,
8970 TEST_CASE(GuardExternalizedString) { 8802 TEST_CASE(GuardExternalizedString) {
8971 const bool saved_flag = FLAG_support_externalizable_strings; 8803 const bool saved_flag = FLAG_support_externalizable_strings;
(...skipping 16 matching lines...) Expand all
8988 " }\n" 8820 " }\n"
8989 " }\n" 8821 " }\n"
8990 " return sum;\n" 8822 " return sum;\n"
8991 "}\n" 8823 "}\n"
8992 "class A {\n" 8824 "class A {\n"
8993 " var f;\n" 8825 " var f;\n"
8994 " A(this.f);\n" 8826 " A(this.f);\n"
8995 "}\n" 8827 "}\n"
8996 "change_str(String s) native 'A_change_str';\n" 8828 "change_str(String s) native 'A_change_str';\n"
8997 ""; 8829 "";
8998 Dart_Handle lib = 8830 Dart_Handle lib = TestCase::LoadTestScript(
8999 TestCase::LoadTestScript(kScriptChars, 8831 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9000 &ExternalStringDeoptimize_native_lookup); 8832 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9001 Dart_Handle result = Dart_Invoke(lib,
9002 NewString("main"),
9003 0,
9004 NULL);
9005 int64_t value = 0; 8833 int64_t value = 0;
9006 result = Dart_IntegerToInt64(result, &value); 8834 result = Dart_IntegerToInt64(result, &value);
9007 EXPECT_VALID(result); 8835 EXPECT_VALID(result);
9008 EXPECT_EQ(10640000, value); 8836 EXPECT_EQ(10640000, value);
9009 8837
9010 FLAG_support_externalizable_strings = saved_flag; 8838 FLAG_support_externalizable_strings = saved_flag;
9011 } 8839 }
9012 8840
9013 8841
9014 TEST_CASE(ExternalStringDeoptimize) { 8842 TEST_CASE(ExternalStringDeoptimize) {
(...skipping 13 matching lines...) Expand all
9028 " }\n" 8856 " }\n"
9029 " return result;\n" 8857 " return result;\n"
9030 "}\n" 8858 "}\n"
9031 "main() {\n" 8859 "main() {\n"
9032 " str = '$str$str';\n" 8860 " str = '$str$str';\n"
9033 " for (var i = 0; i < 2000; i++) sum_chars(str, false);\n" 8861 " for (var i = 0; i < 2000; i++) sum_chars(str, false);\n"
9034 " var x = sum_chars(str, false);\n" 8862 " var x = sum_chars(str, false);\n"
9035 " var y = sum_chars(str, true);\n" 8863 " var y = sum_chars(str, true);\n"
9036 " return x + y;\n" 8864 " return x + y;\n"
9037 "}\n"; 8865 "}\n";
9038 Dart_Handle lib = 8866 Dart_Handle lib = TestCase::LoadTestScript(
9039 TestCase::LoadTestScript(kScriptChars, 8867 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9040 &ExternalStringDeoptimize_native_lookup); 8868 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9041 Dart_Handle result = Dart_Invoke(lib,
9042 NewString("main"),
9043 0,
9044 NULL);
9045 int64_t value = 0; 8869 int64_t value = 0;
9046 result = Dart_IntegerToInt64(result, &value); 8870 result = Dart_IntegerToInt64(result, &value);
9047 EXPECT_VALID(result); 8871 EXPECT_VALID(result);
9048 EXPECT_EQ(260, value); 8872 EXPECT_EQ(260, value);
9049 8873
9050 FLAG_support_externalizable_strings = saved_flag; 8874 FLAG_support_externalizable_strings = saved_flag;
9051 } 8875 }
9052 8876
9053 8877
9054 TEST_CASE(ExternalStringPolymorphicDeoptimize) { 8878 TEST_CASE(ExternalStringPolymorphicDeoptimize) {
(...skipping 13 matching lines...) Expand all
9068 "}\n" 8892 "}\n"
9069 "main() {\n" 8893 "main() {\n"
9070 " var externalA = 'AA' + 'AA';\n" 8894 " var externalA = 'AA' + 'AA';\n"
9071 " A.change_str(externalA);\n" 8895 " A.change_str(externalA);\n"
9072 " compare('AA' + 'AA', strA);\n" 8896 " compare('AA' + 'AA', strA);\n"
9073 " compare(externalA, strA);\n" 8897 " compare(externalA, strA);\n"
9074 " for (var i = 0; i < 10000; i++) compareA(strA);\n" 8898 " for (var i = 0; i < 10000; i++) compareA(strA);\n"
9075 " A.change_str(strA);\n" 8899 " A.change_str(strA);\n"
9076 " return compareA('AA' + 'AA');\n" 8900 " return compareA('AA' + 'AA');\n"
9077 "}\n"; 8901 "}\n";
9078 Dart_Handle lib = 8902 Dart_Handle lib = TestCase::LoadTestScript(
9079 TestCase::LoadTestScript(kScriptChars, 8903 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9080 &ExternalStringDeoptimize_native_lookup); 8904 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9081 Dart_Handle result = Dart_Invoke(lib,
9082 NewString("main"),
9083 0,
9084 NULL);
9085 EXPECT_VALID(result); 8905 EXPECT_VALID(result);
9086 bool value = false; 8906 bool value = false;
9087 result = Dart_BooleanValue(result, &value); 8907 result = Dart_BooleanValue(result, &value);
9088 EXPECT_VALID(result); 8908 EXPECT_VALID(result);
9089 EXPECT(value); 8909 EXPECT(value);
9090 8910
9091 FLAG_support_externalizable_strings = saved_flag; 8911 FLAG_support_externalizable_strings = saved_flag;
9092 } 8912 }
9093 8913
9094 8914
9095 TEST_CASE(ExternalStringLoadElimination) { 8915 TEST_CASE(ExternalStringLoadElimination) {
9096 const bool saved_flag = FLAG_support_externalizable_strings; 8916 const bool saved_flag = FLAG_support_externalizable_strings;
9097 FLAG_support_externalizable_strings = true; 8917 FLAG_support_externalizable_strings = true;
9098 8918
9099 const char* kScriptChars = 8919 const char* kScriptChars =
9100 "class A {\n" 8920 "class A {\n"
9101 " static change_str(String s) native 'A_change_str';\n" 8921 " static change_str(String s) native 'A_change_str';\n"
9102 "}\n" 8922 "}\n"
9103 "double_char0(str) {\n" 8923 "double_char0(str) {\n"
9104 " return str.codeUnitAt(0) + str.codeUnitAt(0);\n" 8924 " return str.codeUnitAt(0) + str.codeUnitAt(0);\n"
9105 "}\n" 8925 "}\n"
9106 "main() {\n" 8926 "main() {\n"
9107 " var externalA = 'AA' + 'AA';\n" 8927 " var externalA = 'AA' + 'AA';\n"
9108 " A.change_str(externalA);\n" 8928 " A.change_str(externalA);\n"
9109 " for (var i = 0; i < 10000; i++) double_char0(externalA);\n" 8929 " for (var i = 0; i < 10000; i++) double_char0(externalA);\n"
9110 " var result = double_char0(externalA);\n" 8930 " var result = double_char0(externalA);\n"
9111 " return result == 130;\n" 8931 " return result == 130;\n"
9112 "}\n"; 8932 "}\n";
9113 Dart_Handle lib = 8933 Dart_Handle lib = TestCase::LoadTestScript(
9114 TestCase::LoadTestScript(kScriptChars, 8934 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9115 &ExternalStringDeoptimize_native_lookup); 8935 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9116 Dart_Handle result = Dart_Invoke(lib,
9117 NewString("main"),
9118 0,
9119 NULL);
9120 EXPECT_VALID(result); 8936 EXPECT_VALID(result);
9121 bool value = false; 8937 bool value = false;
9122 result = Dart_BooleanValue(result, &value); 8938 result = Dart_BooleanValue(result, &value);
9123 EXPECT_VALID(result); 8939 EXPECT_VALID(result);
9124 EXPECT(value); 8940 EXPECT(value);
9125 8941
9126 FLAG_support_externalizable_strings = saved_flag; 8942 FLAG_support_externalizable_strings = saved_flag;
9127 } 8943 }
9128 8944
9129 8945
(...skipping 19 matching lines...) Expand all
9149 " return compare(strA, b, i);\n" 8965 " return compare(strA, b, i);\n"
9150 "}\n" 8966 "}\n"
9151 "main() {\n" 8967 "main() {\n"
9152 " var externalA = 'AA' + 'AA';\n" 8968 " var externalA = 'AA' + 'AA';\n"
9153 " A.change_str(externalA);\n" 8969 " A.change_str(externalA);\n"
9154 " compare('AA' + 'AA', strA);\n" 8970 " compare('AA' + 'AA', strA);\n"
9155 " for (var i = 0; i < 10000; i++) compareA(strA);\n" 8971 " for (var i = 0; i < 10000; i++) compareA(strA);\n"
9156 " shouldExternalize = true;\n" 8972 " shouldExternalize = true;\n"
9157 " return compareA('AA' + 'AA');\n" 8973 " return compareA('AA' + 'AA');\n"
9158 "}\n"; 8974 "}\n";
9159 Dart_Handle lib = 8975 Dart_Handle lib = TestCase::LoadTestScript(
9160 TestCase::LoadTestScript(kScriptChars, 8976 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9161 &ExternalStringDeoptimize_native_lookup); 8977 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9162 Dart_Handle result = Dart_Invoke(lib,
9163 NewString("main"),
9164 0,
9165 NULL);
9166 EXPECT_VALID(result); 8978 EXPECT_VALID(result);
9167 bool value = false; 8979 bool value = false;
9168 result = Dart_BooleanValue(result, &value); 8980 result = Dart_BooleanValue(result, &value);
9169 EXPECT_VALID(result); 8981 EXPECT_VALID(result);
9170 EXPECT(value); 8982 EXPECT(value);
9171 8983
9172 FLAG_support_externalizable_strings = saved_flag; 8984 FLAG_support_externalizable_strings = saved_flag;
9173 } 8985 }
9174 8986
9175 8987
(...skipping 14 matching lines...) Expand all
9190 " return compare(G.f, b, i);\n" 9002 " return compare(G.f, b, i);\n"
9191 "}\n" 9003 "}\n"
9192 "main() {\n" 9004 "main() {\n"
9193 " var externalA = 'AA' + 'AA';\n" 9005 " var externalA = 'AA' + 'AA';\n"
9194 " A.change_str(externalA);\n" 9006 " A.change_str(externalA);\n"
9195 " compare('AA' + 'AA', strA);\n" 9007 " compare('AA' + 'AA', strA);\n"
9196 " for (var i = 0; i < 10000; i++) compareA(strA);\n" 9008 " for (var i = 0; i < 10000; i++) compareA(strA);\n"
9197 " A.change_str(G.f);" 9009 " A.change_str(G.f);"
9198 " return compareA('AA' + 'AA');\n" 9010 " return compareA('AA' + 'AA');\n"
9199 "}\n"; 9011 "}\n";
9200 Dart_Handle lib = 9012 Dart_Handle lib = TestCase::LoadTestScript(
9201 TestCase::LoadTestScript(kScriptChars, 9013 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9202 &ExternalStringDeoptimize_native_lookup); 9014 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9203 Dart_Handle result = Dart_Invoke(lib,
9204 NewString("main"),
9205 0,
9206 NULL);
9207 EXPECT_VALID(result); 9015 EXPECT_VALID(result);
9208 bool value = false; 9016 bool value = false;
9209 result = Dart_BooleanValue(result, &value); 9017 result = Dart_BooleanValue(result, &value);
9210 EXPECT_VALID(result); 9018 EXPECT_VALID(result);
9211 EXPECT(value); 9019 EXPECT(value);
9212 9020
9213 FLAG_support_externalizable_strings = saved_flag; 9021 FLAG_support_externalizable_strings = saved_flag;
9214 } 9022 }
9215 9023
9216 9024
9217 TEST_CASE(ExternalStringTrimDoubleParse) { 9025 TEST_CASE(ExternalStringTrimDoubleParse) {
9218 const bool saved_flag = FLAG_support_externalizable_strings; 9026 const bool saved_flag = FLAG_support_externalizable_strings;
9219 FLAG_support_externalizable_strings = true; 9027 FLAG_support_externalizable_strings = true;
9220 9028
9221 const char* kScriptChars = 9029 const char* kScriptChars =
9222 "String str = 'A';\n" 9030 "String str = 'A';\n"
9223 "class A {\n" 9031 "class A {\n"
9224 " static change_str(String s) native 'A_change_str';\n" 9032 " static change_str(String s) native 'A_change_str';\n"
9225 "}\n" 9033 "}\n"
9226 "main() {\n" 9034 "main() {\n"
9227 " var externalOneByteString = ' 0.2\\xA0 ';\n;" 9035 " var externalOneByteString = ' 0.2\\xA0 ';\n;"
9228 " A.change_str(externalOneByteString);\n" 9036 " A.change_str(externalOneByteString);\n"
9229 " var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n" 9037 " var externalTwoByteString = ' \\u{2029}0.6\\u{2029} ';\n"
9230 " A.change_str(externalTwoByteString);\n" 9038 " A.change_str(externalTwoByteString);\n"
9231 " var x = double.parse(externalOneByteString);\n" 9039 " var x = double.parse(externalOneByteString);\n"
9232 " var y = double.parse(externalTwoByteString);\n" 9040 " var y = double.parse(externalTwoByteString);\n"
9233 " return ((x + y) * 10).toInt();\n" 9041 " return ((x + y) * 10).toInt();\n"
9234 "}\n"; 9042 "}\n";
9235 Dart_Handle lib = 9043 Dart_Handle lib = TestCase::LoadTestScript(
9236 TestCase::LoadTestScript(kScriptChars, 9044 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9237 &ExternalStringDeoptimize_native_lookup); 9045 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9238 Dart_Handle result = Dart_Invoke(lib,
9239 NewString("main"),
9240 0,
9241 NULL);
9242 int64_t value = 0; 9046 int64_t value = 0;
9243 result = Dart_IntegerToInt64(result, &value); 9047 result = Dart_IntegerToInt64(result, &value);
9244 EXPECT_VALID(result); 9048 EXPECT_VALID(result);
9245 EXPECT_EQ(8, value); 9049 EXPECT_EQ(8, value);
9246 9050
9247 FLAG_support_externalizable_strings = saved_flag; 9051 FLAG_support_externalizable_strings = saved_flag;
9248 } 9052 }
9249 9053
9250 9054
9251 TEST_CASE(ExternalStringDoubleParse) { 9055 TEST_CASE(ExternalStringDoubleParse) {
9252 const bool saved_flag = FLAG_support_externalizable_strings; 9056 const bool saved_flag = FLAG_support_externalizable_strings;
9253 FLAG_support_externalizable_strings = true; 9057 FLAG_support_externalizable_strings = true;
9254 9058
9255 const char* kScriptChars = 9059 const char* kScriptChars =
9256 "String str = 'A';\n" 9060 "String str = 'A';\n"
9257 "class A {\n" 9061 "class A {\n"
9258 " static change_str(String s) native 'A_change_str';\n" 9062 " static change_str(String s) native 'A_change_str';\n"
9259 "}\n" 9063 "}\n"
9260 "main() {\n" 9064 "main() {\n"
9261 " var externalOneByteString = '0.2';\n;" 9065 " var externalOneByteString = '0.2';\n;"
9262 " A.change_str(externalOneByteString);\n" 9066 " A.change_str(externalOneByteString);\n"
9263 " var externalTwoByteString = '0.6';\n" 9067 " var externalTwoByteString = '0.6';\n"
9264 " A.change_str(externalTwoByteString);\n" 9068 " A.change_str(externalTwoByteString);\n"
9265 " var x = double.parse(externalOneByteString);\n" 9069 " var x = double.parse(externalOneByteString);\n"
9266 " var y = double.parse(externalTwoByteString);\n" 9070 " var y = double.parse(externalTwoByteString);\n"
9267 " return ((x + y) * 10).toInt();\n" 9071 " return ((x + y) * 10).toInt();\n"
9268 "}\n"; 9072 "}\n";
9269 Dart_Handle lib = 9073 Dart_Handle lib = TestCase::LoadTestScript(
9270 TestCase::LoadTestScript(kScriptChars, 9074 kScriptChars, &ExternalStringDeoptimize_native_lookup);
9271 &ExternalStringDeoptimize_native_lookup); 9075 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9272 Dart_Handle result = Dart_Invoke(lib,
9273 NewString("main"),
9274 0,
9275 NULL);
9276 int64_t value = 0; 9076 int64_t value = 0;
9277 result = Dart_IntegerToInt64(result, &value); 9077 result = Dart_IntegerToInt64(result, &value);
9278 EXPECT_VALID(result); 9078 EXPECT_VALID(result);
9279 EXPECT_EQ(8, value); 9079 EXPECT_EQ(8, value);
9280 9080
9281 FLAG_support_externalizable_strings = saved_flag; 9081 FLAG_support_externalizable_strings = saved_flag;
9282 } 9082 }
9283 9083
9284 9084
9285 TEST_CASE(ExternalStringIndexOf) { 9085 TEST_CASE(ExternalStringIndexOf) {
9286 const char* kScriptChars = 9086 const char* kScriptChars =
9287 "main(String pattern) {\n" 9087 "main(String pattern) {\n"
9288 " var str = 'Hello World';\n" 9088 " var str = 'Hello World';\n"
9289 " return str.indexOf(pattern);\n" 9089 " return str.indexOf(pattern);\n"
9290 "}\n"; 9090 "}\n";
9291 Dart_Handle lib = 9091 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9292 TestCase::LoadTestScript(kScriptChars, NULL);
9293 9092
9294 uint8_t data8[] = { 'W' }; 9093 uint8_t data8[] = {'W'};
9295 Dart_Handle ext8 = Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), 9094 Dart_Handle ext8 =
9296 data8, NULL); 9095 Dart_NewExternalLatin1String(data8, ARRAY_SIZE(data8), data8, NULL);
9297 EXPECT_VALID(ext8); 9096 EXPECT_VALID(ext8);
9298 EXPECT(Dart_IsString(ext8)); 9097 EXPECT(Dart_IsString(ext8));
9299 EXPECT(Dart_IsExternalString(ext8)); 9098 EXPECT(Dart_IsExternalString(ext8));
9300 9099
9301 Dart_Handle dart_args[1]; 9100 Dart_Handle dart_args[1];
9302 dart_args[0] = ext8; 9101 dart_args[0] = ext8;
9303 Dart_Handle result = Dart_Invoke(lib, 9102 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 1, dart_args);
9304 NewString("main"),
9305 1,
9306 dart_args);
9307 int64_t value = 0; 9103 int64_t value = 0;
9308 result = Dart_IntegerToInt64(result, &value); 9104 result = Dart_IntegerToInt64(result, &value);
9309 EXPECT_VALID(result); 9105 EXPECT_VALID(result);
9310 EXPECT_EQ(6, value); 9106 EXPECT_EQ(6, value);
9311 } 9107 }
9312 9108
9313 9109
9314 TEST_CASE(StringFromExternalTypedData) { 9110 TEST_CASE(StringFromExternalTypedData) {
9315 const char* kScriptChars = 9111 const char* kScriptChars =
9316 "test(external) {\n" 9112 "test(external) {\n"
9317 " var str1 = new String.fromCharCodes(external);\n" 9113 " var str1 = new String.fromCharCodes(external);\n"
9318 " var str2 = new String.fromCharCodes(new List.from(external));\n" 9114 " var str2 = new String.fromCharCodes(new List.from(external));\n"
9319 " if (str2 != str1) throw 'FAIL';\n" 9115 " if (str2 != str1) throw 'FAIL';\n"
9320 " return str1;\n" 9116 " return str1;\n"
9321 "}\n" 9117 "}\n"
9322 "testView8(external) {\n" 9118 "testView8(external) {\n"
9323 " return test(external.buffer.asUint8List());\n" 9119 " return test(external.buffer.asUint8List());\n"
9324 "}\n" 9120 "}\n"
9325 "testView16(external) {\n" 9121 "testView16(external) {\n"
9326 " return test(external.buffer.asUint16List());\n" 9122 " return test(external.buffer.asUint16List());\n"
9327 "}\n"; 9123 "}\n";
9328 Dart_Handle lib = 9124 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9329 TestCase::LoadTestScript(kScriptChars, NULL);
9330 9125
9331 { 9126 {
9332 uint8_t data[64]; 9127 uint8_t data[64];
9333 for (int i = 0; i < 64; i++) { 9128 for (int i = 0; i < 64; i++) {
9334 data[i] = i * 4; 9129 data[i] = i * 4;
9335 } 9130 }
9336 // LATIN-1 in external Uint8List. 9131 // LATIN-1 in external Uint8List.
9337 Dart_Handle external = Dart_NewExternalTypedData( 9132 Dart_Handle external =
9338 Dart_TypedData_kUint8, data, 64); 9133 Dart_NewExternalTypedData(Dart_TypedData_kUint8, data, 64);
9339 EXPECT_VALID(external); 9134 EXPECT_VALID(external);
9340 Dart_Handle dart_args[1]; 9135 Dart_Handle dart_args[1];
9341 dart_args[0] = external; 9136 dart_args[0] = external;
9342 Dart_Handle result = Dart_Invoke(lib, 9137 Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args);
9343 NewString("test"),
9344 1,
9345 dart_args);
9346 EXPECT_VALID(result); 9138 EXPECT_VALID(result);
9347 EXPECT(Dart_IsString(result)); 9139 EXPECT(Dart_IsString(result));
9348 9140
9349 result = Dart_Invoke(lib, 9141 result = Dart_Invoke(lib, NewString("testView8"), 1, dart_args);
9350 NewString("testView8"),
9351 1,
9352 dart_args);
9353 EXPECT_VALID(result); 9142 EXPECT_VALID(result);
9354 EXPECT(Dart_IsString(result)); 9143 EXPECT(Dart_IsString(result));
9355 } 9144 }
9356 9145
9357 { 9146 {
9358 uint16_t data[64]; 9147 uint16_t data[64];
9359 for (int i = 0; i < 64; i++) { 9148 for (int i = 0; i < 64; i++) {
9360 data[i] = i * 4; 9149 data[i] = i * 4;
9361 } 9150 }
9362 // LATIN-1 in external Uint16List. 9151 // LATIN-1 in external Uint16List.
9363 Dart_Handle external = Dart_NewExternalTypedData( 9152 Dart_Handle external =
9364 Dart_TypedData_kUint16, data, 64); 9153 Dart_NewExternalTypedData(Dart_TypedData_kUint16, data, 64);
9365 EXPECT_VALID(external); 9154 EXPECT_VALID(external);
9366 Dart_Handle dart_args[1]; 9155 Dart_Handle dart_args[1];
9367 dart_args[0] = external; 9156 dart_args[0] = external;
9368 Dart_Handle result = Dart_Invoke(lib, 9157 Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args);
9369 NewString("test"),
9370 1,
9371 dart_args);
9372 EXPECT_VALID(result); 9158 EXPECT_VALID(result);
9373 EXPECT(Dart_IsString(result)); 9159 EXPECT(Dart_IsString(result));
9374 9160
9375 result = Dart_Invoke(lib, 9161 result = Dart_Invoke(lib, NewString("testView16"), 1, dart_args);
9376 NewString("testView16"),
9377 1,
9378 dart_args);
9379 EXPECT_VALID(result); 9162 EXPECT_VALID(result);
9380 EXPECT(Dart_IsString(result)); 9163 EXPECT(Dart_IsString(result));
9381 } 9164 }
9382 9165
9383 { 9166 {
9384 uint16_t data[64]; 9167 uint16_t data[64];
9385 for (int i = 0; i < 64; i++) { 9168 for (int i = 0; i < 64; i++) {
9386 data[i] = 0x2000 + i * 4; 9169 data[i] = 0x2000 + i * 4;
9387 } 9170 }
9388 // Non-LATIN-1 in external Uint16List. 9171 // Non-LATIN-1 in external Uint16List.
9389 Dart_Handle external = Dart_NewExternalTypedData( 9172 Dart_Handle external =
9390 Dart_TypedData_kUint16, data, 64); 9173 Dart_NewExternalTypedData(Dart_TypedData_kUint16, data, 64);
9391 EXPECT_VALID(external); 9174 EXPECT_VALID(external);
9392 Dart_Handle dart_args[1]; 9175 Dart_Handle dart_args[1];
9393 dart_args[0] = external; 9176 dart_args[0] = external;
9394 Dart_Handle result = Dart_Invoke(lib, 9177 Dart_Handle result = Dart_Invoke(lib, NewString("test"), 1, dart_args);
9395 NewString("test"),
9396 1,
9397 dart_args);
9398 EXPECT_VALID(result); 9178 EXPECT_VALID(result);
9399 EXPECT(Dart_IsString(result)); 9179 EXPECT(Dart_IsString(result));
9400 9180
9401 result = Dart_Invoke(lib, 9181 result = Dart_Invoke(lib, NewString("testView16"), 1, dart_args);
9402 NewString("testView16"),
9403 1,
9404 dart_args);
9405 EXPECT_VALID(result); 9182 EXPECT_VALID(result);
9406 EXPECT(Dart_IsString(result)); 9183 EXPECT(Dart_IsString(result));
9407 } 9184 }
9408 } 9185 }
9409 9186
9410 9187
9411 #ifndef PRODUCT 9188 #ifndef PRODUCT
9412 9189
9413 9190
9414 TEST_CASE(Timeline_Dart_TimelineDuration) { 9191 TEST_CASE(Timeline_Dart_TimelineDuration) {
9415 Isolate* isolate = Isolate::Current(); 9192 Isolate* isolate = Isolate::Current();
9416 // Grab embedder stream. 9193 // Grab embedder stream.
9417 TimelineStream* stream = Timeline::GetEmbedderStream(); 9194 TimelineStream* stream = Timeline::GetEmbedderStream();
9418 // Make sure it is enabled. 9195 // Make sure it is enabled.
9419 stream->set_enabled(true); 9196 stream->set_enabled(true);
9420 // Add a duration event. 9197 // Add a duration event.
9421 Dart_TimelineEvent("testDurationEvent", 9198 Dart_TimelineEvent("testDurationEvent", 0, 1, Dart_Timeline_Event_Duration, 0,
9422 0, 9199 NULL, NULL);
9423 1,
9424 Dart_Timeline_Event_Duration,
9425 0, NULL, NULL);
9426 // Check that it is in the output. 9200 // Check that it is in the output.
9427 TimelineEventRecorder* recorder = Timeline::recorder(); 9201 TimelineEventRecorder* recorder = Timeline::recorder();
9428 Timeline::ReclaimCachedBlocksFromThreads(); 9202 Timeline::ReclaimCachedBlocksFromThreads();
9429 JSONStream js; 9203 JSONStream js;
9430 IsolateTimelineEventFilter filter(isolate->main_port()); 9204 IsolateTimelineEventFilter filter(isolate->main_port());
9431 recorder->PrintJSON(&js, &filter); 9205 recorder->PrintJSON(&js, &filter);
9432 EXPECT_SUBSTRING("testDurationEvent", js.ToCString()); 9206 EXPECT_SUBSTRING("testDurationEvent", js.ToCString());
9433 } 9207 }
9434 9208
9435 9209
9436 TEST_CASE(Timeline_Dart_TimelineInstant) { 9210 TEST_CASE(Timeline_Dart_TimelineInstant) {
9437 Isolate* isolate = Isolate::Current(); 9211 Isolate* isolate = Isolate::Current();
9438 // Grab embedder stream. 9212 // Grab embedder stream.
9439 TimelineStream* stream = Timeline::GetEmbedderStream(); 9213 TimelineStream* stream = Timeline::GetEmbedderStream();
9440 // Make sure it is enabled. 9214 // Make sure it is enabled.
9441 stream->set_enabled(true); 9215 stream->set_enabled(true);
9442 Dart_TimelineEvent("testInstantEvent", 9216 Dart_TimelineEvent("testInstantEvent", 0, 1, Dart_Timeline_Event_Instant, 0,
9443 0, 9217 NULL, NULL);
9444 1,
9445 Dart_Timeline_Event_Instant,
9446 0, NULL, NULL);
9447 // Check that it is in the output. 9218 // Check that it is in the output.
9448 TimelineEventRecorder* recorder = Timeline::recorder(); 9219 TimelineEventRecorder* recorder = Timeline::recorder();
9449 Timeline::ReclaimCachedBlocksFromThreads(); 9220 Timeline::ReclaimCachedBlocksFromThreads();
9450 JSONStream js; 9221 JSONStream js;
9451 IsolateTimelineEventFilter filter(isolate->main_port()); 9222 IsolateTimelineEventFilter filter(isolate->main_port());
9452 recorder->PrintJSON(&js, &filter); 9223 recorder->PrintJSON(&js, &filter);
9453 EXPECT_SUBSTRING("testInstantEvent", js.ToCString()); 9224 EXPECT_SUBSTRING("testInstantEvent", js.ToCString());
9454 } 9225 }
9455 9226
9456 9227
9457 TEST_CASE(Timeline_Dart_TimelineAsyncDisabled) { 9228 TEST_CASE(Timeline_Dart_TimelineAsyncDisabled) {
9458 // Grab embedder stream. 9229 // Grab embedder stream.
9459 TimelineStream* stream = Timeline::GetEmbedderStream(); 9230 TimelineStream* stream = Timeline::GetEmbedderStream();
9460 // Make sure it is disabled. 9231 // Make sure it is disabled.
9461 stream->set_enabled(false); 9232 stream->set_enabled(false);
9462 int64_t async_id = 99; 9233 int64_t async_id = 99;
9463 Dart_TimelineEvent("testAsyncEvent", 9234 Dart_TimelineEvent("testAsyncEvent", 0, async_id,
9464 0, 9235 Dart_Timeline_Event_Async_Begin, 0, NULL, NULL);
9465 async_id,
9466 Dart_Timeline_Event_Async_Begin,
9467 0, NULL, NULL);
9468 // Check that testAsync is not in the output. 9236 // Check that testAsync is not in the output.
9469 TimelineEventRecorder* recorder = Timeline::recorder(); 9237 TimelineEventRecorder* recorder = Timeline::recorder();
9470 Timeline::ReclaimCachedBlocksFromThreads(); 9238 Timeline::ReclaimCachedBlocksFromThreads();
9471 JSONStream js; 9239 JSONStream js;
9472 TimelineEventFilter filter; 9240 TimelineEventFilter filter;
9473 recorder->PrintJSON(&js, &filter); 9241 recorder->PrintJSON(&js, &filter);
9474 EXPECT_NOTSUBSTRING("testAsyncEvent", js.ToCString()); 9242 EXPECT_NOTSUBSTRING("testAsyncEvent", js.ToCString());
9475 } 9243 }
9476 9244
9477 9245
9478 TEST_CASE(Timeline_Dart_TimelineAsync) { 9246 TEST_CASE(Timeline_Dart_TimelineAsync) {
9479 Isolate* isolate = Isolate::Current(); 9247 Isolate* isolate = Isolate::Current();
9480 // Grab embedder stream. 9248 // Grab embedder stream.
9481 TimelineStream* stream = Timeline::GetEmbedderStream(); 9249 TimelineStream* stream = Timeline::GetEmbedderStream();
9482 // Make sure it is enabled. 9250 // Make sure it is enabled.
9483 stream->set_enabled(true); 9251 stream->set_enabled(true);
9484 int64_t async_id = 99; 9252 int64_t async_id = 99;
9485 Dart_TimelineEvent("testAsyncEvent", 9253 Dart_TimelineEvent("testAsyncEvent", 0, async_id,
9486 0, 9254 Dart_Timeline_Event_Async_Begin, 0, NULL, NULL);
9487 async_id,
9488 Dart_Timeline_Event_Async_Begin,
9489 0, NULL, NULL);
9490 9255
9491 // Check that it is in the output. 9256 // Check that it is in the output.
9492 TimelineEventRecorder* recorder = Timeline::recorder(); 9257 TimelineEventRecorder* recorder = Timeline::recorder();
9493 Timeline::ReclaimCachedBlocksFromThreads(); 9258 Timeline::ReclaimCachedBlocksFromThreads();
9494 JSONStream js; 9259 JSONStream js;
9495 IsolateTimelineEventFilter filter(isolate->main_port()); 9260 IsolateTimelineEventFilter filter(isolate->main_port());
9496 recorder->PrintJSON(&js, &filter); 9261 recorder->PrintJSON(&js, &filter);
9497 EXPECT_SUBSTRING("testAsyncEvent", js.ToCString()); 9262 EXPECT_SUBSTRING("testAsyncEvent", js.ToCString());
9498 } 9263 }
9499 9264
(...skipping 18 matching lines...) Expand all
9518 data->buffer = NULL; 9283 data->buffer = NULL;
9519 data->buffer_length = 0; 9284 data->buffer_length = 0;
9520 return; 9285 return;
9521 } 9286 }
9522 ASSERT(state == Dart_StreamConsumer_kData); 9287 ASSERT(state == Dart_StreamConsumer_kData);
9523 9288
9524 // Grow buffer. 9289 // Grow buffer.
9525 data->buffer = reinterpret_cast<uint8_t*>( 9290 data->buffer = reinterpret_cast<uint8_t*>(
9526 realloc(data->buffer, data->buffer_length + buffer_length)); 9291 realloc(data->buffer, data->buffer_length + buffer_length));
9527 // Copy new data. 9292 // Copy new data.
9528 memmove(&data->buffer[data->buffer_length], 9293 memmove(&data->buffer[data->buffer_length], buffer, buffer_length);
9529 buffer,
9530 buffer_length);
9531 // Update length. 9294 // Update length.
9532 data->buffer_length += buffer_length; 9295 data->buffer_length += buffer_length;
9533 } 9296 }
9534 9297
9535 9298
9536 TEST_CASE(Timeline_Dart_TimelineGetTrace) { 9299 TEST_CASE(Timeline_Dart_TimelineGetTrace) {
9537 const char* kScriptChars = 9300 const char* kScriptChars =
9538 "foo() => 'a';\n" 9301 "foo() => 'a';\n"
9539 "main() => foo();\n"; 9302 "main() => foo();\n";
9540 9303
9541 Dart_Handle lib = 9304 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9542 TestCase::LoadTestScript(kScriptChars, NULL);
9543 9305
9544 const char* buffer = NULL; 9306 const char* buffer = NULL;
9545 intptr_t buffer_length = 0; 9307 intptr_t buffer_length = 0;
9546 bool success = false; 9308 bool success = false;
9547 9309
9548 // Enable recording of all streams. 9310 // Enable recording of all streams.
9549 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL); 9311 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL);
9550 9312
9551 // Invoke main, which will be compiled resulting in a compiler event in 9313 // Invoke main, which will be compiled resulting in a compiler event in
9552 // the timeline. 9314 // the timeline.
9553 Dart_Handle result = Dart_Invoke(lib, 9315 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9554 NewString("main"),
9555 0,
9556 NULL);
9557 EXPECT_VALID(result); 9316 EXPECT_VALID(result);
9558 9317
9559 // Grab the trace. 9318 // Grab the trace.
9560 AppendData data; 9319 AppendData data;
9561 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data); 9320 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data);
9562 EXPECT(success); 9321 EXPECT(success);
9563 buffer = reinterpret_cast<char*>(data.buffer); 9322 buffer = reinterpret_cast<char*>(data.buffer);
9564 buffer_length = data.buffer_length; 9323 buffer_length = data.buffer_length;
9565 EXPECT(buffer_length > 0); 9324 EXPECT(buffer_length > 0);
9566 EXPECT(buffer != NULL); 9325 EXPECT(buffer != NULL);
9567 9326
9568 // Response starts with a '{' character and not a '['. 9327 // Response starts with a '{' character and not a '['.
9569 EXPECT(buffer[0] == '{'); 9328 EXPECT(buffer[0] == '{');
9570 // Response ends with a '}' character and not a ']'. 9329 // Response ends with a '}' character and not a ']'.
9571 EXPECT(buffer[buffer_length - 1] == '\0'); 9330 EXPECT(buffer[buffer_length - 1] == '\0');
9572 EXPECT(buffer[buffer_length - 2] == '}'); 9331 EXPECT(buffer[buffer_length - 2] == '}');
9573 9332
9574 // Heartbeat test. 9333 // Heartbeat test.
9575 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer); 9334 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
9576 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer); 9335 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
9577 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer); 9336 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
9578 9337
9579 // Free buffer allocated by AppendStreamConsumer 9338 // Free buffer allocated by AppendStreamConsumer
9580 free(data.buffer); 9339 free(data.buffer);
9581 } 9340 }
9582 9341
9583 9342
9584 TEST_CASE(Timeline_Dart_TimelineGetTraceOnlyDartEvents) { 9343 TEST_CASE(Timeline_Dart_TimelineGetTraceOnlyDartEvents) {
9585 const char* kScriptChars = 9344 const char* kScriptChars =
9586 "import 'dart:developer';\n" 9345 "import 'dart:developer';\n"
9587 "" 9346 ""
9588 "main() {\n" 9347 "main() {\n"
9589 " Timeline.startSync('DART_NAME');\n" 9348 " Timeline.startSync('DART_NAME');\n"
9590 " Timeline.finishSync();\n" 9349 " Timeline.finishSync();\n"
9591 "}\n"; 9350 "}\n";
9592 9351
9593 Dart_Handle lib = 9352 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9594 TestCase::LoadTestScript(kScriptChars, NULL);
9595 9353
9596 const char* buffer = NULL; 9354 const char* buffer = NULL;
9597 intptr_t buffer_length = 0; 9355 intptr_t buffer_length = 0;
9598 bool success = false; 9356 bool success = false;
9599 9357
9600 // Enable recording of the Dart stream. 9358 // Enable recording of the Dart stream.
9601 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_DART); 9359 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_DART);
9602 9360
9603 // Invoke main, which will add a new timeline event from Dart. 9361 // Invoke main, which will add a new timeline event from Dart.
9604 Dart_Handle result = Dart_Invoke(lib, 9362 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9605 NewString("main"),
9606 0,
9607 NULL);
9608 EXPECT_VALID(result); 9363 EXPECT_VALID(result);
9609 9364
9610 // Grab the trace. 9365 // Grab the trace.
9611 AppendData data; 9366 AppendData data;
9612 data.buffer = NULL; 9367 data.buffer = NULL;
9613 data.buffer_length = 0; 9368 data.buffer_length = 0;
9614 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data); 9369 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data);
9615 EXPECT(success); 9370 EXPECT(success);
9616 buffer = reinterpret_cast<char*>(data.buffer); 9371 buffer = reinterpret_cast<char*>(data.buffer);
9617 buffer_length = data.buffer_length; 9372 buffer_length = data.buffer_length;
(...skipping 10 matching lines...) Expand all
9628 EXPECT_SUBSTRING("\"cat\":\"Dart\"", buffer); 9383 EXPECT_SUBSTRING("\"cat\":\"Dart\"", buffer);
9629 EXPECT_SUBSTRING("\"name\":\"DART_NAME\"", buffer); 9384 EXPECT_SUBSTRING("\"name\":\"DART_NAME\"", buffer);
9630 9385
9631 // Free buffer allocated by AppendStreamConsumer 9386 // Free buffer allocated by AppendStreamConsumer
9632 free(data.buffer); 9387 free(data.buffer);
9633 } 9388 }
9634 9389
9635 9390
9636 TEST_CASE(Timeline_Dart_TimelineGetTraceWithDartEvents) { 9391 TEST_CASE(Timeline_Dart_TimelineGetTraceWithDartEvents) {
9637 const char* kScriptChars = 9392 const char* kScriptChars =
9638 "import 'dart:developer';\n" 9393 "import 'dart:developer';\n"
9639 "\n" 9394 "\n"
9640 "main() {\n" 9395 "main() {\n"
9641 " Timeline.startSync('DART_NAME');\n" 9396 " Timeline.startSync('DART_NAME');\n"
9642 " Timeline.finishSync();\n" 9397 " Timeline.finishSync();\n"
9643 "}\n"; 9398 "}\n";
9644 9399
9645 Dart_Handle lib = 9400 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9646 TestCase::LoadTestScript(kScriptChars, NULL);
9647 9401
9648 const char* buffer = NULL; 9402 const char* buffer = NULL;
9649 intptr_t buffer_length = 0; 9403 intptr_t buffer_length = 0;
9650 bool success = false; 9404 bool success = false;
9651 9405
9652 // Enable recording of all streams. 9406 // Enable recording of all streams.
9653 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL); 9407 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL);
9654 9408
9655 // Invoke main, which will be compiled resulting in a compiler event in 9409 // Invoke main, which will be compiled resulting in a compiler event in
9656 // the timeline. 9410 // the timeline.
9657 Dart_Handle result = Dart_Invoke(lib, 9411 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9658 NewString("main"),
9659 0,
9660 NULL);
9661 EXPECT_VALID(result); 9412 EXPECT_VALID(result);
9662 9413
9663 // Grab the trace. 9414 // Grab the trace.
9664 AppendData data; 9415 AppendData data;
9665 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data); 9416 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data);
9666 EXPECT(success); 9417 EXPECT(success);
9667 buffer = reinterpret_cast<char*>(data.buffer); 9418 buffer = reinterpret_cast<char*>(data.buffer);
9668 buffer_length = data.buffer_length; 9419 buffer_length = data.buffer_length;
9669 EXPECT(buffer_length > 0); 9420 EXPECT(buffer_length > 0);
9670 EXPECT(buffer != NULL); 9421 EXPECT(buffer != NULL);
(...skipping 10 matching lines...) Expand all
9681 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer); 9432 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
9682 EXPECT_SUBSTRING("\"cat\":\"Dart\"", buffer); 9433 EXPECT_SUBSTRING("\"cat\":\"Dart\"", buffer);
9683 EXPECT_SUBSTRING("\"name\":\"DART_NAME\"", buffer); 9434 EXPECT_SUBSTRING("\"name\":\"DART_NAME\"", buffer);
9684 9435
9685 // Free buffer allocated by AppendStreamConsumer 9436 // Free buffer allocated by AppendStreamConsumer
9686 free(data.buffer); 9437 free(data.buffer);
9687 } 9438 }
9688 9439
9689 TEST_CASE(Timeline_Dart_TimelineGetTraceGlobalOverride) { 9440 TEST_CASE(Timeline_Dart_TimelineGetTraceGlobalOverride) {
9690 const char* kScriptChars = 9441 const char* kScriptChars =
9691 "foo() => 'a';\n" 9442 "foo() => 'a';\n"
9692 "main() => foo();\n"; 9443 "main() => foo();\n";
9693 9444
9694 Dart_Handle lib = 9445 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
9695 TestCase::LoadTestScript(kScriptChars, NULL);
9696 9446
9697 const char* buffer = NULL; 9447 const char* buffer = NULL;
9698 intptr_t buffer_length = 0; 9448 intptr_t buffer_length = 0;
9699 bool success = false; 9449 bool success = false;
9700 9450
9701 // Enable recording of all streams across the entire vm. 9451 // Enable recording of all streams across the entire vm.
9702 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL); 9452 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL);
9703 9453
9704 // Invoke main, which will be compiled resulting in a compiler event in 9454 // Invoke main, which will be compiled resulting in a compiler event in
9705 // the timeline. 9455 // the timeline.
9706 Dart_Handle result = Dart_Invoke(lib, 9456 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9707 NewString("main"),
9708 0,
9709 NULL);
9710 EXPECT_VALID(result); 9457 EXPECT_VALID(result);
9711 9458
9712 // Grab the trace. 9459 // Grab the trace.
9713 AppendData data; 9460 AppendData data;
9714 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data); 9461 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data);
9715 EXPECT(success); 9462 EXPECT(success);
9716 buffer = reinterpret_cast<char*>(data.buffer); 9463 buffer = reinterpret_cast<char*>(data.buffer);
9717 buffer_length = data.buffer_length; 9464 buffer_length = data.buffer_length;
9718 EXPECT(buffer_length > 0); 9465 EXPECT(buffer_length > 0);
9719 EXPECT(buffer != NULL); 9466 EXPECT(buffer != NULL);
9720 9467
9721 // Response starts with a '{' character and not a '['. 9468 // Response starts with a '{' character and not a '['.
9722 EXPECT(buffer[0] == '{'); 9469 EXPECT(buffer[0] == '{');
9723 // Response ends with a '}' character and not a ']'. 9470 // Response ends with a '}' character and not a ']'.
9724 EXPECT(buffer[buffer_length - 1] == '\0'); 9471 EXPECT(buffer[buffer_length - 1] == '\0');
9725 EXPECT(buffer[buffer_length - 2] == '}'); 9472 EXPECT(buffer[buffer_length - 2] == '}');
9726 9473
9727 // Heartbeat test. 9474 // Heartbeat test.
9728 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer); 9475 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
9729 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer); 9476 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
9730 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer); 9477 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
9731 9478
9732 // Free buffer allocated by AppendStreamConsumer 9479 // Free buffer allocated by AppendStreamConsumer
9733 free(data.buffer); 9480 free(data.buffer);
9734 } 9481 }
9735 9482
9736 9483
9737 static const char* arg_names[] = { 9484 static const char* arg_names[] = {"arg0"};
9738 "arg0"
9739 };
9740 9485
9741 9486
9742 static const char* arg_values[] = { 9487 static const char* arg_values[] = {"value0"};
9743 "value0"
9744 };
9745 9488
9746 9489
9747 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) { 9490 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) {
9748 const char* kScriptChars = 9491 const char* kScriptChars =
9749 "bar() => 'z';\n" 9492 "bar() => 'z';\n"
9750 "foo() => 'a';\n" 9493 "foo() => 'a';\n"
9751 "main() => foo();\n"; 9494 "main() => foo();\n";
9752 9495
9753 // Enable all streams. 9496 // Enable all streams.
9754 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL | 9497 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL |
9755 DART_TIMELINE_STREAM_VM); 9498 DART_TIMELINE_STREAM_VM);
9756 Dart_Handle lib; 9499 Dart_Handle lib;
9757 { 9500 {
9758 // Add something to the VM stream. 9501 // Add something to the VM stream.
9759 TimelineDurationScope tds(Timeline::GetVMStream(), 9502 TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration");
9760 "TestVMDuration");
9761 lib = TestCase::LoadTestScript(kScriptChars, NULL); 9503 lib = TestCase::LoadTestScript(kScriptChars, NULL);
9762 } 9504 }
9763 9505
9764 { 9506 {
9765 // Add something to the embedder stream. 9507 // Add something to the embedder stream.
9766 Dart_TimelineEvent("TRACE_EVENT", 9508 Dart_TimelineEvent("TRACE_EVENT", Dart_TimelineGetMicros(), 0,
9767 Dart_TimelineGetMicros(), 9509 Dart_Timeline_Event_Begin, 1, &arg_names[0],
9768 0,
9769 Dart_Timeline_Event_Begin,
9770 1,
9771 &arg_names[0],
9772 &arg_values[0]); 9510 &arg_values[0]);
9773 // Add counter to the embedder stream. 9511 // Add counter to the embedder stream.
9774 Dart_TimelineEvent("COUNTER_EVENT", 9512 Dart_TimelineEvent("COUNTER_EVENT", Dart_TimelineGetMicros(), 0,
9775 Dart_TimelineGetMicros(), 9513 Dart_Timeline_Event_Counter, 0, NULL, NULL);
9776 0,
9777 Dart_Timeline_Event_Counter,
9778 0,
9779 NULL,
9780 NULL);
9781 Dart_SetThreadName("CUSTOM THREAD NAME"); 9514 Dart_SetThreadName("CUSTOM THREAD NAME");
9782 } 9515 }
9783 9516
9784 // Invoke main, which will be compiled resulting in a compiler event in 9517 // Invoke main, which will be compiled resulting in a compiler event in
9785 // the timeline. 9518 // the timeline.
9786 Dart_Handle result = Dart_Invoke(lib, 9519 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9787 NewString("main"),
9788 0,
9789 NULL);
9790 EXPECT_VALID(result); 9520 EXPECT_VALID(result);
9791 9521
9792 const char* buffer = NULL; 9522 const char* buffer = NULL;
9793 intptr_t buffer_length = 0; 9523 intptr_t buffer_length = 0;
9794 bool success = false; 9524 bool success = false;
9795 9525
9796 // Grab the global trace. 9526 // Grab the global trace.
9797 AppendData data; 9527 AppendData data;
9798 { 9528 {
9799 Thread* T = Thread::Current(); 9529 Thread* T = Thread::Current();
(...skipping 29 matching lines...) Expand all
9829 // Free buffer allocated by AppendStreamConsumer 9559 // Free buffer allocated by AppendStreamConsumer
9830 free(data.buffer); 9560 free(data.buffer);
9831 data.buffer = NULL; 9561 data.buffer = NULL;
9832 data.buffer_length = 0; 9562 data.buffer_length = 0;
9833 9563
9834 // Retrieving the global trace resulted in all open blocks being reclaimed. 9564 // Retrieving the global trace resulted in all open blocks being reclaimed.
9835 // Add some new events and verify that both sets of events are present 9565 // Add some new events and verify that both sets of events are present
9836 // in the resulting trace. 9566 // in the resulting trace.
9837 { 9567 {
9838 // Add something to the VM stream. 9568 // Add something to the VM stream.
9839 TimelineDurationScope tds(Timeline::GetVMStream(), 9569 TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration2");
9840 "TestVMDuration2");
9841 // Invoke bar, which will be compiled resulting in a compiler event in 9570 // Invoke bar, which will be compiled resulting in a compiler event in
9842 // the timeline. 9571 // the timeline.
9843 result = Dart_Invoke(lib, 9572 result = Dart_Invoke(lib, NewString("bar"), 0, NULL);
9844 NewString("bar"),
9845 0,
9846 NULL);
9847 } 9573 }
9848 9574
9849 // Grab the global trace. 9575 // Grab the global trace.
9850 { 9576 {
9851 Thread* T = Thread::Current(); 9577 Thread* T = Thread::Current();
9852 StackZone zone(T); 9578 StackZone zone(T);
9853 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data); 9579 success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data);
9854 EXPECT(success); 9580 EXPECT(success);
9855 EXPECT(zone.SizeInBytes() == 0); 9581 EXPECT(zone.SizeInBytes() == 0);
9856 } 9582 }
(...skipping 18 matching lines...) Expand all
9875 EXPECT_SUBSTRING("\"function\":\"::_bar\"", buffer); 9601 EXPECT_SUBSTRING("\"function\":\"::_bar\"", buffer);
9876 9602
9877 // Free buffer allocated by AppendStreamConsumer 9603 // Free buffer allocated by AppendStreamConsumer
9878 free(data.buffer); 9604 free(data.buffer);
9879 } 9605 }
9880 9606
9881 9607
9882 class GlobalTimelineThreadData { 9608 class GlobalTimelineThreadData {
9883 public: 9609 public:
9884 GlobalTimelineThreadData() 9610 GlobalTimelineThreadData()
9885 : monitor_(new Monitor()), 9611 : monitor_(new Monitor()), data_(new AppendData()), running_(true) {}
9886 data_(new AppendData()),
9887 running_(true) {
9888 }
9889 9612
9890 ~GlobalTimelineThreadData() { 9613 ~GlobalTimelineThreadData() {
9891 delete monitor_; 9614 delete monitor_;
9892 monitor_ = NULL; 9615 monitor_ = NULL;
9893 free(data_->buffer); 9616 free(data_->buffer);
9894 data_->buffer = NULL; 9617 data_->buffer = NULL;
9895 data_->buffer_length = 0; 9618 data_->buffer_length = 0;
9896 delete data_; 9619 delete data_;
9897 data_ = NULL; 9620 data_ = NULL;
9898 } 9621 }
(...skipping 29 matching lines...) Expand all
9928 } 9651 }
9929 } 9652 }
9930 9653
9931 9654
9932 // This test is the same as the one above except that the calls to 9655 // This test is the same as the one above except that the calls to
9933 // Dart_GlobalTimelineGetTrace are made from a fresh thread. This ensures that 9656 // Dart_GlobalTimelineGetTrace are made from a fresh thread. This ensures that
9934 // we can call the function from a thread for which we have not set up a 9657 // we can call the function from a thread for which we have not set up a
9935 // Thread object. 9658 // Thread object.
9936 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace_Threaded) { 9659 TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace_Threaded) {
9937 const char* kScriptChars = 9660 const char* kScriptChars =
9938 "bar() => 'z';\n" 9661 "bar() => 'z';\n"
9939 "foo() => 'a';\n" 9662 "foo() => 'a';\n"
9940 "main() => foo();\n"; 9663 "main() => foo();\n";
9941 9664
9942 // Enable all streams. 9665 // Enable all streams.
9943 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL | 9666 Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL |
9944 DART_TIMELINE_STREAM_VM); 9667 DART_TIMELINE_STREAM_VM);
9945 Dart_Handle lib; 9668 Dart_Handle lib;
9946 { 9669 {
9947 // Add something to the VM stream. 9670 // Add something to the VM stream.
9948 TimelineDurationScope tds(Timeline::GetVMStream(), 9671 TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration");
9949 "TestVMDuration");
9950 lib = TestCase::LoadTestScript(kScriptChars, NULL); 9672 lib = TestCase::LoadTestScript(kScriptChars, NULL);
9951 } 9673 }
9952 9674
9953 // Invoke main, which will be compiled resulting in a compiler event in 9675 // Invoke main, which will be compiled resulting in a compiler event in
9954 // the timeline. 9676 // the timeline.
9955 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); 9677 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
9956 EXPECT_VALID(result); 9678 EXPECT_VALID(result);
9957 9679
9958 const char* buffer = NULL; 9680 const char* buffer = NULL;
9959 intptr_t buffer_length = 0; 9681 intptr_t buffer_length = 0;
9960 9682
9961 // Run Dart_GlobalTimelineGetTrace on a fresh thread. 9683 // Run Dart_GlobalTimelineGetTrace on a fresh thread.
9962 GlobalTimelineThreadData data; 9684 GlobalTimelineThreadData data;
9963 int err = OSThread::Start("Timeline test thread", 9685 int err = OSThread::Start("Timeline test thread", GlobalTimelineThread,
9964 GlobalTimelineThread, reinterpret_cast<uword>(&data)); 9686 reinterpret_cast<uword>(&data));
9965 EXPECT(err == 0); 9687 EXPECT(err == 0);
9966 { 9688 {
9967 MonitorLocker ml(data.monitor()); 9689 MonitorLocker ml(data.monitor());
9968 while (data.running()) { 9690 while (data.running()) {
9969 ml.Wait(); 9691 ml.Wait();
9970 } 9692 }
9971 buffer = reinterpret_cast<char*>(data.buffer()); 9693 buffer = reinterpret_cast<char*>(data.buffer());
9972 buffer_length = data.buffer_length(); 9694 buffer_length = data.buffer_length();
9973 } 9695 }
9974 EXPECT(buffer_length > 0); 9696 EXPECT(buffer_length > 0);
(...skipping 10 matching lines...) Expand all
9985 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer); 9707 EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
9986 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer); 9708 EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
9987 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer); 9709 EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
9988 EXPECT_NOTSUBSTRING("\"function\":\"::_bar\"", buffer); 9710 EXPECT_NOTSUBSTRING("\"function\":\"::_bar\"", buffer);
9989 9711
9990 // Retrieving the global trace resulted in all open blocks being reclaimed. 9712 // Retrieving the global trace resulted in all open blocks being reclaimed.
9991 // Add some new events and verify that both sets of events are present 9713 // Add some new events and verify that both sets of events are present
9992 // in the resulting trace. 9714 // in the resulting trace.
9993 { 9715 {
9994 // Add something to the VM stream. 9716 // Add something to the VM stream.
9995 TimelineDurationScope tds(Timeline::GetVMStream(), 9717 TimelineDurationScope tds(Timeline::GetVMStream(), "TestVMDuration2");
9996 "TestVMDuration2");
9997 // Invoke bar, which will be compiled resulting in a compiler event in 9718 // Invoke bar, which will be compiled resulting in a compiler event in
9998 // the timeline. 9719 // the timeline.
9999 result = Dart_Invoke(lib, NewString("bar"), 0, NULL); 9720 result = Dart_Invoke(lib, NewString("bar"), 0, NULL);
10000 } 9721 }
10001 9722
10002 // Grab the global trace. 9723 // Grab the global trace.
10003 GlobalTimelineThreadData data2; 9724 GlobalTimelineThreadData data2;
10004 err = OSThread::Start("Timeline test thread", 9725 err = OSThread::Start("Timeline test thread", GlobalTimelineThread,
10005 GlobalTimelineThread, reinterpret_cast<uword>(&data2)); 9726 reinterpret_cast<uword>(&data2));
10006 EXPECT(err == 0); 9727 EXPECT(err == 0);
10007 { 9728 {
10008 MonitorLocker ml(data2.monitor()); 9729 MonitorLocker ml(data2.monitor());
10009 while (data2.running()) { 9730 while (data2.running()) {
10010 ml.Wait(); 9731 ml.Wait();
10011 } 9732 }
10012 buffer = reinterpret_cast<char*>(data2.buffer()); 9733 buffer = reinterpret_cast<char*>(data2.buffer());
10013 buffer_length = data2.buffer_length(); 9734 buffer_length = data2.buffer_length();
10014 } 9735 }
10015 9736
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
10074 "foozoo() { new A().zoo(); }\n" 9795 "foozoo() { new A().zoo(); }\n"
10075 "foomoo() { A.moo(); }\n"; 9796 "foomoo() { A.moo(); }\n";
10076 9797
10077 const char* kScriptChars2 = 9798 const char* kScriptChars2 =
10078 "@patch class A {\n" 9799 "@patch class A {\n"
10079 " @patch int zoo() { return 1; }\n" 9800 " @patch int zoo() { return 1; }\n"
10080 " @patch static int moo() { return 1; }\n" 9801 " @patch static int moo() { return 1; }\n"
10081 "}\n"; 9802 "}\n";
10082 9803
10083 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL); 9804 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
10084 Dart_Handle result = Dart_Invoke(lib, 9805 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
10085 NewString("main"),
10086 0,
10087 NULL);
10088 EXPECT_VALID(result); 9806 EXPECT_VALID(result);
10089 Dart_Handle url = NewString("test-lib-patch"); 9807 Dart_Handle url = NewString("test-lib-patch");
10090 Dart_Handle source = NewString(kScriptChars2); 9808 Dart_Handle source = NewString(kScriptChars2);
10091 result = Dart_LibraryLoadPatch(lib, url, source); 9809 result = Dart_LibraryLoadPatch(lib, url, source);
10092 EXPECT_VALID(result); 9810 EXPECT_VALID(result);
10093 result = Dart_FinalizeLoading(false); 9811 result = Dart_FinalizeLoading(false);
10094 EXPECT_VALID(result); 9812 EXPECT_VALID(result);
10095 result = Dart_Invoke(lib, 9813 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
10096 NewString("foozoo"),
10097 0,
10098 NULL);
10099 EXPECT_VALID(result); 9814 EXPECT_VALID(result);
10100 result = Dart_Invoke(lib, 9815 result = Dart_Invoke(lib, NewString("foomoo"), 0, NULL);
10101 NewString("foomoo"),
10102 0,
10103 NULL);
10104 EXPECT_VALID(result); 9816 EXPECT_VALID(result);
10105 } 9817 }
10106 9818
10107 9819
10108 TEST_CASE(Dart_LoadLibraryPatch_Error1) { 9820 TEST_CASE(Dart_LoadLibraryPatch_Error1) {
10109 const char* kScriptChars1 = 9821 const char* kScriptChars1 =
10110 "class A {\n" 9822 "class A {\n"
10111 " int foo() { return 10; }\n" 9823 " int foo() { return 10; }\n"
10112 " external int zoo();\n" 9824 " external int zoo();\n"
10113 "}\n" 9825 "}\n"
10114 "main() { new A().foo(); }\n" 9826 "main() { new A().foo(); }\n"
10115 "foozoo() { new A().zoo(); }\n"; 9827 "foozoo() { new A().zoo(); }\n";
10116 9828
10117 const char* kScriptChars2 = 9829 const char* kScriptChars2 =
10118 "@patch class A {\n" 9830 "@patch class A {\n"
10119 " @patch int zoo() { return 1; }\n" 9831 " @patch int zoo() { return 1; }\n"
10120 " @patch int fld1;\n" 9832 " @patch int fld1;\n"
10121 "}\n"; 9833 "}\n";
10122 9834
10123 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL); 9835 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
10124 Dart_Handle result = Dart_Invoke(lib, 9836 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
10125 NewString("main"),
10126 0,
10127 NULL);
10128 EXPECT_VALID(result); 9837 EXPECT_VALID(result);
10129 Dart_Handle url = NewString("test-lib-patch"); 9838 Dart_Handle url = NewString("test-lib-patch");
10130 Dart_Handle source = NewString(kScriptChars2); 9839 Dart_Handle source = NewString(kScriptChars2);
10131 // We don't expect to be able to patch in this case as new fields 9840 // We don't expect to be able to patch in this case as new fields
10132 // are being added. 9841 // are being added.
10133 result = Dart_LibraryLoadPatch(lib, url, source); 9842 result = Dart_LibraryLoadPatch(lib, url, source);
10134 EXPECT_VALID(result); 9843 EXPECT_VALID(result);
10135 result = Dart_FinalizeLoading(false); 9844 result = Dart_FinalizeLoading(false);
10136 EXPECT_VALID(result); 9845 EXPECT_VALID(result);
10137 result = Dart_Invoke(lib, 9846 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
10138 NewString("foozoo"),
10139 0,
10140 NULL);
10141 EXPECT(Dart_IsError(result)); 9847 EXPECT(Dart_IsError(result));
10142 } 9848 }
10143 9849
10144 9850
10145 TEST_CASE(Dart_LoadLibraryPatch_Error2) { 9851 TEST_CASE(Dart_LoadLibraryPatch_Error2) {
10146 const char* kScriptChars1 = 9852 const char* kScriptChars1 =
10147 "class A {\n" 9853 "class A {\n"
10148 " int foo() { return 10; }\n" 9854 " int foo() { return 10; }\n"
10149 " int zoo() { return 20; }\n" 9855 " int zoo() { return 20; }\n"
10150 "}\n" 9856 "}\n"
10151 "main() { new A().foo(); }\n" 9857 "main() { new A().foo(); }\n"
10152 "foozoo() { new A().zoo(); }\n"; 9858 "foozoo() { new A().zoo(); }\n";
10153 9859
10154 const char* kScriptChars2 = 9860 const char* kScriptChars2 =
10155 "@patch class A {\n" 9861 "@patch class A {\n"
10156 " @patch int zoo() { return 1; }\n" 9862 " @patch int zoo() { return 1; }\n"
10157 "}\n"; 9863 "}\n";
10158 9864
10159 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL); 9865 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
10160 Dart_Handle result = Dart_Invoke(lib, 9866 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
10161 NewString("main"),
10162 0,
10163 NULL);
10164 EXPECT_VALID(result); 9867 EXPECT_VALID(result);
10165 Dart_Handle url = NewString("test-lib-patch"); 9868 Dart_Handle url = NewString("test-lib-patch");
10166 Dart_Handle source = NewString(kScriptChars2); 9869 Dart_Handle source = NewString(kScriptChars2);
10167 // We don't expect to be able to patch in this case as a non external 9870 // We don't expect to be able to patch in this case as a non external
10168 // method is being patched. 9871 // method is being patched.
10169 result = Dart_LibraryLoadPatch(lib, url, source); 9872 result = Dart_LibraryLoadPatch(lib, url, source);
10170 EXPECT_VALID(result); 9873 EXPECT_VALID(result);
10171 result = Dart_FinalizeLoading(false); 9874 result = Dart_FinalizeLoading(false);
10172 EXPECT_VALID(result); 9875 EXPECT_VALID(result);
10173 result = Dart_Invoke(lib, 9876 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
10174 NewString("foozoo"),
10175 0,
10176 NULL);
10177 EXPECT(Dart_IsError(result)); 9877 EXPECT(Dart_IsError(result));
10178 OS::Print("Patched class executed\n"); 9878 OS::Print("Patched class executed\n");
10179 } 9879 }
10180 9880
10181 9881
10182 TEST_CASE(Dart_LoadLibraryPatch_Error3) { 9882 TEST_CASE(Dart_LoadLibraryPatch_Error3) {
10183 const char* kScriptChars1 = 9883 const char* kScriptChars1 =
10184 "class A {\n" 9884 "class A {\n"
10185 " int foo() { return 10; }\n" 9885 " int foo() { return 10; }\n"
10186 " external int zoo();\n" 9886 " external int zoo();\n"
10187 "}\n" 9887 "}\n"
10188 "main() { new A().foo(); }\n" 9888 "main() { new A().foo(); }\n"
10189 "foozoo() { new A().zoo(); }\n"; 9889 "foozoo() { new A().zoo(); }\n";
10190 9890
10191 const char* kScriptChars2 = 9891 const char* kScriptChars2 =
10192 "@patch class A {\n" 9892 "@patch class A {\n"
10193 " @patch int zoo() { return 1; }\n" 9893 " @patch int zoo() { return 1; }\n"
10194 "}\n"; 9894 "}\n";
10195 9895
10196 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL); 9896 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars1, NULL);
10197 Dart_Handle result = Dart_Invoke(lib, 9897 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
10198 NewString("main"),
10199 0,
10200 NULL);
10201 // We invoke the foozoo method to ensure that code for 'zoo' is generated 9898 // We invoke the foozoo method to ensure that code for 'zoo' is generated
10202 // which throws NoSuchMethod. 9899 // which throws NoSuchMethod.
10203 result = Dart_Invoke(lib, 9900 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
10204 NewString("foozoo"),
10205 0,
10206 NULL);
10207 EXPECT(Dart_IsError(result)); 9901 EXPECT(Dart_IsError(result));
10208 Dart_Handle url = NewString("test-lib-patch"); 9902 Dart_Handle url = NewString("test-lib-patch");
10209 Dart_Handle source = NewString(kScriptChars2); 9903 Dart_Handle source = NewString(kScriptChars2);
10210 // We don't expect to be able to patch in this case as the function being 9904 // We don't expect to be able to patch in this case as the function being
10211 // patched has already executed. 9905 // patched has already executed.
10212 result = Dart_LibraryLoadPatch(lib, url, source); 9906 result = Dart_LibraryLoadPatch(lib, url, source);
10213 EXPECT_VALID(result); 9907 EXPECT_VALID(result);
10214 result = Dart_FinalizeLoading(false); 9908 result = Dart_FinalizeLoading(false);
10215 EXPECT_VALID(result); 9909 EXPECT_VALID(result);
10216 result = Dart_Invoke(lib, 9910 result = Dart_Invoke(lib, NewString("foozoo"), 0, NULL);
10217 NewString("foozoo"),
10218 0,
10219 NULL);
10220 EXPECT(Dart_IsError(result)); 9911 EXPECT(Dart_IsError(result));
10221 } 9912 }
10222 9913
10223 #endif // !PRODUCT 9914 #endif // !PRODUCT
10224 9915
10225 } // namespace dart 9916 } // 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