Index: runtime/bin/dartutils.cc |
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc |
index 274c92eecffba3d1bfae4df9f22f5b9fa92add77..037f6054441f094269d9b869815a280a137167be 100644 |
--- a/runtime/bin/dartutils.cc |
+++ b/runtime/bin/dartutils.cc |
@@ -278,6 +278,33 @@ bool DartUtils::PostInt32(Dart_Port port_id, int32_t value) { |
} |
+Dart_Handle DartUtils::NewDartOSError() { |
+ // Extract the current OS error. |
+ OSError os_error; |
+ return NewDartOSError(&os_error); |
+} |
+ |
+ |
+Dart_Handle DartUtils::NewDartOSError(OSError* os_error) { |
+ // Create a Dart OSError object with the information retrieved from the OS. |
+ Dart_Handle url = Dart_NewString("dart:io"); |
+ if (Dart_IsError(url)) return url; |
+ Dart_Handle lib = Dart_LookupLibrary(url); |
+ if (Dart_IsError(lib)) return lib; |
+ Dart_Handle cls = Dart_NewString("IOUtils"); |
+ if (Dart_IsError(cls)) return cls; |
+ Dart_Handle method = Dart_NewString("makeOSError"); |
+ if (Dart_IsError(method)) return method; |
+ Dart_Handle args[2]; |
+ args[0] = Dart_NewString(os_error->message()); |
+ if (Dart_IsError(args[0])) return args[0]; |
+ args[1] = Dart_NewInteger(os_error->code()); |
+ if (Dart_IsError(args[1])) return args[1]; |
+ Dart_Handle err = Dart_InvokeStatic(lib, cls, method, 2, args); |
+ return err; |
+} |
+ |
+ |
// Statically allocated Dart_CObject instances for immutable |
// objects. As these will be used by different threads the use of |
// these depends on the fact that the marking internally in the |
@@ -378,3 +405,26 @@ Dart_CObject* CObject::NewByteArray(int length) { |
cobject->value.as_byte_array.values = reinterpret_cast<uint8_t*>(cobject + 1); |
return cobject; |
} |
+ |
+ |
+static int kIllegalArgumentError = 1; |
+static int kOSError = 2; |
+ |
+ |
+CObject* CObject::IllegalArgumentError() { |
+ CObjectArray* result = new CObjectArray(CObject::NewArray(1)); |
+ result->SetAt(0, new CObjectInt32(CObject::NewInt32(kIllegalArgumentError))); |
+ return result; |
+} |
+ |
+ |
+CObject* CObject::NewOSError() { |
+ OSError os_error; |
+ CObject* error_message = |
+ new CObjectString(CObject::NewString(os_error.message())); |
+ CObjectArray* result = new CObjectArray(CObject::NewArray(3)); |
+ result->SetAt(0, new CObjectInt32(CObject::NewInt32(kOSError))); |
+ result->SetAt(1, new CObjectInt32(CObject::NewInt32(os_error.code()))); |
+ result->SetAt(2, error_message); |
+ return result; |
+} |