| OLD | NEW |
| (Empty) | |
| 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 |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #include "platform/assert.h" |
| 6 |
| 7 #include "vm/assembler.h" |
| 8 #include "vm/bootstrap_natives.h" |
| 9 #include "vm/exceptions.h" |
| 10 #include "vm/native_entry.h" |
| 11 #include "vm/object.h" |
| 12 |
| 13 namespace dart { |
| 14 |
| 15 DEFINE_NATIVE_ENTRY(GrowableObjectArray_allocate, 2) { |
| 16 const AbstractTypeArguments& type_arguments = |
| 17 AbstractTypeArguments::CheckedHandle(arguments->At(0)); |
| 18 ASSERT(type_arguments.IsNull() || |
| 19 (type_arguments.IsInstantiated() && (type_arguments.Length() == 1))); |
| 20 GET_NATIVE_ARGUMENT(Array, data, arguments->At(1)); |
| 21 if ((data.Length() <= 0)) { |
| 22 const Integer& index = Integer::Handle(Integer::New(data.Length())); |
| 23 GrowableArray<const Object*> args; |
| 24 args.Add(&index); |
| 25 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args); |
| 26 } |
| 27 const GrowableObjectArray& new_array = |
| 28 GrowableObjectArray::Handle(GrowableObjectArray::New(data)); |
| 29 new_array.SetTypeArguments(type_arguments); |
| 30 arguments->SetReturn(new_array); |
| 31 } |
| 32 |
| 33 |
| 34 DEFINE_NATIVE_ENTRY(GrowableObjectArray_getIndexed, 2) { |
| 35 const GrowableObjectArray& array = |
| 36 GrowableObjectArray::CheckedHandle(arguments->At(0)); |
| 37 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); |
| 38 if ((index.Value() < 0) || (index.Value() >= array.Length())) { |
| 39 GrowableArray<const Object*> args; |
| 40 args.Add(&index); |
| 41 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args); |
| 42 } |
| 43 const Instance& obj = Instance::CheckedHandle(array.At(index.Value())); |
| 44 arguments->SetReturn(obj); |
| 45 } |
| 46 |
| 47 |
| 48 DEFINE_NATIVE_ENTRY(GrowableObjectArray_setIndexed, 3) { |
| 49 const GrowableObjectArray& array = |
| 50 GrowableObjectArray::CheckedHandle(arguments->At(0)); |
| 51 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); |
| 52 if ((index.Value() < 0) || (index.Value() >= array.Length())) { |
| 53 GrowableArray<const Object*> args; |
| 54 args.Add(&index); |
| 55 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args); |
| 56 } |
| 57 GET_NATIVE_ARGUMENT(Instance, value, arguments->At(2)); |
| 58 array.SetAt(index.Value(), value); |
| 59 } |
| 60 |
| 61 |
| 62 DEFINE_NATIVE_ENTRY(GrowableObjectArray_getLength, 1) { |
| 63 const GrowableObjectArray& array = |
| 64 GrowableObjectArray::CheckedHandle(arguments->At(0)); |
| 65 const Smi& length = Smi::Handle(isolate, Smi::New(array.Length())); |
| 66 arguments->SetReturn(length); |
| 67 } |
| 68 |
| 69 |
| 70 DEFINE_NATIVE_ENTRY(GrowableObjectArray_getCapacity, 1) { |
| 71 const GrowableObjectArray& array = |
| 72 GrowableObjectArray::CheckedHandle(arguments->At(0)); |
| 73 const Smi& capacity = Smi::Handle(isolate, Smi::New(array.Capacity())); |
| 74 arguments->SetReturn(capacity); |
| 75 } |
| 76 |
| 77 |
| 78 DEFINE_NATIVE_ENTRY(GrowableObjectArray_setLength, 2) { |
| 79 const GrowableObjectArray& array = |
| 80 GrowableObjectArray::CheckedHandle(arguments->At(0)); |
| 81 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(1)); |
| 82 if ((length.Value() < 0) || (length.Value() > array.Capacity())) { |
| 83 GrowableArray<const Object*> args; |
| 84 args.Add(&length); |
| 85 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, args); |
| 86 } |
| 87 array.SetLength(length.Value()); |
| 88 } |
| 89 |
| 90 |
| 91 DEFINE_NATIVE_ENTRY(GrowableObjectArray_setData, 2) { |
| 92 const GrowableObjectArray& array = |
| 93 GrowableObjectArray::CheckedHandle(arguments->At(0)); |
| 94 GET_NATIVE_ARGUMENT(Array, data, arguments->At(1)); |
| 95 ASSERT(data.Length() > 0); |
| 96 array.SetData(data); |
| 97 } |
| 98 |
| 99 } // namespace dart |
| OLD | NEW |