Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(127)

Side by Side Diff: runtime/bin/file.cc

Issue 14018007: Rename RandomAccessFile.readList and RandomAccessFile.writeList to RandomAccessFile.readInto and Ra… (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix return type. Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/file.h" 5 #include "bin/file.h"
6 6
7 #include "bin/builtin.h" 7 #include "bin/builtin.h"
8 #include "bin/dartutils.h" 8 #include "bin/dartutils.h"
9 #include "bin/io_buffer.h" 9 #include "bin/io_buffer.h"
10 #include "bin/thread.h" 10 #include "bin/thread.h"
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 } else { 203 } else {
204 OSError os_error(-1, "Invalid argument", OSError::kUnknown); 204 OSError os_error(-1, "Invalid argument", OSError::kUnknown);
205 Dart_Handle err = DartUtils::NewDartOSError(&os_error); 205 Dart_Handle err = DartUtils::NewDartOSError(&os_error);
206 if (Dart_IsError(err)) Dart_PropagateError(err); 206 if (Dart_IsError(err)) Dart_PropagateError(err);
207 Dart_SetReturnValue(args, err); 207 Dart_SetReturnValue(args, err);
208 } 208 }
209 Dart_ExitScope(); 209 Dart_ExitScope();
210 } 210 }
211 211
212 212
213 void FUNCTION_NAME(File_ReadList)(Dart_NativeArguments args) { 213 void FUNCTION_NAME(File_ReadInto)(Dart_NativeArguments args) {
214 Dart_EnterScope(); 214 Dart_EnterScope();
215 File* file = GetFilePointer(Dart_GetNativeArgument(args, 0)); 215 File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
216 ASSERT(file != NULL); 216 ASSERT(file != NULL);
217 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 217 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
218 ASSERT(Dart_IsList(buffer_obj)); 218 ASSERT(Dart_IsList(buffer_obj));
219 // Offset and length arguments are checked in Dart code to be 219 // start and end arguments are checked in Dart code to be
220 // integers and have the property that (offset + length) <= 220 // integers and have the property that end <=
221 // list.length. Therefore, it is safe to extract their value as 221 // list.length. Therefore, it is safe to extract their value as
222 // intptr_t. 222 // intptr_t.
223 intptr_t offset = 223 intptr_t start =
224 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); 224 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
225 intptr_t length = 225 intptr_t end =
226 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); 226 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
227 intptr_t length = end - start;
227 intptr_t array_len = 0; 228 intptr_t array_len = 0;
228 Dart_Handle result = Dart_ListLength(buffer_obj, &array_len); 229 Dart_Handle result = Dart_ListLength(buffer_obj, &array_len);
229 if (Dart_IsError(result)) Dart_PropagateError(result); 230 if (Dart_IsError(result)) Dart_PropagateError(result);
230 ASSERT((offset + length) <= array_len); 231 ASSERT(end <= array_len);
231 uint8_t* buffer = new uint8_t[length]; 232 uint8_t* buffer = new uint8_t[length];
232 int64_t bytes_read = file->Read(reinterpret_cast<void*>(buffer), length); 233 int64_t bytes_read = file->Read(reinterpret_cast<void*>(buffer), length);
233 if (bytes_read >= 0) { 234 if (bytes_read >= 0) {
234 result = Dart_ListSetAsBytes(buffer_obj, offset, buffer, bytes_read); 235 result = Dart_ListSetAsBytes(buffer_obj, start, buffer, bytes_read);
235 if (Dart_IsError(result)) { 236 if (Dart_IsError(result)) {
236 delete[] buffer; 237 delete[] buffer;
237 Dart_PropagateError(result); 238 Dart_PropagateError(result);
238 } 239 }
239 Dart_SetReturnValue(args, Dart_NewInteger(bytes_read)); 240 Dart_SetReturnValue(args, Dart_NewInteger(bytes_read));
240 } else { 241 } else {
241 Dart_Handle err = DartUtils::NewDartOSError(); 242 Dart_Handle err = DartUtils::NewDartOSError();
242 if (Dart_IsError(err)) Dart_PropagateError(err); 243 if (Dart_IsError(err)) Dart_PropagateError(err);
243 Dart_SetReturnValue(args, err); 244 Dart_SetReturnValue(args, err);
244 } 245 }
245 delete[] buffer; 246 delete[] buffer;
246 Dart_ExitScope(); 247 Dart_ExitScope();
247 } 248 }
248 249
249 250
250 void FUNCTION_NAME(File_WriteList)(Dart_NativeArguments args) { 251 void FUNCTION_NAME(File_WriteFrom)(Dart_NativeArguments args) {
251 Dart_EnterScope(); 252 Dart_EnterScope();
252 File* file = GetFilePointer(Dart_GetNativeArgument(args, 0)); 253 File* file = GetFilePointer(Dart_GetNativeArgument(args, 0));
253 ASSERT(file != NULL); 254 ASSERT(file != NULL);
254 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1); 255 Dart_Handle buffer_obj = Dart_GetNativeArgument(args, 1);
255 ASSERT(Dart_IsList(buffer_obj)); 256 ASSERT(Dart_IsList(buffer_obj));
256 // Offset and length arguments are checked in Dart code to be 257 // Offset and length arguments are checked in Dart code to be
257 // integers and have the property that (offset + length) <= 258 // integers and have the property that (offset + length) <=
258 // list.length. Therefore, it is safe to extract their value as 259 // list.length. Therefore, it is safe to extract their value as
259 // intptr_t. 260 // intptr_t.
260 intptr_t offset = 261 intptr_t start =
261 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2)); 262 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 2));
262 intptr_t length = 263 intptr_t end =
263 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3)); 264 DartUtils::GetIntptrValue(Dart_GetNativeArgument(args, 3));
265 intptr_t length = end - start;
264 intptr_t buffer_len = 0; 266 intptr_t buffer_len = 0;
265 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len); 267 Dart_Handle result = Dart_ListLength(buffer_obj, &buffer_len);
266 if (Dart_IsError(result)) Dart_PropagateError(result); 268 if (Dart_IsError(result)) Dart_PropagateError(result);
267 ASSERT((offset + length) <= buffer_len); 269 ASSERT(end <= buffer_len);
268 uint8_t* buffer = new uint8_t[length]; 270 uint8_t* buffer = new uint8_t[length];
269 result = Dart_ListGetAsBytes(buffer_obj, offset, buffer, length); 271 result = Dart_ListGetAsBytes(buffer_obj, start, buffer, length);
270 if (Dart_IsError(result)) { 272 if (Dart_IsError(result)) {
271 delete[] buffer; 273 delete[] buffer;
272 Dart_PropagateError(result); 274 Dart_PropagateError(result);
273 } 275 }
274 int64_t bytes_written = file->Write(reinterpret_cast<void*>(buffer), length); 276 int64_t bytes_written = file->Write(reinterpret_cast<void*>(buffer), length);
275 if (bytes_written >= 0) { 277 if (bytes_written != length) {
276 Dart_SetReturnValue(args, Dart_NewInteger(bytes_written));
277 } else {
278 Dart_Handle err = DartUtils::NewDartOSError(); 278 Dart_Handle err = DartUtils::NewDartOSError();
279 if (Dart_IsError(err)) Dart_PropagateError(err); 279 if (Dart_IsError(err)) Dart_PropagateError(err);
280 Dart_SetReturnValue(args, err); 280 Dart_SetReturnValue(args, err);
281 } 281 }
282 delete[] buffer; 282 delete[] buffer;
283 Dart_ExitScope(); 283 Dart_ExitScope();
284 } 284 }
285 285
286 286
287 void FUNCTION_NAME(File_Position)(Dart_NativeArguments args) { 287 void FUNCTION_NAME(File_Position)(Dart_NativeArguments args) {
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 return CObject::NewOSError(); 926 return CObject::NewOSError();
927 } 927 }
928 } else { 928 } else {
929 return CObject::FileClosedError(); 929 return CObject::FileClosedError();
930 } 930 }
931 } 931 }
932 return CObject::IllegalArgumentError(); 932 return CObject::IllegalArgumentError();
933 } 933 }
934 934
935 935
936 static CObject* FileReadListRequest(const CObjectArray& request) { 936 static CObject* FileReadIntoRequest(const CObjectArray& request) {
937 if (request.Length() == 3 && 937 if (request.Length() == 3 &&
938 request[1]->IsIntptr() && 938 request[1]->IsIntptr() &&
939 request[2]->IsInt32OrInt64()) { 939 request[2]->IsInt32OrInt64()) {
940 File* file = CObjectToFilePointer(request[1]); 940 File* file = CObjectToFilePointer(request[1]);
941 ASSERT(file != NULL); 941 ASSERT(file != NULL);
942 if (!file->IsClosed()) { 942 if (!file->IsClosed()) {
943 int64_t length = CObjectInt32OrInt64ToInt64(request[2]); 943 int64_t length = CObjectInt32OrInt64ToInt64(request[2]);
944 Dart_CObject* io_buffer = CObject::NewIOBuffer(length); 944 Dart_CObject* io_buffer = CObject::NewIOBuffer(length);
945 uint8_t* data = io_buffer->value.as_external_typed_data.data; 945 uint8_t* data = io_buffer->value.as_external_typed_data.data;
946 int64_t bytes_read = file->Read(data, length); 946 int64_t bytes_read = file->Read(data, length);
(...skipping 27 matching lines...) Expand all
974 case Dart_CObject::kUint16Array: 974 case Dart_CObject::kUint16Array:
975 return 2; 975 return 2;
976 default: 976 default:
977 break; 977 break;
978 } 978 }
979 UNREACHABLE(); 979 UNREACHABLE();
980 return -1; 980 return -1;
981 } 981 }
982 982
983 983
984 static CObject* FileWriteListRequest(const CObjectArray& request) { 984 static CObject* FileWriteFromRequest(const CObjectArray& request) {
985 if (request.Length() == 5 && 985 if (request.Length() == 5 &&
986 request[1]->IsIntptr() && 986 request[1]->IsIntptr() &&
987 (request[2]->IsTypedData() || request[2]->IsArray()) && 987 (request[2]->IsTypedData() || request[2]->IsArray()) &&
988 request[3]->IsInt32OrInt64() && 988 request[3]->IsInt32OrInt64() &&
989 request[4]->IsInt32OrInt64()) { 989 request[4]->IsInt32OrInt64()) {
990 File* file = CObjectToFilePointer(request[1]); 990 File* file = CObjectToFilePointer(request[1]);
991 ASSERT(file != NULL); 991 ASSERT(file != NULL);
992 if (!file->IsClosed()) { 992 if (!file->IsClosed()) {
993 int64_t offset = CObjectInt32OrInt64ToInt64(request[3]); 993 int64_t start = CObjectInt32OrInt64ToInt64(request[3]);
994 int64_t length = CObjectInt32OrInt64ToInt64(request[4]); 994 int64_t end = CObjectInt32OrInt64ToInt64(request[4]);
995 int64_t length = end - start;
995 uint8_t* buffer_start; 996 uint8_t* buffer_start;
996 if (request[2]->IsTypedData()) { 997 if (request[2]->IsTypedData()) {
997 CObjectTypedData typed_data(request[2]); 998 CObjectTypedData typed_data(request[2]);
998 offset = offset * SizeInBytes(typed_data.Type()); 999 start = start * SizeInBytes(typed_data.Type());
999 length = length * SizeInBytes(typed_data.Type()); 1000 length = length * SizeInBytes(typed_data.Type());
1000 buffer_start = typed_data.Buffer() + offset; 1001 buffer_start = typed_data.Buffer() + start;
1001 } else { 1002 } else {
1002 CObjectArray array(request[2]); 1003 CObjectArray array(request[2]);
1003 buffer_start = new uint8_t[length]; 1004 buffer_start = new uint8_t[length];
1004 for (int i = 0; i < length; i++) { 1005 for (int i = 0; i < length; i++) {
1005 if (array[i + offset]->IsInt32OrInt64()) { 1006 if (array[i + start]->IsInt32OrInt64()) {
1006 int64_t value = CObjectInt32OrInt64ToInt64(array[i + offset]); 1007 int64_t value = CObjectInt32OrInt64ToInt64(array[i + start]);
1007 buffer_start[i] = static_cast<uint8_t>(value & 0xFF); 1008 buffer_start[i] = static_cast<uint8_t>(value & 0xFF);
1008 } else { 1009 } else {
1009 // Unsupported type. 1010 // Unsupported type.
1010 delete[] buffer_start; 1011 delete[] buffer_start;
1011 return CObject::IllegalArgumentError(); 1012 return CObject::IllegalArgumentError();
1012 } 1013 }
1013 } 1014 }
1014 offset = 0; 1015 start = 0;
1015 } 1016 }
1016 int64_t bytes_written = 1017 int64_t bytes_written =
1017 file->Write(reinterpret_cast<void*>(buffer_start), length); 1018 file->Write(reinterpret_cast<void*>(buffer_start), length);
1018 if (!request[2]->IsTypedData()) { 1019 if (!request[2]->IsTypedData()) {
1019 delete[] buffer_start; 1020 delete[] buffer_start;
1020 } 1021 }
1021 if (bytes_written >= 0) { 1022 if (bytes_written >= 0) {
1022 return new CObjectInt64(CObject::NewInt64(bytes_written)); 1023 return new CObjectInt64(CObject::NewInt64(bytes_written));
1023 } else { 1024 } else {
1024 return CObject::NewOSError(); 1025 return CObject::NewOSError();
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 break; 1115 break;
1115 case File::kReadByteRequest: 1116 case File::kReadByteRequest:
1116 response = FileReadByteRequest(request); 1117 response = FileReadByteRequest(request);
1117 break; 1118 break;
1118 case File::kWriteByteRequest: 1119 case File::kWriteByteRequest:
1119 response = FileWriteByteRequest(request); 1120 response = FileWriteByteRequest(request);
1120 break; 1121 break;
1121 case File::kReadRequest: 1122 case File::kReadRequest:
1122 response = FileReadRequest(request); 1123 response = FileReadRequest(request);
1123 break; 1124 break;
1124 case File::kReadListRequest: 1125 case File::kReadIntoRequest:
1125 response = FileReadListRequest(request); 1126 response = FileReadIntoRequest(request);
1126 break; 1127 break;
1127 case File::kWriteListRequest: 1128 case File::kWriteFromRequest:
1128 response = FileWriteListRequest(request); 1129 response = FileWriteFromRequest(request);
1129 break; 1130 break;
1130 case File::kDeleteLinkRequest: 1131 case File::kDeleteLinkRequest:
1131 response = FileDeleteLinkRequest(request); 1132 response = FileDeleteLinkRequest(request);
1132 break; 1133 break;
1133 case File::kCreateLinkRequest: 1134 case File::kCreateLinkRequest:
1134 response = FileCreateLinkRequest(request); 1135 response = FileCreateLinkRequest(request);
1135 break; 1136 break;
1136 default: 1137 default:
1137 UNREACHABLE(); 1138 UNREACHABLE();
1138 } 1139 }
(...skipping 13 matching lines...) Expand all
1152 Dart_EnterScope(); 1153 Dart_EnterScope();
1153 Dart_SetReturnValue(args, Dart_Null()); 1154 Dart_SetReturnValue(args, Dart_Null());
1154 Dart_Port service_port = File::GetServicePort(); 1155 Dart_Port service_port = File::GetServicePort();
1155 if (service_port != ILLEGAL_PORT) { 1156 if (service_port != ILLEGAL_PORT) {
1156 // Return a send port for the service port. 1157 // Return a send port for the service port.
1157 Dart_Handle send_port = Dart_NewSendPort(service_port); 1158 Dart_Handle send_port = Dart_NewSendPort(service_port);
1158 Dart_SetReturnValue(args, send_port); 1159 Dart_SetReturnValue(args, send_port);
1159 } 1160 }
1160 Dart_ExitScope(); 1161 Dart_ExitScope();
1161 } 1162 }
OLDNEW
« no previous file with comments | « runtime/bin/file.h ('k') | runtime/bin/file_patch.dart » ('j') | sdk/lib/io/file.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698