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

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

Issue 10379018: Revert "Revert "Implement {Int,Uint}{8,16,32,64} and Float{32,64} typed arrays."" (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 7 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) 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"
11 11
12 namespace dart { 12 namespace dart {
13 13
14 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) { 14 // ByteArray
15 const ByteArray& byte_array = ByteArray::CheckedHandle(arguments->At(0));
16 const Smi& length = Smi::Handle(Smi::New(byte_array.Length()));
17 arguments->SetReturn(length);
18 }
19
20
21 DEFINE_NATIVE_ENTRY(InternalByteArray_allocate, 1) {
22 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
23 if (length.Value() < 0) {
24 GrowableArray<const Object*> args;
25 args.Add(&length);
26 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
27 }
28 const InternalByteArray& new_array =
29 InternalByteArray::Handle(InternalByteArray::New(length.Value()));
30 arguments->SetReturn(new_array);
31 }
32
33 15
34 static void RangeCheck(const ByteArray& array, 16 static void RangeCheck(const ByteArray& array,
35 intptr_t index, 17 intptr_t index,
36 intptr_t num_bytes) { 18 intptr_t num_bytes) {
37 if (!Utils::RangeCheck(index, num_bytes, array.Length())) { 19 if (!Utils::RangeCheck(index, num_bytes, array.ByteLength())) {
38 GrowableArray<const Object*> arguments; 20 GrowableArray<const Object*> arguments;
39 const Smi &index_object = Smi::Handle(Smi::New(index)); 21 const Smi &index_object = Smi::Handle(Smi::New(index));
40 arguments.Add(&index_object); 22 arguments.Add(&index_object);
41 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments); 23 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
42 } 24 }
43 } 25 }
44 26
45 27
28 #define GETTER_ARGUMENTS(ArrayT, ValueT) \
29 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \
30 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1));
31
32
33 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \
34 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \
35 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \
36 GET_NATIVE_ARGUMENT(ObjectT, value_object, arguments->At(2));
37
38
39 #define GETTER(ArrayT, ObjectT, ValueT) \
40 GETTER_ARGUMENTS(ArrayT, ValueT); \
41 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \
42 ValueT result = array.At(index.Value()); \
43 arguments->SetReturn(ObjectT::Handle(ObjectT::New(result)));
44
45
46 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \
47 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \
48 RangeCheck(array, index.Value() * sizeof(ValueT), sizeof(ValueT)); \
49 ValueT value = value_object.Getter(); \
50 array.SetAt(index.Value(), value);
51
52
53 #define UNALIGNED_GETTER(ArrayT, ObjectT, ValueT) \
54 GETTER_ARGUMENTS(ArrayT, ValueT); \
55 RangeCheck(array, index.Value(), sizeof(ValueT)); \
56 ValueT result; \
57 ByteArray::Copy(&result, array, index.Value(), sizeof(ValueT)); \
58 arguments->SetReturn(ObjectT::Handle(ObjectT::New(result)));
59
60
61 #define UNALIGNED_SETTER(ArrayT, ObjectT, Getter, ValueT) \
62 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \
63 RangeCheck(array, index.Value(), sizeof(ValueT)); \
64 ValueT src = value_object.Getter(); \
65 ByteArray::Copy(array, index.Value(), &src, sizeof(ValueT));
66
67
68 #define UINT64_TO_INTEGER(value, integer) \
69 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { \
70 result = BigintOperations::NewFromUint64(value); \
71 } else if (value > static_cast<uint64_t>(Smi::kMaxValue)) { \
72 result = Mint::New(value); \
73 } else { \
74 result = Smi::New(value); \
75 }
76
77
78 #define GETTER_UINT64(ArrayT) \
79 GETTER_ARGUMENTS(ArrayT, uint64_t); \
80 intptr_t size = sizeof(uint64_t); \
81 RangeCheck(array, index.Value() * size, size); \
82 uint64_t value = array.At(index.Value()); \
83 Integer& result = Integer::Handle(); \
84 UINT64_TO_INTEGER(value, result); \
85 arguments->SetReturn(result);
86
87
88 #define UNALIGNED_GETTER_UINT64(ArrayT) \
89 GETTER_ARGUMENTS(ArrayT, uint64_t); \
90 RangeCheck(array, index.Value(), sizeof(uint64_t)); \
91 uint64_t value; \
92 ByteArray::Copy(&value, array, index.Value(), sizeof(uint64_t)); \
93 Integer& result = Integer::Handle(); \
94 UINT64_TO_INTEGER(value, result); \
95 arguments->SetReturn(result);
96
97
98 #define INTEGER_TO_UINT64(integer, uint64) \
99 if (integer.IsBigint()) { \
100 Bigint& bigint = Bigint::Handle(); \
101 bigint ^= integer.raw(); \
102 ASSERT(BigintOperations::FitsIntoUint64(bigint)); \
103 value = BigintOperations::AbsToUint64(bigint); \
104 } else { \
105 ASSERT(integer.IsMint() || integer.IsSmi()); \
106 value = integer.AsInt64Value(); \
107 } \
108
109
110 #define SETTER_UINT64(ArrayT) \
111 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \
112 intptr_t size = sizeof(uint64_t); \
113 RangeCheck(array, index.Value() * size, size); \
114 uint64_t value; \
115 INTEGER_TO_UINT64(value_object, value); \
116 array.SetAt(index.Value(), value);
117
118
119 #define UNALIGNED_SETTER_UINT64(ArrayT) \
120 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \
121 RangeCheck(array, index.Value(), sizeof(uint64_t)); \
122 uint64_t value; \
123 INTEGER_TO_UINT64(value_object, value); \
124 ByteArray::Copy(array, index.Value(), &value, sizeof(uint64_t));
125
126
127 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) {
128 GET_NATIVE_ARGUMENT(ByteArray, array, arguments->At(0));
129 const Smi& length = Smi::Handle(Smi::New(array.Length()));
130 arguments->SetReturn(length);
131 }
132
133
134 DEFINE_NATIVE_ENTRY(ByteArray_getInt8, 2) {
135 UNALIGNED_GETTER(ByteArray, Smi, int8_t);
136 }
137
138
139 DEFINE_NATIVE_ENTRY(ByteArray_setInt8, 3) {
140 UNALIGNED_SETTER(ByteArray, Smi, Value, int8_t);
141 }
142
143
144 DEFINE_NATIVE_ENTRY(ByteArray_getUint8, 2) {
145 UNALIGNED_GETTER(ByteArray, Smi, uint8_t);
146 }
147
148
149 DEFINE_NATIVE_ENTRY(ByteArray_setUint8, 3) {
150 UNALIGNED_SETTER(ByteArray, Smi, Value, uint8_t);
151 }
152
153
154 DEFINE_NATIVE_ENTRY(ByteArray_getInt16, 2) {
155 UNALIGNED_GETTER(ByteArray, Smi, int16_t);
156 }
157
158
159 DEFINE_NATIVE_ENTRY(ByteArray_setInt16, 3) {
160 UNALIGNED_SETTER(ByteArray, Smi, Value, int16_t);
161 }
162
163
164 DEFINE_NATIVE_ENTRY(ByteArray_getUint16, 2) {
165 UNALIGNED_GETTER(ByteArray, Smi, uint16_t);
166 }
167
168
169 DEFINE_NATIVE_ENTRY(ByteArray_setUint16, 3) {
170 UNALIGNED_SETTER(ByteArray, Smi, Value, uint16_t);
171 }
172
173
174 DEFINE_NATIVE_ENTRY(ByteArray_getInt32, 2) {
175 UNALIGNED_GETTER(ByteArray, Integer, int32_t);
176 }
177
178
179 DEFINE_NATIVE_ENTRY(ByteArray_setInt32, 3) {
180 UNALIGNED_SETTER(ByteArray, Integer, AsInt64Value, int32_t);
181 }
182
183
184 DEFINE_NATIVE_ENTRY(ByteArray_getUint32, 2) {
185 UNALIGNED_GETTER(ByteArray, Integer, uint32_t);
186 }
187
188
189 DEFINE_NATIVE_ENTRY(ByteArray_setUint32, 3) {
190 UNALIGNED_SETTER(ByteArray, Integer, AsInt64Value, uint32_t);
191 }
192
193
194 DEFINE_NATIVE_ENTRY(ByteArray_getInt64, 2) {
195 UNALIGNED_GETTER(ByteArray, Integer, int64_t);
196 }
197
198
199 DEFINE_NATIVE_ENTRY(ByteArray_setInt64, 3) {
200 UNALIGNED_SETTER(ByteArray, Integer, AsInt64Value, int64_t);
201 }
202
203
204 DEFINE_NATIVE_ENTRY(ByteArray_getUint64, 2) {
205 UNALIGNED_GETTER_UINT64(ByteArray);
206 }
207
208
209 DEFINE_NATIVE_ENTRY(ByteArray_setUint64, 3) {
210 UNALIGNED_SETTER_UINT64(ByteArray);
211 }
212
213
214 DEFINE_NATIVE_ENTRY(ByteArray_getFloat32, 2) {
215 UNALIGNED_GETTER(ByteArray, Double, float);
216 }
217
218
219 DEFINE_NATIVE_ENTRY(ByteArray_setFloat32, 3) {
220 UNALIGNED_SETTER(ByteArray, Double, value, float);
221 }
222
223
224 DEFINE_NATIVE_ENTRY(ByteArray_getFloat64, 2) {
225 UNALIGNED_GETTER(ByteArray, Double, double);
226 }
227
228
229 DEFINE_NATIVE_ENTRY(ByteArray_setFloat64, 3) {
230 UNALIGNED_SETTER(ByteArray, Double, value, double);
231 }
232
233
46 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) { 234 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) {
47 ByteArray& dst = ByteArray::CheckedHandle(arguments->At(0)); 235 ByteArray& dst = ByteArray::CheckedHandle(arguments->At(0));
48 GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->At(1)); 236 GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->At(1));
49 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(2)); 237 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(2));
50 GET_NATIVE_ARGUMENT(ByteArray, src, arguments->At(3)); 238 GET_NATIVE_ARGUMENT(ByteArray, src, arguments->At(3));
51 GET_NATIVE_ARGUMENT(Smi, src_start, arguments->At(4)); 239 GET_NATIVE_ARGUMENT(Smi, src_start, arguments->At(4));
52 intptr_t length_value = length.Value(); 240 intptr_t length_value = length.Value();
53 intptr_t src_start_value = src_start.Value(); 241 intptr_t src_start_value = src_start.Value();
54 intptr_t dst_start_value = dst_start.Value(); 242 intptr_t dst_start_value = dst_start.Value();
55 if (length_value < 0) { 243 if (length_value < 0) {
56 GrowableArray<const Object*> args; 244 GrowableArray<const Object*> args;
57 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); 245 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
58 } 246 }
59 RangeCheck(src, src_start_value, length_value); 247 RangeCheck(src, src_start_value, length_value);
60 RangeCheck(dst, dst_start_value, length_value); 248 RangeCheck(dst, dst_start_value, length_value);
61 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value); 249 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value);
62 } 250 }
63 251
64 #define GETTER_ARGUMENTS(ArrayT, ValueT) \ 252
65 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \ 253 // Int8Array
66 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \ 254
67 RangeCheck(array, index.Value(), sizeof(ValueT)); 255 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) {
68 256 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
69 257 if (length.Value() < 0) {
70 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \ 258 GrowableArray<const Object*> args;
71 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \ 259 args.Add(&length);
72 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \ 260 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
73 RangeCheck(array, index.Value(), sizeof(ValueT)); \ 261 }
74 GET_NATIVE_ARGUMENT(ObjectT, integer_value, arguments->At(2)); 262 const Int8Array& new_array =
75 263 Int8Array::Handle(Int8Array::New(length.Value()));
76 264 arguments->SetReturn(new_array);
77 #define GETTER(ArrayT, ObjectT, ValueT) \ 265 }
78 GETTER_ARGUMENTS(ArrayT, ValueT); \ 266
79 ValueT result = array.UnalignedAt<ValueT>(index.Value()); \ 267
80 arguments->SetReturn(ObjectT::Handle(ObjectT::New(result))); 268 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) {
81 269 GETTER(Int8Array, Smi, int8_t);
82 270 }
83 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \ 271
84 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \ 272
85 array.SetUnalignedAt<ValueT>(index.Value(), integer_value.Getter()); 273 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) {
86 274 SETTER(Int8Array, Smi, Value, int8_t);
87 275 }
88 #define GETTER_UINT64(ArrayT) \ 276
89 GETTER_ARGUMENTS(ArrayT, uint64_t); \ 277
90 uint64_t value = array.UnalignedAt<uint64_t>(index.Value()); \ 278 // Uint8Array
91 Integer& result = Integer::Handle(); \ 279
92 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { \ 280 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) {
93 result = BigintOperations::NewFromUint64(value); \ 281 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
94 } else if (value > static_cast<uint64_t>(Smi::kMaxValue)) { \ 282 if (length.Value() < 0) {
95 result = Mint::New(value); \ 283 GrowableArray<const Object*> args;
96 } else { \ 284 args.Add(&length);
97 result = Smi::New(value); \ 285 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
98 } \ 286 }
99 arguments->SetReturn(result); 287 const Uint8Array& new_array =
100 288 Uint8Array::Handle(Uint8Array::New(length.Value()));
101 289 arguments->SetReturn(new_array);
102 #define SETTER_UINT64(ArrayT) \ 290 }
103 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \ 291
104 uint64_t value; \ 292
105 if (integer_value.IsBigint()) { \ 293 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) {
106 Bigint& bigint_value = Bigint::Handle(); \ 294 GETTER(Uint8Array, Smi, uint8_t);
107 bigint_value ^= integer_value.raw(); \ 295 }
108 ASSERT(BigintOperations::FitsIntoUint64(bigint_value)); \ 296
109 value = BigintOperations::AbsToUint64(bigint_value); \ 297
110 } else { \ 298 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) {
111 ASSERT(integer_value.IsMint() || integer_value.IsSmi()); \ 299 SETTER(Uint8Array, Smi, Value, uint8_t);
112 value = integer_value.AsInt64Value(); \ 300 }
113 } \ 301
114 array.SetUnalignedAt<uint64_t>(index.Value(), value); 302
115 303 // Int16Array
116 304
117 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt8, 2) { 305 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) {
118 GETTER(InternalByteArray, Smi, int8_t); 306 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
119 } 307 if (length.Value() < 0) {
120 308 GrowableArray<const Object*> args;
121 309 args.Add(&length);
122 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt8, 3) { 310 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
123 SETTER(InternalByteArray, Smi, Value, int8_t); 311 }
124 } 312 const Int16Array& new_array =
125 313 Int16Array::Handle(Int16Array::New(length.Value()));
126 314 arguments->SetReturn(new_array);
127 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint8, 2) { 315 }
128 GETTER(InternalByteArray, Smi, uint8_t); 316
129 } 317
130 318 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) {
131 319 GETTER(Int16Array, Smi, int16_t);
132 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint8, 3) { 320 }
133 SETTER(InternalByteArray, Smi, Value, uint8_t); 321
134 } 322
135 323 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) {
136 324 SETTER(Int16Array, Smi, Value, int16_t);
137 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt16, 2) { 325 }
138 GETTER(InternalByteArray, Smi, int16_t); 326
139 } 327
140 328 // Uint16Array
141 329
142 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt16, 3) { 330 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) {
143 SETTER(InternalByteArray, Smi, Value, int16_t); 331 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
144 } 332 if (length.Value() < 0) {
145 333 GrowableArray<const Object*> args;
146 334 args.Add(&length);
147 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint16, 2) { 335 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
148 GETTER(InternalByteArray, Smi, uint16_t); 336 }
149 } 337 const Uint16Array& new_array =
150 338 Uint16Array::Handle(Uint16Array::New(length.Value()));
151 339 arguments->SetReturn(new_array);
152 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint16, 3) { 340 }
153 SETTER(InternalByteArray, Smi, Value, uint16_t); 341
154 } 342
155 343 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) {
156 344 GETTER(Uint16Array, Smi, uint16_t);
157 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt32, 2) { 345 }
158 GETTER(InternalByteArray, Integer, int32_t); 346
159 } 347
160 348 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) {
161 349 SETTER(Uint16Array, Smi, Value, uint16_t);
162 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt32, 3) { 350 }
163 SETTER(InternalByteArray, Integer, AsInt64Value, int32_t); 351
164 } 352
165 353 // Int32Array
166 354
167 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint32, 2) { 355 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) {
168 GETTER(InternalByteArray, Integer, uint32_t); 356 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
169 } 357 if (length.Value() < 0) {
170 358 GrowableArray<const Object*> args;
171 359 args.Add(&length);
172 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint32, 3) { 360 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
173 SETTER(InternalByteArray, Integer, AsInt64Value, uint32_t); 361 }
174 } 362 const Int32Array& new_array =
175 363 Int32Array::Handle(Int32Array::New(length.Value()));
176 364 arguments->SetReturn(new_array);
177 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt64, 2) { 365 }
178 GETTER(InternalByteArray, Integer, int64_t); 366
179 } 367
180 368 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) {
181 369 GETTER(Int32Array, Integer, int32_t);
182 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt64, 3) { 370 }
183 SETTER(InternalByteArray, Integer, AsInt64Value, int64_t); 371
184 } 372
185 373 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) {
186 374 SETTER(Int32Array, Integer, AsInt64Value, int32_t);
187 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint64, 2) { 375 }
188 GETTER_UINT64(InternalByteArray); 376
189 } 377
190 378 // Uint32Array
191 379
192 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint64, 3) { 380 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) {
193 SETTER_UINT64(InternalByteArray); 381 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
194 } 382 if (length.Value() < 0) {
195 383 GrowableArray<const Object*> args;
196 384 args.Add(&length);
197 DEFINE_NATIVE_ENTRY(InternalByteArray_getFloat32, 2) { 385 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
198 GETTER(InternalByteArray, Double, float); 386 }
199 } 387 const Uint32Array& new_array =
200 388 Uint32Array::Handle(Uint32Array::New(length.Value()));
201 389 arguments->SetReturn(new_array);
202 DEFINE_NATIVE_ENTRY(InternalByteArray_setFloat32, 3) { 390 }
203 SETTER(InternalByteArray, Double, value, float); 391
204 } 392
205 393 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) {
206 394 GETTER(Uint32Array, Integer, uint32_t);
207 DEFINE_NATIVE_ENTRY(InternalByteArray_getFloat64, 2) { 395 }
208 GETTER(InternalByteArray, Double, double); 396
209 } 397
210 398 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) {
211 399 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t);
212 DEFINE_NATIVE_ENTRY(InternalByteArray_setFloat64, 3) { 400 }
213 SETTER(InternalByteArray, Double, value, double); 401
214 } 402
215 403 // Int64Array
216 404
217 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt8, 2) { 405 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) {
218 GETTER(ExternalByteArray, Smi, int8_t); 406 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
219 } 407 if (length.Value() < 0) {
220 408 GrowableArray<const Object*> args;
221 409 args.Add(&length);
222 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt8, 3) { 410 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
223 SETTER(ExternalByteArray, Smi, Value, int8_t); 411 }
224 } 412 const Int64Array& new_array =
225 413 Int64Array::Handle(Int64Array::New(length.Value()));
226 414 arguments->SetReturn(new_array);
227 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint8, 2) { 415 }
228 GETTER(ExternalByteArray, Smi, uint8_t); 416
229 } 417
230 418 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) {
231 419 GETTER(Int64Array, Integer, int64_t);
232 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint8, 3) { 420 }
233 SETTER(ExternalByteArray, Smi, Value, uint8_t); 421
234 } 422
235 423 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) {
236 424 SETTER(Int64Array, Integer, AsInt64Value, int64_t);
237 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt16, 2) { 425 }
238 GETTER(ExternalByteArray, Smi, int16_t); 426
239 } 427
240 428 // Uint64Array
241 429
242 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt16, 3) { 430 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) {
243 SETTER(ExternalByteArray, Smi, Value, int16_t); 431 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
244 } 432 if (length.Value() < 0) {
245 433 GrowableArray<const Object*> args;
246 434 args.Add(&length);
247 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint16, 2) { 435 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
248 GETTER(ExternalByteArray, Smi, uint16_t); 436 }
249 } 437 const Uint64Array& new_array =
250 438 Uint64Array::Handle(Uint64Array::New(length.Value()));
251 439 arguments->SetReturn(new_array);
252 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint16, 3) { 440 }
253 SETTER(ExternalByteArray, Smi, Value, uint16_t); 441
254 } 442
255 443 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) {
256 444 GETTER_UINT64(Uint64Array);
257 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt32, 2) { 445 }
258 GETTER(ExternalByteArray, Integer, int32_t); 446
259 } 447
260 448 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) {
261 449 SETTER_UINT64(Uint64Array);
262 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt32, 3) { 450 }
263 SETTER(ExternalByteArray, Integer, AsInt64Value, int32_t); 451
264 } 452
265 453 // Float32Array
266 454
267 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint32, 2) { 455 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) {
268 GETTER(ExternalByteArray, Integer, uint32_t); 456 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
269 } 457 if (length.Value() < 0) {
270 458 GrowableArray<const Object*> args;
271 459 args.Add(&length);
272 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint32, 3) { 460 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
273 SETTER(ExternalByteArray, Integer, AsInt64Value, uint32_t); 461 }
274 } 462 const Float32Array& new_array =
275 463 Float32Array::Handle(Float32Array::New(length.Value()));
276 464 arguments->SetReturn(new_array);
277 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt64, 2) { 465 }
278 GETTER(ExternalByteArray, Integer, int64_t); 466
279 } 467
280 468 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) {
281 469 GETTER(Float32Array, Double, float);
282 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt64, 3) { 470 }
283 SETTER(ExternalByteArray, Integer, AsInt64Value, int64_t); 471
284 } 472
285 473 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) {
286 474 SETTER(Float32Array, Double, value, float);
287 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint64, 2) { 475 }
288 GETTER_UINT64(ExternalByteArray); 476
289 } 477
290 478 // Float64Array
291 479
292 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint64, 3) { 480 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) {
293 SETTER_UINT64(ExternalByteArray); 481 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
294 } 482 if (length.Value() < 0) {
295 483 GrowableArray<const Object*> args;
296 484 args.Add(&length);
297 DEFINE_NATIVE_ENTRY(ExternalByteArray_getFloat32, 2) { 485 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
298 GETTER(ExternalByteArray, Double, float); 486 }
299 } 487 const Float64Array& new_array =
300 488 Float64Array::Handle(Float64Array::New(length.Value()));
301 489 arguments->SetReturn(new_array);
302 DEFINE_NATIVE_ENTRY(ExternalByteArray_setFloat32, 3) { 490 }
303 SETTER(ExternalByteArray, Double, value, float); 491
304 } 492
305 493 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) {
306 494 GETTER(Float64Array, Double, double);
307 DEFINE_NATIVE_ENTRY(ExternalByteArray_getFloat64, 2) { 495 }
308 GETTER(ExternalByteArray, Double, double); 496
309 } 497
310 498 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) {
311 499 SETTER(Float64Array, Double, value, double);
312 DEFINE_NATIVE_ENTRY(ExternalByteArray_setFloat64, 3) { 500 }
313 SETTER(ExternalByteArray, Double, value, double); 501
502
503 // ExternalInt8Array
504
505 DEFINE_NATIVE_ENTRY(ExternalInt8Array_getIndexed, 2) {
506 GETTER(ExternalInt8Array, Smi, int8_t);
507 }
508
509
510 DEFINE_NATIVE_ENTRY(ExternalInt8Array_setIndexed, 3) {
511 SETTER(ExternalInt8Array, Smi, Value, int8_t);
512 }
513
514
515 // ExternalUint8Array
516
517 DEFINE_NATIVE_ENTRY(ExternalUint8Array_getIndexed, 2) {
518 UNALIGNED_GETTER(ExternalUint8Array, Smi, uint8_t);
519 }
520
521
522 DEFINE_NATIVE_ENTRY(ExternalUint8Array_setIndexed, 3) {
523 UNALIGNED_SETTER(ExternalUint8Array, Smi, Value, uint8_t);
524 }
525
526
527 // ExternalInt16Array
528
529 DEFINE_NATIVE_ENTRY(ExternalInt16Array_getIndexed, 2) {
530 GETTER(ExternalInt16Array, Smi, int16_t);
531 }
532
533
534 DEFINE_NATIVE_ENTRY(ExternalInt16Array_setIndexed, 3) {
535 SETTER(ExternalInt16Array, Smi, Value, int16_t);
536 }
537
538
539 // ExternalUint16Array
540
541 DEFINE_NATIVE_ENTRY(ExternalUint16Array_getIndexed, 2) {
542 UNALIGNED_GETTER(ExternalUint16Array, Smi, uint16_t);
543 }
544
545
546 DEFINE_NATIVE_ENTRY(ExternalUint16Array_setIndexed, 3) {
547 UNALIGNED_SETTER(ExternalUint16Array, Smi, Value, uint16_t);
548 }
549
550
551 // ExternalInt32Array
552
553 DEFINE_NATIVE_ENTRY(ExternalInt32Array_getIndexed, 2) {
554 GETTER(ExternalInt32Array, Integer, int32_t);
555 }
556
557
558 DEFINE_NATIVE_ENTRY(ExternalInt32Array_setIndexed, 3) {
559 SETTER(ExternalInt32Array, Integer, AsInt64Value, int32_t);
560 }
561
562
563 // ExternalUint32Array
564
565 DEFINE_NATIVE_ENTRY(ExternalUint32Array_getIndexed, 2) {
566 UNALIGNED_GETTER(ExternalUint32Array, Integer, uint32_t);
567 }
568
569
570 DEFINE_NATIVE_ENTRY(ExternalUint32Array_setIndexed, 3) {
571 UNALIGNED_SETTER(ExternalUint32Array, Integer, AsInt64Value, uint32_t);
572 }
573
574
575 // ExternalInt64Array
576
577 DEFINE_NATIVE_ENTRY(ExternalInt64Array_getIndexed, 2) {
578 GETTER(ExternalInt64Array, Integer, int64_t);
579 }
580
581
582 DEFINE_NATIVE_ENTRY(ExternalInt64Array_setIndexed, 3) {
583 SETTER(ExternalInt64Array, Integer, AsInt64Value, int64_t);
584 }
585
586
587 // ExternalUint64Array
588
589 DEFINE_NATIVE_ENTRY(ExternalUint64Array_getIndexed, 2) {
590 GETTER_UINT64(ExternalUint64Array);
591 }
592
593
594 DEFINE_NATIVE_ENTRY(ExternalUint64Array_setIndexed, 3) {
595 SETTER_UINT64(ExternalUint64Array);
596 }
597
598
599 // ExternalFloat32Array
600
601 DEFINE_NATIVE_ENTRY(ExternalFloat32Array_getIndexed, 2) {
602 GETTER(ExternalFloat32Array, Double, float);
603 }
604
605
606 DEFINE_NATIVE_ENTRY(ExternalFloat32Array_setIndexed, 3) {
607 SETTER(ExternalFloat32Array, Double, value, float);
608 }
609
610
611 // ExternalFloat64Array
612
613 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_getIndexed, 2) {
614 GETTER(ExternalFloat64Array, Double, double);
615 }
616
617
618 DEFINE_NATIVE_ENTRY(ExternalFloat64Array_setIndexed, 3) {
619 SETTER(ExternalFloat64Array, Double, value, double);
314 } 620 }
315 621
316 } // namespace dart 622 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698