blob: fc3a608f46ff83afd30b4b1108ac1f24e2419602 [file] [log] [blame]
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +00001// Copyright 2013 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28"use strict";
29
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000030// This file relies on the fact that the following declaration has been made
31// in runtime.js:
32// var $Array = global.Array;
mstarzinger@chromium.orgb4968be2013-10-16 09:00:56 +000033var $ArrayBuffer = global.ArrayBuffer;
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +000034
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +000035
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000036// --------------- Typed Arrays ---------------------
verwaest@chromium.org057bd502013-11-06 12:03:29 +000037macro TYPED_ARRAYS(FUNCTION)
38// arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
39FUNCTION(1, Uint8Array, 1)
40FUNCTION(2, Int8Array, 1)
41FUNCTION(3, Uint16Array, 2)
42FUNCTION(4, Int16Array, 2)
43FUNCTION(5, Uint32Array, 4)
44FUNCTION(6, Int32Array, 4)
45FUNCTION(7, Float32Array, 4)
46FUNCTION(8, Float64Array, 8)
47FUNCTION(9, Uint8ClampedArray, 1)
48endmacro
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000049
verwaest@chromium.org057bd502013-11-06 12:03:29 +000050macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE)
machenbach@chromium.orge8412be2013-11-08 10:23:52 +000051 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) {
52 var bufferByteLength = buffer.byteLength;
53 var offset;
54 if (IS_UNDEFINED(byteOffset)) {
55 offset = 0;
56 } else {
57 offset = ToPositiveInteger(byteOffset, "invalid_typed_array_length");
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000058
verwaest@chromium.org057bd502013-11-06 12:03:29 +000059 if (offset % ELEMENT_SIZE !== 0) {
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000060 throw MakeRangeError("invalid_typed_array_alignment",
verwaest@chromium.org057bd502013-11-06 12:03:29 +000061 "start offset", "NAME", ELEMENT_SIZE);
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +000062 }
verwaest@chromium.org057bd502013-11-06 12:03:29 +000063 if (offset > bufferByteLength) {
64 throw MakeRangeError("invalid_typed_array_offset");
65 }
verwaest@chromium.org057bd502013-11-06 12:03:29 +000066 }
ulan@chromium.org57ff8812013-05-10 08:16:55 +000067
machenbach@chromium.orge8412be2013-11-08 10:23:52 +000068 var newByteLength;
69 var newLength;
70 if (IS_UNDEFINED(length)) {
71 if (bufferByteLength % ELEMENT_SIZE !== 0) {
72 throw MakeRangeError("invalid_typed_array_alignment",
73 "byte length", "NAME", ELEMENT_SIZE);
74 }
75 newByteLength = bufferByteLength - offset;
76 newLength = newByteLength / ELEMENT_SIZE;
77 } else {
78 var newLength = ToPositiveInteger(length, "invalid_typed_array_length");
79 newByteLength = newLength * ELEMENT_SIZE;
verwaest@chromium.org057bd502013-11-06 12:03:29 +000080 }
machenbach@chromium.orge8412be2013-11-08 10:23:52 +000081 if (offset + newByteLength > bufferByteLength) {
82 throw MakeRangeError("invalid_typed_array_length");
83 }
84 %TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
85 }
verwaest@chromium.org057bd502013-11-06 12:03:29 +000086
machenbach@chromium.orge8412be2013-11-08 10:23:52 +000087 function NAMEConstructByLength(obj, length) {
88 var l = IS_UNDEFINED(length) ?
89 0 : ToPositiveInteger(length, "invalid_typed_array_length");
machenbach@chromium.orgea468882013-11-18 08:53:19 +000090 if (l > %MaxSmi()) {
91 throw MakeRangeError("invalid_typed_array_length");
92 }
machenbach@chromium.orge8412be2013-11-08 10:23:52 +000093 var byteLength = l * ELEMENT_SIZE;
94 var buffer = new $ArrayBuffer(byteLength);
95 %TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength);
96 }
97
98 function NAMEConstructByArrayLike(obj, arrayLike) {
99 var length = arrayLike.length;
100 var l = ToPositiveInteger(length, "invalid_typed_array_length");
101 if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) {
102 for (var i = 0; i < l; i++) {
103 // It is crucial that we let any execptions from arrayLike[i]
104 // propagate outside the function.
105 obj[i] = arrayLike[i];
danno@chromium.orgd3c42102013-08-01 16:58:23 +0000106 }
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000107 }
machenbach@chromium.orge8412be2013-11-08 10:23:52 +0000108 }
109
110 function NAMEConstructor(arg1, arg2, arg3) {
danno@chromium.orgf005df62013-04-30 16:36:45 +0000111
danno@chromium.orgf005df62013-04-30 16:36:45 +0000112 if (%_IsConstructCall()) {
113 if (IS_ARRAYBUFFER(arg1)) {
machenbach@chromium.orge8412be2013-11-08 10:23:52 +0000114 NAMEConstructByArrayBuffer(this, arg1, arg2, arg3);
danno@chromium.orgbee51992013-07-10 14:57:15 +0000115 } else if (IS_NUMBER(arg1) || IS_STRING(arg1) ||
116 IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) {
machenbach@chromium.orge8412be2013-11-08 10:23:52 +0000117 NAMEConstructByLength(this, arg1);
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000118 } else {
machenbach@chromium.orge8412be2013-11-08 10:23:52 +0000119 NAMEConstructByArrayLike(this, arg1);
danno@chromium.orgf005df62013-04-30 16:36:45 +0000120 }
121 } else {
verwaest@chromium.org057bd502013-11-06 12:03:29 +0000122 throw MakeTypeError("constructor_not_function", ["NAME"])
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000123 }
124 }
verwaest@chromium.org057bd502013-11-06 12:03:29 +0000125endmacro
126
127TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR)
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000128
129function TypedArrayGetBuffer() {
130 return %TypedArrayGetBuffer(this);
131}
132
133function TypedArrayGetByteLength() {
134 return %TypedArrayGetByteLength(this);
135}
136
137function TypedArrayGetByteOffset() {
138 return %TypedArrayGetByteOffset(this);
139}
140
141function TypedArrayGetLength() {
142 return %TypedArrayGetLength(this);
143}
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +0000144
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000145function CreateSubArray(elementSize, constructor) {
146 return function(begin, end) {
147 var srcLength = %TypedArrayGetLength(this);
148 var beginInt = TO_INTEGER(begin);
149 if (beginInt < 0) {
150 beginInt = MathMax(0, srcLength + beginInt);
151 } else {
152 beginInt = MathMin(srcLength, beginInt);
153 }
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +0000154
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000155 var endInt = IS_UNDEFINED(end) ? srcLength : TO_INTEGER(end);
156 if (endInt < 0) {
157 endInt = MathMax(0, srcLength + endInt);
158 } else {
159 endInt = MathMin(endInt, srcLength);
160 }
161 if (endInt < beginInt) {
162 endInt = beginInt;
163 }
164 var newLength = endInt - beginInt;
165 var beginByteOffset =
166 %TypedArrayGetByteOffset(this) + beginInt * elementSize;
167 return new constructor(%TypedArrayGetBuffer(this),
168 beginByteOffset, newLength);
169 }
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000170}
mstarzinger@chromium.orgf705b502013-04-04 11:38:09 +0000171
danno@chromium.orgd3c42102013-08-01 16:58:23 +0000172function TypedArraySetFromArrayLike(target, source, sourceLength, offset) {
173 if (offset > 0) {
174 for (var i = 0; i < sourceLength; i++) {
175 target[offset + i] = source[i];
176 }
177 }
178 else {
179 for (var i = 0; i < sourceLength; i++) {
180 target[i] = source[i];
181 }
182 }
183}
184
185function TypedArraySetFromOverlappingTypedArray(target, source, offset) {
186 var sourceElementSize = source.BYTES_PER_ELEMENT;
187 var targetElementSize = target.BYTES_PER_ELEMENT;
188 var sourceLength = source.length;
189
190 // Copy left part.
191 function CopyLeftPart() {
192 // First un-mutated byte after the next write
193 var targetPtr = target.byteOffset + (offset + 1) * targetElementSize;
194 // Next read at sourcePtr. We do not care for memory changing before
195 // sourcePtr - we have already copied it.
196 var sourcePtr = source.byteOffset;
197 for (var leftIndex = 0;
198 leftIndex < sourceLength && targetPtr <= sourcePtr;
199 leftIndex++) {
200 target[offset + leftIndex] = source[leftIndex];
201 targetPtr += targetElementSize;
202 sourcePtr += sourceElementSize;
203 }
204 return leftIndex;
205 }
206 var leftIndex = CopyLeftPart();
207
208 // Copy rigth part;
209 function CopyRightPart() {
210 // First unmutated byte before the next write
211 var targetPtr =
212 target.byteOffset + (offset + sourceLength - 1) * targetElementSize;
213 // Next read before sourcePtr. We do not care for memory changing after
214 // sourcePtr - we have already copied it.
215 var sourcePtr =
216 source.byteOffset + sourceLength * sourceElementSize;
217 for(var rightIndex = sourceLength - 1;
218 rightIndex >= leftIndex && targetPtr >= sourcePtr;
219 rightIndex--) {
220 target[offset + rightIndex] = source[rightIndex];
221 targetPtr -= targetElementSize;
222 sourcePtr -= sourceElementSize;
223 }
224 return rightIndex;
225 }
226 var rightIndex = CopyRightPart();
227
228 var temp = new $Array(rightIndex + 1 - leftIndex);
229 for (var i = leftIndex; i <= rightIndex; i++) {
230 temp[i - leftIndex] = source[i];
231 }
232 for (i = leftIndex; i <= rightIndex; i++) {
233 target[offset + i] = temp[i - leftIndex];
234 }
235}
236
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000237function TypedArraySet(obj, offset) {
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000238 var intOffset = IS_UNDEFINED(offset) ? 0 : TO_INTEGER(offset);
239 if (intOffset < 0) {
240 throw MakeTypeError("typed_array_set_negative_offset");
241 }
danno@chromium.orgd3c42102013-08-01 16:58:23 +0000242 switch (%TypedArraySetFastCases(this, obj, intOffset)) {
243 // These numbers should be synchronized with runtime.cc.
244 case 0: // TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE
245 return;
246 case 1: // TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING
247 TypedArraySetFromOverlappingTypedArray(this, obj, intOffset);
248 return;
249 case 2: // TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING
250 TypedArraySetFromArrayLike(this, obj, obj.length, intOffset);
251 return;
252 case 3: // TYPED_ARRAY_SET_NON_TYPED_ARRAY
253 var l = obj.length;
254 if (IS_UNDEFINED(l)) {
255 if (IS_NUMBER(obj)) {
256 // For number as a first argument, throw TypeError
257 // instead of silently ignoring the call, so that
258 // the user knows (s)he did something wrong.
259 // (Consistent with Firefox and Blink/WebKit)
260 throw MakeTypeError("invalid_argument");
261 }
262 return;
263 }
264 if (intOffset + l > this.length) {
265 throw MakeRangeError("typed_array_set_source_too_large");
266 }
267 TypedArraySetFromArrayLike(this, obj, l, intOffset);
268 return;
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000269 }
270}
271
272// -------------------------------------------------------------------
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000273
verwaest@chromium.org057bd502013-11-06 12:03:29 +0000274function SetupTypedArray(constructor, fun, elementSize) {
danno@chromium.orgf005df62013-04-30 16:36:45 +0000275 %CheckIsBootstrapping();
danno@chromium.orgf005df62013-04-30 16:36:45 +0000276 %SetCode(constructor, fun);
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000277 %FunctionSetPrototype(constructor, new $Object());
278
jkummerow@chromium.orgba72ec82013-07-22 09:21:20 +0000279 %SetProperty(constructor, "BYTES_PER_ELEMENT", elementSize,
280 READ_ONLY | DONT_ENUM | DONT_DELETE);
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000281 %SetProperty(constructor.prototype,
282 "constructor", constructor, DONT_ENUM);
283 %SetProperty(constructor.prototype,
284 "BYTES_PER_ELEMENT", elementSize,
285 READ_ONLY | DONT_ENUM | DONT_DELETE);
286 InstallGetter(constructor.prototype, "buffer", TypedArrayGetBuffer);
287 InstallGetter(constructor.prototype, "byteOffset", TypedArrayGetByteOffset);
288 InstallGetter(constructor.prototype, "byteLength", TypedArrayGetByteLength);
289 InstallGetter(constructor.prototype, "length", TypedArrayGetLength);
ulan@chromium.org57ff8812013-05-10 08:16:55 +0000290
291 InstallFunctions(constructor.prototype, DONT_ENUM, $Array(
292 "subarray", CreateSubArray(elementSize, constructor),
293 "set", TypedArraySet
294 ));
mstarzinger@chromium.orge27d6172013-04-17 11:51:44 +0000295}
296
verwaest@chromium.org057bd502013-11-06 12:03:29 +0000297macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE)
298 SetupTypedArray (global.NAME, NAMEConstructor, ELEMENT_SIZE);
299endmacro
300
301TYPED_ARRAYS(SETUP_TYPED_ARRAY)
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000302
303// --------------------------- DataView -----------------------------
304
305var $DataView = global.DataView;
306
307function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3
308 if (%_IsConstructCall()) {
309 if (!IS_ARRAYBUFFER(buffer)) {
310 throw MakeTypeError('data_view_not_array_buffer', []);
311 }
machenbach@chromium.orgaf9cfcb2013-11-19 11:05:18 +0000312 var bufferByteLength = buffer.byteLength;
machenbach@chromium.orge8412be2013-11-08 10:23:52 +0000313 var offset = IS_UNDEFINED(byteOffset) ?
314 0 : ToPositiveInteger(byteOffset, 'invalid_data_view_offset');
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000315 if (offset > bufferByteLength) {
316 throw MakeRangeError('invalid_data_view_offset');
317 }
318 var length = IS_UNDEFINED(byteLength) ?
319 bufferByteLength - offset : TO_INTEGER(byteLength);
320 if (length < 0 || offset + length > bufferByteLength) {
321 throw new MakeRangeError('invalid_data_view_length');
322 }
323 %DataViewInitialize(this, buffer, offset, length);
324 } else {
325 throw MakeTypeError('constructor_not_function', ["DataView"]);
326 }
327}
328
329function DataViewGetBuffer() {
330 if (!IS_DATAVIEW(this)) {
jkummerow@chromium.orgfb732b12013-07-26 10:27:09 +0000331 throw MakeTypeError('incompatible_method_receiver',
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000332 ['DataView.buffer', this]);
333 }
334 return %DataViewGetBuffer(this);
335}
336
337function DataViewGetByteOffset() {
338 if (!IS_DATAVIEW(this)) {
jkummerow@chromium.orgfb732b12013-07-26 10:27:09 +0000339 throw MakeTypeError('incompatible_method_receiver',
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000340 ['DataView.byteOffset', this]);
341 }
342 return %DataViewGetByteOffset(this);
343}
344
345function DataViewGetByteLength() {
346 if (!IS_DATAVIEW(this)) {
jkummerow@chromium.orgfb732b12013-07-26 10:27:09 +0000347 throw MakeTypeError('incompatible_method_receiver',
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000348 ['DataView.byteLength', this]);
349 }
350 return %DataViewGetByteLength(this);
351}
352
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000353macro DATA_VIEW_TYPES(FUNCTION)
354 FUNCTION(Int8)
355 FUNCTION(Uint8)
356 FUNCTION(Int16)
357 FUNCTION(Uint16)
358 FUNCTION(Int32)
359 FUNCTION(Uint32)
360 FUNCTION(Float32)
361 FUNCTION(Float64)
362endmacro
363
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000364function ToPositiveDataViewOffset(offset) {
365 return ToPositiveInteger(offset, 'invalid_data_view_accessor_offset');
366}
367
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000368
369macro DATA_VIEW_GETTER_SETTER(TYPENAME)
370function DataViewGetTYPENAME(offset, little_endian) {
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000371 if (!IS_DATAVIEW(this)) {
jkummerow@chromium.orgfb732b12013-07-26 10:27:09 +0000372 throw MakeTypeError('incompatible_method_receiver',
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000373 ['DataView.getTYPENAME', this]);
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000374 }
danno@chromium.org169691d2013-07-15 08:01:13 +0000375 if (%_ArgumentsLength() < 1) {
376 throw MakeTypeError('invalid_argument');
377 }
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000378 return %DataViewGetTYPENAME(this,
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000379 ToPositiveDataViewOffset(offset),
380 !!little_endian);
381}
382
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000383function DataViewSetTYPENAME(offset, value, little_endian) {
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000384 if (!IS_DATAVIEW(this)) {
jkummerow@chromium.orgfb732b12013-07-26 10:27:09 +0000385 throw MakeTypeError('incompatible_method_receiver',
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000386 ['DataView.setTYPENAME', this]);
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000387 }
jkummerow@chromium.orgfb732b12013-07-26 10:27:09 +0000388 if (%_ArgumentsLength() < 2) {
danno@chromium.org169691d2013-07-15 08:01:13 +0000389 throw MakeTypeError('invalid_argument');
390 }
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000391 %DataViewSetTYPENAME(this,
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000392 ToPositiveDataViewOffset(offset),
393 TO_NUMBER_INLINE(value),
394 !!little_endian);
395}
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000396endmacro
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000397
machenbach@chromium.orgfeecfde2013-11-14 10:55:00 +0000398DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER)
mstarzinger@chromium.org1510d582013-06-28 14:00:48 +0000399
400function SetupDataView() {
401 %CheckIsBootstrapping();
402
403 // Setup the DataView constructor.
404 %SetCode($DataView, DataViewConstructor);
405 %FunctionSetPrototype($DataView, new $Object);
406
407 // Set up constructor property on the DataView prototype.
408 %SetProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM);
409
410 InstallGetter($DataView.prototype, "buffer", DataViewGetBuffer);
411 InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset);
412 InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength);
413
414 InstallFunctions($DataView.prototype, DONT_ENUM, $Array(
415 "getInt8", DataViewGetInt8,
416 "setInt8", DataViewSetInt8,
417
418 "getUint8", DataViewGetUint8,
419 "setUint8", DataViewSetUint8,
420
421 "getInt16", DataViewGetInt16,
422 "setInt16", DataViewSetInt16,
423
424 "getUint16", DataViewGetUint16,
425 "setUint16", DataViewSetUint16,
426
427 "getInt32", DataViewGetInt32,
428 "setInt32", DataViewSetInt32,
429
430 "getUint32", DataViewGetUint32,
431 "setUint32", DataViewSetUint32,
432
433 "getFloat32", DataViewGetFloat32,
434 "setFloat32", DataViewSetFloat32,
435
436 "getFloat64", DataViewGetFloat64,
437 "setFloat64", DataViewSetFloat64
438 ));
439}
440
441SetupDataView();