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 (function() { | 5 (function() { |
6 | 6 |
7 "use strict"; | 7 "use strict"; |
8 | 8 |
9 %CheckIsBootstrapping(); | 9 %CheckIsBootstrapping(); |
10 | 10 |
11 var GlobalArray = global.Array; | 11 var GlobalArray = global.Array; |
12 var GlobalArrayBuffer = global.ArrayBuffer; | 12 var GlobalArrayBuffer = global.ArrayBuffer; |
13 var GlobalDataView = global.DataView; | |
14 var GlobalObject = global.Object; | |
15 | 13 |
| 14 // --------------- Typed Arrays --------------------- |
16 macro TYPED_ARRAYS(FUNCTION) | 15 macro TYPED_ARRAYS(FUNCTION) |
17 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. | 16 // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. |
18 FUNCTION(1, Uint8Array, 1) | 17 FUNCTION(1, Uint8Array, 1) |
19 FUNCTION(2, Int8Array, 1) | 18 FUNCTION(2, Int8Array, 1) |
20 FUNCTION(3, Uint16Array, 2) | 19 FUNCTION(3, Uint16Array, 2) |
21 FUNCTION(4, Int16Array, 2) | 20 FUNCTION(4, Int16Array, 2) |
22 FUNCTION(5, Uint32Array, 4) | 21 FUNCTION(5, Uint32Array, 4) |
23 FUNCTION(6, Int32Array, 4) | 22 FUNCTION(6, Int32Array, 4) |
24 FUNCTION(7, Float32Array, 4) | 23 FUNCTION(7, Float32Array, 4) |
25 FUNCTION(8, Float64Array, 8) | 24 FUNCTION(8, Float64Array, 8) |
26 FUNCTION(9, Uint8ClampedArray, 1) | 25 FUNCTION(9, Uint8ClampedArray, 1) |
27 endmacro | 26 endmacro |
28 | 27 |
29 macro DECLARE_GLOBALS(INDEX, NAME, SIZE) | |
30 var GlobalNAME = global.NAME; | |
31 endmacro | |
32 | |
33 TYPED_ARRAYS(DECLARE_GLOBALS) | |
34 | |
35 // --------------- Typed Arrays --------------------- | |
36 | |
37 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) | 28 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
38 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { | 29 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { |
39 if (!IS_UNDEFINED(byteOffset)) { | 30 if (!IS_UNDEFINED(byteOffset)) { |
40 byteOffset = | 31 byteOffset = |
41 ToPositiveInteger(byteOffset, "invalid_typed_array_length"); | 32 ToPositiveInteger(byteOffset, "invalid_typed_array_length"); |
42 } | 33 } |
43 if (!IS_UNDEFINED(length)) { | 34 if (!IS_UNDEFINED(length)) { |
44 length = ToPositiveInteger(length, "invalid_typed_array_length"); | 35 length = ToPositiveInteger(length, "invalid_typed_array_length"); |
45 } | 36 } |
46 | 37 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 return %_ArrayBufferViewGetByteOffset(this); | 138 return %_ArrayBufferViewGetByteOffset(this); |
148 } | 139 } |
149 | 140 |
150 function NAME_GetLength() { | 141 function NAME_GetLength() { |
151 if (!(%_ClassOf(this) === 'NAME')) { | 142 if (!(%_ClassOf(this) === 'NAME')) { |
152 throw MakeTypeError(kIncompatibleMethodReceiver, "NAME.length", this); | 143 throw MakeTypeError(kIncompatibleMethodReceiver, "NAME.length", this); |
153 } | 144 } |
154 return %_TypedArrayGetLength(this); | 145 return %_TypedArrayGetLength(this); |
155 } | 146 } |
156 | 147 |
| 148 var $NAME = global.NAME; |
| 149 |
157 function NAMESubArray(begin, end) { | 150 function NAMESubArray(begin, end) { |
158 if (!(%_ClassOf(this) === 'NAME')) { | 151 if (!(%_ClassOf(this) === 'NAME')) { |
159 throw MakeTypeError(kIncompatibleMethodReceiver, "NAME.subarray", this); | 152 throw MakeTypeError(kIncompatibleMethodReceiver, "NAME.subarray", this); |
160 } | 153 } |
161 var beginInt = TO_INTEGER(begin); | 154 var beginInt = TO_INTEGER(begin); |
162 if (!IS_UNDEFINED(end)) { | 155 if (!IS_UNDEFINED(end)) { |
163 end = TO_INTEGER(end); | 156 end = TO_INTEGER(end); |
164 } | 157 } |
165 | 158 |
166 var srcLength = %_TypedArrayGetLength(this); | 159 var srcLength = %_TypedArrayGetLength(this); |
167 if (beginInt < 0) { | 160 if (beginInt < 0) { |
168 beginInt = $max(0, srcLength + beginInt); | 161 beginInt = $max(0, srcLength + beginInt); |
169 } else { | 162 } else { |
170 beginInt = $min(srcLength, beginInt); | 163 beginInt = $min(srcLength, beginInt); |
171 } | 164 } |
172 | 165 |
173 var endInt = IS_UNDEFINED(end) ? srcLength : end; | 166 var endInt = IS_UNDEFINED(end) ? srcLength : end; |
174 if (endInt < 0) { | 167 if (endInt < 0) { |
175 endInt = $max(0, srcLength + endInt); | 168 endInt = $max(0, srcLength + endInt); |
176 } else { | 169 } else { |
177 endInt = $min(endInt, srcLength); | 170 endInt = $min(endInt, srcLength); |
178 } | 171 } |
179 if (endInt < beginInt) { | 172 if (endInt < beginInt) { |
180 endInt = beginInt; | 173 endInt = beginInt; |
181 } | 174 } |
182 var newLength = endInt - beginInt; | 175 var newLength = endInt - beginInt; |
183 var beginByteOffset = | 176 var beginByteOffset = |
184 %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; | 177 %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; |
185 return new GlobalNAME(%TypedArrayGetBuffer(this), | 178 return new $NAME(%TypedArrayGetBuffer(this), |
186 beginByteOffset, newLength); | 179 beginByteOffset, newLength); |
187 } | 180 } |
188 endmacro | 181 endmacro |
189 | 182 |
190 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) | 183 TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) |
191 | 184 |
192 | 185 |
193 function TypedArraySetFromArrayLike(target, source, sourceLength, offset) { | 186 function TypedArraySetFromArrayLike(target, source, sourceLength, offset) { |
194 if (offset > 0) { | 187 if (offset > 0) { |
195 for (var i = 0; i < sourceLength; i++) { | 188 for (var i = 0; i < sourceLength; i++) { |
196 target[offset + i] = source[i]; | 189 target[offset + i] = source[i]; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 function TypedArrayGetToStringTag() { | 290 function TypedArrayGetToStringTag() { |
298 if (!%IsTypedArray(this)) return; | 291 if (!%IsTypedArray(this)) return; |
299 var name = %_ClassOf(this); | 292 var name = %_ClassOf(this); |
300 if (IS_UNDEFINED(name)) return; | 293 if (IS_UNDEFINED(name)) return; |
301 return name; | 294 return name; |
302 } | 295 } |
303 | 296 |
304 // ------------------------------------------------------------------- | 297 // ------------------------------------------------------------------- |
305 | 298 |
306 macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE) | 299 macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE) |
307 %SetCode(GlobalNAME, NAMEConstructor); | 300 %SetCode(global.NAME, NAMEConstructor); |
308 %FunctionSetPrototype(GlobalNAME, new GlobalObject()); | 301 %FunctionSetPrototype(global.NAME, new $Object()); |
309 | 302 |
310 %AddNamedProperty(GlobalNAME, "BYTES_PER_ELEMENT", ELEMENT_SIZE, | 303 %AddNamedProperty(global.NAME, "BYTES_PER_ELEMENT", ELEMENT_SIZE, |
311 READ_ONLY | DONT_ENUM | DONT_DELETE); | 304 READ_ONLY | DONT_ENUM | DONT_DELETE); |
312 %AddNamedProperty(GlobalNAME.prototype, | 305 %AddNamedProperty(global.NAME.prototype, |
313 "constructor", global.NAME, DONT_ENUM); | 306 "constructor", global.NAME, DONT_ENUM); |
314 %AddNamedProperty(GlobalNAME.prototype, | 307 %AddNamedProperty(global.NAME.prototype, |
315 "BYTES_PER_ELEMENT", ELEMENT_SIZE, | 308 "BYTES_PER_ELEMENT", ELEMENT_SIZE, |
316 READ_ONLY | DONT_ENUM | DONT_DELETE); | 309 READ_ONLY | DONT_ENUM | DONT_DELETE); |
317 $installGetter(GlobalNAME.prototype, "buffer", NAME_GetBuffer); | 310 InstallGetter(global.NAME.prototype, "buffer", NAME_GetBuffer); |
318 $installGetter(GlobalNAME.prototype, "byteOffset", NAME_GetByteOffset, | 311 InstallGetter(global.NAME.prototype, "byteOffset", NAME_GetByteOffset, |
319 DONT_ENUM | DONT_DELETE); | 312 DONT_ENUM | DONT_DELETE); |
320 $installGetter(GlobalNAME.prototype, "byteLength", NAME_GetByteLength, | 313 InstallGetter(global.NAME.prototype, "byteLength", NAME_GetByteLength, |
321 DONT_ENUM | DONT_DELETE); | 314 DONT_ENUM | DONT_DELETE); |
322 $installGetter(GlobalNAME.prototype, "length", NAME_GetLength, | 315 InstallGetter(global.NAME.prototype, "length", NAME_GetLength, |
323 DONT_ENUM | DONT_DELETE); | 316 DONT_ENUM | DONT_DELETE); |
324 $installGetter(GlobalNAME.prototype, symbolToStringTag, | 317 InstallGetter(global.NAME.prototype, symbolToStringTag, |
325 TypedArrayGetToStringTag); | 318 TypedArrayGetToStringTag); |
326 $installFunctions(GlobalNAME.prototype, DONT_ENUM, [ | 319 InstallFunctions(global.NAME.prototype, DONT_ENUM, [ |
327 "subarray", NAMESubArray, | 320 "subarray", NAMESubArray, |
328 "set", TypedArraySet | 321 "set", TypedArraySet |
329 ]); | 322 ]); |
330 endmacro | 323 endmacro |
331 | 324 |
332 TYPED_ARRAYS(SETUP_TYPED_ARRAY) | 325 TYPED_ARRAYS(SETUP_TYPED_ARRAY) |
333 | 326 |
334 // --------------------------- DataView ----------------------------- | 327 // --------------------------- DataView ----------------------------- |
335 | 328 |
| 329 var $DataView = global.DataView; |
| 330 |
336 function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 | 331 function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 |
337 if (%_IsConstructCall()) { | 332 if (%_IsConstructCall()) { |
338 if (!IS_ARRAYBUFFER(buffer)) { | 333 if (!IS_ARRAYBUFFER(buffer)) { |
339 throw MakeTypeError('data_view_not_array_buffer', []); | 334 throw MakeTypeError('data_view_not_array_buffer', []); |
340 } | 335 } |
341 if (!IS_UNDEFINED(byteOffset)) { | 336 if (!IS_UNDEFINED(byteOffset)) { |
342 byteOffset = ToPositiveInteger(byteOffset, 'invalid_data_view_offset'); | 337 byteOffset = ToPositiveInteger(byteOffset, 'invalid_data_view_offset'); |
343 } | 338 } |
344 if (!IS_UNDEFINED(byteLength)) { | 339 if (!IS_UNDEFINED(byteLength)) { |
345 byteLength = TO_INTEGER(byteLength); | 340 byteLength = TO_INTEGER(byteLength); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 %DataViewSetTYPENAME(this, | 423 %DataViewSetTYPENAME(this, |
429 ToPositiveDataViewOffset(offset), | 424 ToPositiveDataViewOffset(offset), |
430 TO_NUMBER_INLINE(value), | 425 TO_NUMBER_INLINE(value), |
431 !!little_endian); | 426 !!little_endian); |
432 } | 427 } |
433 endmacro | 428 endmacro |
434 | 429 |
435 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) | 430 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) |
436 | 431 |
437 // Setup the DataView constructor. | 432 // Setup the DataView constructor. |
438 %SetCode(GlobalDataView, DataViewConstructor); | 433 %SetCode($DataView, DataViewConstructor); |
439 %FunctionSetPrototype(GlobalDataView, new GlobalObject); | 434 %FunctionSetPrototype($DataView, new $Object); |
440 | 435 |
441 // Set up constructor property on the DataView prototype. | 436 // Set up constructor property on the DataView prototype. |
442 %AddNamedProperty(GlobalDataView.prototype, "constructor", GlobalDataView, | 437 %AddNamedProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM); |
443 DONT_ENUM); | 438 %AddNamedProperty( |
444 %AddNamedProperty(GlobalDataView.prototype, symbolToStringTag, "DataView", | 439 $DataView.prototype, symbolToStringTag, "DataView", READ_ONLY|DONT_ENUM); |
445 READ_ONLY|DONT_ENUM); | |
446 | 440 |
447 $installGetter(GlobalDataView.prototype, "buffer", DataViewGetBufferJS); | 441 InstallGetter($DataView.prototype, "buffer", DataViewGetBufferJS); |
448 $installGetter(GlobalDataView.prototype, "byteOffset", DataViewGetByteOffset); | 442 InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset); |
449 $installGetter(GlobalDataView.prototype, "byteLength", DataViewGetByteLength); | 443 InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength); |
450 | 444 |
451 $installFunctions(GlobalDataView.prototype, DONT_ENUM, [ | 445 InstallFunctions($DataView.prototype, DONT_ENUM, [ |
452 "getInt8", DataViewGetInt8JS, | 446 "getInt8", DataViewGetInt8JS, |
453 "setInt8", DataViewSetInt8JS, | 447 "setInt8", DataViewSetInt8JS, |
454 | 448 |
455 "getUint8", DataViewGetUint8JS, | 449 "getUint8", DataViewGetUint8JS, |
456 "setUint8", DataViewSetUint8JS, | 450 "setUint8", DataViewSetUint8JS, |
457 | 451 |
458 "getInt16", DataViewGetInt16JS, | 452 "getInt16", DataViewGetInt16JS, |
459 "setInt16", DataViewSetInt16JS, | 453 "setInt16", DataViewSetInt16JS, |
460 | 454 |
461 "getUint16", DataViewGetUint16JS, | 455 "getUint16", DataViewGetUint16JS, |
462 "setUint16", DataViewSetUint16JS, | 456 "setUint16", DataViewSetUint16JS, |
463 | 457 |
464 "getInt32", DataViewGetInt32JS, | 458 "getInt32", DataViewGetInt32JS, |
465 "setInt32", DataViewSetInt32JS, | 459 "setInt32", DataViewSetInt32JS, |
466 | 460 |
467 "getUint32", DataViewGetUint32JS, | 461 "getUint32", DataViewGetUint32JS, |
468 "setUint32", DataViewSetUint32JS, | 462 "setUint32", DataViewSetUint32JS, |
469 | 463 |
470 "getFloat32", DataViewGetFloat32JS, | 464 "getFloat32", DataViewGetFloat32JS, |
471 "setFloat32", DataViewSetFloat32JS, | 465 "setFloat32", DataViewSetFloat32JS, |
472 | 466 |
473 "getFloat64", DataViewGetFloat64JS, | 467 "getFloat64", DataViewGetFloat64JS, |
474 "setFloat64", DataViewSetFloat64JS | 468 "setFloat64", DataViewSetFloat64JS |
475 ]); | 469 ]); |
476 | 470 |
477 })(); | 471 })(); |
OLD | NEW |