| 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 | #ifndef RUNTIME_BIN_DARTUTILS_H_ |
| 6 | #define RUNTIME_BIN_DARTUTILS_H_ |
| 7 | |
| 8 | #include "bin/isolate_data.h" |
| 9 | #include "include/dart_api.h" |
| 10 | #include "include/dart_native_api.h" |
| 11 | #include "platform/assert.h" |
| 12 | #include "platform/globals.h" |
| 13 | #include "platform/hashmap.h" |
| 14 | |
| 15 | namespace dart { |
| 16 | namespace bin { |
| 17 | |
| 18 | // Forward declarations. |
| 19 | class File; |
| 20 | class OSError; |
| 21 | |
| 22 | /* Handles error handles returned from Dart API functions. If a value |
| 23 | * is an error, uses Dart_PropagateError to throw it to the enclosing |
| 24 | * Dart activation. Otherwise, returns the original handle. |
| 25 | * |
| 26 | * This function can be used to wrap most API functions, but API |
| 27 | * functions can also be nested without this error check, since all |
| 28 | * API functions return any error handles passed in as arguments, unchanged. |
| 29 | */ |
| 30 | static inline Dart_Handle ThrowIfError(Dart_Handle handle) { |
| 31 | if (Dart_IsError(handle)) { |
| 32 | Dart_PropagateError(handle); |
| 33 | } |
| 34 | return handle; |
| 35 | } |
| 36 | |
| 37 | static inline void* GetHashmapKeyFromString(char* key) { |
| 38 | return reinterpret_cast<void*>(key); |
| 39 | } |
| 40 | |
| 41 | class CommandLineOptions { |
| 42 | public: |
| 43 | explicit CommandLineOptions(int max_count) |
| 44 | : count_(0), max_count_(max_count), arguments_(NULL) { |
| 45 | static const int kWordSize = sizeof(intptr_t); |
| 46 | arguments_ = reinterpret_cast<const char**>(malloc(max_count * kWordSize)); |
| 47 | if (arguments_ == NULL) { |
| 48 | max_count_ = 0; |
| 49 | } |
| 50 | } |
| 51 | ~CommandLineOptions() { |
| 52 | free(arguments_); |
| 53 | count_ = 0; |
| 54 | max_count_ = 0; |
| 55 | arguments_ = NULL; |
| 56 | } |
| 57 | |
| 58 | void Reset() { count_ = 0; } |
| 59 | |
| 60 | int count() const { return count_; } |
| 61 | int max_count() const { return max_count_; } |
| 62 | const char** arguments() const { return arguments_; } |
| 63 | |
| 64 | const char* GetArgument(int index) const { |
| 65 | return (index >= 0 && index < count_) ? arguments_[index] : NULL; |
| 66 | } |
| 67 | void AddArgument(const char* argument) { |
| 68 | if (count_ < max_count_) { |
| 69 | arguments_[count_] = argument; |
| 70 | count_ += 1; |
| 71 | } else { |
| 72 | abort(); // We should never get into this situation. |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | void AddArguments(const char** argv, int argc) { |
| 77 | if (count_ + argc >= max_count_) { |
| 78 | abort(); // We should never get into this situation. |
| 79 | } |
| 80 | for (int i = 0; i < argc; ++i) { |
| 81 | arguments_[count_++] = argv[i]; |
| 82 | } |
| 83 | } |
| 84 | |
| 85 | Dart_Handle CreateRuntimeOptions(); |
| 86 | |
| 87 | void operator delete(void* pointer) { abort(); } |
| 88 | |
| 89 | private: |
| 90 | void* operator new(size_t size); |
| 91 | |
| 92 | int count_; |
| 93 | int max_count_; |
| 94 | const char** arguments_; |
| 95 | |
| 96 | DISALLOW_COPY_AND_ASSIGN(CommandLineOptions); |
| 97 | }; |
| 98 | |
| 99 | class DartUtils { |
| 100 | public: |
| 101 | // Returns the integer value of a Dart object. If the object is not |
| 102 | // an integer value an API error is propagated. |
| 103 | static int64_t GetIntegerValue(Dart_Handle value_obj); |
| 104 | // Returns the integer value of a Dart object. If the object is not |
| 105 | // an integer value or outside the requested range an API error is |
| 106 | // propagated. |
| 107 | static int64_t GetInt64ValueCheckRange(Dart_Handle value_obj, |
| 108 | int64_t lower, |
| 109 | int64_t upper); |
| 110 | // Returns the intptr_t value of a Dart object. If the object is not |
| 111 | // an integer value or the value is outside the intptr_t range an |
| 112 | // API error is propagated. |
| 113 | static intptr_t GetIntptrValue(Dart_Handle value_obj); |
| 114 | // Checks that the value object is an integer object that fits in a |
| 115 | // signed 64-bit integer. If it is, the value is returned in the |
| 116 | // value out parameter and true is returned. Otherwise, false is |
| 117 | // returned. |
| 118 | static bool GetInt64Value(Dart_Handle value_obj, int64_t* value); |
| 119 | // Returns the string value of a Dart object. If the object is not |
| 120 | // a string value an API error is propagated. |
| 121 | static const char* GetStringValue(Dart_Handle str_obj); |
| 122 | // Returns the boolean value of a Dart object. If the object is not |
| 123 | // a boolean value an API error is propagated. |
| 124 | static bool GetBooleanValue(Dart_Handle bool_obj); |
| 125 | // Returns the boolean value of the argument at index. If the argument |
| 126 | // is not a boolean value an API error is propagated. |
| 127 | static bool GetNativeBooleanArgument(Dart_NativeArguments args, |
| 128 | intptr_t index); |
| 129 | // Returns the integer value of the argument at index. If the argument |
| 130 | // is not an integer value an API error is propagated. |
| 131 | static int64_t GetNativeIntegerArgument(Dart_NativeArguments args, |
| 132 | intptr_t index); |
| 133 | // Returns the intptr_t value of the argument at index. If the argument |
| 134 | // is not an integer value or the value is outside the intptr_t range an |
| 135 | // API error is propagated. |
| 136 | static intptr_t GetNativeIntptrArgument(Dart_NativeArguments args, |
| 137 | intptr_t index); |
| 138 | // Returns the string value of the argument at index. If the argument |
| 139 | // is not a string value an API error is propagated. |
| 140 | static const char* GetNativeStringArgument(Dart_NativeArguments args, |
| 141 | intptr_t index); |
| 142 | static Dart_Handle SetIntegerField(Dart_Handle handle, |
| 143 | const char* name, |
| 144 | int64_t val); |
| 145 | static Dart_Handle SetStringField(Dart_Handle handle, |
| 146 | const char* name, |
| 147 | const char* val); |
| 148 | static bool IsDartSchemeURL(const char* url_name); |
| 149 | static bool IsDartExtensionSchemeURL(const char* url_name); |
| 150 | static bool IsDartIOLibURL(const char* url_name); |
| 151 | static bool IsDartCLILibURL(const char* url_name); |
| 152 | static bool IsDartHttpLibURL(const char* url_name); |
| 153 | static bool IsDartBuiltinLibURL(const char* url_name); |
| 154 | static bool IsHttpSchemeURL(const char* url_name); |
| 155 | static const char* RemoveScheme(const char* url); |
| 156 | static char* DirName(const char* url); |
| 157 | static void* MapExecutable(const char* name, intptr_t* file_len); |
| 158 | static void* OpenFile(const char* name, bool write); |
| 159 | static void* OpenFileUri(const char* uri, bool write); |
| 160 | static void ReadFile(uint8_t** data, intptr_t* file_len, void* stream); |
| 161 | static void WriteFile(const void* buffer, intptr_t num_bytes, void* stream); |
| 162 | static void CloseFile(void* stream); |
| 163 | static bool EntropySource(uint8_t* buffer, intptr_t length); |
| 164 | static Dart_Handle ReadStringFromFile(const char* filename); |
| 165 | static Dart_Handle MakeUint8Array(const uint8_t* buffer, intptr_t length); |
| 166 | static Dart_Handle PrepareForScriptLoading(bool is_service_isolate, |
| 167 | bool trace_loading); |
| 168 | static Dart_Handle SetupPackageConfig(const char* packages_file); |
| 169 | |
| 170 | static Dart_Handle SetupIOLibrary(const char* namespc_path, |
| 171 | const char* script_uri, |
| 172 | bool disable_exit); |
| 173 | |
| 174 | static bool PostNull(Dart_Port port_id); |
| 175 | static bool PostInt32(Dart_Port port_id, int32_t value); |
| 176 | static bool PostInt64(Dart_Port port_id, int64_t value); |
| 177 | |
| 178 | static Dart_Handle GetDartType(const char* library_url, |
| 179 | const char* class_name); |
| 180 | // Create a new Dart OSError object with the current OS error. |
| 181 | static Dart_Handle NewDartOSError(); |
| 182 | // Create a new Dart OSError object with the provided OS error. |
| 183 | static Dart_Handle NewDartOSError(OSError* os_error); |
| 184 | static Dart_Handle NewDartExceptionWithOSError(const char* library_url, |
| 185 | const char* exception_name, |
| 186 | const char* message, |
| 187 | Dart_Handle os_error); |
| 188 | static Dart_Handle NewDartExceptionWithMessage(const char* library_url, |
| 189 | const char* exception_name, |
| 190 | const char* message); |
| 191 | static Dart_Handle NewDartArgumentError(const char* message); |
| 192 | static Dart_Handle NewDartFormatException(const char* message); |
| 193 | static Dart_Handle NewDartUnsupportedError(const char* message); |
| 194 | static Dart_Handle NewDartIOException(const char* exception_name, |
| 195 | const char* message, |
| 196 | Dart_Handle os_error); |
| 197 | |
| 198 | // Create a new Dart String object from a C String. |
| 199 | static Dart_Handle NewString(const char* str) { |
| 200 | ASSERT(str != NULL); |
| 201 | return Dart_NewStringFromUTF8(reinterpret_cast<const uint8_t*>(str), |
| 202 | strlen(str)); |
| 203 | } |
| 204 | |
| 205 | // Allocate length bytes for a C string with Dart_ScopeAllocate. |
| 206 | static char* ScopedCString(intptr_t length) { |
| 207 | char* result = NULL; |
| 208 | result = |
| 209 | reinterpret_cast<char*>(Dart_ScopeAllocate(length * sizeof(*result))); |
| 210 | return result; |
| 211 | } |
| 212 | |
| 213 | // Copy str into a buffer allocated with Dart_ScopeAllocate. |
| 214 | static char* ScopedCopyCString(const char* str) { |
| 215 | size_t str_len = strlen(str); |
| 216 | char* result = ScopedCString(str_len + 1); |
| 217 | memmove(result, str, str_len); |
| 218 | result[str_len] = '\0'; |
| 219 | return result; |
| 220 | } |
| 221 | |
| 222 | // Create a new Dart InternalError object with the provided message. |
| 223 | static Dart_Handle NewError(const char* format, ...); |
| 224 | static Dart_Handle NewInternalError(const char* message); |
| 225 | |
| 226 | static Dart_Handle LookupBuiltinLib() { |
| 227 | return Dart_LookupLibrary(NewString(kBuiltinLibURL)); |
| 228 | } |
| 229 | |
| 230 | static bool SetOriginalWorkingDirectory(); |
| 231 | |
| 232 | static Dart_Handle ResolveScript(Dart_Handle url); |
| 233 | |
| 234 | enum MagicNumber { |
| 235 | kAppJITMagicNumber, |
| 236 | kKernelMagicNumber, |
| 237 | kKernelListMagicNumber, |
| 238 | kGzipMagicNumber, |
| 239 | kUnknownMagicNumber |
| 240 | }; |
| 241 | |
| 242 | // Checks if the buffer is a script snapshot, kernel file, or gzip file. |
| 243 | static MagicNumber SniffForMagicNumber(const char* filename); |
| 244 | |
| 245 | // Checks if the buffer is a script snapshot, kernel file, or gzip file. |
| 246 | static MagicNumber SniffForMagicNumber(const uint8_t* text_buffer, |
| 247 | intptr_t buffer_len); |
| 248 | |
| 249 | // Global state that stores the original working directory.. |
| 250 | static const char* original_working_directory; |
| 251 | |
| 252 | static const char* const kDartScheme; |
| 253 | static const char* const kDartExtensionScheme; |
| 254 | static const char* const kAsyncLibURL; |
| 255 | static const char* const kBuiltinLibURL; |
| 256 | static const char* const kCoreLibURL; |
| 257 | static const char* const kInternalLibURL; |
| 258 | static const char* const kIsolateLibURL; |
| 259 | static const char* const kHttpLibURL; |
| 260 | static const char* const kIOLibURL; |
| 261 | static const char* const kIOLibPatchURL; |
| 262 | static const char* const kCLILibURL; |
| 263 | static const char* const kCLILibPatchURL; |
| 264 | static const char* const kUriLibURL; |
| 265 | static const char* const kHttpScheme; |
| 266 | static const char* const kVMServiceLibURL; |
| 267 | |
| 268 | static void SetEnvironment(dart::SimpleHashMap* environment); |
| 269 | static Dart_Handle EnvironmentCallback(Dart_Handle name); |
| 270 | |
| 271 | private: |
| 272 | static Dart_Handle SetWorkingDirectory(); |
| 273 | static Dart_Handle PrepareBuiltinLibrary(Dart_Handle builtin_lib, |
| 274 | Dart_Handle internal_lib, |
| 275 | bool is_service_isolate, |
| 276 | bool trace_loading); |
| 277 | static Dart_Handle PrepareCoreLibrary(Dart_Handle core_lib, |
| 278 | Dart_Handle io_lib, |
| 279 | bool is_service_isolate); |
| 280 | static Dart_Handle PrepareAsyncLibrary(Dart_Handle async_lib, |
| 281 | Dart_Handle isolate_lib); |
| 282 | static Dart_Handle PrepareIOLibrary(Dart_Handle io_lib); |
| 283 | static Dart_Handle PrepareIsolateLibrary(Dart_Handle isolate_lib); |
| 284 | static Dart_Handle PrepareCLILibrary(Dart_Handle cli_lib); |
| 285 | |
| 286 | static dart::SimpleHashMap* environment_; |
| 287 | |
| 288 | DISALLOW_ALLOCATION(); |
| 289 | DISALLOW_IMPLICIT_CONSTRUCTORS(DartUtils); |
| 290 | }; |
| 291 | |
| 292 | class CObject { |
| 293 | public: |
| 294 | // These match the constants in sdk/lib/io/common.dart. |
| 295 | static const int kSuccess = 0; |
| 296 | static const int kArgumentError = 1; |
| 297 | static const int kOSError = 2; |
| 298 | static const int kFileClosedError = 3; |
| 299 | |
| 300 | explicit CObject(Dart_CObject* cobject) : cobject_(cobject) {} |
| 301 | Dart_CObject_Type type() { return cobject_->type; } |
| 302 | Dart_TypedData_Type byte_array_type() { |
| 303 | ASSERT(type() == Dart_CObject_kTypedData || |
| 304 | type() == Dart_CObject_kExternalTypedData); |
| 305 | return cobject_->value.as_typed_data.type; |
| 306 | } |
| 307 | |
| 308 | bool IsNull() { return type() == Dart_CObject_kNull; } |
| 309 | bool IsBool() { return type() == Dart_CObject_kBool; } |
| 310 | bool IsInt32() { return type() == Dart_CObject_kInt32; } |
| 311 | bool IsInt64() { return type() == Dart_CObject_kInt64; } |
| 312 | bool IsInt32OrInt64() { return IsInt32() || IsInt64(); } |
| 313 | bool IsIntptr() { return IsInt32OrInt64(); } |
| 314 | bool IsDouble() { return type() == Dart_CObject_kDouble; } |
| 315 | bool IsString() { return type() == Dart_CObject_kString; } |
| 316 | bool IsArray() { return type() == Dart_CObject_kArray; } |
| 317 | bool IsTypedData() { return type() == Dart_CObject_kTypedData; } |
| 318 | bool IsUint8Array() { |
| 319 | return type() == Dart_CObject_kTypedData && |
| 320 | byte_array_type() == Dart_TypedData_kUint8; |
| 321 | } |
| 322 | bool IsSendPort() { return type() == Dart_CObject_kSendPort; } |
| 323 | |
| 324 | bool IsTrue() { |
| 325 | return type() == Dart_CObject_kBool && cobject_->value.as_bool; |
| 326 | } |
| 327 | |
| 328 | bool IsFalse() { |
| 329 | return type() == Dart_CObject_kBool && !cobject_->value.as_bool; |
| 330 | } |
| 331 | |
| 332 | void* operator new(size_t size) { return Dart_ScopeAllocate(size); } |
| 333 | |
| 334 | static CObject* Null(); |
| 335 | static CObject* True(); |
| 336 | static CObject* False(); |
| 337 | static CObject* Bool(bool value); |
| 338 | static Dart_CObject* NewInt32(int32_t value); |
| 339 | static Dart_CObject* NewInt64(int64_t value); |
| 340 | static Dart_CObject* NewIntptr(intptr_t value); |
| 341 | static Dart_CObject* NewDouble(double value); |
| 342 | static Dart_CObject* NewString(intptr_t length); |
| 343 | static Dart_CObject* NewString(const char* str); |
| 344 | static Dart_CObject* NewArray(intptr_t length); |
| 345 | static Dart_CObject* NewUint8Array(intptr_t length); |
| 346 | static Dart_CObject* NewUint32Array(intptr_t length); |
| 347 | static Dart_CObject* NewExternalUint8Array( |
| 348 | intptr_t length, |
| 349 | uint8_t* data, |
| 350 | void* peer, |
| 351 | Dart_WeakPersistentHandleFinalizer callback); |
| 352 | |
| 353 | static Dart_CObject* NewIOBuffer(int64_t length); |
| 354 | static void FreeIOBufferData(Dart_CObject* object); |
| 355 | |
| 356 | Dart_CObject* AsApiCObject() { return cobject_; } |
| 357 | |
| 358 | // Create a new CObject array with an illegal arguments error. |
| 359 | static CObject* IllegalArgumentError(); |
| 360 | // Create a new CObject array with a file closed error. |
| 361 | static CObject* FileClosedError(); |
| 362 | // Create a new CObject array with the current OS error. |
| 363 | static CObject* NewOSError(); |
| 364 | // Create a new CObject array with the specified OS error. |
| 365 | static CObject* NewOSError(OSError* os_error); |
| 366 | |
| 367 | protected: |
| 368 | CObject() : cobject_(NULL) {} |
| 369 | Dart_CObject* cobject_; |
| 370 | |
| 371 | private: |
| 372 | static Dart_CObject* New(Dart_CObject_Type type, int additional_bytes = 0); |
| 373 | |
| 374 | static Dart_CObject api_null_; |
| 375 | static Dart_CObject api_true_; |
| 376 | static Dart_CObject api_false_; |
| 377 | static CObject null_; |
| 378 | static CObject true_; |
| 379 | static CObject false_; |
| 380 | |
| 381 | private: |
| 382 | DISALLOW_COPY_AND_ASSIGN(CObject); |
| 383 | }; |
| 384 | |
| 385 | #define DECLARE_COBJECT_CONSTRUCTORS(t) \ |
| 386 | explicit CObject##t(Dart_CObject* cobject) : CObject(cobject) { \ |
| 387 | ASSERT(type() == Dart_CObject_k##t); \ |
| 388 | cobject_ = cobject; \ |
| 389 | } \ |
| 390 | explicit CObject##t(CObject* cobject) : CObject() { \ |
| 391 | ASSERT(cobject != NULL); \ |
| 392 | ASSERT(cobject->type() == Dart_CObject_k##t); \ |
| 393 | cobject_ = cobject->AsApiCObject(); \ |
| 394 | } |
| 395 | |
| 396 | #define DECLARE_COBJECT_TYPED_DATA_CONSTRUCTORS(t) \ |
| 397 | explicit CObject##t##Array(Dart_CObject* cobject) : CObject(cobject) { \ |
| 398 | ASSERT(type() == Dart_CObject_kTypedData); \ |
| 399 | ASSERT(byte_array_type() == Dart_TypedData_k##t); \ |
| 400 | cobject_ = cobject; \ |
| 401 | } \ |
| 402 | explicit CObject##t##Array(CObject* cobject) : CObject() { \ |
| 403 | ASSERT(cobject != NULL); \ |
| 404 | ASSERT(cobject->type() == Dart_CObject_kTypedData); \ |
| 405 | ASSERT(cobject->byte_array_type() == Dart_TypedData_k##t); \ |
| 406 | cobject_ = cobject->AsApiCObject(); \ |
| 407 | } |
| 408 | |
| 409 | #define DECLARE_COBJECT_EXTERNAL_TYPED_DATA_CONSTRUCTORS(t) \ |
| 410 | explicit CObjectExternal##t##Array(Dart_CObject* cobject) \ |
| 411 | : CObject(cobject) { \ |
| 412 | ASSERT(type() == Dart_CObject_kExternalTypedData); \ |
| 413 | ASSERT(byte_array_type() == Dart_TypedData_k##t); \ |
| 414 | cobject_ = cobject; \ |
| 415 | } \ |
| 416 | explicit CObjectExternal##t##Array(CObject* cobject) : CObject() { \ |
| 417 | ASSERT(cobject != NULL); \ |
| 418 | ASSERT(cobject->type() == Dart_CObject_kExternalTypedData); \ |
| 419 | ASSERT(cobject->byte_array_type() == Dart_TypedData_k##t); \ |
| 420 | cobject_ = cobject->AsApiCObject(); \ |
| 421 | } |
| 422 | |
| 423 | class CObjectBool : public CObject { |
| 424 | public: |
| 425 | DECLARE_COBJECT_CONSTRUCTORS(Bool) |
| 426 | |
| 427 | bool Value() const { return cobject_->value.as_bool; } |
| 428 | |
| 429 | private: |
| 430 | DISALLOW_COPY_AND_ASSIGN(CObjectBool); |
| 431 | }; |
| 432 | |
| 433 | class CObjectInt32 : public CObject { |
| 434 | public: |
| 435 | DECLARE_COBJECT_CONSTRUCTORS(Int32) |
| 436 | |
| 437 | int32_t Value() const { return cobject_->value.as_int32; } |
| 438 | |
| 439 | private: |
| 440 | DISALLOW_COPY_AND_ASSIGN(CObjectInt32); |
| 441 | }; |
| 442 | |
| 443 | class CObjectInt64 : public CObject { |
| 444 | public: |
| 445 | DECLARE_COBJECT_CONSTRUCTORS(Int64) |
| 446 | |
| 447 | int64_t Value() const { return cobject_->value.as_int64; } |
| 448 | |
| 449 | private: |
| 450 | DISALLOW_COPY_AND_ASSIGN(CObjectInt64); |
| 451 | }; |
| 452 | |
| 453 | class CObjectIntptr : public CObject { |
| 454 | public: |
| 455 | explicit CObjectIntptr(Dart_CObject* cobject) : CObject(cobject) { |
| 456 | ASSERT(type() == Dart_CObject_kInt32 || type() == Dart_CObject_kInt64); |
| 457 | cobject_ = cobject; |
| 458 | } |
| 459 | explicit CObjectIntptr(CObject* cobject) : CObject() { |
| 460 | ASSERT(cobject != NULL); |
| 461 | ASSERT(cobject->type() == Dart_CObject_kInt64 || |
| 462 | cobject->type() == Dart_CObject_kInt32); |
| 463 | cobject_ = cobject->AsApiCObject(); |
| 464 | } |
| 465 | |
| 466 | intptr_t Value() { |
| 467 | intptr_t result; |
| 468 | if (type() == Dart_CObject_kInt32) { |
| 469 | result = cobject_->value.as_int32; |
| 470 | } else { |
| 471 | ASSERT(sizeof(result) == 8); |
| 472 | result = static_cast<intptr_t>(cobject_->value.as_int64); |
| 473 | } |
| 474 | return result; |
| 475 | } |
| 476 | |
| 477 | private: |
| 478 | DISALLOW_COPY_AND_ASSIGN(CObjectIntptr); |
| 479 | }; |
| 480 | |
| 481 | class CObjectDouble : public CObject { |
| 482 | public: |
| 483 | DECLARE_COBJECT_CONSTRUCTORS(Double) |
| 484 | |
| 485 | double Value() const { return cobject_->value.as_double; } |
| 486 | |
| 487 | private: |
| 488 | DISALLOW_COPY_AND_ASSIGN(CObjectDouble); |
| 489 | }; |
| 490 | |
| 491 | class CObjectString : public CObject { |
| 492 | public: |
| 493 | DECLARE_COBJECT_CONSTRUCTORS(String) |
| 494 | |
| 495 | intptr_t Length() const { return strlen(cobject_->value.as_string); } |
| 496 | char* CString() const { return cobject_->value.as_string; } |
| 497 | |
| 498 | private: |
| 499 | DISALLOW_COPY_AND_ASSIGN(CObjectString); |
| 500 | }; |
| 501 | |
| 502 | class CObjectArray : public CObject { |
| 503 | public: |
| 504 | DECLARE_COBJECT_CONSTRUCTORS(Array) |
| 505 | |
| 506 | intptr_t Length() const { return cobject_->value.as_array.length; } |
| 507 | CObject* operator[](intptr_t index) const { |
| 508 | return new CObject(cobject_->value.as_array.values[index]); |
| 509 | } |
| 510 | void SetAt(intptr_t index, CObject* value) { |
| 511 | cobject_->value.as_array.values[index] = value->AsApiCObject(); |
| 512 | } |
| 513 | |
| 514 | private: |
| 515 | DISALLOW_COPY_AND_ASSIGN(CObjectArray); |
| 516 | }; |
| 517 | |
| 518 | class CObjectSendPort : public CObject { |
| 519 | public: |
| 520 | DECLARE_COBJECT_CONSTRUCTORS(SendPort) |
| 521 | |
| 522 | Dart_Port Value() const { return cobject_->value.as_send_port.id; } |
| 523 | Dart_Port OriginId() const { return cobject_->value.as_send_port.origin_id; } |
| 524 | |
| 525 | private: |
| 526 | DISALLOW_COPY_AND_ASSIGN(CObjectSendPort); |
| 527 | }; |
| 528 | |
| 529 | class CObjectTypedData : public CObject { |
| 530 | public: |
| 531 | explicit CObjectTypedData(Dart_CObject* cobject) : CObject(cobject) { |
| 532 | ASSERT(type() == Dart_CObject_kTypedData); |
| 533 | cobject_ = cobject; |
| 534 | } |
| 535 | explicit CObjectTypedData(CObject* cobject) : CObject() { |
| 536 | ASSERT(cobject != NULL); |
| 537 | ASSERT(cobject->type() == Dart_CObject_kTypedData); |
| 538 | cobject_ = cobject->AsApiCObject(); |
| 539 | } |
| 540 | |
| 541 | Dart_TypedData_Type Type() const { |
| 542 | return cobject_->value.as_typed_data.type; |
| 543 | } |
| 544 | intptr_t Length() const { return cobject_->value.as_typed_data.length; } |
| 545 | uint8_t* Buffer() const { return cobject_->value.as_typed_data.values; } |
| 546 | |
| 547 | private: |
| 548 | DISALLOW_COPY_AND_ASSIGN(CObjectTypedData); |
| 549 | }; |
| 550 | |
| 551 | class CObjectUint8Array : public CObject { |
| 552 | public: |
| 553 | DECLARE_COBJECT_TYPED_DATA_CONSTRUCTORS(Uint8) |
| 554 | |
| 555 | intptr_t Length() const { return cobject_->value.as_typed_data.length; } |
| 556 | uint8_t* Buffer() const { return cobject_->value.as_typed_data.values; } |
| 557 | |
| 558 | private: |
| 559 | DISALLOW_COPY_AND_ASSIGN(CObjectUint8Array); |
| 560 | }; |
| 561 | |
| 562 | class CObjectExternalUint8Array : public CObject { |
| 563 | public: |
| 564 | DECLARE_COBJECT_EXTERNAL_TYPED_DATA_CONSTRUCTORS(Uint8) |
| 565 | |
| 566 | intptr_t Length() const { |
| 567 | return cobject_->value.as_external_typed_data.length; |
| 568 | } |
| 569 | void SetLength(intptr_t length) { |
| 570 | cobject_->value.as_external_typed_data.length = length; |
| 571 | } |
| 572 | uint8_t* Data() const { return cobject_->value.as_external_typed_data.data; } |
| 573 | void* Peer() const { return cobject_->value.as_external_typed_data.peer; } |
| 574 | Dart_WeakPersistentHandleFinalizer Callback() const { |
| 575 | return cobject_->value.as_external_typed_data.callback; |
| 576 | } |
| 577 | |
| 578 | private: |
| 579 | DISALLOW_COPY_AND_ASSIGN(CObjectExternalUint8Array); |
| 580 | }; |
| 581 | |
| 582 | class ScopedBlockingCall { |
| 583 | public: |
| 584 | ScopedBlockingCall() { Dart_ThreadDisableProfiling(); } |
| 585 | |
| 586 | ~ScopedBlockingCall() { Dart_ThreadEnableProfiling(); } |
| 587 | |
| 588 | private: |
| 589 | DISALLOW_ALLOCATION(); |
| 590 | DISALLOW_COPY_AND_ASSIGN(ScopedBlockingCall); |
| 591 | }; |
| 592 | |
| 593 | struct MagicNumberData { |
| 594 | static const intptr_t kMaxLength = 8; |
| 595 | |
| 596 | intptr_t length; |
| 597 | const uint8_t bytes[kMaxLength]; |
| 598 | }; |
| 599 | |
| 600 | extern MagicNumberData appjit_magic_number; |
| 601 | extern MagicNumberData kernel_magic_number; |
| 602 | extern MagicNumberData kernel_list_magic_number; |
| 603 | extern MagicNumberData gzip_magic_number; |
| 604 | |
| 605 | } // namespace bin |
| 606 | } // namespace dart |
| 607 | |
| 608 | #endif // RUNTIME_BIN_DARTUTILS_H_ |
| 609 | |