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

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

Issue 9195031: Add ByteArray interface and provide internal and external implementations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address remaining review comments Created 8 years, 11 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
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/lib/byte_array.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 "vm/bootstrap_natives.h"
6
7 #include "vm/exceptions.h"
8 #include "vm/native_entry.h"
9 #include "vm/object.h"
10
11 namespace dart {
12
13 DEFINE_NATIVE_ENTRY(ByteArray_getLength, 1) {
14 const ByteArray& byte_array = ByteArray::CheckedHandle(arguments->At(0));
15 const Smi& length = Smi::Handle(Smi::New(byte_array.Length()));
16 arguments->SetReturn(length);
17 }
18
19
20 DEFINE_NATIVE_ENTRY(InternalByteArray_allocate, 1) {
21 GET_NATIVE_ARGUMENT(Smi, length, arguments->At(0));
22 if (length.Value() < 0) {
23 GrowableArray<const Object*> args;
24 args.Add(&length);
25 Exceptions::ThrowByType(Exceptions::kIllegalArgument, args);
26 }
27 const InternalByteArray& new_array =
28 InternalByteArray::Handle(InternalByteArray::New(length.Value()));
29 arguments->SetReturn(new_array);
30 }
31
32
33 static void RangeCheck(const ByteArray& array, const Smi& index,
34 intptr_t num_bytes) {
35 if ((index.Value() < 0) || ((index.Value() + num_bytes) > array.Length())) {
36 GrowableArray<const Object*> arguments;
37 arguments.Add(&index);
38 Exceptions::ThrowByType(Exceptions::kIndexOutOfRange, arguments);
39 }
40 }
41
42
43 #define GETTER(ArrayT, ObjectT, ValueT) \
44 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \
45 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \
46 RangeCheck(array, index, sizeof(ValueT)); \
47 ValueT result = array.UnalignedAt<ValueT>(index.Value()); \
48 arguments->SetReturn(ObjectT::Handle(ObjectT::New(result)));
49
50
51 #define SETTER(ArrayT, ObjectT, Getter, ValueT) \
52 GET_NATIVE_ARGUMENT(ArrayT, array, arguments->At(0)); \
53 GET_NATIVE_ARGUMENT(Smi, index, arguments->At(1)); \
54 RangeCheck(array, index, sizeof(ValueT)); \
55 GET_NATIVE_ARGUMENT(ObjectT, value, arguments->At(2)); \
56 array.SetUnalignedAt<ValueT>(index.Value(), value.Getter());
57
58
59 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt8, 2) {
60 GETTER(InternalByteArray, Smi, int8_t);
61 }
62
63
64 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt8, 3) {
65 SETTER(InternalByteArray, Smi, Value, int8_t);
66 }
67
68
69 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint8, 2) {
70 GETTER(InternalByteArray, Smi, uint8_t);
71 }
72
73
74 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint8, 3) {
75 SETTER(InternalByteArray, Smi, Value, uint8_t);
76 }
77
78
79 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt16, 2) {
80 GETTER(InternalByteArray, Smi, int16_t);
81 }
82
83
84 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt16, 3) {
85 SETTER(InternalByteArray, Smi, Value, int16_t);
86 }
87
88
89 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint16, 2) {
90 GETTER(InternalByteArray, Smi, uint16_t);
91 }
92
93
94 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint16, 3) {
95 SETTER(InternalByteArray, Smi, Value, uint16_t);
96 }
97
98
99 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt32, 2) {
100 GETTER(InternalByteArray, Integer, int32_t);
101 }
102
103
104 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt32, 3) {
105 SETTER(InternalByteArray, Integer, AsInt64Value, int32_t);
106 }
107
108
109 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint32, 2) {
110 GETTER(InternalByteArray, Integer, uint32_t);
111 }
112
113
114 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint32, 3) {
115 SETTER(InternalByteArray, Integer, AsInt64Value, uint32_t);
116 }
117
118
119 DEFINE_NATIVE_ENTRY(InternalByteArray_getInt64, 2) {
120 GETTER(InternalByteArray, Integer, int64_t);
121 }
122
123
124 DEFINE_NATIVE_ENTRY(InternalByteArray_setInt64, 3) {
125 SETTER(InternalByteArray, Integer, AsInt64Value, int64_t);
126 }
127
128
129 DEFINE_NATIVE_ENTRY(InternalByteArray_getUint64, 2) {
130 UNIMPLEMENTED(); // TODO(cshapiro): need getter implementation.
131 }
132
133
134 DEFINE_NATIVE_ENTRY(InternalByteArray_setUint64, 3) {
135 UNIMPLEMENTED(); // TODO(cshapiro): need setter implementation.
136 }
137
138
139 DEFINE_NATIVE_ENTRY(InternalByteArray_getFloat32, 2) {
140 GETTER(InternalByteArray, Double, float);
141 }
142
143
144 DEFINE_NATIVE_ENTRY(InternalByteArray_setFloat32, 3) {
145 SETTER(InternalByteArray, Double, value, float);
146 }
147
148
149 DEFINE_NATIVE_ENTRY(InternalByteArray_getFloat64, 2) {
150 GETTER(InternalByteArray, Double, double);
151 }
152
153
154 DEFINE_NATIVE_ENTRY(InternalByteArray_setFloat64, 3) {
155 SETTER(InternalByteArray, Double, value, double);
156 }
157
158
159 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt8, 2) {
160 GETTER(ExternalByteArray, Smi, int8_t);
161 }
162
163
164 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt8, 3) {
165 SETTER(ExternalByteArray, Smi, Value, int8_t);
166 }
167
168
169 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint8, 2) {
170 GETTER(ExternalByteArray, Smi, uint8_t);
171 }
172
173
174 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint8, 3) {
175 SETTER(ExternalByteArray, Smi, Value, uint8_t);
176 }
177
178
179 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt16, 2) {
180 GETTER(ExternalByteArray, Smi, int16_t);
181 }
182
183
184 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt16, 3) {
185 SETTER(ExternalByteArray, Smi, Value, int16_t);
186 }
187
188
189 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint16, 2) {
190 GETTER(ExternalByteArray, Smi, uint16_t);
191 }
192
193
194 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint16, 3) {
195 SETTER(ExternalByteArray, Smi, Value, uint16_t);
196 }
197
198
199 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt32, 2) {
200 GETTER(ExternalByteArray, Integer, int32_t);
201 }
202
203
204 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt32, 3) {
205 SETTER(ExternalByteArray, Integer, AsInt64Value, int32_t);
206 }
207
208
209 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint32, 2) {
210 GETTER(ExternalByteArray, Integer, uint32_t);
211 }
212
213
214 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint32, 3) {
215 SETTER(ExternalByteArray, Integer, AsInt64Value, uint32_t);
216 }
217
218
219 DEFINE_NATIVE_ENTRY(ExternalByteArray_getInt64, 2) {
220 GETTER(ExternalByteArray, Integer, int64_t);
221 }
222
223
224 DEFINE_NATIVE_ENTRY(ExternalByteArray_setInt64, 3) {
225 SETTER(ExternalByteArray, Integer, AsInt64Value, int64_t);
226 }
227
228
229 DEFINE_NATIVE_ENTRY(ExternalByteArray_getUint64, 2) {
230 UNIMPLEMENTED(); // TODO(cshapiro): need getter implementation.
231 }
232
233
234 DEFINE_NATIVE_ENTRY(ExternalByteArray_setUint64, 3) {
235 UNIMPLEMENTED(); // TODO(cshapiro): need setter implementation.
236 }
237
238
239 DEFINE_NATIVE_ENTRY(ExternalByteArray_getFloat32, 2) {
240 GETTER(ExternalByteArray, Double, float);
241 }
242
243
244 DEFINE_NATIVE_ENTRY(ExternalByteArray_setFloat32, 3) {
245 SETTER(ExternalByteArray, Double, value, float);
246 }
247
248
249 DEFINE_NATIVE_ENTRY(ExternalByteArray_getFloat64, 2) {
250 GETTER(ExternalByteArray, Double, double);
251 }
252
253
254 DEFINE_NATIVE_ENTRY(ExternalByteArray_setFloat64, 3) {
255 SETTER(ExternalByteArray, Double, value, double);
256 }
257
258 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/include/dart_api.h ('k') | runtime/lib/byte_array.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698