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

Side by Side Diff: runtime/lib/byte_array.cc

Issue 11293290: Fix native argument handling (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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
« no previous file with comments | « runtime/lib/array.cc ('k') | runtime/lib/date.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS 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 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 "vm/bootstrap_natives.h" 5 #include "vm/bootstrap_natives.h"
6 6
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/exceptions.h" 8 #include "vm/exceptions.h"
9 #include "vm/native_entry.h" 9 #include "vm/native_entry.h"
10 #include "vm/object.h" 10 #include "vm/object.h"
(...skipping 26 matching lines...) Expand all
37 const String& error = String::Handle(String::NewFormatted( 37 const String& error = String::Handle(String::NewFormatted(
38 "length (%"Pd") must be in the range [0..%"Pd"]", len, max)); 38 "length (%"Pd") must be in the range [0..%"Pd"]", len, max));
39 GrowableArray<const Object*> args; 39 GrowableArray<const Object*> args;
40 args.Add(&error); 40 args.Add(&error);
41 Exceptions::ThrowByType(Exceptions::kArgument, args); 41 Exceptions::ThrowByType(Exceptions::kArgument, args);
42 } 42 }
43 } 43 }
44 44
45 45
46 #define GETTER_ARGUMENTS(ArrayT, ValueT) \ 46 #define GETTER_ARGUMENTS(ArrayT, ValueT) \
47 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \ 47 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \
48 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); 48 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1));
49 49
50 50
51 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \ 51 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \
52 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \ 52 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \
53 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \ 53 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \
54 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->At(2)); 54 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->NativeArgAt(2));
55 55
56 56
57 #define GETTER(ArrayT, ObjectT, ValueT) \ 57 #define GETTER(ArrayT, ObjectT, ValueT) \
58 GETTER_ARGUMENTS(ArrayT, ValueT); \ 58 GETTER_ARGUMENTS(ArrayT, ValueT); \
59 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \ 59 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \
60 ValueT result = array.At(index.Value()); \ 60 ValueT result = array.At(index.Value()); \
61 return ObjectT::New(result); 61 return ObjectT::New(result);
62 62
63 63
64 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \ 64 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 #define UNALIGNED_SETTER_UINT64(ArrayT) \ 140 #define UNALIGNED_SETTER_UINT64(ArrayT) \
141 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \ 141 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \
142 RangeCheck(array, index.Value(), sizeof(uint64_t)); \ 142 RangeCheck(array, index.Value(), sizeof(uint64_t)); \
143 uint64_t value; \ 143 uint64_t value; \
144 INTEGER_TO_UINT64(value_object, value); \ 144 INTEGER_TO_UINT64(value_object, value); \
145 ByteArray::Copy(array, index.Value(), &value, sizeof(uint64_t)); \ 145 ByteArray::Copy(array, index.Value(), &value, sizeof(uint64_t)); \
146 return Integer::New(index.Value() + sizeof(uint64_t)); 146 return Integer::New(index.Value() + sizeof(uint64_t));
147 147
148 148
149 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) { 149 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) {
150 GET_NATIVE_ARGUMENT(ByteArray, array, arguments->At(0)); 150 GET_NATIVE_ARGUMENT(ByteArray, array, arguments->NativeArgAt(0));
151 return Smi::New(array.Length()); 151 return Smi::New(array.Length());
152 } 152 }
153 153
154 154
155 DEFINE_NATIVE_ENTRY(ByteArray_getInt8, 2) { 155 DEFINE_NATIVE_ENTRY(ByteArray_getInt8, 2) {
156 UNALIGNED_GETTER(ByteArray, Smi, int8_t); 156 UNALIGNED_GETTER(ByteArray, Smi, int8_t);
157 } 157 }
158 158
159 159
160 DEFINE_NATIVE_ENTRY(ByteArray_setInt8, 3) { 160 DEFINE_NATIVE_ENTRY(ByteArray_setInt8, 3) {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 UNALIGNED_GETTER(ByteArray, Double, double); 246 UNALIGNED_GETTER(ByteArray, Double, double);
247 } 247 }
248 248
249 249
250 DEFINE_NATIVE_ENTRY(ByteArray_setFloat64, 3) { 250 DEFINE_NATIVE_ENTRY(ByteArray_setFloat64, 3) {
251 UNALIGNED_SETTER(ByteArray, Double, value, double); 251 UNALIGNED_SETTER(ByteArray, Double, value, double);
252 } 252 }
253 253
254 254
255 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) { 255 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) {
256 ByteArray& dst = ByteArray::CheckedHandle(arguments->At(0)); 256 ByteArray& dst = ByteArray::CheckedHandle(arguments->NativeArgAt(0));
257 GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->At(1)); 257 GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->NativeArgAt(1));
258 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(2)); 258 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(2));
259 GET_NATIVE_ARGUMENT(ByteArray, src, arguments->At(3)); 259 GET_NATIVE_ARGUMENT(ByteArray, src, arguments->NativeArgAt(3));
260 GET_NATIVE_ARGUMENT(Smi, src_start, arguments->At(4)); 260 GET_NATIVE_ARGUMENT(Smi, src_start, arguments->NativeArgAt(4));
261 intptr_t length_value = length.Value(); 261 intptr_t length_value = length.Value();
262 intptr_t src_start_value = src_start.Value(); 262 intptr_t src_start_value = src_start.Value();
263 intptr_t dst_start_value = dst_start.Value(); 263 intptr_t dst_start_value = dst_start.Value();
264 if (length_value < 0) { 264 if (length_value < 0) {
265 const String& error = String::Handle(String::NewFormatted( 265 const String& error = String::Handle(String::NewFormatted(
266 "length (%"Pd") must be non-negative", length_value)); 266 "length (%"Pd") must be non-negative", length_value));
267 GrowableArray<const Object*> args; 267 GrowableArray<const Object*> args;
268 args.Add(&error); 268 args.Add(&error);
269 Exceptions::ThrowByType(Exceptions::kArgument, args); 269 Exceptions::ThrowByType(Exceptions::kArgument, args);
270 } 270 }
271 RangeCheck(src, src_start_value, length_value); 271 RangeCheck(src, src_start_value, length_value);
272 RangeCheck(dst, dst_start_value, length_value); 272 RangeCheck(dst, dst_start_value, length_value);
273 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value); 273 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value);
274 return Object::null(); 274 return Object::null();
275 } 275 }
276 276
277 277
278 // Int8Array 278 // Int8Array
279 279
280 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { 280 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) {
281 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 281 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
282 intptr_t len = length.Value(); 282 intptr_t len = length.Value();
283 LengthCheck(len, Int8Array::kMaxElements); 283 LengthCheck(len, Int8Array::kMaxElements);
284 return Int8Array::New(len); 284 return Int8Array::New(len);
285 } 285 }
286 286
287 287
288 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { 288 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) {
289 GETTER(Int8Array, Smi, int8_t); 289 GETTER(Int8Array, Smi, int8_t);
290 } 290 }
291 291
292 292
293 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { 293 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) {
294 SETTER(Int8Array, Smi, Value, int8_t); 294 SETTER(Int8Array, Smi, Value, int8_t);
295 } 295 }
296 296
297 297
298 // Uint8Array 298 // Uint8Array
299 299
300 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { 300 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) {
301 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 301 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
302 intptr_t len = length.Value(); 302 intptr_t len = length.Value();
303 LengthCheck(len, Uint8Array::kMaxElements); 303 LengthCheck(len, Uint8Array::kMaxElements);
304 return Uint8Array::New(len); 304 return Uint8Array::New(len);
305 } 305 }
306 306
307 307
308 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { 308 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) {
309 GETTER(Uint8Array, Smi, uint8_t); 309 GETTER(Uint8Array, Smi, uint8_t);
310 } 310 }
311 311
312 312
313 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { 313 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) {
314 SETTER(Uint8Array, Smi, Value, uint8_t); 314 SETTER(Uint8Array, Smi, Value, uint8_t);
315 } 315 }
316 316
317 317
318 // Int16Array 318 // Int16Array
319 319
320 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { 320 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) {
321 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 321 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
322 intptr_t len = length.Value(); 322 intptr_t len = length.Value();
323 LengthCheck(len, Int16Array::kMaxElements); 323 LengthCheck(len, Int16Array::kMaxElements);
324 return Int16Array::New(len); 324 return Int16Array::New(len);
325 } 325 }
326 326
327 327
328 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { 328 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) {
329 GETTER(Int16Array, Smi, int16_t); 329 GETTER(Int16Array, Smi, int16_t);
330 } 330 }
331 331
332 332
333 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { 333 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) {
334 SETTER(Int16Array, Smi, Value, int16_t); 334 SETTER(Int16Array, Smi, Value, int16_t);
335 } 335 }
336 336
337 337
338 // Uint16Array 338 // Uint16Array
339 339
340 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { 340 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) {
341 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 341 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
342 intptr_t len = length.Value(); 342 intptr_t len = length.Value();
343 LengthCheck(len, Uint16Array::kMaxElements); 343 LengthCheck(len, Uint16Array::kMaxElements);
344 return Uint16Array::New(len); 344 return Uint16Array::New(len);
345 } 345 }
346 346
347 347
348 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { 348 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) {
349 GETTER(Uint16Array, Smi, uint16_t); 349 GETTER(Uint16Array, Smi, uint16_t);
350 } 350 }
351 351
352 352
353 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { 353 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) {
354 SETTER(Uint16Array, Smi, Value, uint16_t); 354 SETTER(Uint16Array, Smi, Value, uint16_t);
355 } 355 }
356 356
357 357
358 // Int32Array 358 // Int32Array
359 359
360 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { 360 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) {
361 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 361 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
362 intptr_t len = length.Value(); 362 intptr_t len = length.Value();
363 LengthCheck(len, Int32Array::kMaxElements); 363 LengthCheck(len, Int32Array::kMaxElements);
364 return Int32Array::New(len); 364 return Int32Array::New(len);
365 } 365 }
366 366
367 367
368 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { 368 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) {
369 GETTER(Int32Array, Integer, int32_t); 369 GETTER(Int32Array, Integer, int32_t);
370 } 370 }
371 371
372 372
373 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) { 373 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) {
374 SETTER(Int32Array, Integer, AsInt64Value, int32_t); 374 SETTER(Int32Array, Integer, AsInt64Value, int32_t);
375 } 375 }
376 376
377 377
378 // Uint32Array 378 // Uint32Array
379 379
380 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { 380 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) {
381 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 381 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
382 intptr_t len = length.Value(); 382 intptr_t len = length.Value();
383 LengthCheck(len, Uint32Array::kMaxElements); 383 LengthCheck(len, Uint32Array::kMaxElements);
384 return Uint32Array::New(len); 384 return Uint32Array::New(len);
385 } 385 }
386 386
387 387
388 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { 388 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) {
389 GETTER(Uint32Array, Integer, uint32_t); 389 GETTER(Uint32Array, Integer, uint32_t);
390 } 390 }
391 391
392 392
393 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { 393 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) {
394 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); 394 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t);
395 } 395 }
396 396
397 397
398 // Int64Array 398 // Int64Array
399 399
400 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { 400 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) {
401 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 401 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
402 intptr_t len = length.Value(); 402 intptr_t len = length.Value();
403 LengthCheck(len, Int64Array::kMaxElements); 403 LengthCheck(len, Int64Array::kMaxElements);
404 return Int64Array::New(len); 404 return Int64Array::New(len);
405 } 405 }
406 406
407 407
408 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { 408 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) {
409 GETTER(Int64Array, Integer, int64_t); 409 GETTER(Int64Array, Integer, int64_t);
410 } 410 }
411 411
412 412
413 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { 413 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) {
414 SETTER(Int64Array, Integer, AsInt64Value, int64_t); 414 SETTER(Int64Array, Integer, AsInt64Value, int64_t);
415 } 415 }
416 416
417 417
418 // Uint64Array 418 // Uint64Array
419 419
420 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { 420 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) {
421 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 421 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
422 intptr_t len = length.Value(); 422 intptr_t len = length.Value();
423 LengthCheck(len, Uint64Array::kMaxElements); 423 LengthCheck(len, Uint64Array::kMaxElements);
424 return Uint64Array::New(len); 424 return Uint64Array::New(len);
425 } 425 }
426 426
427 427
428 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { 428 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) {
429 GETTER_UINT64(Uint64Array); 429 GETTER_UINT64(Uint64Array);
430 } 430 }
431 431
432 432
433 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { 433 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) {
434 SETTER_UINT64(Uint64Array); 434 SETTER_UINT64(Uint64Array);
435 } 435 }
436 436
437 437
438 // Float32Array 438 // Float32Array
439 439
440 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { 440 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) {
441 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 441 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
442 intptr_t len = length.Value(); 442 intptr_t len = length.Value();
443 LengthCheck(len, Float32Array::kMaxElements); 443 LengthCheck(len, Float32Array::kMaxElements);
444 return Float32Array::New(len); 444 return Float32Array::New(len);
445 } 445 }
446 446
447 447
448 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { 448 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) {
449 GETTER(Float32Array, Double, float); 449 GETTER(Float32Array, Double, float);
450 } 450 }
451 451
452 452
453 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { 453 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) {
454 SETTER(Float32Array, Double, value, float); 454 SETTER(Float32Array, Double, value, float);
455 } 455 }
456 456
457 457
458 // Float64Array 458 // Float64Array
459 459
460 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { 460 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) {
461 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); 461 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
462 intptr_t len = length.Value(); 462 intptr_t len = length.Value();
463 LengthCheck(len, Float64Array::kMaxElements); 463 LengthCheck(len, Float64Array::kMaxElements);
464 return Float64Array::New(len); 464 return Float64Array::New(len);
465 } 465 }
466 466
467 467
468 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { 468 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) {
469 GETTER(Float64Array, Double, double); 469 GETTER(Float64Array, Double, double);
470 } 470 }
471 471
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { 588 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) {
589 GETTER(ExternalFloat64Array, Double, double); 589 GETTER(ExternalFloat64Array, Double, double);
590 } 590 }
591 591
592 592
593 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { 593 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) {
594 SETTER(ExternalFloat64Array, Double, value, double); 594 SETTER(ExternalFloat64Array, Double, value, double);
595 } 595 }
596 596
597 } // namespace dart 597 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/lib/array.cc ('k') | runtime/lib/date.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698