51 kernel_buffer_ = kernel_buffer;
62 expectation_(strlen(expectation) > 0 ? expectation :
"Pass") {
63 if (first_ ==
nullptr) {
73 while (
test !=
nullptr) {
74 if (
test->raw_test_) {
84 while (
test !=
nullptr) {
85 if (!
test->raw_test_) {
101 ASSERT(kernel_buffer !=
nullptr);
109Dart_Isolate TestCase::CreateIsolate(
const uint8_t* data_buffer,
111 const uint8_t* instr_buffer,
114 void* isolate_data) {
122 name,
name, data_buffer, instr_buffer,
123 &api_flags, group_data, isolate_data, &err);
126 name, data_buffer, len,
127 &api_flags, group_data,
130 if (isolate ==
nullptr) {
135 EXPECT(isolate !=
nullptr);
141 void* isolate_data) {
145 group_data, isolate_data);
165 void* isolate_data) {
169 if (
error !=
nullptr) {
193 for (intptr_t i = 0; i <
test_libs_->length(); i++) {
195 (*test_libs_)[i].source =
source;
209 for (intptr_t i = 0; i <
test_libs_->length(); i++) {
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();
232 return "test:isolate_reload_helper";
235#define RELOAD_NATIVE_LIST(V) \
237 V(Test_CollectNewSpace, 0) \
238 V(Test_CollectOldSpace, 0)
251 bool* auto_setup_scope) {
256 ASSERT(auto_setup_scope !=
nullptr);
257 *auto_setup_scope =
true;
259 for (
int i = 0; i < num_entries; i++) {
279 GCTestHelper::CollectNewSpace();
284 GCTestHelper::CollectOldSpace();
302 const uint8_t** kernel_buffer,
303 intptr_t* kernel_buffer_size,
305 bool allow_compile_errors,
306 const char* multiroot_filepaths,
307 const char* multiroot_scheme) {
314 "file:///.packages",
""
319 kernel_buffer, kernel_buffer_size, incrementally, allow_compile_errors,
320 multiroot_filepaths, multiroot_scheme);
324 int sourcefiles_count,
326 const uint8_t** kernel_buffer,
327 intptr_t* kernel_buffer_size,
329 bool allow_compile_errors,
330 const char* multiroot_filepaths,
331 const char* multiroot_scheme) {
335 sourcefiles, incrementally,
false,
336 true,
nullptr, multiroot_filepaths, multiroot_scheme);
341 "An error occurred in the CFE while accepting the most recent"
342 " compilation results.");
345 return ValidateCompilationResult(zone,
result, kernel_buffer,
346 kernel_buffer_size, allow_compile_errors);
349char* TestCase::ValidateCompilationResult(
352 const uint8_t** kernel_buffer,
353 intptr_t* kernel_buffer_size,
354 bool allow_compile_errors) {
355 if (!allow_compile_errors &&
359 free(compilation_result.
error);
360 if (compilation_result.
kernel !=
nullptr) {
361 free(
const_cast<uint8_t*
>(compilation_result.
kernel));
363 *kernel_buffer =
nullptr;
364 *kernel_buffer_size = 0;
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);
372 if (kernel_buffer ==
nullptr) {
373 return OS::SCreate(zone,
"front end generated a nullptr kernel file");
396 ASSERT(sourcefiles !=
nullptr);
397 ASSERT(script !=
nullptr);
399 intptr_t num_test_libs = 0;
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;
411 return num_test_libs + 1;
418 bool finalize_classes) {
419 return LoadTestScript(script, resolver, lib_url, finalize_classes,
true);
425 bool finalize_classes,
426 bool allow_compile_errors) {
432 finalize_classes,
true, allow_compile_errors);
433 delete[] sourcefiles;
445 const char* prefixed_lib_uri =
448 const uint8_t* kernel_buffer =
nullptr;
449 intptr_t kernel_buffer_size = 0;
452 sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_buffer,
453 &kernel_buffer_size,
true);
454 if ((kernel_buffer ==
nullptr) && (
error !=
nullptr)) {
460 kernel_buffer_size,
const_cast<uint8_t*
>(kernel_buffer),
481 bool allow_compile_errors,
482 const char* entry_script_uri,
483 const char* multiroot_filepaths,
484 const char* multiroot_scheme) {
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,
495 if ((kernel_buffer ==
nullptr) &&
error !=
nullptr) {
501 kernel_buffer_size,
const_cast<uint8_t*
>(kernel_buffer),
509 entry_script_uri !=
nullptr ? entry_script_uri : sourcefiles[0].
uri));
528 FLAG_gc_during_reload =
true;
529 FLAG_force_evacuation =
true;
535 delete[] sourcefiles;
538 free(compilation_result.
error);
549 bool success =
false;
552 success = do_reload(isolate_group, &js);
564 TransitionNativeToVM transition(thread);
572 TransitionNativeToVM transition(thread);
583 false, root_script_url,
590 intptr_t kernel_buffer_size) {
593 false, kernel_buffer,
604 delete[] sourcefiles;
607 free(compilation_result.
error);
608 if (compilation_result.
kernel !=
nullptr) {
609 free(
const_cast<uint8_t*
>(compilation_result.
kernel));
618 intptr_t kernel_buffer_size) {
648 const Array& param_names,
649 const Array& param_values) {
659 expr.
ToCString(), param_names, Array::empty_array(),
660 Array::empty_array(), Array::empty_array(), Array::empty_array(),
664 TokenPosition::kNoSource,
673 const_cast<uint8_t*
>(compilation_result.
kernel),
676 val =
lib.EvaluateCompiledExpression(kernel_buffer, Array::empty_array(),
678 TypeArguments::null_type_arguments());
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');
695 const char* kDummyScript =
"assembler_test_dummy_function() {}";
703 signature,
function_name, UntaggedFunction::kRegularFunction,
true,
false,
714 if (FLAG_disassemble) {
721#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64)
726 bool in_hex_constant =
false;
727 for (
char* p = disassembly_; *p !=
'\0'; p++) {
728 if (in_hex_constant) {
732 in_hex_constant =
false;
735#if defined(TARGET_ARCH_IA32)
736 if (*p ==
'[' && *(p + 1) ==
'0' && *(p + 2) ==
'x' && IsHex(*(p + 3)) &&
739 in_hex_constant =
true;
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))) {
747 in_hex_constant =
true;
769 ASSERT(thread !=
nullptr);
779 const char* postfix) {
780 const char*
pos = strstr(in, prefix);
781 while (
pos !=
nullptr) {
788 in += strlen(prefix);
789 in += strcspn(in, postfix);
790 pos = strstr(in, prefix);
793 while (*in !=
'\0') {
static bool ok(int result)
#define RELEASE_ASSERT(cond)
#define FUNCTION_NAME(name)
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
static const Code & Generate(const char *name, const std::function< void(compiler::Assembler *assembler)> &generator)
static bool AllClassesFinalized()
static ClassPtr New(IsolateGroup *isolate_group, bool register_class=true)
void set_exception_handlers(const ExceptionHandlers &handlers) const
static CodePtr FinalizeCodeAndNotify(const Function &function, FlowGraphCompiler *compiler, compiler::Assembler *assembler, PoolAttachment pool_attachment, bool optimized=false, CodeStatistics *stats=nullptr)
uword PayloadStart() const
void set_owner(const Object &owner) const
static bool TestCompileFunction(const Function &function)
static ObjectPtr CompileFunction(Thread *thread, const Function &function)
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)
static FunctionTypePtr New(intptr_t num_parent_type_arguments=0, Nullability nullability=Nullability::kLegacy, Heap::Space space=Heap::kOld)
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)
bool reload_aborted() const
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)
void DeleteReloadContext()
SafepointRwLock * program_lock()
IsolateGroupReloadContext * reload_context()
bool ReloadSources(JSONStream *js, bool force_reload, const char *root_script_url=nullptr, const char *packages_url=nullptr, bool dont_delete_reload_context=false)
ProgramReloadContext * program_reload_context()
static void FlagsInitialize(Dart_IsolateFlags *api_flags)
void AddBufferToList(const uint8_t *kernel_buffer)
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 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()
static void static void PrintErr(const char *format,...) PRINTF_ATTRIBUTE(1
static char * SCreate(Zone *zone, const char *format,...) PRINTF_ATTRIBUTE(2
virtual const char * ToCString() const
static Object & ZoneHandle()
IsolateGroupReloadContext * group_reload_context()
static ScriptPtr New(const String &url, const String &source)
static StringPtr New(const char *cstr, Heap::Space space=Heap::kNew)
static const char * ToCString(Thread *thread, StringPtr ptr)
static StringPtr New(Thread *thread, const char *cstr)
static void CleanupState()
static void AddToKernelBuffers(const uint8_t *kernel_buffer)
const char * name() const
static KernelBufferList * current_kernel_buffers_
TestCaseBase(const char *name, const char *expectation)
static Dart_Handle TriggerReload(const uint8_t *kernel_buffer, intptr_t kernel_buffer_size)
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)
static void AddTestLib(const char *url, const char *source)
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)
static Dart_Handle ReloadTestScript(const char *script)
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)
static Dart_Isolate CreateTestIsolateInGroup(const char *name, Dart_Isolate parent, void *group_data=nullptr, void *isolate_data=nullptr)
static Dart_Handle SetReloadTestScript(const char *script)
static const char * url()
static Dart_Handle LoadTestScriptWithErrors(const char *script, Dart_NativeEntryResolver resolver=nullptr, const char *lib_uri=RESOLVED_USER_TEST_URI, bool finalize=true)
static Dart_Handle LoadTestLibrary(const char *lib_uri, const char *script, Dart_NativeEntryResolver resolver=nullptr)
static Dart_Handle ReloadTestKernel(const uint8_t *kernel_buffer, intptr_t kernel_buffer_size)
static Dart_Handle library_handler(Dart_LibraryTag tag, Dart_Handle library, Dart_Handle url)
static Dart_Handle EvaluateExpression(const Library &lib, const String &expr, const Array ¶m_names, const Array ¶m_values)
static Dart_Isolate CreateTestIsolate(const char *name=nullptr, void *isolate_group_data=nullptr, void *isolate_data=nullptr)
static const char * GetTestLib(const char *url)
static Dart_Handle LoadCoreTestScript(const char *script, Dart_NativeEntryResolver resolver)
static Dart_IsolateShutdownCallback shutdown_callback
static Dart_IsolateGroupCreateCallback create_callback
static const char ** argv
static Dart_IsolateGroupCleanupCallback group_cleanup_callback
static const uint8_t * vm_snapshot_data
static Thread * Current()
IsolateGroup * isolate_group() const
static const TokenPosition kMinSource
static bool SetOriginalWorkingDirectory()
static Dart_Handle PrepareForScriptLoading(bool is_service_isolate, bool trace_loading)
intptr_t CodeSize() const
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)
@ Dart_KernelCompilationStatus_Ok
struct _Dart_Handle * Dart_Handle
struct _Dart_Isolate * Dart_Isolate
Dart_NativeFunction(* Dart_NativeEntryResolver)(Dart_Handle name, int num_of_arguments, bool *auto_setup_scope)
struct _Dart_NativeArguments * Dart_NativeArguments
void(* Dart_IsolateGroupCleanupCallback)(void *isolate_group_data)
void(* Dart_IsolateShutdownCallback)(void *isolate_group_data, void *isolate_data)
void(* Dart_NativeFunction)(Dart_NativeArguments arguments)
static const uint8_t buffer[]
const uint8_t uint32_t uint32_t GError ** error
#define DECLARE_FLAG(type, name)
Dart_NativeFunction function
#define REGISTER_FUNCTION(name, count)
#define DECLARE_FUNCTION(name, count)
FLUTTER_ASSERT_NOT_ARC const uint8_t kPlatformStrongDill[]
const intptr_t kPlatformStrongDillSize
const uint8_t * core_isolate_snapshot_data
const uint8_t * core_isolate_snapshot_instructions
DART_EXPORT bool Dart_IsLibrary(Dart_Handle object)
void ElideJSONSubstring(const char *prefix, const char *in, char *out, const char *postfix)
DART_EXPORT void Dart_EnterScope()
const uint8_t * platform_strong_dill
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)
DART_EXPORT Dart_Handle Dart_RootLibrary()
void FUNCTION_NAME() Test_CollectNewSpace(Dart_NativeArguments native_args)
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)
DART_EXPORT void Dart_PropagateError(Dart_Handle handle)
void FUNCTION_NAME() Test_Reload(Dart_NativeArguments native_args)
static MallocGrowableArray< TestLibEntry > * test_libs_
static const char * IsolateReloadTestLibUri()
static struct dart::NativeEntries ReloadEntries[]
const intptr_t platform_strong_dill_size
static void LoadIsolateReloadTestLibIfNeeded(const char *script)
DART_EXPORT bool Dart_IsError(Dart_Handle handle)
static Dart_NativeFunction IsolateReloadTestNativeResolver(Dart_Handle name, int argument_count, bool *auto_setup_scope)
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()
static const char * kIsolateReloadTestLibSource
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)
DART_EXPORT Dart_Handle Dart_NewStringFromCString(const char *str)
void FUNCTION_NAME() Test_CollectOldSpace(Dart_NativeArguments native_args)
Dart_KernelCompilationStatus status
const int argument_count_
#define RELOAD_NATIVE_LIST(V)
const uint8_t kPlatformStrongDill[]
intptr_t kPlatformStrongDillSize
#define RESOLVED_USER_TEST_URI
#define EXPECT_VALID(handle)