| 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 "platform/assert.h" | 5 #include "platform/assert.h" |
| 6 #include "vm/bootstrap_natives.h" | 6 #include "vm/bootstrap_natives.h" |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/bigint_operations.h" | 8 #include "vm/bigint_operations.h" |
| 9 #include "vm/exceptions.h" | 9 #include "vm/exceptions.h" |
| 10 #include "vm/native_entry.h" | 10 #include "vm/native_entry.h" |
| 11 #include "vm/object.h" | 11 #include "vm/object.h" |
| 12 | 12 |
| 13 namespace dart { | 13 namespace dart { |
| 14 | 14 |
| 15 DEFINE_NATIVE_ENTRY(ObjectArray_allocate, 2) { | 15 DEFINE_NATIVE_ENTRY(List_allocate, 2) { |
| 16 const AbstractTypeArguments& type_arguments = | 16 const AbstractTypeArguments& type_arguments = |
| 17 AbstractTypeArguments::CheckedHandle(isolate, arguments->NativeArgAt(0)); | 17 AbstractTypeArguments::CheckedHandle(isolate, arguments->NativeArgAt(0)); |
| 18 const Instance& length = Instance::CheckedHandle( | 18 const Instance& length = Instance::CheckedHandle( |
| 19 isolate, arguments->NativeArgAt(1)); | 19 isolate, arguments->NativeArgAt(1)); |
| 20 if (!length.IsSmi()) { | 20 if (!length.IsSmi()) { |
| 21 const String& error = String::Handle(String::NewFormatted( | 21 const String& error = String::Handle(String::NewFormatted( |
| 22 "Length must be an integer in the range [0..%" Pd "].", | 22 "Length must be an integer in the range [0..%" Pd "].", |
| 23 Array::kMaxElements)); | 23 Array::kMaxElements)); |
| 24 Exceptions::ThrowArgumentError(error); | 24 Exceptions::ThrowArgumentError(error); |
| 25 } | 25 } |
| 26 intptr_t len = Smi::Cast(length).Value(); | 26 intptr_t len = Smi::Cast(length).Value(); |
| 27 if (len < 0 || len > Array::kMaxElements) { | 27 if (len < 0 || len > Array::kMaxElements) { |
| 28 const String& error = String::Handle(String::NewFormatted( | 28 const String& error = String::Handle(String::NewFormatted( |
| 29 "Length (%" Pd ") must be an integer in the range [0..%" Pd "].", | 29 "Length (%" Pd ") must be an integer in the range [0..%" Pd "].", |
| 30 len, Array::kMaxElements)); | 30 len, Array::kMaxElements)); |
| 31 Exceptions::ThrowArgumentError(error); | 31 Exceptions::ThrowArgumentError(error); |
| 32 } | 32 } |
| 33 const Array& new_array = Array::Handle(Array::New(len)); | 33 const Array& new_array = Array::Handle(Array::New(len)); |
| 34 new_array.SetTypeArguments(type_arguments); | 34 new_array.SetTypeArguments(type_arguments); |
| 35 return new_array.raw(); | 35 return new_array.raw(); |
| 36 } | 36 } |
| 37 | 37 |
| 38 | 38 |
| 39 DEFINE_NATIVE_ENTRY(ObjectArray_getIndexed, 2) { | 39 DEFINE_NATIVE_ENTRY(List_getIndexed, 2) { |
| 40 const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0)); | 40 const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0)); |
| 41 GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); | 41 GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); |
| 42 if ((index.Value() < 0) || (index.Value() >= array.Length())) { | 42 if ((index.Value() < 0) || (index.Value() >= array.Length())) { |
| 43 const Array& args = Array::Handle(Array::New(1)); | 43 const Array& args = Array::Handle(Array::New(1)); |
| 44 args.SetAt(0, index); | 44 args.SetAt(0, index); |
| 45 Exceptions::ThrowByType(Exceptions::kRange, args); | 45 Exceptions::ThrowByType(Exceptions::kRange, args); |
| 46 } | 46 } |
| 47 return array.At(index.Value()); | 47 return array.At(index.Value()); |
| 48 } | 48 } |
| 49 | 49 |
| 50 | 50 |
| 51 DEFINE_NATIVE_ENTRY(ObjectArray_setIndexed, 3) { | 51 DEFINE_NATIVE_ENTRY(List_setIndexed, 3) { |
| 52 const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0)); | 52 const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0)); |
| 53 GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); | 53 GET_NON_NULL_NATIVE_ARGUMENT(Smi, index, arguments->NativeArgAt(1)); |
| 54 const Instance& value = Instance::CheckedHandle(arguments->NativeArgAt(2)); | 54 const Instance& value = Instance::CheckedHandle(arguments->NativeArgAt(2)); |
| 55 if ((index.Value() < 0) || (index.Value() >= array.Length())) { | 55 if ((index.Value() < 0) || (index.Value() >= array.Length())) { |
| 56 const Array& args = Array::Handle(Array::New(1)); | 56 const Array& args = Array::Handle(Array::New(1)); |
| 57 args.SetAt(0, index); | 57 args.SetAt(0, index); |
| 58 Exceptions::ThrowByType(Exceptions::kRange, args); | 58 Exceptions::ThrowByType(Exceptions::kRange, args); |
| 59 } | 59 } |
| 60 array.SetAt(index.Value(), value); | 60 array.SetAt(index.Value(), value); |
| 61 return Object::null(); | 61 return Object::null(); |
| 62 } | 62 } |
| 63 | 63 |
| 64 | 64 |
| 65 DEFINE_NATIVE_ENTRY(ObjectArray_getLength, 1) { | 65 DEFINE_NATIVE_ENTRY(List_getLength, 1) { |
| 66 const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0)); | 66 const Array& array = Array::CheckedHandle(arguments->NativeArgAt(0)); |
| 67 return Smi::New(array.Length()); | 67 return Smi::New(array.Length()); |
| 68 } | 68 } |
| 69 | 69 |
| 70 | 70 |
| 71 // ObjectArray src, int srcStart, int dstStart, int count. | 71 // ObjectArray src, int srcStart, int dstStart, int count. |
| 72 DEFINE_NATIVE_ENTRY(ObjectArray_copyFromObjectArray, 5) { | 72 DEFINE_NATIVE_ENTRY(List_copyFromObjectArray, 5) { |
| 73 const Array& dest = Array::CheckedHandle(arguments->NativeArgAt(0)); | 73 const Array& dest = Array::CheckedHandle(arguments->NativeArgAt(0)); |
| 74 GET_NON_NULL_NATIVE_ARGUMENT(Array, source, arguments->NativeArgAt(1)); | 74 GET_NON_NULL_NATIVE_ARGUMENT(Array, source, arguments->NativeArgAt(1)); |
| 75 GET_NON_NULL_NATIVE_ARGUMENT(Smi, src_start, arguments->NativeArgAt(2)); | 75 GET_NON_NULL_NATIVE_ARGUMENT(Smi, src_start, arguments->NativeArgAt(2)); |
| 76 GET_NON_NULL_NATIVE_ARGUMENT(Smi, dst_start, arguments->NativeArgAt(3)); | 76 GET_NON_NULL_NATIVE_ARGUMENT(Smi, dst_start, arguments->NativeArgAt(3)); |
| 77 GET_NON_NULL_NATIVE_ARGUMENT(Smi, count, arguments->NativeArgAt(4)); | 77 GET_NON_NULL_NATIVE_ARGUMENT(Smi, count, arguments->NativeArgAt(4)); |
| 78 intptr_t icount = count.Value(); | 78 intptr_t icount = count.Value(); |
| 79 if (icount < 0) { | 79 if (icount < 0) { |
| 80 Exceptions::ThrowByType(Exceptions::kArgument, Object::empty_array()); | 80 Exceptions::ThrowByType(Exceptions::kArgument, Object::empty_array()); |
| 81 } | 81 } |
| 82 if (icount == 0) { | 82 if (icount == 0) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 104 } else { | 104 } else { |
| 105 for (intptr_t i = 0; i < icount; i++) { | 105 for (intptr_t i = 0; i < icount; i++) { |
| 106 src_obj = source.At(isrc_start + i); | 106 src_obj = source.At(isrc_start + i); |
| 107 dest.SetAt(idst_start + i, src_obj); | 107 dest.SetAt(idst_start + i, src_obj); |
| 108 } | 108 } |
| 109 } | 109 } |
| 110 return Object::null(); | 110 return Object::null(); |
| 111 } | 111 } |
| 112 | 112 |
| 113 } // namespace dart | 113 } // namespace dart |
| OLD | NEW |