| OLD | NEW |
| 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 // ByteArray | 14 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) { |
| 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 |
| 15 | 33 |
| 16 static void RangeCheck(const ByteArray& array, | 34 static void RangeCheck(const ByteArray& array, |
| 17 intptr_t index, | 35 intptr_t index, |
| 18 intptr_t num_bytes) { | 36 intptr_t num_bytes) { |
| 19 if (!Utils::RangeCheck(index, num_bytes, array.ByteLength())) { | 37 if (!Utils::RangeCheck(index, num_bytes, array.Length())) { |
| 20 GrowableArray<const Object*> arguments; | 38 GrowableArray<const Object*> arguments; |
| 21 const Smi &index_object = Smi::Handle(Smi::New(index)); | 39 const Smi &index_object = Smi::Handle(Smi::New(index)); |
| 22 arguments.Add(&index_object); | 40 arguments.Add(&index_object); |
| 23 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments); | 41 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments); |
| 24 } | 42 } |
| 25 } | 43 } |
| 26 | 44 |
| 27 | 45 |
| 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 | |
| 234 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) { | 46 DEFINE_NATIVE_ENTRY(ByteArray_setRange, 5) { |
| 235 ByteArray& dst = ByteArray::CheckedHandle(arguments->At(0)); | 47 ByteArray& dst = ByteArray::CheckedHandle(arguments->At(0)); |
| 236 GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->At(1)); | 48 GET_NATIVE_ARGUMENT(Smi, dst_start, arguments->At(1)); |
| 237 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(2)); | 49 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(2)); |
| 238 GET_NATIVE_ARGUMENT(ByteArray, src, arguments->At(3)); | 50 GET_NATIVE_ARGUMENT(ByteArray, src, arguments->At(3)); |
| 239 GET_NATIVE_ARGUMENT(Smi, src_start, arguments->At(4)); | 51 GET_NATIVE_ARGUMENT(Smi, src_start, arguments->At(4)); |
| 240 intptr_t length_value = length.Value(); | 52 intptr_t length_value = length.Value(); |
| 241 intptr_t src_start_value = src_start.Value(); | 53 intptr_t src_start_value = src_start.Value(); |
| 242 intptr_t dst_start_value = dst_start.Value(); | 54 intptr_t dst_start_value = dst_start.Value(); |
| 243 if (length_value < 0) { | 55 if (length_value < 0) { |
| 244 GrowableArray<const Object*> args; | 56 GrowableArray<const Object*> args; |
| 245 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 57 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); |
| 246 } | 58 } |
| 247 RangeCheck(src, src_start_value, length_value); | 59 RangeCheck(src, src_start_value, length_value); |
| 248 RangeCheck(dst, dst_start_value, length_value); | 60 RangeCheck(dst, dst_start_value, length_value); |
| 249 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value); | 61 ByteArray::Copy(dst, dst_start_value, src, src_start_value, length_value); |
| 250 } | 62 } |
| 251 | 63 |
| 252 | 64 #define GETTER_ARGUMENTS(ArrayT, ValueT) \ |
| 253 // Int8Array | 65 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \ |
| 254 | 66 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \ |
| 255 DEFINE_NATIVE_ENTRY(Int8Array_new, 1) { | 67 RangeCheck(array, index.Value(), sizeof(ValueT)); |
| 256 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 68 |
| 257 if (length.Value() < 0) { | 69 |
| 258 GrowableArray<const Object*> args; | 70 #define SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT) \ |
| 259 args.Add(&length); | 71 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \ |
| 260 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 72 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \ |
| 261 } | 73 RangeCheck(array, index.Value(), sizeof(ValueT)); \ |
| 262 const Int8Array& new_array = | 74 GET_NATIVE_ARGUMENT(ObjectT, integer_value, arguments->At(2)); |
| 263 Int8Array::Handle(Int8Array::New(length.Value())); | 75 |
| 264 arguments->SetReturn(new_array); | 76 |
| 265 } | 77 #define GETTER(ArrayT, ObjectT, ValueT) \ |
| 266 | 78 GETTER_ARGUMENTS(ArrayT, ValueT); \ |
| 267 | 79 ValueT result = array.UnalignedAt<ValueT>(index.Value()); \ |
| 268 DEFINE_NATIVE_ENTRY(Int8Array_getIndexed, 2) { | 80 arguments->SetReturn(ObjectT::Handle(ObjectT::New(result))); |
| 269 GETTER(Int8Array, Smi, int8_t); | 81 |
| 270 } | 82 |
| 271 | 83 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \ |
| 272 | 84 SETTER_ARGUMENTS(ArrayT, ObjectT, ValueT); \ |
| 273 DEFINE_NATIVE_ENTRY(Int8Array_setIndexed, 3) { | 85 array.SetUnalignedAt<ValueT>(index.Value(), integer_value.Getter()); |
| 274 SETTER(Int8Array, Smi, Value, int8_t); | 86 |
| 275 } | 87 |
| 276 | 88 #define GETTER_UINT64(ArrayT) \ |
| 277 | 89 GETTER_ARGUMENTS(ArrayT, uint64_t); \ |
| 278 // Uint8Array | 90 uint64_t value = array.UnalignedAt<uint64_t>(index.Value()); \ |
| 279 | 91 Integer& result = Integer::Handle(); \ |
| 280 DEFINE_NATIVE_ENTRY(Uint8Array_new, 1) { | 92 if (value > static_cast<uint64_t>(Mint::kMaxValue)) { \ |
| 281 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 93 result = BigintOperations::NewFromUint64(value); \ |
| 282 if (length.Value() < 0) { | 94 } else if (value > static_cast<uint64_t>(Smi::kMaxValue)) { \ |
| 283 GrowableArray<const Object*> args; | 95 result = Mint::New(value); \ |
| 284 args.Add(&length); | 96 } else { \ |
| 285 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 97 result = Smi::New(value); \ |
| 286 } | 98 } \ |
| 287 const Uint8Array& new_array = | 99 arguments->SetReturn(result); |
| 288 Uint8Array::Handle(Uint8Array::New(length.Value())); | 100 |
| 289 arguments->SetReturn(new_array); | 101 |
| 290 } | 102 #define SETTER_UINT64(ArrayT) \ |
| 291 | 103 SETTER_ARGUMENTS(ArrayT, Integer, uint64_t); \ |
| 292 | 104 uint64_t value; \ |
| 293 DEFINE_NATIVE_ENTRY(Uint8Array_getIndexed, 2) { | 105 if (integer_value.IsBigint()) { \ |
| 294 GETTER(Uint8Array, Smi, uint8_t); | 106 Bigint& bigint_value = Bigint::Handle(); \ |
| 295 } | 107 bigint_value ^= integer_value.raw(); \ |
| 296 | 108 ASSERT(BigintOperations::FitsIntoUint64(bigint_value)); \ |
| 297 | 109 value = BigintOperations::AbsToUint64(bigint_value); \ |
| 298 DEFINE_NATIVE_ENTRY(Uint8Array_setIndexed, 3) { | 110 } else { \ |
| 299 SETTER(Uint8Array, Smi, Value, uint8_t); | 111 ASSERT(integer_value.IsMint() || integer_value.IsSmi()); \ |
| 300 } | 112 value = integer_value.AsInt64Value(); \ |
| 301 | 113 } \ |
| 302 | 114 array.SetUnalignedAt<uint64_t>(index.Value(), value); |
| 303 // Int16Array | 115 |
| 304 | 116 |
| 305 DEFINE_NATIVE_ENTRY(Int16Array_new, 1) { | 117 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt8, 2) { |
| 306 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 118 GETTER(InternalByteArray, Smi, int8_t); |
| 307 if (length.Value() < 0) { | 119 } |
| 308 GrowableArray<const Object*> args; | 120 |
| 309 args.Add(&length); | 121 |
| 310 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 122 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt8, 3) { |
| 311 } | 123 SETTER(InternalByteArray, Smi, Value, int8_t); |
| 312 const Int16Array& new_array = | 124 } |
| 313 Int16Array::Handle(Int16Array::New(length.Value())); | 125 |
| 314 arguments->SetReturn(new_array); | 126 |
| 315 } | 127 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint8, 2) { |
| 316 | 128 GETTER(InternalByteArray, Smi, uint8_t); |
| 317 | 129 } |
| 318 DEFINE_NATIVE_ENTRY(Int16Array_getIndexed, 2) { | 130 |
| 319 GETTER(Int16Array, Smi, int16_t); | 131 |
| 320 } | 132 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint8, 3) { |
| 321 | 133 SETTER(InternalByteArray, Smi, Value, uint8_t); |
| 322 | 134 } |
| 323 DEFINE_NATIVE_ENTRY(Int16Array_setIndexed, 3) { | 135 |
| 324 SETTER(Int16Array, Smi, Value, int16_t); | 136 |
| 325 } | 137 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt16, 2) { |
| 326 | 138 GETTER(InternalByteArray, Smi, int16_t); |
| 327 | 139 } |
| 328 // Uint16Array | 140 |
| 329 | 141 |
| 330 DEFINE_NATIVE_ENTRY(Uint16Array_new, 1) { | 142 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt16, 3) { |
| 331 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 143 SETTER(InternalByteArray, Smi, Value, int16_t); |
| 332 if (length.Value() < 0) { | 144 } |
| 333 GrowableArray<const Object*> args; | 145 |
| 334 args.Add(&length); | 146 |
| 335 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 147 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint16, 2) { |
| 336 } | 148 GETTER(InternalByteArray, Smi, uint16_t); |
| 337 const Uint16Array& new_array = | 149 } |
| 338 Uint16Array::Handle(Uint16Array::New(length.Value())); | 150 |
| 339 arguments->SetReturn(new_array); | 151 |
| 340 } | 152 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint16, 3) { |
| 341 | 153 SETTER(InternalByteArray, Smi, Value, uint16_t); |
| 342 | 154 } |
| 343 DEFINE_NATIVE_ENTRY(Uint16Array_getIndexed, 2) { | 155 |
| 344 GETTER(Uint16Array, Smi, uint16_t); | 156 |
| 345 } | 157 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt32, 2) { |
| 346 | 158 GETTER(InternalByteArray, Integer, int32_t); |
| 347 | 159 } |
| 348 DEFINE_NATIVE_ENTRY(Uint16Array_setIndexed, 3) { | 160 |
| 349 SETTER(Uint16Array, Smi, Value, uint16_t); | 161 |
| 350 } | 162 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt32, 3) { |
| 351 | 163 SETTER(InternalByteArray, Integer, AsInt64Value, int32_t); |
| 352 | 164 } |
| 353 // Int32Array | 165 |
| 354 | 166 |
| 355 DEFINE_NATIVE_ENTRY(Int32Array_new, 1) { | 167 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint32, 2) { |
| 356 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 168 GETTER(InternalByteArray, Integer, uint32_t); |
| 357 if (length.Value() < 0) { | 169 } |
| 358 GrowableArray<const Object*> args; | 170 |
| 359 args.Add(&length); | 171 |
| 360 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 172 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint32, 3) { |
| 361 } | 173 SETTER(InternalByteArray, Integer, AsInt64Value, uint32_t); |
| 362 const Int32Array& new_array = | 174 } |
| 363 Int32Array::Handle(Int32Array::New(length.Value())); | 175 |
| 364 arguments->SetReturn(new_array); | 176 |
| 365 } | 177 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt64, 2) { |
| 366 | 178 GETTER(InternalByteArray, Integer, int64_t); |
| 367 | 179 } |
| 368 DEFINE_NATIVE_ENTRY(Int32Array_getIndexed, 2) { | 180 |
| 369 GETTER(Int32Array, Integer, int32_t); | 181 |
| 370 } | 182 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt64, 3) { |
| 371 | 183 SETTER(InternalByteArray, Integer, AsInt64Value, int64_t); |
| 372 | 184 } |
| 373 DEFINE_NATIVE_ENTRY(Int32Array_setIndexed, 3) { | 185 |
| 374 SETTER(Int32Array, Integer, AsInt64Value, int32_t); | 186 |
| 375 } | 187 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint64, 2) { |
| 376 | 188 GETTER_UINT64(InternalByteArray); |
| 377 | 189 } |
| 378 // Uint32Array | 190 |
| 379 | 191 |
| 380 DEFINE_NATIVE_ENTRY(Uint32Array_new, 1) { | 192 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint64, 3) { |
| 381 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 193 SETTER_UINT64(InternalByteArray); |
| 382 if (length.Value() < 0) { | 194 } |
| 383 GrowableArray<const Object*> args; | 195 |
| 384 args.Add(&length); | 196 |
| 385 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 197 DEFINE_NATIVE_ENTRY(InternalByteArray_getFloat32, 2) { |
| 386 } | 198 GETTER(InternalByteArray, Double, float); |
| 387 const Uint32Array& new_array = | 199 } |
| 388 Uint32Array::Handle(Uint32Array::New(length.Value())); | 200 |
| 389 arguments->SetReturn(new_array); | 201 |
| 390 } | 202 DEFINE_NATIVE_ENTRY(InternalByteArray_setFloat32, 3) { |
| 391 | 203 SETTER(InternalByteArray, Double, value, float); |
| 392 | 204 } |
| 393 DEFINE_NATIVE_ENTRY(Uint32Array_getIndexed, 2) { | 205 |
| 394 GETTER(Uint32Array, Integer, uint32_t); | 206 |
| 395 } | 207 DEFINE_NATIVE_ENTRY(InternalByteArray_getFloat64, 2) { |
| 396 | 208 GETTER(InternalByteArray, Double, double); |
| 397 | 209 } |
| 398 DEFINE_NATIVE_ENTRY(Uint32Array_setIndexed, 3) { | 210 |
| 399 SETTER(Uint32Array, Integer, AsInt64Value, uint32_t); | 211 |
| 400 } | 212 DEFINE_NATIVE_ENTRY(InternalByteArray_setFloat64, 3) { |
| 401 | 213 SETTER(InternalByteArray, Double, value, double); |
| 402 | 214 } |
| 403 // Int64Array | 215 |
| 404 | 216 |
| 405 DEFINE_NATIVE_ENTRY(Int64Array_new, 1) { | 217 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt8, 2) { |
| 406 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 218 GETTER(ExternalByteArray, Smi, int8_t); |
| 407 if (length.Value() < 0) { | 219 } |
| 408 GrowableArray<const Object*> args; | 220 |
| 409 args.Add(&length); | 221 |
| 410 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 222 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt8, 3) { |
| 411 } | 223 SETTER(ExternalByteArray, Smi, Value, int8_t); |
| 412 const Int64Array& new_array = | 224 } |
| 413 Int64Array::Handle(Int64Array::New(length.Value())); | 225 |
| 414 arguments->SetReturn(new_array); | 226 |
| 415 } | 227 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint8, 2) { |
| 416 | 228 GETTER(ExternalByteArray, Smi, uint8_t); |
| 417 | 229 } |
| 418 DEFINE_NATIVE_ENTRY(Int64Array_getIndexed, 2) { | 230 |
| 419 GETTER(Int64Array, Integer, int64_t); | 231 |
| 420 } | 232 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint8, 3) { |
| 421 | 233 SETTER(ExternalByteArray, Smi, Value, uint8_t); |
| 422 | 234 } |
| 423 DEFINE_NATIVE_ENTRY(Int64Array_setIndexed, 3) { | 235 |
| 424 SETTER(Int64Array, Integer, AsInt64Value, int64_t); | 236 |
| 425 } | 237 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt16, 2) { |
| 426 | 238 GETTER(ExternalByteArray, Smi, int16_t); |
| 427 | 239 } |
| 428 // Uint64Array | 240 |
| 429 | 241 |
| 430 DEFINE_NATIVE_ENTRY(Uint64Array_new, 1) { | 242 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt16, 3) { |
| 431 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 243 SETTER(ExternalByteArray, Smi, Value, int16_t); |
| 432 if (length.Value() < 0) { | 244 } |
| 433 GrowableArray<const Object*> args; | 245 |
| 434 args.Add(&length); | 246 |
| 435 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 247 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint16, 2) { |
| 436 } | 248 GETTER(ExternalByteArray, Smi, uint16_t); |
| 437 const Uint64Array& new_array = | 249 } |
| 438 Uint64Array::Handle(Uint64Array::New(length.Value())); | 250 |
| 439 arguments->SetReturn(new_array); | 251 |
| 440 } | 252 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint16, 3) { |
| 441 | 253 SETTER(ExternalByteArray, Smi, Value, uint16_t); |
| 442 | 254 } |
| 443 DEFINE_NATIVE_ENTRY(Uint64Array_getIndexed, 2) { | 255 |
| 444 GETTER_UINT64(Uint64Array); | 256 |
| 445 } | 257 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt32, 2) { |
| 446 | 258 GETTER(ExternalByteArray, Integer, int32_t); |
| 447 | 259 } |
| 448 DEFINE_NATIVE_ENTRY(Uint64Array_setIndexed, 3) { | 260 |
| 449 SETTER_UINT64(Uint64Array); | 261 |
| 450 } | 262 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt32, 3) { |
| 451 | 263 SETTER(ExternalByteArray, Integer, AsInt64Value, int32_t); |
| 452 | 264 } |
| 453 // Float32Array | 265 |
| 454 | 266 |
| 455 DEFINE_NATIVE_ENTRY(Float32Array_new, 1) { | 267 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint32, 2) { |
| 456 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 268 GETTER(ExternalByteArray, Integer, uint32_t); |
| 457 if (length.Value() < 0) { | 269 } |
| 458 GrowableArray<const Object*> args; | 270 |
| 459 args.Add(&length); | 271 |
| 460 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 272 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint32, 3) { |
| 461 } | 273 SETTER(ExternalByteArray, Integer, AsInt64Value, uint32_t); |
| 462 const Float32Array& new_array = | 274 } |
| 463 Float32Array::Handle(Float32Array::New(length.Value())); | 275 |
| 464 arguments->SetReturn(new_array); | 276 |
| 465 } | 277 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt64, 2) { |
| 466 | 278 GETTER(ExternalByteArray, Integer, int64_t); |
| 467 | 279 } |
| 468 DEFINE_NATIVE_ENTRY(Float32Array_getIndexed, 2) { | 280 |
| 469 GETTER(Float32Array, Double, float); | 281 |
| 470 } | 282 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt64, 3) { |
| 471 | 283 SETTER(ExternalByteArray, Integer, AsInt64Value, int64_t); |
| 472 | 284 } |
| 473 DEFINE_NATIVE_ENTRY(Float32Array_setIndexed, 3) { | 285 |
| 474 SETTER(Float32Array, Double, value, float); | 286 |
| 475 } | 287 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint64, 2) { |
| 476 | 288 GETTER_UINT64(ExternalByteArray); |
| 477 | 289 } |
| 478 // Float64Array | 290 |
| 479 | 291 |
| 480 DEFINE_NATIVE_ENTRY(Float64Array_new, 1) { | 292 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint64, 3) { |
| 481 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0)); | 293 SETTER_UINT64(ExternalByteArray); |
| 482 if (length.Value() < 0) { | 294 } |
| 483 GrowableArray<const Object*> args; | 295 |
| 484 args.Add(&length); | 296 |
| 485 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args); | 297 DEFINE_NATIVE_ENTRY(ExternalByteArray_getFloat32, 2) { |
| 486 } | 298 GETTER(ExternalByteArray, Double, float); |
| 487 const Float64Array& new_array = | 299 } |
| 488 Float64Array::Handle(Float64Array::New(length.Value())); | 300 |
| 489 arguments->SetReturn(new_array); | 301 |
| 490 } | 302 DEFINE_NATIVE_ENTRY(ExternalByteArray_setFloat32, 3) { |
| 491 | 303 SETTER(ExternalByteArray, Double, value, float); |
| 492 | 304 } |
| 493 DEFINE_NATIVE_ENTRY(Float64Array_getIndexed, 2) { | 305 |
| 494 GETTER(Float64Array, Double, double); | 306 |
| 495 } | 307 DEFINE_NATIVE_ENTRY(ExternalByteArray_getFloat64, 2) { |
| 496 | 308 GETTER(ExternalByteArray, Double, double); |
| 497 | 309 } |
| 498 DEFINE_NATIVE_ENTRY(Float64Array_setIndexed, 3) { | 310 |
| 499 SETTER(Float64Array, Double, value, double); | 311 |
| 500 } | 312 DEFINE_NATIVE_ENTRY(ExternalByteArray_setFloat64, 3) { |
| 501 | 313 SETTER(ExternalByteArray, Double, value, double); |
| 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); | |
| 620 } | 314 } |
| 621 | 315 |
| 622 } // namespace dart | 316 } // namespace dart |
| OLD | NEW |