Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
unit_test.cc
Go to the documentation of this 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
3// BSD-style license that can be found in the LICENSE file.
4
5#include "vm/unit_test.h"
6
7#include <stdio.h>
8
9#include "bin/builtin.h"
10#include "bin/dartutils.h"
11#include "bin/isolate_data.h"
12
13#include "platform/globals.h"
14
18#include "vm/dart_api_impl.h"
19#include "vm/isolate_reload.h"
20#include "vm/kernel_isolate.h"
21#include "vm/parser.h"
22#include "vm/symbols.h"
23#include "vm/thread.h"
24#include "vm/virtual_memory.h"
25
28
29extern "C" {
30extern const uint8_t kPlatformStrongDill[];
31extern intptr_t kPlatformStrongDillSize;
32}
33
34namespace dart {
35
37DECLARE_FLAG(bool, force_evacuation);
38
41
42const uint8_t* TesterState::vm_snapshot_data = nullptr;
46const char** TesterState::argv = nullptr;
47int TesterState::argc = 0;
48
49void KernelBufferList::AddBufferToList(const uint8_t* kernel_buffer) {
50 next_ = new KernelBufferList(kernel_buffer_, next_);
51 kernel_buffer_ = kernel_buffer;
52}
53
54TestCaseBase* TestCaseBase::first_ = nullptr;
55TestCaseBase* TestCaseBase::tail_ = nullptr;
57
58TestCaseBase::TestCaseBase(const char* name, const char* expectation)
59 : raw_test_(false),
60 next_(nullptr),
61 name_(name),
62 expectation_(strlen(expectation) > 0 ? expectation : "Pass") {
63 if (first_ == nullptr) {
64 first_ = this;
65 } else {
66 tail_->next_ = this;
67 }
68 tail_ = this;
69}
70
72 TestCaseBase* test = first_;
73 while (test != nullptr) {
74 if (test->raw_test_) {
75 test->RunTest();
77 }
78 test = test->next_;
79 }
80}
81
83 TestCaseBase* test = first_;
84 while (test != nullptr) {
85 if (!test->raw_test_) {
86 test->RunTest();
88 }
89 test = test->next_;
90 }
91}
92
94 if (current_kernel_buffers_ != nullptr) {
97 }
98}
99
100void TestCaseBase::AddToKernelBuffers(const uint8_t* kernel_buffer) {
101 ASSERT(kernel_buffer != nullptr);
102 if (current_kernel_buffers_ == nullptr) {
103 current_kernel_buffers_ = new KernelBufferList(kernel_buffer);
104 } else {
106 }
107}
108
109Dart_Isolate TestCase::CreateIsolate(const uint8_t* data_buffer,
110 intptr_t len,
111 const uint8_t* instr_buffer,
112 const char* name,
113 void* group_data,
114 void* isolate_data) {
115 char* err;
116 Dart_IsolateFlags api_flags;
117 Isolate::FlagsInitialize(&api_flags);
118 api_flags.null_safety = true;
119 Dart_Isolate isolate = nullptr;
120 if (len == 0) {
121 isolate = Dart_CreateIsolateGroup(
122 /*script_uri=*/name, /*name=*/name, data_buffer, instr_buffer,
123 &api_flags, group_data, isolate_data, &err);
124 } else {
125 isolate = Dart_CreateIsolateGroupFromKernel(/*script_uri=*/name,
126 /*name=*/name, data_buffer, len,
127 &api_flags, group_data,
128 isolate_data, &err);
129 }
130 if (isolate == nullptr) {
131 OS::PrintErr("Creation of isolate failed '%s'\n", err);
132 free(err);
133 }
134
135 EXPECT(isolate != nullptr);
136 return isolate;
137}
138
140 void* group_data,
141 void* isolate_data) {
142 return CreateIsolate(bin::core_isolate_snapshot_data,
143 0 /* Snapshots have length encoded within them. */,
145 group_data, isolate_data);
146}
147
150
155 /*is_service_isolate=*/false,
156 /*trace_loading=*/false);
158
160}
161
163 Dart_Isolate parent,
164 void* group_data,
165 void* isolate_data) {
166 char* error;
168 reinterpret_cast<Isolate*>(parent)->group(), name, &error);
169 if (error != nullptr) {
170 OS::PrintErr("CreateTestIsolateInGroup failed: %s\n", error);
171 free(error);
172 }
173 EXPECT(result != nullptr);
174 return Api::CastIsolate(result);
175}
176
178 const char* url;
179 const char* source;
180};
181
183
184const char* TestCase::url() {
186}
187
188void TestCase::AddTestLib(const char* url, const char* source) {
189 if (test_libs_ == nullptr) {
191 }
192 // If the test lib is already added, replace the source.
193 for (intptr_t i = 0; i < test_libs_->length(); i++) {
194 if (strcmp(url, (*test_libs_)[i].url) == 0) {
195 (*test_libs_)[i].source = source;
196 return;
197 }
198 }
199 TestLibEntry entry;
200 entry.url = url;
201 entry.source = source;
202 test_libs_->Add(entry);
203}
204
205const char* TestCase::GetTestLib(const char* url) {
206 if (test_libs_ == nullptr) {
207 return nullptr;
208 }
209 for (intptr_t i = 0; i < test_libs_->length(); i++) {
210 if (strcmp(url, (*test_libs_)[i].url) == 0) {
211 return (*test_libs_)[i].source;
212 }
213 }
214 return nullptr;
215}
216
220
221#ifndef PRODUCT
222static const char* kIsolateReloadTestLibSource = R"(
223@pragma("vm:external-name", "Test_Reload")
224external void reloadTest();
225@pragma("vm:external-name", "Test_CollectNewSpace")
226external void collectNewSpace();
227@pragma("vm:external-name", "Test_CollectOldSpace")
228external void collectOldSpace();
229)";
230
231static const char* IsolateReloadTestLibUri() {
232 return "test:isolate_reload_helper";
233}
234
235#define RELOAD_NATIVE_LIST(V) \
236 V(Test_Reload, 0) \
237 V(Test_CollectNewSpace, 0) \
238 V(Test_CollectOldSpace, 0)
239
241
242static struct NativeEntries {
243 const char* name_;
245 int argument_count_;
247
250 int argument_count,
251 bool* auto_setup_scope) {
252 const char* function_name = nullptr;
255 ASSERT(function_name != nullptr);
256 ASSERT(auto_setup_scope != nullptr);
257 *auto_setup_scope = true;
258 int num_entries = sizeof(ReloadEntries) / sizeof(struct NativeEntries);
259 for (int i = 0; i < num_entries; i++) {
260 struct NativeEntries* entry = &(ReloadEntries[i]);
261 if ((strcmp(function_name, entry->name_) == 0) &&
262 (entry->argument_count_ == argument_count)) {
263 return reinterpret_cast<Dart_NativeFunction>(entry->function_);
264 }
265 }
266 return nullptr;
267}
268
270 Dart_Handle result = TestCase::TriggerReload(/* kernel_buffer= */ nullptr,
271 /* kernel_buffer_size= */ 0);
272 if (Dart_IsError(result)) {
274 }
275}
276
279 GCTestHelper::CollectNewSpace();
280}
281
284 GCTestHelper::CollectOldSpace();
285}
286
287#endif // !PRODUCT
288
289static void LoadIsolateReloadTestLibIfNeeded(const char* script) {
290#ifndef PRODUCT
291 if (strstr(script, IsolateReloadTestLibUri()) != nullptr) {
296 }
297#endif // ifndef PRODUCT
298}
299
301 const char* source,
302 const uint8_t** kernel_buffer,
303 intptr_t* kernel_buffer_size,
304 bool incrementally,
305 bool allow_compile_errors,
306 const char* multiroot_filepaths,
307 const char* multiroot_scheme) {
308 // clang-format off
309 Dart_SourceFile sourcefiles[] = {
310 {
311 url, source,
312 },
313 {
314 "file:///.packages", ""
315 }};
316 // clang-format on
318 url, sizeof(sourcefiles) / sizeof(Dart_SourceFile), sourcefiles,
319 kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors,
320 multiroot_filepaths, multiroot_scheme);
321}
322
324 int sourcefiles_count,
325 Dart_SourceFile sourcefiles[],
326 const uint8_t** kernel_buffer,
327 intptr_t* kernel_buffer_size,
328 bool incrementally,
329 bool allow_compile_errors,
330 const char* multiroot_filepaths,
331 const char* multiroot_scheme) {
332 Zone* zone = Thread::Current()->zone();
335 sourcefiles, incrementally, /*for_snapshot=*/false,
336 /*embed_sources=*/true, nullptr, multiroot_filepaths, multiroot_scheme);
340 FATAL(
341 "An error occurred in the CFE while accepting the most recent"
342 " compilation results.");
343 }
344 }
345 return ValidateCompilationResult(zone, result, kernel_buffer,
346 kernel_buffer_size, allow_compile_errors);
347}
348
349char* TestCase::ValidateCompilationResult(
350 Zone* zone,
351 Dart_KernelCompilationResult compilation_result,
352 const uint8_t** kernel_buffer,
353 intptr_t* kernel_buffer_size,
354 bool allow_compile_errors) {
355 if (!allow_compile_errors &&
356 (compilation_result.status != Dart_KernelCompilationStatus_Ok)) {
357 char* result =
358 OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
359 free(compilation_result.error);
360 if (compilation_result.kernel != nullptr) {
361 free(const_cast<uint8_t*>(compilation_result.kernel));
362 }
363 *kernel_buffer = nullptr;
364 *kernel_buffer_size = 0;
365 return result;
366 }
367 *kernel_buffer = compilation_result.kernel;
368 *kernel_buffer_size = compilation_result.kernel_size;
369 if (compilation_result.error != nullptr) {
370 free(compilation_result.error);
371 }
372 if (kernel_buffer == nullptr) {
373 return OS::SCreate(zone, "front end generated a nullptr kernel file");
374 }
375 return nullptr;
376}
377
379 Dart_Handle library,
380 Dart_Handle url) {
381 if (tag == Dart_kCanonicalizeUrl) {
382 Dart_Handle library_url = Dart_LibraryUrl(library);
383 if (Dart_IsError(library_url)) {
384 return library_url;
385 }
386 return Dart_DefaultCanonicalizeUrl(library_url, url);
387 }
388 UNREACHABLE();
389 return Dart_Null();
390}
391
392static intptr_t BuildSourceFilesArray(
393 Dart_SourceFile** sourcefiles,
394 const char* script,
395 const char* script_url = RESOLVED_USER_TEST_URI) {
396 ASSERT(sourcefiles != nullptr);
397 ASSERT(script != nullptr);
398
399 intptr_t num_test_libs = 0;
400 if (test_libs_ != nullptr) {
401 num_test_libs = test_libs_->length();
402 }
403
404 *sourcefiles = new Dart_SourceFile[num_test_libs + 1];
405 (*sourcefiles)[0].uri = script_url;
406 (*sourcefiles)[0].source = script;
407 for (intptr_t i = 0; i < num_test_libs; ++i) {
408 (*sourcefiles)[i + 1].uri = test_libs_->At(i).url;
409 (*sourcefiles)[i + 1].source = test_libs_->At(i).source;
410 }
411 return num_test_libs + 1;
412}
413
415 const char* script,
417 const char* lib_url,
418 bool finalize_classes) {
419 return LoadTestScript(script, resolver, lib_url, finalize_classes, true);
420}
421
424 const char* lib_url,
425 bool finalize_classes,
426 bool allow_compile_errors) {
428 Dart_SourceFile* sourcefiles = nullptr;
429 intptr_t num_sources = BuildSourceFilesArray(&sourcefiles, script, lib_url);
431 LoadTestScriptWithDFE(num_sources, sourcefiles, resolver,
432 finalize_classes, true, allow_compile_errors);
433 delete[] sourcefiles;
434 return result;
435}
436
437static void MallocFinalizer(void* isolate_callback_data, void* peer) {
438 free(peer);
439}
440
442 const char* script,
443 Dart_NativeEntryResolver resolver) {
445 const char* prefixed_lib_uri =
446 OS::SCreate(Thread::Current()->zone(), "file:///%s", lib_uri);
447 Dart_SourceFile sourcefiles[] = {{prefixed_lib_uri, script}};
448 const uint8_t* kernel_buffer = nullptr;
449 intptr_t kernel_buffer_size = 0;
450 int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile);
452 sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
453 &kernel_buffer_size, true);
454 if ((kernel_buffer == nullptr) && (error != nullptr)) {
455 return Dart_NewApiError(error);
456 }
457
459 Dart_TypedData_kUint8, const_cast<uint8_t*>(kernel_buffer),
460 kernel_buffer_size, const_cast<uint8_t*>(kernel_buffer),
461 kernel_buffer_size, MallocFinalizer);
462 EXPECT_VALID(td);
465
466 // TODO(32618): Kernel doesn't correctly represent the root library.
467 lib = Dart_LookupLibrary(Dart_NewStringFromCString(sourcefiles[0].uri));
471
472 Dart_SetNativeResolver(lib, resolver, nullptr);
473 return lib;
474}
475
477 Dart_SourceFile sourcefiles[],
479 bool finalize,
480 bool incrementally,
481 bool allow_compile_errors,
482 const char* entry_script_uri,
483 const char* multiroot_filepaths,
484 const char* multiroot_scheme) {
485 // First script is the main script.
488 const uint8_t* kernel_buffer = nullptr;
489 intptr_t kernel_buffer_size = 0;
491 entry_script_uri != nullptr ? entry_script_uri : sourcefiles[0].uri,
492 sourcefiles_count, sourcefiles, &kernel_buffer, &kernel_buffer_size,
493 incrementally, allow_compile_errors, multiroot_filepaths,
494 multiroot_scheme);
495 if ((kernel_buffer == nullptr) && error != nullptr) {
496 return Dart_NewApiError(error);
497 }
498
500 Dart_TypedData_kUint8, const_cast<uint8_t*>(kernel_buffer),
501 kernel_buffer_size, const_cast<uint8_t*>(kernel_buffer),
502 kernel_buffer_size, MallocFinalizer);
503 EXPECT_VALID(td);
506
507 // BOGUS: Kernel doesn't correctly represent the root library.
509 entry_script_uri != nullptr ? entry_script_uri : sourcefiles[0].uri));
513
514 result = Dart_SetNativeResolver(lib, resolver, nullptr);
516 if (finalize) {
519 }
520 return lib;
521}
522
523#ifndef PRODUCT
524
526 // For our vm/cc/IsolateReload_* tests we flip the GC flag on, which will
527 // cause the isolate reload to do GCs before/after morphing, etc.
528 FLAG_gc_during_reload = true;
529 FLAG_force_evacuation = true;
530
531 Dart_SourceFile* sourcefiles = nullptr;
532 intptr_t num_files = BuildSourceFilesArray(&sourcefiles, script);
533 Dart_KernelCompilationResult compilation_result =
534 KernelIsolate::UpdateInMemorySources(num_files, sourcefiles);
535 delete[] sourcefiles;
536 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
537 Dart_Handle result = Dart_NewApiError(compilation_result.error);
538 free(compilation_result.error);
539 return result;
540 }
541 return Api::Success();
542}
543
545 std::function<bool(IsolateGroup*, JSONStream*)> do_reload) {
546 Thread* thread = Thread::Current();
547 IsolateGroup* isolate_group = thread->isolate_group();
548 JSONStream js;
549 bool success = false;
550 {
551 TransitionNativeToVM transition(thread);
552 success = do_reload(isolate_group, &js);
553 OS::PrintErr("RELOAD REPORT:\n%s\n", js.ToCString());
554 }
555
557 if (success) {
559 }
560
561 if (Dart_IsError(result)) {
562 // Keep load error.
563 } else if (isolate_group->reload_context()->reload_aborted()) {
564 TransitionNativeToVM transition(thread);
565 result = Api::NewHandle(thread, isolate_group->program_reload_context()
567 ->error());
568 } else {
570 }
571
572 TransitionNativeToVM transition(thread);
573 if (isolate_group->program_reload_context() != nullptr) {
574 isolate_group->DeleteReloadContext();
575 }
576
577 return result;
578}
579
580Dart_Handle TestCase::TriggerReload(const char* root_script_url) {
581 return TriggerReload([&](IsolateGroup* isolate_group, JSONStream* js) {
582 return isolate_group->ReloadSources(js,
583 /*force_reload=*/false, root_script_url,
584 /*packages_url=*/nullptr,
585 /*dont_delete_reload_context=*/true);
586 });
587}
588
589Dart_Handle TestCase::TriggerReload(const uint8_t* kernel_buffer,
590 intptr_t kernel_buffer_size) {
591 return TriggerReload([&](IsolateGroup* isolate_group, JSONStream* js) {
592 return isolate_group->ReloadKernel(js,
593 /*force_reload=*/false, kernel_buffer,
594 kernel_buffer_size,
595 /*dont_delete_reload_context=*/true);
596 });
597}
598
600 Dart_SourceFile* sourcefiles = nullptr;
601 intptr_t num_files = BuildSourceFilesArray(&sourcefiles, script);
602 Dart_KernelCompilationResult compilation_result =
603 KernelIsolate::UpdateInMemorySources(num_files, sourcefiles);
604 delete[] sourcefiles;
605 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
606 Dart_Handle result = Dart_NewApiError(compilation_result.error);
607 free(compilation_result.error);
608 if (compilation_result.kernel != nullptr) {
609 free(const_cast<uint8_t*>(compilation_result.kernel));
610 }
611 return result;
612 }
613
614 return TriggerReload(/*kernel_buffer=*/nullptr, /*kernel_buffer_size=*/0);
615}
616
617Dart_Handle TestCase::ReloadTestKernel(const uint8_t* kernel_buffer,
618 intptr_t kernel_buffer_size) {
619 return TriggerReload(kernel_buffer, kernel_buffer_size);
620}
621
622#endif // !PRODUCT
623
625 Dart_NativeEntryResolver resolver) {
626 return LoadTestScript(script, resolver, CORELIB_TEST_URI);
627}
628
636
638 Dart_Handle library,
639 Dart_Handle url) {
640 if (tag == Dart_kCanonicalizeUrl) {
641 return url;
642 }
643 return Api::Success();
644}
645
647 const String& expr,
648 const Array& param_names,
649 const Array& param_values) {
650 Thread* thread = Thread::Current();
651
652 Object& val = Object::Handle();
654 UNREACHABLE();
655 } else {
656 Dart_KernelCompilationResult compilation_result =
658 /* platform_kernel= */ nullptr, /* platform_kernel_size= */ 0,
659 expr.ToCString(), param_names, Array::empty_array(),
660 Array::empty_array(), Array::empty_array(), Array::empty_array(),
662 /* klass= */ nullptr,
663 /* method= */ nullptr,
664 /* token_pos= */ TokenPosition::kNoSource,
665 /* script_uri= */ String::Handle(lib.url()).ToCString(),
666 /* is_static= */ true);
667 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
668 return Api::NewError("%s", compilation_result.error);
669 }
670
671 const ExternalTypedData& kernel_buffer =
673 const_cast<uint8_t*>(compilation_result.kernel),
674 compilation_result.kernel_size));
675
676 val = lib.EvaluateCompiledExpression(kernel_buffer, Array::empty_array(),
677 param_values,
678 TypeArguments::null_type_arguments());
679 }
680 return Api::NewHandle(thread, val.ptr());
681}
682
683#if !defined(PRODUCT) && (defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64))
684static bool IsHex(int c) {
685 return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f');
686}
687#endif
688
690 auto thread = Thread::Current();
691 const String& function_name = String::ZoneHandle(Symbols::New(thread, name_));
692
693 // We make a dummy script so that exception objects can be composed for
694 // assembler instructions that do runtime calls.
695 const char* kDummyScript = "assembler_test_dummy_function() {}";
696 const Script& script = Script::Handle(
699 const Class& cls = Class::ZoneHandle(
703 signature, function_name, UntaggedFunction::kRegularFunction, true, false,
704 false, false, false, cls, TokenPosition::kMinSource));
705 SafepointWriteRwLocker ml(thread, thread->isolate_group()->program_lock());
706 code_ = Code::FinalizeCodeAndNotify(function, nullptr, assembler_,
708 code_.set_owner(function);
709 code_.set_exception_handlers(Object::empty_exception_handlers());
710#ifndef PRODUCT
711 // Disassemble relative since code addresses are not stable from run to run.
712 SetFlagScope<bool> sfs(&FLAG_disassemble_relative, true);
713 uword start = code_.PayloadStart();
714 if (FLAG_disassemble) {
715 OS::PrintErr("Code for test '%s' {\n", name_);
717 OS::PrintErr("}\n");
718 }
719 Disassembler::Disassemble(start, start + assembler_->CodeSize(), disassembly_,
720 DISASSEMBLY_SIZE);
721#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
722 // Blank out absolute addressing constants on ia32, since they are not stable
723 // from run to run.
724 // Blank out thread-relative offsets on x64 since they change when new fields
725 // are added to thread object.
726 bool in_hex_constant = false;
727 for (char* p = disassembly_; *p != '\0'; p++) {
728 if (in_hex_constant) {
729 if (IsHex(*p)) {
730 *p = '.';
731 } else {
732 in_hex_constant = false;
733 }
734 } else {
735#if defined(TARGET_ARCH_IA32)
736 if (*p == '[' && *(p + 1) == '0' && *(p + 2) == 'x' && IsHex(*(p + 3)) &&
737 IsHex(*(p + 4))) {
738 p += 2;
739 in_hex_constant = true;
740 }
741#endif // defined(TARGET_ARCH_IA32)
742#if defined(TARGET_ARCH_X64)
743 if (*p == '[' && *(p + 1) == 't' && *(p + 2) == 'h' && *(p + 3) == 'r' &&
744 *(p + 4) == '+' && *(p + 5) == '0' && *(p + 6) == 'x' &&
745 IsHex(*(p + 7)) && IsHex(*(p + 8))) {
746 p += 6;
747 in_hex_constant = true;
748 }
749#endif // defined(TARGET_ARCH_X64)
750 }
751 }
752#endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
753#endif // !PRODUCT
754}
755
757 const char* name,
758 const std::function<void(compiler::Assembler* assembler)>& generator) {
759 compiler::ObjectPoolBuilder object_pool_builder;
760 compiler::Assembler assembler(&object_pool_builder, /*far_branch_level=*/0);
762 assembler.Ret();
763 test.Assemble();
764 return test.code();
765}
766
768 Thread* thread = Thread::Current();
769 ASSERT(thread != nullptr);
771 const Object& result =
773 return result.IsCode();
774}
775
776void ElideJSONSubstring(const char* prefix,
777 const char* in,
778 char* out,
779 const char* postfix) {
780 const char* pos = strstr(in, prefix);
781 while (pos != nullptr) {
782 // Copy up to pos into the output buffer.
783 while (in < pos) {
784 *out++ = *in++;
785 }
786
787 // Skip to the closing postfix.
788 in += strlen(prefix);
789 in += strcspn(in, postfix);
790 pos = strstr(in, prefix);
791 }
792 // Copy the remainder of in to out.
793 while (*in != '\0') {
794 *out++ = *in++;
795 }
796 *out = '\0';
797}
798
800 ElideJSONSubstring(",\"tokenPos\":", buffer, buffer, ",");
801 ElideJSONSubstring(",\"endTokenPos\":", buffer, buffer, "}");
802}
803
804} // namespace dart
#define test(name)
SkPoint pos
static bool ok(int result)
#define EXPECT(type, expectedAlignment, expectedSize)
#define UNREACHABLE()
Definition assert.h:248
#define RELEASE_ASSERT(cond)
Definition assert.h:327
#define FUNCTION_NAME(name)
Definition builtin.h:19
static Dart_Handle Success()
static Dart_Handle NewHandle(Thread *thread, ObjectPtr raw)
static Dart_Isolate CastIsolate(Isolate *isolate)
static Dart_Handle NewError(const char *format,...) PRINTF_ATTRIBUTE(1
compiler::Assembler * assembler() const
Definition unit_test.h:522
static const Code & Generate(const char *name, const std::function< void(compiler::Assembler *assembler)> &generator)
Definition unit_test.cc:756
static bool AllClassesFinalized()
static ClassPtr New(IsolateGroup *isolate_group, bool register_class=true)
Definition object.cc:3114
void set_exception_handlers(const ExceptionHandlers &handlers) const
Definition object.h:7090
static CodePtr FinalizeCodeAndNotify(const Function &function, FlowGraphCompiler *compiler, compiler::Assembler *assembler, PoolAttachment pool_attachment, bool optimized=false, CodeStatistics *stats=nullptr)
Definition object.cc:18033
uword PayloadStart() const
Definition object.h:6823
void set_owner(const Object &owner) const
Definition object.cc:17686
static bool TestCompileFunction(const Function &function)
Definition unit_test.cc:767
static ObjectPtr CompileFunction(Thread *thread, const Function &function)
Definition compiler.cc:825
static void Disassemble(uword start, uword end, DisassemblyFormatter *formatter, const Code &code, const CodeComments *comments=nullptr)
static ExternalTypedDataPtr NewFinalizeWithFree(uint8_t *data, intptr_t len)
Definition object.cc:25728
static FunctionTypePtr New(intptr_t num_parent_type_arguments=0, Nullability nullability=Nullability::kLegacy, Heap::Space space=Heap::kOld)
Definition object.cc:11682
static FunctionPtr New(const FunctionType &signature, const String &name, UntaggedFunction::Kind kind, bool is_static, bool is_const, bool is_abstract, bool is_external, bool is_native, const Object &owner, TokenPosition token_pos, Heap::Space space=Heap::kOld)
Definition object.cc:10301
bool ReloadKernel(JSONStream *js, bool force_reload, const uint8_t *kernel_buffer=nullptr, intptr_t kernel_buffer_size=0, bool dont_delete_reload_context=false)
Definition isolate.cc:2066
void DeleteReloadContext()
Definition isolate.cc:2095
SafepointRwLock * program_lock()
Definition isolate.h:532
IsolateGroupReloadContext * reload_context()
Definition isolate.h:649
bool ReloadSources(JSONStream *js, bool force_reload, const char *root_script_url=nullptr, const char *packages_url=nullptr, bool dont_delete_reload_context=false)
Definition isolate.cc:2037
ProgramReloadContext * program_reload_context()
Definition isolate.h:652
static void FlagsInitialize(Dart_IsolateFlags *api_flags)
Definition isolate.cc:1612
void AddBufferToList(const uint8_t *kernel_buffer)
Definition unit_test.cc:49
static Dart_KernelCompilationResult UpdateInMemorySources(int source_files_count, Dart_SourceFile source_files[])
static Dart_KernelCompilationResult CompileToKernel(const char *script_uri, const uint8_t *platform_kernel, intptr_t platform_kernel_size, int source_files_count=0, Dart_SourceFile source_files[]=nullptr, bool incremental_compile=true, bool for_snapshot=false, bool embed_sources=true, const char *package_config=nullptr, const char *multiroot_filepaths=nullptr, const char *multiroot_scheme=nullptr, Dart_KernelCompilationVerbosityLevel verbosity=Dart_KernelCompilationVerbosityLevel_All)
static bool IsRunning()
static Dart_KernelCompilationResult CompileExpressionToKernel(const uint8_t *platform_kernel, intptr_t platform_kernel_size, const char *expression, const Array &definitions, const Array &definition_types, const Array &type_definitions, const Array &type_bounds, const Array &type_defaults, const char *library_url, const char *klass, const char *method, TokenPosition token_pos, char const *script_uri, bool is_static)
static Dart_KernelCompilationResult AcceptCompilation()
static bool GetExperimentalFlag(ExperimentalFeature feature)
static LibraryPtr CoreLibrary()
Definition object.cc:14834
static void static void PrintErr(const char *format,...) PRINTF_ATTRIBUTE(1
static char * SCreate(Zone *zone, const char *format,...) PRINTF_ATTRIBUTE(2
ObjectPtr ptr() const
Definition object.h:332
virtual const char * ToCString() const
Definition object.h:366
static Object & Handle()
Definition object.h:407
static Object & ZoneHandle()
Definition object.h:419
IsolateGroupReloadContext * group_reload_context()
static ScriptPtr New(const String &url, const String &source)
Definition object.cc:13498
static StringPtr New(const char *cstr, Heap::Space space=Heap::kNew)
Definition object.cc:23777
static const char * ToCString(Thread *thread, StringPtr ptr)
Definition object.cc:24205
static StringPtr New(Thread *thread, const char *cstr)
Definition symbols.h:722
static void CleanupState()
Definition unit_test.cc:93
static void AddToKernelBuffers(const uint8_t *kernel_buffer)
Definition unit_test.cc:100
static void RunAllRaw()
Definition unit_test.cc:71
const char * name() const
Definition unit_test.h:290
static void RunAll()
Definition unit_test.cc:82
static KernelBufferList * current_kernel_buffers_
Definition unit_test.h:302
TestCaseBase(const char *name, const char *expectation)
Definition unit_test.cc:58
static Dart_Handle TriggerReload(const uint8_t *kernel_buffer, intptr_t kernel_buffer_size)
Definition unit_test.cc:589
static Dart_Handle LoadTestScriptWithDFE(int sourcefiles_count, Dart_SourceFile sourcefiles[], Dart_NativeEntryResolver resolver=nullptr, bool finalize=true, bool incrementally=true, bool allow_compile_errors=false, const char *entry_script_uri=nullptr, const char *multiroot_filepaths=nullptr, const char *multiroot_scheme=nullptr)
Definition unit_test.cc:476
static Dart_Handle lib()
Definition unit_test.cc:629
static void AddTestLib(const char *url, const char *source)
Definition unit_test.cc:188
static Dart_Handle LoadTestScript(const char *script, Dart_NativeEntryResolver resolver, const char *lib_uri=RESOLVED_USER_TEST_URI, bool finalize=true, bool allow_compile_errors=false)
Definition unit_test.cc:422
static Dart_Handle ReloadTestScript(const char *script)
Definition unit_test.cc:599
static char * CompileTestScriptWithDFE(const char *url, const char *source, const uint8_t **kernel_buffer, intptr_t *kernel_buffer_size, bool incrementally=true, bool allow_compile_errors=false, const char *multiroot_filepaths=nullptr, const char *multiroot_scheme=nullptr)
Definition unit_test.cc:300
static Dart_Isolate CreateTestIsolateInGroup(const char *name, Dart_Isolate parent, void *group_data=nullptr, void *isolate_data=nullptr)
Definition unit_test.cc:162
static Dart_Handle SetReloadTestScript(const char *script)
Definition unit_test.cc:525
static const char * url()
Definition unit_test.cc:184
static Dart_Handle LoadTestScriptWithErrors(const char *script, Dart_NativeEntryResolver resolver=nullptr, const char *lib_uri=RESOLVED_USER_TEST_URI, bool finalize=true)
Definition unit_test.cc:414
static Dart_Handle LoadTestLibrary(const char *lib_uri, const char *script, Dart_NativeEntryResolver resolver=nullptr)
Definition unit_test.cc:441
static bool IsNNBD()
Definition unit_test.cc:217
static Dart_Handle ReloadTestKernel(const uint8_t *kernel_buffer, intptr_t kernel_buffer_size)
Definition unit_test.cc:617
static Dart_Handle library_handler(Dart_LibraryTag tag, Dart_Handle library, Dart_Handle url)
Definition unit_test.cc:637
static Dart_Handle EvaluateExpression(const Library &lib, const String &expr, const Array &param_names, const Array &param_values)
Definition unit_test.cc:646
static Dart_Isolate CreateTestIsolate(const char *name=nullptr, void *isolate_group_data=nullptr, void *isolate_data=nullptr)
Definition unit_test.cc:139
static const char * GetTestLib(const char *url)
Definition unit_test.cc:205
static Dart_Handle LoadCoreTestScript(const char *script, Dart_NativeEntryResolver resolver)
Definition unit_test.cc:624
static Dart_IsolateShutdownCallback shutdown_callback
Definition unit_test.h:257
static Dart_IsolateGroupCreateCallback create_callback
Definition unit_test.h:256
static const char ** argv
Definition unit_test.h:259
static Dart_IsolateGroupCleanupCallback group_cleanup_callback
Definition unit_test.h:258
static int argc
Definition unit_test.h:260
static const uint8_t * vm_snapshot_data
Definition unit_test.h:255
Zone * zone() const
static Thread * Current()
Definition thread.h:361
IsolateGroup * isolate_group() const
Definition thread.h:540
static const TokenPosition kMinSource
static bool SetOriginalWorkingDirectory()
Definition dartutils.cc:827
static Dart_Handle PrepareForScriptLoading(bool is_service_isolate, bool trace_loading)
Definition dartutils.cc:574
void Ret(Condition cond=AL)
Dart_Isolate(* Dart_IsolateGroupCreateCallback)(const char *script_uri, const char *main, const char *package_root, const char *package_config, Dart_IsolateFlags *flags, void *isolate_data, char **error)
Definition dart_api.h:653
@ Dart_KernelCompilationStatus_Ok
Definition dart_api.h:3728
struct _Dart_Handle * Dart_Handle
Definition dart_api.h:258
struct _Dart_Isolate * Dart_Isolate
Definition dart_api.h:88
Dart_NativeFunction(* Dart_NativeEntryResolver)(Dart_Handle name, int num_of_arguments, bool *auto_setup_scope)
Definition dart_api.h:3225
struct _Dart_NativeArguments * Dart_NativeArguments
Definition dart_api.h:3010
@ Dart_TypedData_kUint8
Definition dart_api.h:2606
void(* Dart_IsolateGroupCleanupCallback)(void *isolate_group_data)
Definition dart_api.h:744
Dart_LibraryTag
Definition dart_api.h:3339
@ Dart_kCanonicalizeUrl
Definition dart_api.h:3340
void(* Dart_IsolateShutdownCallback)(void *isolate_group_data, void *isolate_data)
Definition dart_api.h:710
void(* Dart_NativeFunction)(Dart_NativeArguments arguments)
Definition dart_api.h:3198
#define ASSERT(E)
SkBitmap source
Definition examples.cpp:28
#define FATAL(error)
static const uint8_t buffer[]
const uint8_t uint32_t uint32_t GError ** error
GAsyncResult * result
#define DECLARE_FLAG(type, name)
Definition flags.h:14
Dart_NativeFunction function
Definition fuchsia.cc:51
#define REGISTER_FUNCTION(name, count)
Definition fuchsia.cc:41
int argument_count
Definition fuchsia.cc:52
#define DECLARE_FUNCTION(name, count)
Definition fuchsia.cc:42
FLUTTER_ASSERT_NOT_ARC const uint8_t kPlatformStrongDill[]
const intptr_t kPlatformStrongDillSize
const uint8_t * core_isolate_snapshot_data
Definition main_impl.cc:58
const uint8_t * core_isolate_snapshot_instructions
Definition main_impl.cc:59
DART_EXPORT bool Dart_IsLibrary(Dart_Handle object)
void ElideJSONSubstring(const char *prefix, const char *in, char *out, const char *postfix)
Definition unit_test.cc:776
DART_EXPORT void Dart_EnterScope()
const uint8_t * platform_strong_dill
Definition unit_test.cc:39
const char *const name
DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures)
static intptr_t BuildSourceFilesArray(Dart_SourceFile **sourcefiles, const char *script, const char *script_url=RESOLVED_USER_TEST_URI)
Definition unit_test.cc:392
DART_EXPORT Dart_Handle Dart_RootLibrary()
void FUNCTION_NAME() Test_CollectNewSpace(Dart_NativeArguments native_args)
Definition unit_test.cc:277
DART_EXPORT Dart_Handle Dart_NewExternalTypedDataWithFinalizer(Dart_TypedData_Type type, void *data, intptr_t length, void *peer, intptr_t external_allocation_size, Dart_HandleFinalizer callback)
static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, Dart_Handle library, Dart_Handle url)
Definition unit_test.cc:378
DART_EXPORT void Dart_PropagateError(Dart_Handle handle)
void FUNCTION_NAME() Test_Reload(Dart_NativeArguments native_args)
Definition unit_test.cc:269
static MallocGrowableArray< TestLibEntry > * test_libs_
Definition unit_test.cc:182
static const char * IsolateReloadTestLibUri()
Definition unit_test.cc:231
static struct dart::NativeEntries ReloadEntries[]
const intptr_t platform_strong_dill_size
Definition unit_test.cc:40
uintptr_t uword
Definition globals.h:501
static void LoadIsolateReloadTestLibIfNeeded(const char *script)
Definition unit_test.cc:289
DART_EXPORT bool Dart_IsError(Dart_Handle handle)
static Dart_NativeFunction IsolateReloadTestNativeResolver(Dart_Handle name, int argument_count, bool *auto_setup_scope)
Definition unit_test.cc:248
DART_EXPORT Dart_Handle Dart_SetNativeResolver(Dart_Handle library, Dart_NativeEntryResolver resolver, Dart_NativeEntrySymbol symbol)
DART_EXPORT Dart_Isolate Dart_CreateIsolateGroup(const char *script_uri, const char *name, const uint8_t *snapshot_data, const uint8_t *snapshot_instructions, Dart_IsolateFlags *flags, void *isolate_group_data, void *isolate_data, char **error)
Dart_Handle NewString(const char *str)
DART_EXPORT Dart_Handle Dart_LoadLibrary(Dart_Handle kernel_buffer)
DART_EXPORT Dart_Isolate Dart_CreateIsolateGroupFromKernel(const char *script_uri, const char *name, const uint8_t *kernel_buffer, intptr_t kernel_buffer_size, Dart_IsolateFlags *flags, void *isolate_group_data, void *isolate_data, char **error)
void SetupCoreLibrariesForUnitTest()
Definition unit_test.cc:148
static const char * kIsolateReloadTestLibSource
Definition unit_test.cc:222
DART_EXPORT Dart_Handle Dart_SetLibraryTagHandler(Dart_LibraryTagHandler handler)
DART_EXPORT void Dart_ExitScope()
DART_EXPORT Dart_Handle Dart_NewApiError(const char *error)
DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url)
DART_EXPORT Dart_Handle Dart_DefaultCanonicalizeUrl(Dart_Handle base_url, Dart_Handle url)
DART_EXPORT Dart_Handle Dart_LibraryUrl(Dart_Handle library)
DART_EXPORT Dart_Handle Dart_Null()
Isolate * CreateWithinExistingIsolateGroup(IsolateGroup *group, const char *name, char **error)
const char *const function_name
DART_EXPORT Dart_Handle Dart_SetRootLibrary(Dart_Handle library)
static void MallocFinalizer(void *isolate_callback_data, void *peer)
DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, const char **cstr)
void StripTokenPositions(char *buffer)
Definition unit_test.cc:799
DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char *str)
void FUNCTION_NAME() Test_CollectOldSpace(Dart_NativeArguments native_args)
Definition unit_test.cc:282
Dart_KernelCompilationStatus status
Definition dart_api.h:3735
const char * uri
Definition dart_api.h:3793
const char *const name_
const char * url
Definition unit_test.cc:178
const char * source
Definition unit_test.cc:179
#define RELOAD_NATIVE_LIST(V)
Definition unit_test.cc:235
const uint8_t kPlatformStrongDill[]
intptr_t kPlatformStrongDillSize
#define RESOLVED_USER_TEST_URI
Definition unit_test.h:317
#define CORELIB_TEST_URI
Definition unit_test.h:318
#define EXPECT_VALID(handle)
Definition unit_test.h:650