Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dartutils.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 "bin/dartutils.h"
6
7#include "bin/crypto.h"
8#include "bin/directory.h"
9#include "bin/file.h"
10#include "bin/io_buffer.h"
11#include "bin/namespace.h"
12#include "bin/platform.h"
14#include "bin/utils.h"
15#include "include/dart_api.h"
18#include "platform/assert.h"
19#include "platform/globals.h"
21#include "platform/utils.h"
22
23// Return the error from the containing function if handle is in error handle.
24#define RETURN_IF_ERROR(handle) \
25 { \
26 Dart_Handle __handle = handle; \
27 if (Dart_IsError((__handle))) { \
28 return __handle; \
29 } \
30 }
31
32namespace dart {
33namespace bin {
34
35const char* DartUtils::original_working_directory = nullptr;
36
37dart::SimpleHashMap* DartUtils::environment_ = nullptr;
38
39MagicNumberData appjit_magic_number = {8, {0xdc, 0xdc, 0xf6, 0xf6, 0, 0, 0, 0}};
40MagicNumberData aotelf_magic_number = {4, {0x7F, 0x45, 0x4C, 0x46, 0x0}};
41MagicNumberData aotmacho32_magic_number = {4, {0xFE, 0xED, 0xFA, 0xCE}};
42MagicNumberData aotmacho64_magic_number = {4, {0xFE, 0xED, 0xFA, 0xCF}};
43MagicNumberData aotmacho64_arm64_magic_number = {4, {0xCF, 0xFA, 0xED, 0xFE}};
48MagicNumberData kernel_magic_number = {4, {0x90, 0xab, 0xcd, 0xef}};
50 7,
51 {0x23, 0x40, 0x64, 0x69, 0x6c, 0x6c, 0x0a}}; // #@dill\n
52MagicNumberData gzip_magic_number = {2, {0x1f, 0x8b, 0, 0}};
53
54static bool IsWindowsHost() {
55#if defined(DART_HOST_OS_WINDOWS)
56 return true;
57#else // defined(DART_HOST_OS_WINDOWS)
58 return false;
59#endif // defined(DART_HOST_OS_WINDOWS)
60}
61
63 Dart_Handle string_type = DartUtils::GetDartType("dart:core", "String");
64 if (Dart_IsError(string_type)) {
65 return string_type;
66 }
67 Dart_Handle dart_arguments =
68 Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), count_);
69 if (Dart_IsError(dart_arguments)) {
70 return dart_arguments;
71 }
72 for (int i = 0; i < count_; i++) {
73 Dart_Handle argument_value = DartUtils::NewString(GetArgument(i));
74 if (Dart_IsError(argument_value)) {
75 return argument_value;
76 }
77 Dart_Handle result = Dart_ListSetAt(dart_arguments, i, argument_value);
78 if (Dart_IsError(result)) {
79 return result;
80 }
81 }
82 return dart_arguments;
83}
84
86 int64_t value = 0;
88 if (Dart_IsError(result)) {
90 }
91 return value;
92}
93
95 int64_t lower,
96 int64_t upper) {
97 int64_t value = DartUtils::GetIntegerValue(value_obj);
98 if (value < lower || upper < value) {
99 Dart_PropagateError(Dart_NewApiError("Value outside expected range"));
100 }
101 return value;
102}
103
105 int64_t value = 0;
107 if (Dart_IsError(result)) {
109 }
110 if (value < kIntptrMin || kIntptrMax < value) {
111 Dart_PropagateError(Dart_NewApiError("Value outside intptr_t range"));
112 }
113 return static_cast<intptr_t>(value);
114}
115
116bool DartUtils::GetInt64Value(Dart_Handle value_obj, int64_t* value) {
117 bool valid = Dart_IsInteger(value_obj);
118 if (valid) {
119 Dart_Handle result = Dart_IntegerFitsIntoInt64(value_obj, &valid);
120 if (Dart_IsError(result)) {
122 }
123 }
124 if (!valid) return false;
126 if (Dart_IsError(result)) {
128 }
129 return true;
130}
131
133 const char* cstring = nullptr;
134 Dart_Handle result = Dart_StringToCString(str_obj, &cstring);
135 if (Dart_IsError(result)) {
137 }
138 return cstring;
139}
140
142 bool value = false;
144 if (Dart_IsError(result)) {
146 }
147 return value;
148}
149
151 intptr_t index) {
152 bool value = false;
154 if (Dart_IsError(result)) {
156 }
157 return value;
158}
159
161 intptr_t index) {
162 int64_t value = 0;
164 if (Dart_IsError(result)) {
166 }
167 return value;
168}
169
171 intptr_t index) {
172 int64_t value = GetNativeIntegerArgument(args, index);
173 if (value < kIntptrMin || kIntptrMax < value) {
174 Dart_PropagateError(Dart_NewApiError("Value outside intptr_t range"));
175 }
176 return static_cast<intptr_t>(value);
177}
178
180 intptr_t index) {
181 char* tmp = nullptr;
183 Dart_GetNativeStringArgument(args, index, reinterpret_cast<void**>(&tmp));
184 if (Dart_IsError(result)) {
186 }
187 if (tmp != nullptr) {
188 return tmp;
189 }
190 const char* cstring = nullptr;
192 if (Dart_IsError(result)) {
194 }
195 ASSERT(cstring != nullptr);
196 return cstring;
197}
198
200 intptr_t index) {
201 Dart_Handle handle = Dart_GetNativeArgument(args, index);
202 TypedDataScope data(handle);
204 return data.GetScopedCString();
205}
206
208 const char* name,
209 int64_t val) {
210 return Dart_SetField(handle, NewString(name), Dart_NewInteger(val));
211}
212
214 const char* name,
215 const char* val) {
216 return Dart_SetField(handle, NewString(name), NewString(val));
217}
218
219bool DartUtils::IsDartSchemeURL(const char* url_name) {
220 static const intptr_t kDartSchemeLen = strlen(kDartScheme);
221 // If the URL starts with "dart:" then it is considered as a special
222 // library URL which is handled differently from other URLs.
223 return (strncmp(url_name, kDartScheme, kDartSchemeLen) == 0);
224}
225
226bool DartUtils::IsHttpSchemeURL(const char* url_name) {
227 static const intptr_t kHttpSchemeLen = strlen(kHttpScheme);
228 return (strncmp(url_name, kHttpScheme, kHttpSchemeLen) == 0);
229}
230
231bool DartUtils::IsDartIOLibURL(const char* url_name) {
232 return (strcmp(url_name, kIOLibURL) == 0);
233}
234
235bool DartUtils::IsDartCLILibURL(const char* url_name) {
236 return (strcmp(url_name, kCLILibURL) == 0);
237}
238
239bool DartUtils::IsDartHttpLibURL(const char* url_name) {
240 return (strcmp(url_name, kHttpLibURL) == 0);
241}
242
243bool DartUtils::IsDartBuiltinLibURL(const char* url_name) {
244 return (strcmp(url_name, kBuiltinLibURL) == 0);
245}
246
247const char* DartUtils::RemoveScheme(const char* url) {
248 const char* colon = strchr(url, ':');
249 if (colon == nullptr) {
250 return url;
251 } else {
252 return colon + 1;
253 }
254}
255
256char* DartUtils::DirName(const char* url) {
257 const char* slash = strrchr(url, File::PathSeparator()[0]);
258 if (slash == nullptr) {
259 return Utils::StrDup(url);
260 } else {
261 return Utils::StrNDup(url, slash - url + 1);
262 }
263}
264
265void* DartUtils::OpenFile(const char* name, bool write) {
266 File* file =
268 return reinterpret_cast<void*>(file);
269}
270
271void* DartUtils::OpenFileUri(const char* uri, bool write) {
272 File* file =
274 return reinterpret_cast<void*>(file);
275}
276
277void DartUtils::ReadFile(uint8_t** data, intptr_t* len, void* stream) {
278 ASSERT(data != nullptr);
279 ASSERT(len != nullptr);
280 ASSERT(stream != nullptr);
281 File* file_stream = reinterpret_cast<File*>(stream);
282 int64_t file_len = file_stream->Length();
283 if ((file_len < 0) || (file_len > kIntptrMax)) {
284 *data = nullptr;
285 *len = -1; // Indicates read was not successful.
286 return;
287 }
288 *len = static_cast<intptr_t>(file_len);
289 *data = reinterpret_cast<uint8_t*>(malloc(*len));
290 if (!file_stream->ReadFully(*data, *len)) {
291 free(*data);
292 *data = nullptr;
293 *len = -1; // Indicates read was not successful.
294 return;
295 }
296}
297
299 intptr_t num_bytes,
300 void* stream) {
301 ASSERT(stream != nullptr);
302 File* file_stream = reinterpret_cast<File*>(stream);
303 bool bytes_written = file_stream->WriteFully(buffer, num_bytes);
304 ASSERT(bytes_written);
305}
306
307void DartUtils::CloseFile(void* stream) {
308 File* file = reinterpret_cast<File*>(stream);
309 file->Release();
310}
311
312bool DartUtils::EntropySource(uint8_t* buffer, intptr_t length) {
314}
315
317 const char* method,
318 Dart_Handle arg) {
319 const int kNumArgs = 1;
320 Dart_Handle dart_args[kNumArgs];
321 dart_args[0] = arg;
322 return Dart_Invoke(lib, DartUtils::NewString(method), kNumArgs, dart_args);
323}
324
325// TODO(iposva): Allocate from the zone instead of leaking error string
326// here. On the other hand the binary is about to exit anyway.
327#define SET_ERROR_MSG(error_msg, format, ...) \
328 intptr_t len = snprintf(nullptr, 0, format, __VA_ARGS__); \
329 char* msg = reinterpret_cast<char*>(malloc(len + 1)); \
330 snprintf(msg, len + 1, format, __VA_ARGS__); \
331 *error_msg = msg
332
333static uint8_t* ReadFileFully(const char* filename,
334 intptr_t* file_len,
335 const char** error_msg) {
336 *file_len = -1;
337 void* stream = DartUtils::OpenFile(filename, false);
338 if (stream == nullptr) {
339 SET_ERROR_MSG(error_msg, "Unable to open file: %s", filename);
340 return nullptr;
341 }
342 uint8_t* text_buffer = nullptr;
343 DartUtils::ReadFile(&text_buffer, file_len, stream);
344 if (text_buffer == nullptr || *file_len == -1) {
345 *error_msg = "Unable to read file contents";
346 text_buffer = nullptr;
347 }
348 DartUtils::CloseFile(stream);
349 return text_buffer;
350}
351
353 const char* error_msg = nullptr;
354 intptr_t len;
355 uint8_t* text_buffer = ReadFileFully(filename, &len, &error_msg);
356 if (text_buffer == nullptr) {
357 return Dart_NewApiError(error_msg);
358 }
359 Dart_Handle str = Dart_NewStringFromUTF8(text_buffer, len);
360 free(text_buffer);
361 return str;
362}
363
364Dart_Handle DartUtils::MakeUint8Array(const void* buffer, intptr_t len) {
366 RETURN_IF_ERROR(array);
367 {
368 Dart_TypedData_Type td_type;
369 void* td_data;
370 intptr_t td_len;
372 Dart_TypedDataAcquireData(array, &td_type, &td_data, &td_len);
374 ASSERT(td_type == Dart_TypedData_kUint8);
375 ASSERT(td_len == len);
376 ASSERT(td_data != nullptr);
377 memmove(td_data, buffer, td_len);
380 }
381 return array;
382}
383
384Dart_Handle DartUtils::SetWorkingDirectory() {
386 return SingleArgDart_Invoke(LookupBuiltinLib(), "_setWorkingDirectory",
387 directory);
388}
389
391 const int kNumArgs = 1;
392 Dart_Handle dart_args[kNumArgs];
393 dart_args[0] = url;
395 NewString("_resolveScriptUri"), kNumArgs, dart_args);
396}
397
398static bool CheckMagicNumber(const uint8_t* buffer,
399 intptr_t buffer_length,
400 const MagicNumberData& magic_number) {
401 if ((buffer_length >= magic_number.length)) {
402 return memcmp(buffer, magic_number.bytes, magic_number.length) == 0;
403 }
404 return false;
405}
406
433
435 intptr_t buffer_length) {
436 if (CheckMagicNumber(buffer, buffer_length, appjit_magic_number)) {
437 return kAppJITMagicNumber;
438 }
439
440 if (CheckMagicNumber(buffer, buffer_length, kernel_magic_number)) {
441 return kKernelMagicNumber;
442 }
443
444 if (CheckMagicNumber(buffer, buffer_length, kernel_list_magic_number)) {
446 }
447
448 if (CheckMagicNumber(buffer, buffer_length, gzip_magic_number)) {
449 return kGzipMagicNumber;
450 }
451
452 if (CheckMagicNumber(buffer, buffer_length, gzip_magic_number)) {
453 return kGzipMagicNumber;
454 }
455
456 if (CheckMagicNumber(buffer, buffer_length, aotelf_magic_number)) {
457 return kAotELFMagicNumber;
458 }
459
460 if (CheckMagicNumber(buffer, buffer_length, aotmacho32_magic_number)) {
462 }
463
464 if (CheckMagicNumber(buffer, buffer_length, aotmacho64_magic_number)) {
466 }
467
470 }
471
474 }
475
478 }
479
482 }
483
486 }
487
488 return kUnknownMagicNumber;
489}
490
491Dart_Handle DartUtils::PrepareBuiltinLibrary(Dart_Handle builtin_lib,
492 Dart_Handle internal_lib,
493 bool is_service_isolate,
494 bool trace_loading) {
495 // Setup the internal library's 'internalPrint' function.
497 Dart_Invoke(builtin_lib, NewString("_getPrintClosure"), 0, nullptr);
500 Dart_SetField(internal_lib, NewString("_printClosure"), print);
502
503 if (!is_service_isolate) {
504 if (IsWindowsHost()) {
505 result = Dart_SetField(builtin_lib, NewString("_isWindows"), Dart_True());
507 }
508 if (trace_loading) {
509 result =
510 Dart_SetField(builtin_lib, NewString("_traceLoading"), Dart_True());
512 }
513 // Set current working directory.
514 result = SetWorkingDirectory();
516 }
517 return Dart_True();
518}
519
520Dart_Handle DartUtils::PrepareCoreLibrary(Dart_Handle core_lib,
521 Dart_Handle io_lib,
522 bool is_service_isolate) {
523 if (!is_service_isolate) {
524 // Setup the 'Uri.base' getter in dart:core.
525 Dart_Handle uri_base =
526 Dart_Invoke(io_lib, NewString("_getUriBaseClosure"), 0, nullptr);
527 RETURN_IF_ERROR(uri_base);
529 Dart_SetField(core_lib, NewString("_uriBaseClosure"), uri_base);
531 }
532 return Dart_True();
533}
534
535Dart_Handle DartUtils::PrepareAsyncLibrary(Dart_Handle async_lib,
536 Dart_Handle isolate_lib) {
537 Dart_Handle schedule_immediate_closure =
538 Dart_Invoke(isolate_lib, NewString("_getIsolateScheduleImmediateClosure"),
539 0, nullptr);
540 RETURN_IF_ERROR(schedule_immediate_closure);
541 Dart_Handle args[1];
542 args[0] = schedule_immediate_closure;
543 return Dart_Invoke(async_lib, NewString("_setScheduleImmediateClosure"), 1,
544 args);
545}
546
547Dart_Handle DartUtils::PrepareIOLibrary(Dart_Handle io_lib) {
548 return Dart_Invoke(io_lib, NewString("_setupHooks"), 0, nullptr);
549}
550
551Dart_Handle DartUtils::PrepareIsolateLibrary(Dart_Handle isolate_lib) {
552 return Dart_Invoke(isolate_lib, NewString("_setupHooks"), 0, nullptr);
553}
554
555Dart_Handle DartUtils::PrepareCLILibrary(Dart_Handle cli_lib) {
556 return Dart_Null();
557}
558
559Dart_Handle DartUtils::SetupPackageConfig(const char* packages_config) {
561
562 if (packages_config != nullptr) {
563 result = NewString(packages_config);
565 const int kNumArgs = 1;
566 Dart_Handle dart_args[kNumArgs];
567 dart_args[0] = result;
569 NewString("_setPackagesMap"), kNumArgs, dart_args);
570 }
571 return result;
572}
573
575 bool trace_loading) {
576 // First ensure all required libraries are available.
578 RETURN_IF_ERROR(url);
579 Dart_Handle core_lib = Dart_LookupLibrary(url);
580 RETURN_IF_ERROR(core_lib);
581 url = NewString(kAsyncLibURL);
582 RETURN_IF_ERROR(url);
583 Dart_Handle async_lib = Dart_LookupLibrary(url);
584 RETURN_IF_ERROR(async_lib);
586 RETURN_IF_ERROR(url);
587 Dart_Handle isolate_lib = Dart_LookupLibrary(url);
588 RETURN_IF_ERROR(isolate_lib);
590 RETURN_IF_ERROR(url);
591 Dart_Handle internal_lib = Dart_LookupLibrary(url);
592 RETURN_IF_ERROR(internal_lib);
593 Dart_Handle builtin_lib =
595 RETURN_IF_ERROR(builtin_lib);
598 RETURN_IF_ERROR(io_lib);
601 RETURN_IF_ERROR(cli_lib);
603
604 // We need to ensure that all the scripts loaded so far are finalized
605 // as we are about to invoke some Dart code below to setup closures.
608
609 result = PrepareBuiltinLibrary(builtin_lib, internal_lib, is_service_isolate,
610 trace_loading);
612
613 RETURN_IF_ERROR(PrepareAsyncLibrary(async_lib, isolate_lib));
614 RETURN_IF_ERROR(PrepareCoreLibrary(core_lib, io_lib, is_service_isolate));
615 RETURN_IF_ERROR(PrepareIsolateLibrary(isolate_lib));
616 RETURN_IF_ERROR(PrepareIOLibrary(io_lib));
617 RETURN_IF_ERROR(PrepareCLILibrary(cli_lib));
618 return result;
619}
620
621Dart_Handle DartUtils::SetupIOLibrary(const char* namespc_path,
622 const char* script_uri,
623 bool disable_exit) {
624 Dart_Handle io_lib_url = NewString(kIOLibURL);
625 RETURN_IF_ERROR(io_lib_url);
626 Dart_Handle io_lib = Dart_LookupLibrary(io_lib_url);
627 RETURN_IF_ERROR(io_lib);
628
629 if (namespc_path != nullptr) {
630 Dart_Handle namespc_type = GetDartType(DartUtils::kIOLibURL, "_Namespace");
631 RETURN_IF_ERROR(namespc_type);
632 Dart_Handle args[1];
633 args[0] = NewString(namespc_path);
636 Dart_Invoke(namespc_type, NewString("_setupNamespace"), 1, args);
638 }
639
640 if (disable_exit) {
641 Dart_Handle embedder_config_type =
642 GetDartType(DartUtils::kIOLibURL, "_EmbedderConfig");
643 RETURN_IF_ERROR(embedder_config_type);
644 Dart_Handle result = Dart_SetField(embedder_config_type,
645 NewString("_mayExit"), Dart_False());
647 }
648
649 Dart_Handle platform_type = GetDartType(DartUtils::kIOLibURL, "_Platform");
650 RETURN_IF_ERROR(platform_type);
651 Dart_Handle script_name = NewString("_nativeScript");
652 RETURN_IF_ERROR(script_name);
653 Dart_Handle dart_script = NewString(script_uri);
654 RETURN_IF_ERROR(dart_script);
655 Dart_Handle set_script_name =
656 Dart_SetField(platform_type, script_name, dart_script);
657 RETURN_IF_ERROR(set_script_name);
658
659#if !defined(PRODUCT)
660 Dart_Handle network_profiling_type =
661 GetDartType(DartUtils::kIOLibURL, "_NetworkProfiling");
662 RETURN_IF_ERROR(network_profiling_type);
664 Dart_Invoke(network_profiling_type,
665 NewString("_registerServiceExtension"), 0, nullptr);
667#endif // !defined(PRODUCT)
668 return Dart_Null();
669}
670
672 // Post a message with just the null object.
673 return Dart_PostCObject(port_id, CObject::Null()->AsApiCObject());
674}
675
676bool DartUtils::PostInt32(Dart_Port port_id, int32_t value) {
677 // Post a message with the integer value.
678 int32_t min = 0xc0000000; // -1073741824
679 int32_t max = 0x3fffffff; // 1073741823
680 ASSERT(min <= value && value < max);
681 Dart_CObject object;
682 object.type = Dart_CObject_kInt32;
683 object.value.as_int32 = value;
684 return Dart_PostCObject(port_id, &object);
685}
686
687bool DartUtils::PostInt64(Dart_Port port_id, int64_t value) {
688 // Post a message with the integer value.
689 Dart_CObject object;
690 object.type = Dart_CObject_kInt64;
691 object.value.as_int64 = value;
692 return Dart_PostCObject(port_id, &object);
693}
694
695bool DartUtils::PostString(Dart_Port port_id, const char* value) {
697 return Dart_PostCObject(port_id, object);
698}
699
700Dart_Handle DartUtils::GetDartType(const char* library_url,
701 const char* class_name) {
703 NewString(class_name), 0, nullptr);
704}
705
707 // Extract the current OS error.
708 OSError os_error;
709 return NewDartOSError(&os_error);
710}
711
713 // Create a dart:io OSError object with the information retrieved from the OS.
716 Dart_Handle args[2];
717 args[0] = NewString(os_error->message());
718 args[1] = Dart_NewInteger(os_error->code());
719 return Dart_New(type, Dart_Null(), 2, args);
720}
721
723 const char* exception_name,
724 const char* message,
725 Dart_Handle os_error) {
726 // Create a Dart Exception object with a message and an OSError.
727 Dart_Handle type = GetDartType(library_url, exception_name);
729 Dart_Handle args[2];
730 args[0] = NewString(message);
731 args[1] = os_error;
732 return Dart_New(type, Dart_Null(), 2, args);
733}
734
736 const char* exception_name,
737 const char* message) {
738 // Create a Dart Exception object with a message.
739 Dart_Handle type = GetDartType(library_url, exception_name);
741 if (message != nullptr) {
742 Dart_Handle args[1];
743 args[0] = NewString(message);
744 return Dart_New(type, Dart_Null(), 1, args);
745 } else {
746 return Dart_New(type, Dart_Null(), 0, nullptr);
747 }
748}
749
753
757
761
763 const char* message,
764 Dart_Handle os_error) {
765 // Create a dart:io exception object of the given type.
766 return NewDartExceptionWithOSError(kIOLibURL, exception_name, message,
767 os_error);
768}
769
771 va_list measure_args;
772 va_start(measure_args, format);
773 intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
774 va_end(measure_args);
775
776 char* buffer = reinterpret_cast<char*>(Dart_ScopeAllocate(len + 1));
777 MSAN_UNPOISON(buffer, (len + 1));
778 va_list print_args;
779 va_start(print_args, format);
780 Utils::VSNPrint(buffer, (len + 1), format, print_args);
781 va_end(print_args);
782
783 return Dart_NewApiError(buffer);
784}
785
789
791 va_list args;
794 va_end(args);
795 return NewString(result);
796}
797
798char* DartUtils::ScopedCStringVFormatted(const char* format, va_list args) {
799 va_list measure_args;
800 va_copy(measure_args, args);
801 intptr_t len = Utils::VSNPrint(nullptr, 0, format, measure_args);
802 if (len < 0) {
803 return nullptr;
804 }
805 va_end(measure_args);
806
807 char* buffer = ScopedCString(len + 1);
808 MSAN_UNPOISON(buffer, (len + 1));
809 va_list print_args;
810 va_copy(print_args, args);
811 len = Utils::VSNPrint(buffer, (len + 1), format, print_args);
812 if (len < 0) {
813 return nullptr;
814 }
815 va_end(print_args);
816 return buffer;
817}
818
820 va_list args;
823 va_end(args);
824 return result;
825}
826
828 // If we happen to re-initialize the Dart VM multiple times, make sure to free
829 // the old string (allocated by getcwd()) before setting a new one.
830 if (original_working_directory != nullptr) {
831 free(const_cast<char*>(original_working_directory));
832 }
834 return original_working_directory != nullptr;
835}
836
840
842 uint8_t* utf8_array;
843 intptr_t utf8_len;
845 Dart_Handle handle = Dart_StringToUTF8(name, &utf8_array, &utf8_len);
846 if (Dart_IsError(handle)) {
847 handle = Dart_ThrowException(
849 } else {
850 char* name_chars = reinterpret_cast<char*>(malloc(utf8_len + 1));
851 memmove(name_chars, utf8_array, utf8_len);
852 name_chars[utf8_len] = '\0';
853 const char* value = nullptr;
854 if (environment_ != nullptr) {
855 SimpleHashMap::Entry* entry =
856 environment_->Lookup(GetHashmapKeyFromString(name_chars),
857 SimpleHashMap::StringHash(name_chars), false);
858 if (entry != nullptr) {
859 value = reinterpret_cast<char*>(entry->value);
860 }
861 }
862 if (value != nullptr) {
863 result = Dart_NewStringFromUTF8(reinterpret_cast<const uint8_t*>(value),
864 strlen(value));
865 if (Dart_IsError(result)) {
866 result = Dart_Null();
867 }
868 }
869 free(name_chars);
870 }
871 return result;
872}
873
874// Statically allocated Dart_CObject instances for immutable
875// objects. As these will be used by different threads the use of
876// these depends on the fact that the marking internally in the
877// Dart_CObject structure is not marking simple value objects.
878Dart_CObject CObject::api_null_ = {Dart_CObject_kNull, {false}};
879Dart_CObject CObject::api_true_ = {Dart_CObject_kBool, {true}};
880Dart_CObject CObject::api_false_ = {Dart_CObject_kBool, {false}};
881CObject CObject::null_(&api_null_);
882CObject CObject::true_(&api_true_);
883CObject CObject::false_(&api_false_);
884
886 return &null_;
887}
888
890 return &true_;
891}
892
894 return &false_;
895}
896
897CObject* CObject::Bool(bool value) {
898 return value ? &true_ : &false_;
899}
900
901Dart_CObject* CObject::New(Dart_CObject_Type type, int additional_bytes) {
902 Dart_CObject* cobject = reinterpret_cast<Dart_CObject*>(
903 Dart_ScopeAllocate(sizeof(Dart_CObject) + additional_bytes));
904 cobject->type = type;
905 return cobject;
906}
907
909 Dart_CObject* cobject = New(Dart_CObject_kInt32);
910 cobject->value.as_int32 = value;
911 return cobject;
912}
913
915 Dart_CObject* cobject = New(Dart_CObject_kInt64);
916 cobject->value.as_int64 = value;
917 return cobject;
918}
919
921 // Pointer values passed as intptr_t are always send as int64_t.
922 Dart_CObject* cobject = New(Dart_CObject_kInt64);
923 cobject->value.as_int64 = value;
924 return cobject;
925}
926
928 Dart_CObject* cobject = New(Dart_CObject_kDouble);
929 cobject->value.as_double = value;
930 return cobject;
931}
932
934 intptr_t length = strlen(str);
935 Dart_CObject* cobject = New(Dart_CObject_kString, length + 1);
936 char* payload = reinterpret_cast<char*>(cobject + 1);
937 memmove(payload, str, length + 1);
938 cobject->value.as_string = payload;
939 return cobject;
940}
941
943 Dart_CObject* cobject =
944 New(Dart_CObject_kArray, length * sizeof(Dart_CObject*)); // NOLINT
945 cobject->value.as_array.length = length;
946 cobject->value.as_array.values =
947 reinterpret_cast<Dart_CObject**>(cobject + 1);
948 return cobject;
949}
950
953 memmove(reinterpret_cast<uint8_t*>(cobject + 1), data, length);
955 cobject->value.as_typed_data.length = length;
956 cobject->value.as_typed_data.values =
957 reinterpret_cast<const uint8_t*>(cobject + 1);
958 return cobject;
959}
960
973
975 intptr_t size,
978 cobject->value.as_native_pointer.ptr = ptr;
979 cobject->value.as_native_pointer.size = size;
981 return cobject;
982}
983
985 // Make sure that we do not have an integer overflow here. Actual check
986 // against max elements will be done at the time of writing, as the constant
987 // is not part of the public API.
988 if ((length < 0) || (length > kIntptrMax)) {
989 return nullptr;
990 }
991 uint8_t* data = IOBuffer::Allocate(static_cast<intptr_t>(length));
992 if (data == nullptr) {
993 return nullptr;
994 }
995 return NewExternalUint8Array(static_cast<intptr_t>(length), data, data,
997}
998
999void CObject::ShrinkIOBuffer(Dart_CObject* cobject, int64_t new_length) {
1000 if (cobject == nullptr) return;
1002
1003 const auto old_data = cobject->value.as_external_typed_data.data;
1004 const auto old_length = cobject->value.as_external_typed_data.length;
1005
1006 // We only shrink IOBuffers, never grow them.
1007 ASSERT(0 <= new_length && new_length <= old_length);
1008
1009 // We only reallocate if we think the freed space is worth reallocating.
1010 // We consider it worthwhile when freed space is >=25% and we have at
1011 // least 100 free bytes.
1012 const auto free_memory = old_length - new_length;
1013 if ((old_length >> 2) <= free_memory && 100 <= free_memory) {
1014 const auto new_data = IOBuffer::Reallocate(old_data, new_length);
1015 if (new_data != nullptr) {
1016 cobject->value.as_external_typed_data.data = new_data;
1017 cobject->value.as_external_typed_data.peer = new_data;
1018 }
1019 }
1020
1021 // The typed data object always has to have the shranken length.
1022 cobject->value.as_external_typed_data.length = new_length;
1023}
1024
1028 nullptr, cobject->value.as_external_typed_data.peer);
1029 cobject->value.as_external_typed_data.data = nullptr;
1030}
1031
1037
1043
1045 OSError os_error;
1046 return NewOSError(&os_error);
1047}
1048
1050 CObject* error_message =
1051 new CObjectString(CObject::NewString(os_error->message()));
1054 result->SetAt(1, new CObjectInt32(CObject::NewInt32(os_error->code())));
1055 result->SetAt(2, error_message);
1056 return result;
1057}
1058
1059} // namespace bin
1060} // namespace dart
void print(void *str)
Definition bridge.cpp:126
Entry * Lookup(void *key, uint32_t hash, bool insert)
Definition hashmap.cc:20
static uint32_t StringHash(const char *key)
Definition hashmap.h:26
static char * StrDup(const char *s)
static int static int VSNPrint(char *str, size_t size, const char *format, va_list args)
static char * StrNDup(const char *s, intptr_t n)
static Dart_Handle LoadAndCheckLibrary(BuiltinLibraryId id)
Definition builtin.cc:43
static void SetNativeResolver(BuiltinLibraryId id)
Definition builtin.cc:28
Dart_CObject_Type type()
Definition dartutils.h:338
static Dart_CObject * NewString(const char *str)
Definition dartutils.cc:933
static CObject * IllegalArgumentError()
static CObject * FileClosedError()
static Dart_CObject * NewExternalUint8Array(intptr_t length, uint8_t *data, void *peer, Dart_HandleFinalizer callback)
Definition dartutils.cc:961
static void FreeIOBufferData(Dart_CObject *object)
static Dart_CObject * NewIntptr(intptr_t value)
Definition dartutils.cc:920
static constexpr int kOSError
Definition dartutils.h:334
static constexpr int kFileClosedError
Definition dartutils.h:335
static Dart_CObject * NewIOBuffer(int64_t length)
Definition dartutils.cc:984
static CObject * Bool(bool value)
Definition dartutils.cc:897
static Dart_CObject * NewArray(intptr_t length)
Definition dartutils.cc:942
static CObject * True()
Definition dartutils.cc:889
static Dart_CObject * NewUint8Array(const void *data, intptr_t length)
Definition dartutils.cc:951
static constexpr int kArgumentError
Definition dartutils.h:333
static Dart_CObject * NewNativePointer(intptr_t ptr, intptr_t size, Dart_HandleFinalizer callback)
Definition dartutils.cc:974
static Dart_CObject * NewInt32(int32_t value)
Definition dartutils.cc:908
static Dart_CObject * NewInt64(int64_t value)
Definition dartutils.cc:914
static Dart_CObject * NewDouble(double value)
Definition dartutils.cc:927
static CObject * NewOSError()
static void ShrinkIOBuffer(Dart_CObject *cobject, int64_t new_length)
Definition dartutils.cc:999
static CObject * Null()
Definition dartutils.cc:885
static CObject * False()
Definition dartutils.cc:893
Dart_Handle CreateRuntimeOptions()
Definition dartutils.cc:62
const char * GetArgument(int index) const
Definition dartutils.h:65
static bool GetRandomBytes(intptr_t count, uint8_t *buffer)
static constexpr const char * kDartScheme
Definition dartutils.h:290
static constexpr const char * kCLILibURL
Definition dartutils.h:299
static int64_t GetNativeIntegerArgument(Dart_NativeArguments args, intptr_t index)
Definition dartutils.cc:160
static Dart_Handle NewDartFormatException(const char *message)
Definition dartutils.cc:754
static char static char * ScopedCStringVFormatted(const char *format, va_list args)
Definition dartutils.cc:798
static int64_t GetIntegerValue(Dart_Handle value_obj)
Definition dartutils.cc:85
static Dart_Handle SetupPackageConfig(const char *packages_file)
Definition dartutils.cc:559
static int64_t GetInt64ValueCheckRange(Dart_Handle value_obj, int64_t lower, int64_t upper)
Definition dartutils.cc:94
static Dart_Handle NewDartExceptionWithMessage(const char *library_url, const char *exception_name, const char *message)
Definition dartutils.cc:735
static Dart_Handle LookupBuiltinLib()
Definition dartutils.h:248
static constexpr const char * kIOLibURL
Definition dartutils.h:297
static const char * GetNativeTypedDataArgument(Dart_NativeArguments args, intptr_t index)
Definition dartutils.cc:199
static Dart_Handle NewDartOSError()
Definition dartutils.cc:706
static constexpr const char * kAsyncLibURL
Definition dartutils.h:291
static constexpr const char * kIsolateLibURL
Definition dartutils.h:295
static char * DirName(const char *url)
Definition dartutils.cc:256
static void ReadFile(uint8_t **data, intptr_t *file_len, void *stream)
Definition dartutils.cc:277
static Dart_Handle ReadStringFromFile(const char *filename)
Definition dartutils.cc:352
static bool GetBooleanValue(Dart_Handle bool_obj)
Definition dartutils.cc:141
static bool GetInt64Value(Dart_Handle value_obj, int64_t *value)
Definition dartutils.cc:116
static bool IsHttpSchemeURL(const char *url_name)
Definition dartutils.cc:226
static const char * GetStringValue(Dart_Handle str_obj)
Definition dartutils.cc:132
static void * OpenFileUri(const char *uri, bool write)
Definition dartutils.cc:271
static Dart_Handle NewDartExceptionWithOSError(const char *library_url, const char *exception_name, const char *message, Dart_Handle os_error)
Definition dartutils.cc:722
static Dart_Handle MakeUint8Array(const void *buffer, intptr_t length)
Definition dartutils.cc:364
static bool IsDartBuiltinLibURL(const char *url_name)
Definition dartutils.cc:243
static constexpr const char * kInternalLibURL
Definition dartutils.h:294
static Dart_Handle SetupIOLibrary(const char *namespc_path, const char *script_uri, bool disable_exit)
Definition dartutils.cc:621
static bool PostInt32(Dart_Port port_id, int32_t value)
Definition dartutils.cc:676
static Dart_Handle NewStringFormatted(const char *format,...)
Definition dartutils.cc:790
static const char * original_working_directory
Definition dartutils.h:288
static bool SetOriginalWorkingDirectory()
Definition dartutils.cc:827
static bool PostNull(Dart_Port port_id)
Definition dartutils.cc:671
static Dart_Handle NewError(const char *format,...)
Definition dartutils.cc:770
static char * ScopedCStringFormatted(const char *format,...) PRINTF_ATTRIBUTE(1
Definition dartutils.cc:819
static bool EntropySource(uint8_t *buffer, intptr_t length)
Definition dartutils.cc:312
static Dart_Handle EnvironmentCallback(Dart_Handle name)
Definition dartutils.cc:841
static Dart_Handle NewDartIOException(const char *exception_name, const char *message, Dart_Handle os_error)
Definition dartutils.cc:762
static bool PostString(Dart_Port port_id, const char *value)
Definition dartutils.cc:695
static constexpr const char * kHttpLibURL
Definition dartutils.h:296
static constexpr const char * kCoreLibURL
Definition dartutils.h:293
static bool PostInt64(Dart_Port port_id, int64_t value)
Definition dartutils.cc:687
static Dart_Handle NewDartUnsupportedError(const char *message)
Definition dartutils.cc:758
static intptr_t GetNativeIntptrArgument(Dart_NativeArguments args, intptr_t index)
Definition dartutils.cc:170
static char * ScopedCString(intptr_t length)
Definition dartutils.h:224
static Dart_Handle NewString(const char *str)
Definition dartutils.h:214
static Dart_Handle PrepareForScriptLoading(bool is_service_isolate, bool trace_loading)
Definition dartutils.cc:574
static void SetEnvironment(dart::SimpleHashMap *environment)
Definition dartutils.cc:837
static Dart_Handle SetIntegerField(Dart_Handle handle, const char *name, int64_t val)
Definition dartutils.cc:207
static void CloseFile(void *stream)
Definition dartutils.cc:307
static Dart_Handle NewDartArgumentError(const char *message)
Definition dartutils.cc:750
static MagicNumber SniffForMagicNumber(const char *filename)
Definition dartutils.cc:407
static void * OpenFile(const char *name, bool write)
Definition dartutils.cc:265
static Dart_Handle NewInternalError(const char *message)
Definition dartutils.cc:786
static const char * RemoveScheme(const char *url)
Definition dartutils.cc:247
static bool IsDartCLILibURL(const char *url_name)
Definition dartutils.cc:235
static constexpr const char * kBuiltinLibURL
Definition dartutils.h:292
static bool IsDartSchemeURL(const char *url_name)
Definition dartutils.cc:219
static Dart_Handle SetStringField(Dart_Handle handle, const char *name, const char *val)
Definition dartutils.cc:213
static bool IsDartHttpLibURL(const char *url_name)
Definition dartutils.cc:239
static constexpr int64_t kMaxMagicNumberSize
Definition dartutils.h:271
static Dart_Handle ResolveScript(Dart_Handle url)
Definition dartutils.cc:390
static bool IsDartIOLibURL(const char *url_name)
Definition dartutils.cc:231
static Dart_Handle GetDartType(const char *library_url, const char *class_name)
Definition dartutils.cc:700
static intptr_t GetIntptrValue(Dart_Handle value_obj)
Definition dartutils.cc:104
static constexpr const char * kHttpScheme
Definition dartutils.h:302
static const char * GetNativeStringArgument(Dart_NativeArguments args, intptr_t index)
Definition dartutils.cc:179
static void WriteFile(const void *buffer, intptr_t num_bytes, void *stream)
Definition dartutils.cc:298
static bool GetNativeBooleanArgument(Dart_NativeArguments args, intptr_t index)
Definition dartutils.cc:150
static char * CurrentNoScope()
static File * OpenUri(Namespace *namespc, const char *uri, FileOpenMode mode)
static const char * PathSeparator()
bool WriteFully(const void *buffer, int64_t num_bytes)
bool ReadFully(void *buffer, int64_t num_bytes)
static File * Open(Namespace *namespc, const char *path, FileOpenMode mode)
int64_t Length()
@ kWriteTruncate
Definition file.h:60
static Type GetType(Namespace *namespc, const char *path, bool follow_links)
static void Finalizer(void *isolate_callback_data, void *buffer)
Definition io_buffer.h:31
static Dart_Handle Allocate(intptr_t size, uint8_t **buffer)
Definition io_buffer.cc:12
static uint8_t * Reallocate(uint8_t *buffer, intptr_t new_size)
Definition io_buffer.cc:34
char * message()
Definition utils.h:36
int64_t Dart_Port
Definition dart_api.h:1524
struct _Dart_Handle * Dart_Handle
Definition dart_api.h:258
void(* Dart_HandleFinalizer)(void *isolate_callback_data, void *peer)
Definition dart_api.h:265
struct _Dart_NativeArguments * Dart_NativeArguments
Definition dart_api.h:3010
Dart_TypedData_Type
Definition dart_api.h:2603
@ Dart_TypedData_kUint8
Definition dart_api.h:2606
Dart_CObject_Type
@ Dart_CObject_kInt64
@ Dart_CObject_kNativePointer
@ Dart_CObject_kDouble
@ Dart_CObject_kTypedData
@ Dart_CObject_kString
@ Dart_CObject_kArray
@ Dart_CObject_kNull
@ Dart_CObject_kExternalTypedData
@ Dart_CObject_kInt32
@ Dart_CObject_kBool
#define SET_ERROR_MSG(error_msg, format,...)
Definition dartutils.cc:327
#define RETURN_IF_ERROR(handle)
Definition dartutils.cc:24
#define ASSERT(E)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
static const uint8_t buffer[]
uint8_t value
GAsyncResult * result
uint32_t uint32_t * format
static float max(float r, float g, float b)
Definition hsl.cpp:49
static float min(float r, float g, float b)
Definition hsl.cpp:48
size_t length
Win32Message message
#define MSAN_UNPOISON(ptr, len)
MagicNumberData gzip_magic_number
Definition dartutils.cc:52
MagicNumberData aotcoff_riscv32_magic_number
Definition dartutils.cc:46
MagicNumberData appjit_magic_number
Definition dartutils.cc:39
static void * GetHashmapKeyFromString(char *key)
Definition dartutils.h:38
va_start(args, format)
MagicNumberData aotmacho32_magic_number
Definition dartutils.cc:41
static uint8_t * ReadFileFully(const char *filename, intptr_t *file_len, const char **error_msg)
Definition dartutils.cc:333
CObject CObject::false_ & api_false_
Definition dartutils.cc:883
MagicNumberData aotmacho64_magic_number
Definition dartutils.cc:42
static Dart_Handle SingleArgDart_Invoke(Dart_Handle lib, const char *method, Dart_Handle arg)
Definition dartutils.cc:316
MagicNumberData kernel_list_magic_number
Definition dartutils.cc:49
va_end(args)
MagicNumberData aotelf_magic_number
Definition dartutils.cc:40
CObject CObject::true_ & api_true_
Definition dartutils.cc:882
static bool CheckMagicNumber(const uint8_t *buffer, intptr_t buffer_length, const MagicNumberData &magic_number)
Definition dartutils.cc:398
MagicNumberData aotcoff_riscv64_magic_number
Definition dartutils.cc:47
CObject CObject::null_ & api_null_
Definition dartutils.cc:881
MagicNumberData kernel_magic_number
Definition dartutils.cc:48
static bool IsWindowsHost()
Definition dartutils.cc:54
MagicNumberData aotcoff_arm64_magic_number
Definition dartutils.cc:45
MagicNumberData aotcoff_arm32_magic_number
Definition dartutils.cc:44
MagicNumberData aotmacho64_arm64_magic_number
Definition dartutils.cc:43
static dart::SimpleHashMap * environment
DART_EXPORT Dart_Handle Dart_StringToUTF8(Dart_Handle str, uint8_t **utf8_array, intptr_t *length)
DART_EXPORT Dart_Handle Dart_GetNativeStringArgument(Dart_NativeArguments args, int arg_index, void **peer)
const char *const name
DART_EXPORT Dart_Handle Dart_FinalizeLoading(bool complete_futures)
DART_EXPORT Dart_Handle Dart_False()
DART_EXPORT Dart_Handle Dart_Invoke(Dart_Handle target, Dart_Handle name, int number_of_arguments, Dart_Handle *arguments)
DART_EXPORT Dart_Handle Dart_True()
void * malloc(size_t size)
Definition allocation.cc:19
const char *const class_name
constexpr intptr_t kIntptrMin
Definition globals.h:556
DART_EXPORT Dart_Handle Dart_NewInteger(int64_t value)
DART_EXPORT Dart_Handle Dart_BooleanValue(Dart_Handle boolean_obj, bool *value)
DART_EXPORT Dart_Handle Dart_NewStringFromUTF8(const uint8_t *utf8_array, intptr_t length)
DART_EXPORT void Dart_PropagateError(Dart_Handle handle)
DART_EXPORT Dart_Handle Dart_GetNonNullableType(Dart_Handle library, Dart_Handle class_name, intptr_t number_of_type_arguments, Dart_Handle *type_arguments)
DART_EXPORT const char * Dart_GetError(Dart_Handle handle)
DART_EXPORT Dart_Handle Dart_NewTypedData(Dart_TypedData_Type type, intptr_t length)
DART_EXPORT uint8_t * Dart_ScopeAllocate(intptr_t size)
DART_EXPORT Dart_Handle Dart_TypedDataAcquireData(Dart_Handle object, Dart_TypedData_Type *type, void **data, intptr_t *len)
DART_EXPORT Dart_Handle Dart_NewListOfTypeFilled(Dart_Handle element_type, Dart_Handle fill_object, intptr_t length)
DART_EXPORT Dart_Handle Dart_ListSetAt(Dart_Handle list, intptr_t index, Dart_Handle value)
DART_EXPORT bool Dart_IsError(Dart_Handle handle)
DART_EXPORT Dart_Handle Dart_EmptyString()
DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, int index)
DART_EXPORT Dart_Handle Dart_SetField(Dart_Handle container, Dart_Handle name, Dart_Handle value)
DART_EXPORT Dart_Handle Dart_TypedDataReleaseData(Dart_Handle object)
DART_EXPORT Dart_Handle Dart_IntegerFitsIntoInt64(Dart_Handle integer, bool *fits)
DART_EXPORT Dart_Handle Dart_NewApiError(const char *error)
DART_EXPORT Dart_Handle Dart_LookupLibrary(Dart_Handle url)
DART_EXPORT Dart_Handle Dart_ThrowException(Dart_Handle exception)
DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, int index, int64_t *value)
DART_EXPORT bool Dart_IsInteger(Dart_Handle object)
DART_EXPORT bool Dart_PostCObject(Dart_Port port_id, Dart_CObject *message)
DART_EXPORT Dart_Handle Dart_Null()
DART_EXPORT Dart_Handle Dart_New(Dart_Handle type, Dart_Handle constructor_name, int number_of_arguments, Dart_Handle *arguments)
static int8_t data[kExtLength]
DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, int index, bool *value)
DART_EXPORT Dart_Handle Dart_StringToCString(Dart_Handle object, const char **cstr)
constexpr intptr_t kIntptrMax
Definition globals.h:557
DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, int64_t *value)
static const char header[]
Definition skpbench.cpp:88
void write(SkWStream *wStream, const T &text)
Definition skqp.cpp:188
Dart_HandleFinalizer callback
union _Dart_CObject::@86 value
Dart_CObject_Type type
struct _Dart_CObject::@86::@90 as_typed_data
const char * as_string
struct _Dart_CObject::@86::@91 as_external_typed_data
struct _Dart_CObject::@86::@89 as_array
struct _Dart_CObject ** values
struct _Dart_CObject::@86::@92 as_native_pointer
const uint8_t bytes[kMaxLength]
Definition dartutils.h:657