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

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

Issue 11468016: Rename GET_NATIVE_ARGUMENT macro to GET_NON_NULL_NATIVE_ARGUMENT. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years 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 25 matching lines...) Expand all
36 if (len < 0 || len > max) { 36 if (len < 0 || len > max) {
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->NativeArgAt(0)); \ 47 GET_NON_NULL_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \
48 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); 48 GET_NON_NULL_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->NativeArgAt(0)); \ 52 GET_NON_NULL_NATIVE_ARGUMENT(ArrayT, array, arguments->NativeArgAt(0)); \
53 GET_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \ 53 GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); \
54 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->NativeArgAt(2)); 54 GET_NON_NULL_NATIVE_ARGUMENT( \
55 ObjectT, value_object, arguments->NativeArgAt(2));
55 56
56 57
57 #define GETTER(ArrayT, ObjectT, ValueT) \ 58 #define GETTER(ArrayT, ObjectT, ValueT) \
58 GETTER_ARGUMENTS(ArrayT, ValueT); \ 59 GETTER_ARGUMENTS(ArrayT, ValueT); \
59 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \ 60 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \
60 ValueT result = array.At(index.Value()); \ 61 ValueT result = array.At(index.Value()); \
61 return ObjectT::New(result); 62 return ObjectT::New(result);
62 63
63 64
64 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \ 65 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \
65 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \ 66 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \
66 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \ 67 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \
67 ValueT value = value_object.Getter(); \ 68 ValueT value = value_object.Getter(); \
68 array.SetAt(index.Value(), value); \ 69 array.SetAt(index.Value(), value); \
69 return Object::null(); 70 return Object::null();
70 71
71 72
72 #define UNALIGNED_GETTER(ArrayT, ObjectT, ValueT) \ 73 #define UNALIGNED_GETTER(ArrayT, ObjectT, ValueT) \
73 GETTER_ARGUMENTS(ArrayT, ValueT); \ 74 GETTER_ARGUMENTS(ArrayT, ValueT); \
74 RangeCheck(array, index.Value(), sizeof(ValueT)); \ 75 RangeCheck(array, index.Value(), sizeof(ValueT)); \
75 ValueT result; \ 76 ValueT result; \
76 ByteArray::Copy(&result, array, index.Value(), sizeof(ValueT)); \ 77 ByteArray::Copy(&result, array, index.Value(), sizeof(ValueT)); \
77 return ObjectT::New(result); 78 return ObjectT::New(result);
78 79
79 80
80 #define UNALIGNED_SETTER(ArrayT, ObjectT, Getter, ValueT) \ 81 #define UNALIGNED_SETTER(ArrayT, ObjectT, Getter, ValueT) \
81 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \ 82 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \
82 RangeCheck(array, index.Value(), sizeof(ValueT)); \ 83 RangeCheck(array, index.Value(), sizeof(ValueT)); \
83 ValueT src = value_object.Getter(); \ 84 ValueT src = value_object.Getter(); \
84 ByteArray::Copy(array, index.Value(), &src, sizeof(ValueT)); \ 85 ByteArray::Copy(array, index.Value(), &src, sizeof(ValueT)); \
85 return Integer::New(index.Value() + sizeof(ValueT)); 86 return Integer::New(index.Value() + sizeof(ValueT));
86 87
87 88
88 #define UINT64_TO_INTEGER(value, integer) \ 89 #define UINT64_TO_INTEGER(value, integer) \
89 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { \ 90 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { \
90 result = BigintOperations::NewFromUint64(value); \ 91 result = BigintOperations::NewFromUint64(value); \
91 } else if (value > static_cast<uint64_t>(Smi::kMaxValue)) { \ 92 } else if (value > static_cast<uint64_t>(Smi::kMaxValue)) { \
92 result = Mint::New(value); \ 93 result = Mint::New(value); \
93 } else { \ 94 } else { \
94 result = Smi::New(value); \ 95 result = Smi::New(value); \
95 } 96 }
96 97
97 98
98 #define GETTER_UINT64(ArrayT) \ 99 #define GETTER_UINT64(ArrayT) \
99 GETTER_ARGUMENTS(ArrayT, uint64_t); \ 100 GETTER_ARGUMENTS(ArrayT, uint64_t); \
100 intptr_t size = sizeof(uint64_t); \ 101 intptr_t size = sizeof(uint64_t); \
101 RangeCheck(array, index.Value() * size, size); \ 102 RangeCheck(array, index.Value() * size, size); \
102 uint64_t value = array.At(index.Value()); \ 103 uint64_t value = array.At(index.Value()); \
103 Integer& result = Integer::Handle(); \ 104 Integer& result = Integer::Handle(); \
104 UINT64_TO_INTEGER(value, result); \ 105 UINT64_TO_INTEGER(value, result); \
105 return result.raw(); 106 return result.raw();
106 107
107 108
108 #define UNALIGNED_GETTER_UINT64(ArrayT) \ 109 #define UNALIGNED_GETTER_UINT64(ArrayT) \
109 GETTER_ARGUMENTS(ArrayT, uint64_t); \ 110 GETTER_ARGUMENTS(ArrayT, uint64_t); \
110 RangeCheck(array, index.Value(), sizeof(uint64_t)); \ 111 RangeCheck(array, index.Value(), sizeof(uint64_t)); \
111 uint64_t value; \ 112 uint64_t value; \
112 ByteArray::Copy(&value, array, index.Value(), sizeof(uint64_t)); \ 113 ByteArray::Copy(&value, array, index.Value(), sizeof(uint64_t)); \
113 Integer& result = Integer::Handle(); \ 114 Integer& result = Integer::Handle(); \
114 UINT64_TO_INTEGER(value, result); \ 115 UINT64_TO_INTEGER(value, result); \
115 return result.raw(); 116 return result.raw();
116 117
117 118
118 #define INTEGER_TO_UINT64(integer, uint64) \ 119 #define INTEGER_TO_UINT64(integer, uint64) \
119 if (integer.IsBigint()) { \ 120 if (integer.IsBigint()) { \
120 Bigint& bigint = Bigint::Handle(); \ 121 Bigint& bigint = Bigint::Handle(); \
121 bigint ^= integer.raw(); \ 122 bigint ^= integer.raw(); \
122 ASSERT(BigintOperations::FitsIntoUint64(bigint)); \ 123 ASSERT(BigintOperations::FitsIntoUint64(bigint)); \
123 value = BigintOperations::AbsToUint64(bigint); \ 124 value = BigintOperations::AbsToUint64(bigint); \
124 } else { \ 125 } else { \
125 ASSERT(integer.IsMint() || integer.IsSmi()); \ 126 ASSERT(integer.IsMint() || integer.IsSmi()); \
126 value = integer.AsInt64Value(); \ 127 value = integer.AsInt64Value(); \
127 } \ 128 } \
128 129
129 130
130 #define SETTER_UINT64(ArrayT) \ 131 #define SETTER_UINT64(ArrayT) \
131 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \ 132 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \
132 intptr_t size = sizeof(uint64_t); \ 133 intptr_t size = sizeof(uint64_t); \
133 RangeCheck(array, index.Value() * size, size); \ 134 RangeCheck(array, index.Value() * size, size); \
134 uint64_t value; \ 135 uint64_t value; \
135 INTEGER_TO_UINT64(value_object, value); \ 136 INTEGER_TO_UINT64(value_object, value); \
136 array.SetAt(index.Value(), value); \ 137 array.SetAt(index.Value(), value); \
137 return Object::null(); 138 return Object::null();
138 139
139 140
140 #define UNALIGNED_SETTER_UINT64(ArrayT) \ 141 #define UNALIGNED_SETTER_UINT64(ArrayT) \
141 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \ 142 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \
142 RangeCheck(array, index.Value(), sizeof(uint64_t)); \ 143 RangeCheck(array, index.Value(), sizeof(uint64_t)); \
143 uint64_t value; \ 144 uint64_t value; \
144 INTEGER_TO_UINT64(value_object, value); \ 145 INTEGER_TO_UINT64(value_object, value); \
145 ByteArray::Copy(array, index.Value(), &value, sizeof(uint64_t)); \ 146 ByteArray::Copy(array, index.Value(), &value, sizeof(uint64_t)); \
146 return Integer::New(index.Value() + sizeof(uint64_t)); 147 return Integer::New(index.Value() + sizeof(uint64_t));
147 148
148 149
149 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) { 150 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) {
150 GET_NATIVE_ARGUMENT(ByteArray, array, arguments->NativeArgAt(0)); 151 GET_NON_NULL_NATIVE_ARGUMENT(ByteArray, array, arguments->NativeArgAt(0));
151 return Smi::New(array.Length()); 152 return Smi::New(array.Length());
152 } 153 }
153 154
154 155
155 DEFINE_NATIVE_ENTRY(ByteArray_getInt8, 2) { 156 DEFINE_NATIVE_ENTRY(ByteArray_getInt8, 2) {
156 UNALIGNED_GETTER(ByteArray, Smi, int8_t); 157 UNALIGNED_GETTER(ByteArray, Smi, int8_t);
157 } 158 }
158 159
159 160
160 DEFINE_NATIVE_ENTRY(ByteArray_setInt8, 3) { 161 DEFINE_NATIVE_ENTRY(ByteArray_setInt8, 3) {
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 } 248 }
248 249
249 250
250 DEFINE_NATIVE_ENTRY(ByteArray_setFloat64, 3) { 251 DEFINE_NATIVE_ENTRY(ByteArray_setFloat64, 3) {
251 UNALIGNED_SETTER(ByteArray, Double, value, double); 252 UNALIGNED_SETTER(ByteArray, Double, value, double);
252 } 253 }
253 254
254 255
255 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) { 256 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) {
256 ByteArray& dst = ByteArray::CheckedHandle(arguments->NativeArgAt(0)); 257 ByteArray& dst = ByteArray::CheckedHandle(arguments->NativeArgAt(0));
257 GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->NativeArgAt(1)); 258 GET_NON_NULL_NATIVE_ARGUMENT(Smi, dst_start, arguments->NativeArgAt(1));
258 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(2)); 259 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(2));
259 GET_NATIVE_ARGUMENT(ByteArray, src, arguments->NativeArgAt(3)); 260 GET_NON_NULL_NATIVE_ARGUMENT(ByteArray, src, arguments->NativeArgAt(3));
260 GET_NATIVE_ARGUMENT(Smi, src_start, arguments->NativeArgAt(4)); 261 GET_NON_NULL_NATIVE_ARGUMENT(Smi, src_start, arguments->NativeArgAt(4));
261 intptr_t length_value = length.Value(); 262 intptr_t length_value = length.Value();
262 intptr_t src_start_value = src_start.Value(); 263 intptr_t src_start_value = src_start.Value();
263 intptr_t dst_start_value = dst_start.Value(); 264 intptr_t dst_start_value = dst_start.Value();
264 if (length_value < 0) { 265 if (length_value < 0) {
265 const String& error = String::Handle(String::NewFormatted( 266 const String& error = String::Handle(String::NewFormatted(
266 "length (%"Pd") must be non-negative", length_value)); 267 "length (%"Pd") must be non-negative", length_value));
267 GrowableArray<const Object*> args; 268 GrowableArray<const Object*> args;
268 args.Add(&error); 269 args.Add(&error);
269 Exceptions::ThrowByType(Exceptions::kArgument, args); 270 Exceptions::ThrowByType(Exceptions::kArgument, args);
270 } 271 }
271 RangeCheck(src, src_start_value, length_value); 272 RangeCheck(src, src_start_value, length_value);
272 RangeCheck(dst, dst_start_value, length_value); 273 RangeCheck(dst, dst_start_value, length_value);
273 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value); 274 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value);
274 return Object::null(); 275 return Object::null();
275 } 276 }
276 277
277 278
278 // Int8Array 279 // Int8Array
279 280
280 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { 281 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) {
281 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 282 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
282 intptr_t len = length.Value(); 283 intptr_t len = length.Value();
283 LengthCheck(len, Int8Array::kMaxElements); 284 LengthCheck(len, Int8Array::kMaxElements);
284 return Int8Array::New(len); 285 return Int8Array::New(len);
285 } 286 }
286 287
287 288
288 DEFINE_NATIVE_ENTRY(Int8Array_newTransferable, 1) { 289 DEFINE_NATIVE_ENTRY(Int8Array_newTransferable, 1) {
289 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 290 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
290 intptr_t len = length.Value(); 291 intptr_t len = length.Value();
291 LengthCheck(len, Int8Array::kMaxElements); 292 LengthCheck(len, Int8Array::kMaxElements);
292 int8_t* bytes = OS::AllocateAlignedArray<int8_t>( 293 int8_t* bytes = OS::AllocateAlignedArray<int8_t>(
293 len, 294 len,
294 ExternalByteArrayData<int8_t>::kAlignment); 295 ExternalByteArrayData<int8_t>::kAlignment);
295 return ExternalInt8Array::New(bytes, 296 return ExternalInt8Array::New(bytes,
296 len, 297 len,
297 bytes, 298 bytes,
298 OS::AlignedFree); 299 OS::AlignedFree);
299 } 300 }
300 301
301 302
302 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { 303 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) {
303 GETTER(Int8Array, Smi, int8_t); 304 GETTER(Int8Array, Smi, int8_t);
304 } 305 }
305 306
306 307
307 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { 308 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) {
308 SETTER(Int8Array, Smi, Value, int8_t); 309 SETTER(Int8Array, Smi, Value, int8_t);
309 } 310 }
310 311
311 312
312 // Uint8Array 313 // Uint8Array
313 314
314 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { 315 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) {
315 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 316 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
316 intptr_t len = length.Value(); 317 intptr_t len = length.Value();
317 LengthCheck(len, Uint8Array::kMaxElements); 318 LengthCheck(len, Uint8Array::kMaxElements);
318 return Uint8Array::New(len); 319 return Uint8Array::New(len);
319 } 320 }
320 321
321 322
322 DEFINE_NATIVE_ENTRY(Uint8Array_newTransferable, 1) { 323 DEFINE_NATIVE_ENTRY(Uint8Array_newTransferable, 1) {
323 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 324 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
324 intptr_t len = length.Value(); 325 intptr_t len = length.Value();
325 LengthCheck(len, Uint8Array::kMaxElements); 326 LengthCheck(len, Uint8Array::kMaxElements);
326 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>( 327 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>(
327 len, 328 len,
328 ExternalByteArrayData<uint8_t>::kAlignment); 329 ExternalByteArrayData<uint8_t>::kAlignment);
329 return ExternalUint8Array::New(bytes, 330 return ExternalUint8Array::New(bytes,
330 len, 331 len,
331 bytes, 332 bytes,
332 OS::AlignedFree); 333 OS::AlignedFree);
333 } 334 }
334 335
335 336
336 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { 337 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) {
337 GETTER(Uint8Array, Smi, uint8_t); 338 GETTER(Uint8Array, Smi, uint8_t);
338 } 339 }
339 340
340 341
341 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { 342 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) {
342 SETTER(Uint8Array, Smi, Value, uint8_t); 343 SETTER(Uint8Array, Smi, Value, uint8_t);
343 } 344 }
344 345
345 346
346 // Uint8ClampedArray 347 // Uint8ClampedArray
347 348
348 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_new, 1) { 349 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_new, 1) {
349 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 350 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
350 intptr_t len = length.Value(); 351 intptr_t len = length.Value();
351 LengthCheck(len, Uint8ClampedArray::kMaxElements); 352 LengthCheck(len, Uint8ClampedArray::kMaxElements);
352 return Uint8ClampedArray::New(len); 353 return Uint8ClampedArray::New(len);
353 } 354 }
354 355
355 356
356 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_newTransferable, 1) { 357 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_newTransferable, 1) {
357 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 358 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
358 intptr_t len = length.Value(); 359 intptr_t len = length.Value();
359 LengthCheck(len, Uint8ClampedArray::kMaxElements); 360 LengthCheck(len, Uint8ClampedArray::kMaxElements);
360 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>( 361 uint8_t* bytes = OS::AllocateAlignedArray<uint8_t>(
361 len, 362 len,
362 ExternalByteArrayData<uint8_t>::kAlignment); 363 ExternalByteArrayData<uint8_t>::kAlignment);
363 return ExternalUint8ClampedArray::New(bytes, 364 return ExternalUint8ClampedArray::New(bytes,
364 len, 365 len,
365 bytes, 366 bytes,
366 OS::AlignedFree); 367 OS::AlignedFree);
367 } 368 }
368 369
369 370
370 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_getIndexed, 2) { 371 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_getIndexed, 2) {
371 GETTER(Uint8ClampedArray, Smi, uint8_t); 372 GETTER(Uint8ClampedArray, Smi, uint8_t);
372 } 373 }
373 374
374 375
375 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_setIndexed, 3) { 376 DEFINE_NATIVE_ENTRY(Uint8ClampedArray_setIndexed, 3) {
376 SETTER(Uint8ClampedArray, Smi, Value, uint8_t); 377 SETTER(Uint8ClampedArray, Smi, Value, uint8_t);
377 } 378 }
378 379
379 380
380 // Int16Array 381 // Int16Array
381 382
382 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { 383 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) {
383 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 384 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
384 intptr_t len = length.Value(); 385 intptr_t len = length.Value();
385 LengthCheck(len, Int16Array::kMaxElements); 386 LengthCheck(len, Int16Array::kMaxElements);
386 return Int16Array::New(len); 387 return Int16Array::New(len);
387 } 388 }
388 389
389 390
390 DEFINE_NATIVE_ENTRY(Int16Array_newTransferable, 1) { 391 DEFINE_NATIVE_ENTRY(Int16Array_newTransferable, 1) {
391 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 392 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
392 intptr_t len = length.Value(); 393 intptr_t len = length.Value();
393 LengthCheck(len, Int16Array::kMaxElements); 394 LengthCheck(len, Int16Array::kMaxElements);
394 int16_t* bytes = OS::AllocateAlignedArray<int16_t>( 395 int16_t* bytes = OS::AllocateAlignedArray<int16_t>(
395 len, 396 len,
396 ExternalByteArrayData<int16_t>::kAlignment); 397 ExternalByteArrayData<int16_t>::kAlignment);
397 return ExternalInt16Array::New(bytes, 398 return ExternalInt16Array::New(bytes,
398 len, 399 len,
399 bytes, 400 bytes,
400 OS::AlignedFree); 401 OS::AlignedFree);
401 } 402 }
402 403
403 404
404 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { 405 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) {
405 GETTER(Int16Array, Smi, int16_t); 406 GETTER(Int16Array, Smi, int16_t);
406 } 407 }
407 408
408 409
409 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { 410 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) {
410 SETTER(Int16Array, Smi, Value, int16_t); 411 SETTER(Int16Array, Smi, Value, int16_t);
411 } 412 }
412 413
413 414
414 // Uint16Array 415 // Uint16Array
415 416
416 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { 417 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) {
417 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 418 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
418 intptr_t len = length.Value(); 419 intptr_t len = length.Value();
419 LengthCheck(len, Uint16Array::kMaxElements); 420 LengthCheck(len, Uint16Array::kMaxElements);
420 return Uint16Array::New(len); 421 return Uint16Array::New(len);
421 } 422 }
422 423
423 424
424 DEFINE_NATIVE_ENTRY(Uint16Array_newTransferable, 1) { 425 DEFINE_NATIVE_ENTRY(Uint16Array_newTransferable, 1) {
425 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 426 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
426 intptr_t len = length.Value(); 427 intptr_t len = length.Value();
427 LengthCheck(len, Uint16Array::kMaxElements); 428 LengthCheck(len, Uint16Array::kMaxElements);
428 uint16_t* bytes = OS::AllocateAlignedArray<uint16_t>( 429 uint16_t* bytes = OS::AllocateAlignedArray<uint16_t>(
429 len, 430 len,
430 ExternalByteArrayData<uint16_t>::kAlignment); 431 ExternalByteArrayData<uint16_t>::kAlignment);
431 return ExternalUint16Array::New(bytes, 432 return ExternalUint16Array::New(bytes,
432 len, 433 len,
433 bytes, 434 bytes,
434 OS::AlignedFree); 435 OS::AlignedFree);
435 } 436 }
436 437
437 438
438 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { 439 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) {
439 GETTER(Uint16Array, Smi, uint16_t); 440 GETTER(Uint16Array, Smi, uint16_t);
440 } 441 }
441 442
442 443
443 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { 444 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) {
444 SETTER(Uint16Array, Smi, Value, uint16_t); 445 SETTER(Uint16Array, Smi, Value, uint16_t);
445 } 446 }
446 447
447 448
448 // Int32Array 449 // Int32Array
449 450
450 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { 451 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) {
451 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 452 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
452 intptr_t len = length.Value(); 453 intptr_t len = length.Value();
453 LengthCheck(len, Int32Array::kMaxElements); 454 LengthCheck(len, Int32Array::kMaxElements);
454 return Int32Array::New(len); 455 return Int32Array::New(len);
455 } 456 }
456 457
457 458
458 DEFINE_NATIVE_ENTRY(Int32Array_newTransferable, 1) { 459 DEFINE_NATIVE_ENTRY(Int32Array_newTransferable, 1) {
459 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 460 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
460 intptr_t len = length.Value(); 461 intptr_t len = length.Value();
461 LengthCheck(len, Int32Array::kMaxElements); 462 LengthCheck(len, Int32Array::kMaxElements);
462 int32_t* bytes = OS::AllocateAlignedArray<int32_t>( 463 int32_t* bytes = OS::AllocateAlignedArray<int32_t>(
463 len, 464 len,
464 ExternalByteArrayData<int32_t>::kAlignment); 465 ExternalByteArrayData<int32_t>::kAlignment);
465 return ExternalInt32Array::New(bytes, 466 return ExternalInt32Array::New(bytes,
466 len, 467 len,
467 bytes, 468 bytes,
468 OS::AlignedFree); 469 OS::AlignedFree);
469 } 470 }
470 471
471 472
472 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { 473 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) {
473 GETTER(Int32Array, Integer, int32_t); 474 GETTER(Int32Array, Integer, int32_t);
474 } 475 }
475 476
476 477
477 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) { 478 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) {
478 SETTER(Int32Array, Integer, AsInt64Value, int32_t); 479 SETTER(Int32Array, Integer, AsInt64Value, int32_t);
479 } 480 }
480 481
481 482
482 // Uint32Array 483 // Uint32Array
483 484
484 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { 485 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) {
485 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 486 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
486 intptr_t len = length.Value(); 487 intptr_t len = length.Value();
487 LengthCheck(len, Uint32Array::kMaxElements); 488 LengthCheck(len, Uint32Array::kMaxElements);
488 return Uint32Array::New(len); 489 return Uint32Array::New(len);
489 } 490 }
490 491
491 492
492 DEFINE_NATIVE_ENTRY(Uint32Array_newTransferable, 1) { 493 DEFINE_NATIVE_ENTRY(Uint32Array_newTransferable, 1) {
493 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 494 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
494 intptr_t len = length.Value(); 495 intptr_t len = length.Value();
495 LengthCheck(len, Uint32Array::kMaxElements); 496 LengthCheck(len, Uint32Array::kMaxElements);
496 uint32_t* bytes = OS::AllocateAlignedArray<uint32_t>( 497 uint32_t* bytes = OS::AllocateAlignedArray<uint32_t>(
497 len, 498 len,
498 ExternalByteArrayData<uint32_t>::kAlignment); 499 ExternalByteArrayData<uint32_t>::kAlignment);
499 return ExternalUint32Array::New(bytes, 500 return ExternalUint32Array::New(bytes,
500 len, 501 len,
501 bytes, 502 bytes,
502 OS::AlignedFree); 503 OS::AlignedFree);
503 } 504 }
504 505
505 506
506 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { 507 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) {
507 GETTER(Uint32Array, Integer, uint32_t); 508 GETTER(Uint32Array, Integer, uint32_t);
508 } 509 }
509 510
510 511
511 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { 512 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) {
512 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); 513 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t);
513 } 514 }
514 515
515 516
516 // Int64Array 517 // Int64Array
517 518
518 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { 519 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) {
519 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 520 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
520 intptr_t len = length.Value(); 521 intptr_t len = length.Value();
521 LengthCheck(len, Int64Array::kMaxElements); 522 LengthCheck(len, Int64Array::kMaxElements);
522 return Int64Array::New(len); 523 return Int64Array::New(len);
523 } 524 }
524 525
525 526
526 DEFINE_NATIVE_ENTRY(Int64Array_newTransferable, 1) { 527 DEFINE_NATIVE_ENTRY(Int64Array_newTransferable, 1) {
527 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 528 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
528 intptr_t len = length.Value(); 529 intptr_t len = length.Value();
529 LengthCheck(len, Int64Array::kMaxElements); 530 LengthCheck(len, Int64Array::kMaxElements);
530 int64_t* bytes = OS::AllocateAlignedArray<int64_t>( 531 int64_t* bytes = OS::AllocateAlignedArray<int64_t>(
531 len, 532 len,
532 ExternalByteArrayData<int64_t>::kAlignment); 533 ExternalByteArrayData<int64_t>::kAlignment);
533 return ExternalInt64Array::New(bytes, 534 return ExternalInt64Array::New(bytes,
534 len, 535 len,
535 bytes, 536 bytes,
536 OS::AlignedFree); 537 OS::AlignedFree);
537 } 538 }
538 539
539 540
540 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { 541 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) {
541 GETTER(Int64Array, Integer, int64_t); 542 GETTER(Int64Array, Integer, int64_t);
542 } 543 }
543 544
544 545
545 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { 546 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) {
546 SETTER(Int64Array, Integer, AsInt64Value, int64_t); 547 SETTER(Int64Array, Integer, AsInt64Value, int64_t);
547 } 548 }
548 549
549 550
550 // Uint64Array 551 // Uint64Array
551 552
552 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { 553 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) {
553 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 554 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
554 intptr_t len = length.Value(); 555 intptr_t len = length.Value();
555 LengthCheck(len, Uint64Array::kMaxElements); 556 LengthCheck(len, Uint64Array::kMaxElements);
556 return Uint64Array::New(len); 557 return Uint64Array::New(len);
557 } 558 }
558 559
559 560
560 DEFINE_NATIVE_ENTRY(Uint64Array_newTransferable, 1) { 561 DEFINE_NATIVE_ENTRY(Uint64Array_newTransferable, 1) {
561 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 562 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
562 intptr_t len = length.Value(); 563 intptr_t len = length.Value();
563 LengthCheck(len, Uint64Array::kMaxElements); 564 LengthCheck(len, Uint64Array::kMaxElements);
564 uint64_t* bytes = OS::AllocateAlignedArray<uint64_t>( 565 uint64_t* bytes = OS::AllocateAlignedArray<uint64_t>(
565 len, 566 len,
566 ExternalByteArrayData<uint64_t>::kAlignment); 567 ExternalByteArrayData<uint64_t>::kAlignment);
567 return ExternalUint64Array::New(bytes, 568 return ExternalUint64Array::New(bytes,
568 len, 569 len,
569 bytes, 570 bytes,
570 OS::AlignedFree); 571 OS::AlignedFree);
571 } 572 }
572 573
573 574
574 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { 575 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) {
575 GETTER_UINT64(Uint64Array); 576 GETTER_UINT64(Uint64Array);
576 } 577 }
577 578
578 579
579 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { 580 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) {
580 SETTER_UINT64(Uint64Array); 581 SETTER_UINT64(Uint64Array);
581 } 582 }
582 583
583 584
584 // Float32Array 585 // Float32Array
585 586
586 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { 587 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) {
587 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 588 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
588 intptr_t len = length.Value(); 589 intptr_t len = length.Value();
589 LengthCheck(len, Float32Array::kMaxElements); 590 LengthCheck(len, Float32Array::kMaxElements);
590 return Float32Array::New(len); 591 return Float32Array::New(len);
591 } 592 }
592 593
593 594
594 DEFINE_NATIVE_ENTRY(Float32Array_newTransferable, 1) { 595 DEFINE_NATIVE_ENTRY(Float32Array_newTransferable, 1) {
595 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 596 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
596 intptr_t len = length.Value(); 597 intptr_t len = length.Value();
597 LengthCheck(len, Float32Array::kMaxElements); 598 LengthCheck(len, Float32Array::kMaxElements);
598 float* bytes = OS::AllocateAlignedArray<float>( 599 float* bytes = OS::AllocateAlignedArray<float>(
599 len, 600 len,
600 ExternalByteArrayData<float>::kAlignment); 601 ExternalByteArrayData<float>::kAlignment);
601 return ExternalFloat32Array::New(bytes, 602 return ExternalFloat32Array::New(bytes,
602 len, 603 len,
603 bytes, 604 bytes,
604 OS::AlignedFree); 605 OS::AlignedFree);
605 } 606 }
606 607
607 608
608 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { 609 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) {
609 GETTER(Float32Array, Double, float); 610 GETTER(Float32Array, Double, float);
610 } 611 }
611 612
612 613
613 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { 614 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) {
614 SETTER(Float32Array, Double, value, float); 615 SETTER(Float32Array, Double, value, float);
615 } 616 }
616 617
617 618
618 // Float64Array 619 // Float64Array
619 620
620 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { 621 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) {
621 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 622 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
622 intptr_t len = length.Value(); 623 intptr_t len = length.Value();
623 LengthCheck(len, Float64Array::kMaxElements); 624 LengthCheck(len, Float64Array::kMaxElements);
624 return Float64Array::New(len); 625 return Float64Array::New(len);
625 } 626 }
626 627
627 628
628 DEFINE_NATIVE_ENTRY(Float64Array_newTransferable, 1) { 629 DEFINE_NATIVE_ENTRY(Float64Array_newTransferable, 1) {
629 GET_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0)); 630 GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(0));
630 intptr_t len = length.Value(); 631 intptr_t len = length.Value();
631 LengthCheck(len, Float64Array::kMaxElements); 632 LengthCheck(len, Float64Array::kMaxElements);
632 double* bytes = OS::AllocateAlignedArray<double>( 633 double* bytes = OS::AllocateAlignedArray<double>(
633 len, 634 len,
634 ExternalByteArrayData<double>::kAlignment); 635 ExternalByteArrayData<double>::kAlignment);
635 return ExternalFloat64Array::New(bytes, 636 return ExternalFloat64Array::New(bytes,
636 len, 637 len,
637 bytes, 638 bytes,
638 OS::AlignedFree); 639 OS::AlignedFree);
639 } 640 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) { 763 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) {
763 GETTER(ExternalFloat64Array, Double, double); 764 GETTER(ExternalFloat64Array, Double, double);
764 } 765 }
765 766
766 767
767 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) { 768 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) {
768 SETTER(ExternalFloat64Array, Double, value, double); 769 SETTER(ExternalFloat64Array, Double, value, double);
769 } 770 }
770 771
771 } // namespace dart 772 } // 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