OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 "use strict"; | 5 "use strict"; |
6 | 6 |
7 // This file relies on the fact that the following declaration has been made | 7 // This file relies on the fact that the following declaration has been made |
8 // in runtime.js: | 8 // in runtime.js: |
9 // var $Array = global.Array; | 9 // var $Array = global.Array; |
10 var $ArrayBuffer = global.ArrayBuffer; | 10 var $ArrayBuffer = global.ArrayBuffer; |
11 | 11 |
12 | 12 |
13 // --------------- Typed Arrays --------------------- | 13 // --------------- Typed Arrays --------------------- |
14 macro TYPED_ARRAYS(FUNCTION) | 14 macro TYPED_ARRAYS(FUNCTION) |
15 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. | 15 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. |
16 FUNCTION(1, Uint8Array, 1) | 16 FUNCTION(1, Uint8Array, 1) |
17 FUNCTION(2, Int8Array, 1) | 17 FUNCTION(2, Int8Array, 1) |
18 FUNCTION(3, Uint16Array, 2) | 18 FUNCTION(3, Uint16Array, 2) |
19 FUNCTION(4, Int16Array, 2) | 19 FUNCTION(4, Int16Array, 2) |
20 FUNCTION(5, Uint32Array, 4) | 20 FUNCTION(5, Uint32Array, 4) |
21 FUNCTION(6, Int32Array, 4) | 21 FUNCTION(6, Int32Array, 4) |
22 FUNCTION(7, Float32Array, 4) | 22 FUNCTION(7, Float32Array, 4) |
23 FUNCTION(8, Float64Array, 8) | 23 FUNCTION(8, Float64Array, 8) |
24 FUNCTION(9, Uint8ClampedArray, 1) | 24 FUNCTION(9, Uint8ClampedArray, 1) |
25 endmacro | 25 endmacro |
26 | 26 |
27 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) | 27 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
28 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { | 28 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { |
29 if (!IS_UNDEFINED(byteOffset)) { | 29 if (!IS_UNDEFINED(byteOffset)) { |
30 byteOffset = | 30 byteOffset = |
31 ToPositiveInteger(byteOffset, "invalid_typed_array_length"); | 31 ToPositiveInteger(byteOffset, "invalid_typed_array_length"); |
32 } | 32 } |
33 if (!IS_UNDEFINED(length)) { | 33 if (!IS_UNDEFINED(length)) { |
34 length = ToPositiveInteger(length, "invalid_typed_array_length"); | 34 length = ToPositiveInteger(length, "invalid_typed_array_length"); |
35 } | |
36 | |
37 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); | |
38 var offset; | |
39 if (IS_UNDEFINED(byteOffset)) { | |
40 offset = 0; | |
41 } else { | |
42 offset = byteOffset; | |
43 | |
44 if (offset % ELEMENT_SIZE !== 0) { | |
45 throw MakeRangeError("invalid_typed_array_alignment", | |
46 ["start offset", "NAME", ELEMENT_SIZE]); | |
47 } | |
48 if (offset > bufferByteLength) { | |
49 throw MakeRangeError("invalid_typed_array_offset"); | |
50 } | |
51 } | |
52 | |
53 var newByteLength; | |
54 var newLength; | |
55 if (IS_UNDEFINED(length)) { | |
56 if (bufferByteLength % ELEMENT_SIZE !== 0) { | |
57 throw MakeRangeError("invalid_typed_array_alignment", | |
58 ["byte length", "NAME", ELEMENT_SIZE]); | |
59 } | |
60 newByteLength = bufferByteLength - offset; | |
61 newLength = newByteLength / ELEMENT_SIZE; | |
62 } else { | |
63 var newLength = length; | |
64 newByteLength = newLength * ELEMENT_SIZE; | |
65 } | |
66 if ((offset + newByteLength > bufferByteLength) | |
67 || (newLength > %_MaxSmi())) { | |
68 throw MakeRangeError("invalid_typed_array_length"); | |
69 } | |
70 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength); | |
71 } | 35 } |
72 | 36 |
73 function NAMEConstructByLength(obj, length) { | 37 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); |
74 var l = IS_UNDEFINED(length) ? | 38 var offset; |
75 0 : ToPositiveInteger(length, "invalid_typed_array_length"); | 39 if (IS_UNDEFINED(byteOffset)) { |
76 if (l > %_MaxSmi()) { | 40 offset = 0; |
77 throw MakeRangeError("invalid_typed_array_length"); | 41 } else { |
| 42 offset = byteOffset; |
| 43 |
| 44 if (offset % ELEMENT_SIZE !== 0) { |
| 45 throw MakeRangeError("invalid_typed_array_alignment", |
| 46 ["start offset", "NAME", ELEMENT_SIZE]); |
78 } | 47 } |
79 var byteLength = l * ELEMENT_SIZE; | 48 if (offset > bufferByteLength) { |
80 if (byteLength > %_TypedArrayMaxSizeInHeap()) { | 49 throw MakeRangeError("invalid_typed_array_offset"); |
81 var buffer = new $ArrayBuffer(byteLength); | |
82 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength); | |
83 } else { | |
84 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength); | |
85 } | 50 } |
86 } | 51 } |
87 | 52 |
88 function NAMEConstructByArrayLike(obj, arrayLike) { | 53 var newByteLength; |
89 var length = arrayLike.length; | 54 var newLength; |
90 var l = ToPositiveInteger(length, "invalid_typed_array_length"); | 55 if (IS_UNDEFINED(length)) { |
| 56 if (bufferByteLength % ELEMENT_SIZE !== 0) { |
| 57 throw MakeRangeError("invalid_typed_array_alignment", |
| 58 ["byte length", "NAME", ELEMENT_SIZE]); |
| 59 } |
| 60 newByteLength = bufferByteLength - offset; |
| 61 newLength = newByteLength / ELEMENT_SIZE; |
| 62 } else { |
| 63 var newLength = length; |
| 64 newByteLength = newLength * ELEMENT_SIZE; |
| 65 } |
| 66 if ((offset + newByteLength > bufferByteLength) |
| 67 || (newLength > %_MaxSmi())) { |
| 68 throw MakeRangeError("invalid_typed_array_length"); |
| 69 } |
| 70 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength); |
| 71 } |
91 | 72 |
92 if (l > %_MaxSmi()) { | 73 function NAMEConstructByLength(obj, length) { |
93 throw MakeRangeError("invalid_typed_array_length"); | 74 var l = IS_UNDEFINED(length) ? |
94 } | 75 0 : ToPositiveInteger(length, "invalid_typed_array_length"); |
95 if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) { | 76 if (l > %_MaxSmi()) { |
96 for (var i = 0; i < l; i++) { | 77 throw MakeRangeError("invalid_typed_array_length"); |
97 // It is crucial that we let any execptions from arrayLike[i] | 78 } |
98 // propagate outside the function. | 79 var byteLength = l * ELEMENT_SIZE; |
99 obj[i] = arrayLike[i]; | 80 if (byteLength > %_TypedArrayMaxSizeInHeap()) { |
100 } | 81 var buffer = new $ArrayBuffer(byteLength); |
| 82 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength); |
| 83 } else { |
| 84 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength); |
| 85 } |
| 86 } |
| 87 |
| 88 function NAMEConstructByArrayLike(obj, arrayLike) { |
| 89 var length = arrayLike.length; |
| 90 var l = ToPositiveInteger(length, "invalid_typed_array_length"); |
| 91 |
| 92 if (l > %_MaxSmi()) { |
| 93 throw MakeRangeError("invalid_typed_array_length"); |
| 94 } |
| 95 if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) { |
| 96 for (var i = 0; i < l; i++) { |
| 97 // It is crucial that we let any execptions from arrayLike[i] |
| 98 // propagate outside the function. |
| 99 obj[i] = arrayLike[i]; |
101 } | 100 } |
102 } | 101 } |
| 102 } |
103 | 103 |
104 function NAMEConstructor(arg1, arg2, arg3) { | 104 function NAMEConstructor(arg1, arg2, arg3) { |
105 if (%_IsConstructCall()) { | 105 if (%_IsConstructCall()) { |
106 if (IS_ARRAYBUFFER(arg1)) { | 106 if (IS_ARRAYBUFFER(arg1)) { |
107 NAMEConstructByArrayBuffer(this, arg1, arg2, arg3); | 107 NAMEConstructByArrayBuffer(this, arg1, arg2, arg3); |
108 } else if (IS_NUMBER(arg1) || IS_STRING(arg1) || | 108 } else if (IS_NUMBER(arg1) || IS_STRING(arg1) || |
109 IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) { | 109 IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) { |
110 NAMEConstructByLength(this, arg1); | 110 NAMEConstructByLength(this, arg1); |
111 } else { | |
112 NAMEConstructByArrayLike(this, arg1); | |
113 } | |
114 } else { | 111 } else { |
115 throw MakeTypeError("constructor_not_function", ["NAME"]) | 112 NAMEConstructByArrayLike(this, arg1); |
116 } | 113 } |
| 114 } else { |
| 115 throw MakeTypeError("constructor_not_function", ["NAME"]) |
| 116 } |
| 117 } |
| 118 |
| 119 function NAME_GetBuffer() { |
| 120 if (!(%_ClassOf(this) === 'NAME')) { |
| 121 throw MakeTypeError('incompatible_method_receiver', |
| 122 ["NAME.buffer", this]); |
| 123 } |
| 124 return %TypedArrayGetBuffer(this); |
| 125 } |
| 126 |
| 127 function NAME_GetByteLength() { |
| 128 if (!(%_ClassOf(this) === 'NAME')) { |
| 129 throw MakeTypeError('incompatible_method_receiver', |
| 130 ["NAME.byteLength", this]); |
| 131 } |
| 132 return %_ArrayBufferViewGetByteLength(this); |
| 133 } |
| 134 |
| 135 function NAME_GetByteOffset() { |
| 136 if (!(%_ClassOf(this) === 'NAME')) { |
| 137 throw MakeTypeError('incompatible_method_receiver', |
| 138 ["NAME.byteOffset", this]); |
| 139 } |
| 140 return %_ArrayBufferViewGetByteOffset(this); |
| 141 } |
| 142 |
| 143 function NAME_GetLength() { |
| 144 if (!(%_ClassOf(this) === 'NAME')) { |
| 145 throw MakeTypeError('incompatible_method_receiver', |
| 146 ["NAME.length", this]); |
| 147 } |
| 148 return %_TypedArrayGetLength(this); |
| 149 } |
| 150 |
| 151 var $NAME = global.NAME; |
| 152 |
| 153 function NAMESubArray(begin, end) { |
| 154 if (!(%_ClassOf(this) === 'NAME')) { |
| 155 throw MakeTypeError('incompatible_method_receiver', |
| 156 ["NAME.subarray", this]); |
| 157 } |
| 158 var beginInt = TO_INTEGER(begin); |
| 159 if (!IS_UNDEFINED(end)) { |
| 160 end = TO_INTEGER(end); |
117 } | 161 } |
118 | 162 |
119 function NAME_GetBuffer() { | 163 var srcLength = %_TypedArrayGetLength(this); |
120 if (!(%_ClassOf(this) === 'NAME')) { | 164 if (beginInt < 0) { |
121 throw MakeTypeError('incompatible_method_receiver', | 165 beginInt = MathMax(0, srcLength + beginInt); |
122 ["NAME.buffer", this]); | 166 } else { |
123 } | 167 beginInt = MathMin(srcLength, beginInt); |
124 return %TypedArrayGetBuffer(this); | |
125 } | 168 } |
126 | 169 |
127 function NAME_GetByteLength() { | 170 var endInt = IS_UNDEFINED(end) ? srcLength : end; |
128 if (!(%_ClassOf(this) === 'NAME')) { | 171 if (endInt < 0) { |
129 throw MakeTypeError('incompatible_method_receiver', | 172 endInt = MathMax(0, srcLength + endInt); |
130 ["NAME.byteLength", this]); | 173 } else { |
131 } | 174 endInt = MathMin(endInt, srcLength); |
132 return %_ArrayBufferViewGetByteLength(this); | |
133 } | 175 } |
134 | 176 if (endInt < beginInt) { |
135 function NAME_GetByteOffset() { | 177 endInt = beginInt; |
136 if (!(%_ClassOf(this) === 'NAME')) { | |
137 throw MakeTypeError('incompatible_method_receiver', | |
138 ["NAME.byteOffset", this]); | |
139 } | |
140 return %_ArrayBufferViewGetByteOffset(this); | |
141 } | 178 } |
142 | 179 var newLength = endInt - beginInt; |
143 function NAME_GetLength() { | 180 var beginByteOffset = |
144 if (!(%_ClassOf(this) === 'NAME')) { | 181 %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; |
145 throw MakeTypeError('incompatible_method_receiver', | 182 return new $NAME(%TypedArrayGetBuffer(this), |
146 ["NAME.length", this]); | 183 beginByteOffset, newLength); |
147 } | 184 } |
148 return %_TypedArrayGetLength(this); | |
149 } | |
150 | |
151 var $NAME = global.NAME; | |
152 | |
153 function NAMESubArray(begin, end) { | |
154 if (!(%_ClassOf(this) === 'NAME')) { | |
155 throw MakeTypeError('incompatible_method_receiver', | |
156 ["NAME.subarray", this]); | |
157 } | |
158 var beginInt = TO_INTEGER(begin); | |
159 if (!IS_UNDEFINED(end)) { | |
160 end = TO_INTEGER(end); | |
161 } | |
162 | |
163 var srcLength = %_TypedArrayGetLength(this); | |
164 if (beginInt < 0) { | |
165 beginInt = MathMax(0, srcLength + beginInt); | |
166 } else { | |
167 beginInt = MathMin(srcLength, beginInt); | |
168 } | |
169 | |
170 var endInt = IS_UNDEFINED(end) ? srcLength : end; | |
171 if (endInt < 0) { | |
172 endInt = MathMax(0, srcLength + endInt); | |
173 } else { | |
174 endInt = MathMin(endInt, srcLength); | |
175 } | |
176 if (endInt < beginInt) { | |
177 endInt = beginInt; | |
178 } | |
179 var newLength = endInt - beginInt; | |
180 var beginByteOffset = | |
181 %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; | |
182 return new $NAME(%TypedArrayGetBuffer(this), | |
183 beginByteOffset, newLength); | |
184 } | |
185 endmacro | 185 endmacro |
186 | 186 |
187 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) | 187 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) |
188 | 188 |
189 | 189 |
190 function TypedArraySetFromArrayLike(target, source, sourceLength, offset) { | 190 function TypedArraySetFromArrayLike(target, source, sourceLength, offset) { |
191 if (offset > 0) { | 191 if (offset > 0) { |
192 for (var i = 0; i < sourceLength; i++) { | 192 for (var i = 0; i < sourceLength; i++) { |
193 target[offset + i] = source[i]; | 193 target[offset + i] = source[i]; |
194 } | 194 } |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 : byteLength; | 350 : byteLength; |
351 if (length < 0 || offset + length > bufferByteLength) { | 351 if (length < 0 || offset + length > bufferByteLength) { |
352 throw new MakeRangeError('invalid_data_view_length'); | 352 throw new MakeRangeError('invalid_data_view_length'); |
353 } | 353 } |
354 %_DataViewInitialize(this, buffer, offset, length); | 354 %_DataViewInitialize(this, buffer, offset, length); |
355 } else { | 355 } else { |
356 throw MakeTypeError('constructor_not_function', ["DataView"]); | 356 throw MakeTypeError('constructor_not_function', ["DataView"]); |
357 } | 357 } |
358 } | 358 } |
359 | 359 |
360 function DataViewGetBuffer() { | 360 function DataViewGetBufferJS() { |
361 if (!IS_DATAVIEW(this)) { | 361 if (!IS_DATAVIEW(this)) { |
362 throw MakeTypeError('incompatible_method_receiver', | 362 throw MakeTypeError('incompatible_method_receiver', |
363 ['DataView.buffer', this]); | 363 ['DataView.buffer', this]); |
364 } | 364 } |
365 return %DataViewGetBuffer(this); | 365 return %DataViewGetBuffer(this); |
366 } | 366 } |
367 | 367 |
368 function DataViewGetByteOffset() { | 368 function DataViewGetByteOffset() { |
369 if (!IS_DATAVIEW(this)) { | 369 if (!IS_DATAVIEW(this)) { |
370 throw MakeTypeError('incompatible_method_receiver', | 370 throw MakeTypeError('incompatible_method_receiver', |
(...skipping 20 matching lines...) Expand all Loading... |
391 FUNCTION(Float32) | 391 FUNCTION(Float32) |
392 FUNCTION(Float64) | 392 FUNCTION(Float64) |
393 endmacro | 393 endmacro |
394 | 394 |
395 function ToPositiveDataViewOffset(offset) { | 395 function ToPositiveDataViewOffset(offset) { |
396 return ToPositiveInteger(offset, 'invalid_data_view_accessor_offset'); | 396 return ToPositiveInteger(offset, 'invalid_data_view_accessor_offset'); |
397 } | 397 } |
398 | 398 |
399 | 399 |
400 macro DATA_VIEW_GETTER_SETTER(TYPENAME) | 400 macro DATA_VIEW_GETTER_SETTER(TYPENAME) |
401 function DataViewGetTYPENAME(offset, little_endian) { | 401 function DataViewGetTYPENAMEJS(offset, little_endian) { |
402 if (!IS_DATAVIEW(this)) { | 402 if (!IS_DATAVIEW(this)) { |
403 throw MakeTypeError('incompatible_method_receiver', | 403 throw MakeTypeError('incompatible_method_receiver', |
404 ['DataView.getTYPENAME', this]); | 404 ['DataView.getTYPENAME', this]); |
405 } | 405 } |
406 if (%_ArgumentsLength() < 1) { | 406 if (%_ArgumentsLength() < 1) { |
407 throw MakeTypeError('invalid_argument'); | 407 throw MakeTypeError('invalid_argument'); |
408 } | 408 } |
409 return %DataViewGetTYPENAME(this, | 409 return %DataViewGetTYPENAME(this, |
410 ToPositiveDataViewOffset(offset), | 410 ToPositiveDataViewOffset(offset), |
411 !!little_endian); | 411 !!little_endian); |
412 } | 412 } |
413 | 413 |
414 function DataViewSetTYPENAME(offset, value, little_endian) { | 414 function DataViewSetTYPENAMEJS(offset, value, little_endian) { |
415 if (!IS_DATAVIEW(this)) { | 415 if (!IS_DATAVIEW(this)) { |
416 throw MakeTypeError('incompatible_method_receiver', | 416 throw MakeTypeError('incompatible_method_receiver', |
417 ['DataView.setTYPENAME', this]); | 417 ['DataView.setTYPENAME', this]); |
418 } | 418 } |
419 if (%_ArgumentsLength() < 2) { | 419 if (%_ArgumentsLength() < 2) { |
420 throw MakeTypeError('invalid_argument'); | 420 throw MakeTypeError('invalid_argument'); |
421 } | 421 } |
422 %DataViewSetTYPENAME(this, | 422 %DataViewSetTYPENAME(this, |
423 ToPositiveDataViewOffset(offset), | 423 ToPositiveDataViewOffset(offset), |
424 TO_NUMBER_INLINE(value), | 424 TO_NUMBER_INLINE(value), |
425 !!little_endian); | 425 !!little_endian); |
426 } | 426 } |
427 endmacro | 427 endmacro |
428 | 428 |
429 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) | 429 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) |
430 | 430 |
431 function SetupDataView() { | 431 function SetupDataView() { |
432 %CheckIsBootstrapping(); | 432 %CheckIsBootstrapping(); |
433 | 433 |
434 // Setup the DataView constructor. | 434 // Setup the DataView constructor. |
435 %SetCode($DataView, DataViewConstructor); | 435 %SetCode($DataView, DataViewConstructor); |
436 %FunctionSetPrototype($DataView, new $Object); | 436 %FunctionSetPrototype($DataView, new $Object); |
437 | 437 |
438 // Set up constructor property on the DataView prototype. | 438 // Set up constructor property on the DataView prototype. |
439 %SetProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM); | 439 %SetProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM); |
440 | 440 |
441 InstallGetter($DataView.prototype, "buffer", DataViewGetBuffer); | 441 InstallGetter($DataView.prototype, "buffer", DataViewGetBufferJS); |
442 InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset); | 442 InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset); |
443 InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength); | 443 InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength); |
444 | 444 |
445 InstallFunctions($DataView.prototype, DONT_ENUM, $Array( | 445 InstallFunctions($DataView.prototype, DONT_ENUM, $Array( |
446 "getInt8", DataViewGetInt8, | 446 "getInt8", DataViewGetInt8JS, |
447 "setInt8", DataViewSetInt8, | 447 "setInt8", DataViewSetInt8JS, |
448 | 448 |
449 "getUint8", DataViewGetUint8, | 449 "getUint8", DataViewGetUint8JS, |
450 "setUint8", DataViewSetUint8, | 450 "setUint8", DataViewSetUint8JS, |
451 | 451 |
452 "getInt16", DataViewGetInt16, | 452 "getInt16", DataViewGetInt16JS, |
453 "setInt16", DataViewSetInt16, | 453 "setInt16", DataViewSetInt16JS, |
454 | 454 |
455 "getUint16", DataViewGetUint16, | 455 "getUint16", DataViewGetUint16JS, |
456 "setUint16", DataViewSetUint16, | 456 "setUint16", DataViewSetUint16JS, |
457 | 457 |
458 "getInt32", DataViewGetInt32, | 458 "getInt32", DataViewGetInt32JS, |
459 "setInt32", DataViewSetInt32, | 459 "setInt32", DataViewSetInt32JS, |
460 | 460 |
461 "getUint32", DataViewGetUint32, | 461 "getUint32", DataViewGetUint32JS, |
462 "setUint32", DataViewSetUint32, | 462 "setUint32", DataViewSetUint32JS, |
463 | 463 |
464 "getFloat32", DataViewGetFloat32, | 464 "getFloat32", DataViewGetFloat32JS, |
465 "setFloat32", DataViewSetFloat32, | 465 "setFloat32", DataViewSetFloat32JS, |
466 | 466 |
467 "getFloat64", DataViewGetFloat64, | 467 "getFloat64", DataViewGetFloat64JS, |
468 "setFloat64", DataViewSetFloat64 | 468 "setFloat64", DataViewSetFloat64JS |
469 )); | 469 )); |
470 } | 470 } |
471 | 471 |
472 SetupDataView(); | 472 SetupDataView(); |
OLD | NEW |