| 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 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 endmacro | 31 endmacro |
| 32 | 32 |
| 33 TYPED_ARRAYS(DECLARE_GLOBALS) | 33 TYPED_ARRAYS(DECLARE_GLOBALS) |
| 34 | 34 |
| 35 // --------------- Typed Arrays --------------------- | 35 // --------------- Typed Arrays --------------------- |
| 36 | 36 |
| 37 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) | 37 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
| 38 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { | 38 function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { |
| 39 if (!IS_UNDEFINED(byteOffset)) { | 39 if (!IS_UNDEFINED(byteOffset)) { |
| 40 byteOffset = | 40 byteOffset = |
| 41 ToPositiveInteger(byteOffset, "invalid_typed_array_length"); | 41 ToPositiveInteger(byteOffset, kInvalidTypedArrayLength); |
| 42 } | 42 } |
| 43 if (!IS_UNDEFINED(length)) { | 43 if (!IS_UNDEFINED(length)) { |
| 44 length = ToPositiveInteger(length, "invalid_typed_array_length"); | 44 length = ToPositiveInteger(length, kInvalidTypedArrayLength); |
| 45 } | 45 } |
| 46 | 46 |
| 47 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); | 47 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); |
| 48 var offset; | 48 var offset; |
| 49 if (IS_UNDEFINED(byteOffset)) { | 49 if (IS_UNDEFINED(byteOffset)) { |
| 50 offset = 0; | 50 offset = 0; |
| 51 } else { | 51 } else { |
| 52 offset = byteOffset; | 52 offset = byteOffset; |
| 53 | 53 |
| 54 if (offset % ELEMENT_SIZE !== 0) { | 54 if (offset % ELEMENT_SIZE !== 0) { |
| 55 throw MakeRangeError("invalid_typed_array_alignment", | 55 throw MakeRangeError(kInvalidTypedArrayAlignment, |
| 56 ["start offset", "NAME", ELEMENT_SIZE]); | 56 "start offset", "NAME", ELEMENT_SIZE); |
| 57 } | 57 } |
| 58 if (offset > bufferByteLength) { | 58 if (offset > bufferByteLength) { |
| 59 throw MakeRangeError("invalid_typed_array_offset"); | 59 throw MakeRangeError(kInvalidTypedArrayOffset); |
| 60 } | 60 } |
| 61 } | 61 } |
| 62 | 62 |
| 63 var newByteLength; | 63 var newByteLength; |
| 64 var newLength; | 64 var newLength; |
| 65 if (IS_UNDEFINED(length)) { | 65 if (IS_UNDEFINED(length)) { |
| 66 if (bufferByteLength % ELEMENT_SIZE !== 0) { | 66 if (bufferByteLength % ELEMENT_SIZE !== 0) { |
| 67 throw MakeRangeError("invalid_typed_array_alignment", | 67 throw MakeRangeError(kInvalidTypedArrayAlignment, |
| 68 ["byte length", "NAME", ELEMENT_SIZE]); | 68 "byte length", "NAME", ELEMENT_SIZE); |
| 69 } | 69 } |
| 70 newByteLength = bufferByteLength - offset; | 70 newByteLength = bufferByteLength - offset; |
| 71 newLength = newByteLength / ELEMENT_SIZE; | 71 newLength = newByteLength / ELEMENT_SIZE; |
| 72 } else { | 72 } else { |
| 73 var newLength = length; | 73 var newLength = length; |
| 74 newByteLength = newLength * ELEMENT_SIZE; | 74 newByteLength = newLength * ELEMENT_SIZE; |
| 75 } | 75 } |
| 76 if ((offset + newByteLength > bufferByteLength) | 76 if ((offset + newByteLength > bufferByteLength) |
| 77 || (newLength > %_MaxSmi())) { | 77 || (newLength > %_MaxSmi())) { |
| 78 throw MakeRangeError("invalid_typed_array_length"); | 78 throw MakeRangeError(kInvalidTypedArrayLength); |
| 79 } | 79 } |
| 80 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength); | 80 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength); |
| 81 } | 81 } |
| 82 | 82 |
| 83 function NAMEConstructByLength(obj, length) { | 83 function NAMEConstructByLength(obj, length) { |
| 84 var l = IS_UNDEFINED(length) ? | 84 var l = IS_UNDEFINED(length) ? |
| 85 0 : ToPositiveInteger(length, "invalid_typed_array_length"); | 85 0 : ToPositiveInteger(length, kInvalidTypedArrayLength); |
| 86 if (l > %_MaxSmi()) { | 86 if (l > %_MaxSmi()) { |
| 87 throw MakeRangeError("invalid_typed_array_length"); | 87 throw MakeRangeError(kInvalidTypedArrayLength); |
| 88 } | 88 } |
| 89 var byteLength = l * ELEMENT_SIZE; | 89 var byteLength = l * ELEMENT_SIZE; |
| 90 if (byteLength > %_TypedArrayMaxSizeInHeap()) { | 90 if (byteLength > %_TypedArrayMaxSizeInHeap()) { |
| 91 var buffer = new GlobalArrayBuffer(byteLength); | 91 var buffer = new GlobalArrayBuffer(byteLength); |
| 92 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength); | 92 %_TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength); |
| 93 } else { | 93 } else { |
| 94 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength); | 94 %_TypedArrayInitialize(obj, ARRAY_ID, null, 0, byteLength); |
| 95 } | 95 } |
| 96 } | 96 } |
| 97 | 97 |
| 98 function NAMEConstructByArrayLike(obj, arrayLike) { | 98 function NAMEConstructByArrayLike(obj, arrayLike) { |
| 99 var length = arrayLike.length; | 99 var length = arrayLike.length; |
| 100 var l = ToPositiveInteger(length, "invalid_typed_array_length"); | 100 var l = ToPositiveInteger(length, kInvalidTypedArrayLength); |
| 101 | 101 |
| 102 if (l > %_MaxSmi()) { | 102 if (l > %_MaxSmi()) { |
| 103 throw MakeRangeError("invalid_typed_array_length"); | 103 throw MakeRangeError(kInvalidTypedArrayLength); |
| 104 } | 104 } |
| 105 if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) { | 105 if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) { |
| 106 for (var i = 0; i < l; i++) { | 106 for (var i = 0; i < l; i++) { |
| 107 // It is crucial that we let any execptions from arrayLike[i] | 107 // It is crucial that we let any execptions from arrayLike[i] |
| 108 // propagate outside the function. | 108 // propagate outside the function. |
| 109 obj[i] = arrayLike[i]; | 109 obj[i] = arrayLike[i]; |
| 110 } | 110 } |
| 111 } | 111 } |
| 112 } | 112 } |
| 113 | 113 |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 for (var i = leftIndex; i <= rightIndex; i++) { | 250 for (var i = leftIndex; i <= rightIndex; i++) { |
| 251 temp[i - leftIndex] = source[i]; | 251 temp[i - leftIndex] = source[i]; |
| 252 } | 252 } |
| 253 for (i = leftIndex; i <= rightIndex; i++) { | 253 for (i = leftIndex; i <= rightIndex; i++) { |
| 254 target[offset + i] = temp[i - leftIndex]; | 254 target[offset + i] = temp[i - leftIndex]; |
| 255 } | 255 } |
| 256 } | 256 } |
| 257 | 257 |
| 258 function TypedArraySet(obj, offset) { | 258 function TypedArraySet(obj, offset) { |
| 259 var intOffset = IS_UNDEFINED(offset) ? 0 : TO_INTEGER(offset); | 259 var intOffset = IS_UNDEFINED(offset) ? 0 : TO_INTEGER(offset); |
| 260 if (intOffset < 0) { | 260 if (intOffset < 0) throw MakeTypeError(kTypedArraySetNegativeOffset); |
| 261 throw MakeTypeError("typed_array_set_negative_offset"); | |
| 262 } | |
| 263 | 261 |
| 264 if (intOffset > %_MaxSmi()) { | 262 if (intOffset > %_MaxSmi()) { |
| 265 throw MakeRangeError("typed_array_set_source_too_large"); | 263 throw MakeRangeError(kTypedArraySetSourceTooLarge); |
| 266 } | 264 } |
| 267 switch (%TypedArraySetFastCases(this, obj, intOffset)) { | 265 switch (%TypedArraySetFastCases(this, obj, intOffset)) { |
| 268 // These numbers should be synchronized with runtime.cc. | 266 // These numbers should be synchronized with runtime.cc. |
| 269 case 0: // TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE | 267 case 0: // TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE |
| 270 return; | 268 return; |
| 271 case 1: // TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING | 269 case 1: // TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING |
| 272 TypedArraySetFromOverlappingTypedArray(this, obj, intOffset); | 270 TypedArraySetFromOverlappingTypedArray(this, obj, intOffset); |
| 273 return; | 271 return; |
| 274 case 2: // TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING | 272 case 2: // TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING |
| 275 TypedArraySetFromArrayLike(this, obj, obj.length, intOffset); | 273 TypedArraySetFromArrayLike(this, obj, obj.length, intOffset); |
| 276 return; | 274 return; |
| 277 case 3: // TYPED_ARRAY_SET_NON_TYPED_ARRAY | 275 case 3: // TYPED_ARRAY_SET_NON_TYPED_ARRAY |
| 278 var l = obj.length; | 276 var l = obj.length; |
| 279 if (IS_UNDEFINED(l)) { | 277 if (IS_UNDEFINED(l)) { |
| 280 if (IS_NUMBER(obj)) { | 278 if (IS_NUMBER(obj)) { |
| 281 // For number as a first argument, throw TypeError | 279 // For number as a first argument, throw TypeError |
| 282 // instead of silently ignoring the call, so that | 280 // instead of silently ignoring the call, so that |
| 283 // the user knows (s)he did something wrong. | 281 // the user knows (s)he did something wrong. |
| 284 // (Consistent with Firefox and Blink/WebKit) | 282 // (Consistent with Firefox and Blink/WebKit) |
| 285 throw MakeTypeError("invalid_argument"); | 283 throw MakeTypeError(kInvalidArgument); |
| 286 } | 284 } |
| 287 return; | 285 return; |
| 288 } | 286 } |
| 289 if (intOffset + l > this.length) { | 287 if (intOffset + l > this.length) { |
| 290 throw MakeRangeError("typed_array_set_source_too_large"); | 288 throw MakeRangeError(kTypedArraySetSourceTooLarge); |
| 291 } | 289 } |
| 292 TypedArraySetFromArrayLike(this, obj, l, intOffset); | 290 TypedArraySetFromArrayLike(this, obj, l, intOffset); |
| 293 return; | 291 return; |
| 294 } | 292 } |
| 295 } | 293 } |
| 296 | 294 |
| 297 function TypedArrayGetToStringTag() { | 295 function TypedArrayGetToStringTag() { |
| 298 if (!%IsTypedArray(this)) return; | 296 if (!%IsTypedArray(this)) return; |
| 299 var name = %_ClassOf(this); | 297 var name = %_ClassOf(this); |
| 300 if (IS_UNDEFINED(name)) return; | 298 if (IS_UNDEFINED(name)) return; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 328 "set", TypedArraySet | 326 "set", TypedArraySet |
| 329 ]); | 327 ]); |
| 330 endmacro | 328 endmacro |
| 331 | 329 |
| 332 TYPED_ARRAYS(SETUP_TYPED_ARRAY) | 330 TYPED_ARRAYS(SETUP_TYPED_ARRAY) |
| 333 | 331 |
| 334 // --------------------------- DataView ----------------------------- | 332 // --------------------------- DataView ----------------------------- |
| 335 | 333 |
| 336 function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 | 334 function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 |
| 337 if (%_IsConstructCall()) { | 335 if (%_IsConstructCall()) { |
| 338 if (!IS_ARRAYBUFFER(buffer)) { | 336 if (!IS_ARRAYBUFFER(buffer)) throw MakeTypeError(kDataViewNotArrayBuffer); |
| 339 throw MakeTypeError('data_view_not_array_buffer', []); | |
| 340 } | |
| 341 if (!IS_UNDEFINED(byteOffset)) { | 337 if (!IS_UNDEFINED(byteOffset)) { |
| 342 byteOffset = ToPositiveInteger(byteOffset, 'invalid_data_view_offset'); | 338 byteOffset = ToPositiveInteger(byteOffset, kInvalidDataViewOffset); |
| 343 } | 339 } |
| 344 if (!IS_UNDEFINED(byteLength)) { | 340 if (!IS_UNDEFINED(byteLength)) { |
| 345 byteLength = TO_INTEGER(byteLength); | 341 byteLength = TO_INTEGER(byteLength); |
| 346 } | 342 } |
| 347 | 343 |
| 348 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); | 344 var bufferByteLength = %_ArrayBufferGetByteLength(buffer); |
| 349 | 345 |
| 350 var offset = IS_UNDEFINED(byteOffset) ? 0 : byteOffset; | 346 var offset = IS_UNDEFINED(byteOffset) ? 0 : byteOffset; |
| 351 if (offset > bufferByteLength) { | 347 if (offset > bufferByteLength) throw MakeRangeError(kInvalidDataViewOffset); |
| 352 throw MakeRangeError('invalid_data_view_offset'); | |
| 353 } | |
| 354 | 348 |
| 355 var length = IS_UNDEFINED(byteLength) | 349 var length = IS_UNDEFINED(byteLength) |
| 356 ? bufferByteLength - offset | 350 ? bufferByteLength - offset |
| 357 : byteLength; | 351 : byteLength; |
| 358 if (length < 0 || offset + length > bufferByteLength) { | 352 if (length < 0 || offset + length > bufferByteLength) { |
| 359 throw new MakeRangeError('invalid_data_view_length'); | 353 throw new MakeRangeError(kInvalidDataViewLength); |
| 360 } | 354 } |
| 361 %_DataViewInitialize(this, buffer, offset, length); | 355 %_DataViewInitialize(this, buffer, offset, length); |
| 362 } else { | 356 } else { |
| 363 throw MakeTypeError(kConstructorNotFunction, "DataView"); | 357 throw MakeTypeError(kConstructorNotFunction, "DataView"); |
| 364 } | 358 } |
| 365 } | 359 } |
| 366 | 360 |
| 367 function DataViewGetBufferJS() { | 361 function DataViewGetBufferJS() { |
| 368 if (!IS_DATAVIEW(this)) { | 362 if (!IS_DATAVIEW(this)) { |
| 369 throw MakeTypeError(kIncompatibleMethodReceiver, 'DataView.buffer', this); | 363 throw MakeTypeError(kIncompatibleMethodReceiver, 'DataView.buffer', this); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 392 FUNCTION(Uint8) | 386 FUNCTION(Uint8) |
| 393 FUNCTION(Int16) | 387 FUNCTION(Int16) |
| 394 FUNCTION(Uint16) | 388 FUNCTION(Uint16) |
| 395 FUNCTION(Int32) | 389 FUNCTION(Int32) |
| 396 FUNCTION(Uint32) | 390 FUNCTION(Uint32) |
| 397 FUNCTION(Float32) | 391 FUNCTION(Float32) |
| 398 FUNCTION(Float64) | 392 FUNCTION(Float64) |
| 399 endmacro | 393 endmacro |
| 400 | 394 |
| 401 function ToPositiveDataViewOffset(offset) { | 395 function ToPositiveDataViewOffset(offset) { |
| 402 return ToPositiveInteger(offset, 'invalid_data_view_accessor_offset'); | 396 return ToPositiveInteger(offset, kInvalidDataViewAccessorOffset); |
| 403 } | 397 } |
| 404 | 398 |
| 405 | 399 |
| 406 macro DATA_VIEW_GETTER_SETTER(TYPENAME) | 400 macro DATA_VIEW_GETTER_SETTER(TYPENAME) |
| 407 function DataViewGetTYPENAMEJS(offset, little_endian) { | 401 function DataViewGetTYPENAMEJS(offset, little_endian) { |
| 408 if (!IS_DATAVIEW(this)) { | 402 if (!IS_DATAVIEW(this)) { |
| 409 throw MakeTypeError(kIncompatibleMethodReceiver, | 403 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 410 'DataView.getTYPENAME', this); | 404 'DataView.getTYPENAME', this); |
| 411 } | 405 } |
| 412 if (%_ArgumentsLength() < 1) { | 406 if (%_ArgumentsLength() < 1) throw MakeTypeError(kInvalidArgument); |
| 413 throw MakeTypeError('invalid_argument'); | |
| 414 } | |
| 415 return %DataViewGetTYPENAME(this, | 407 return %DataViewGetTYPENAME(this, |
| 416 ToPositiveDataViewOffset(offset), | 408 ToPositiveDataViewOffset(offset), |
| 417 !!little_endian); | 409 !!little_endian); |
| 418 } | 410 } |
| 419 | 411 |
| 420 function DataViewSetTYPENAMEJS(offset, value, little_endian) { | 412 function DataViewSetTYPENAMEJS(offset, value, little_endian) { |
| 421 if (!IS_DATAVIEW(this)) { | 413 if (!IS_DATAVIEW(this)) { |
| 422 throw MakeTypeError(kIncompatibleMethodReceiver, | 414 throw MakeTypeError(kIncompatibleMethodReceiver, |
| 423 'DataView.setTYPENAME', this); | 415 'DataView.setTYPENAME', this); |
| 424 } | 416 } |
| 425 if (%_ArgumentsLength() < 2) { | 417 if (%_ArgumentsLength() < 2) throw MakeTypeError(kInvalidArgument); |
| 426 throw MakeTypeError('invalid_argument'); | |
| 427 } | |
| 428 %DataViewSetTYPENAME(this, | 418 %DataViewSetTYPENAME(this, |
| 429 ToPositiveDataViewOffset(offset), | 419 ToPositiveDataViewOffset(offset), |
| 430 TO_NUMBER_INLINE(value), | 420 TO_NUMBER_INLINE(value), |
| 431 !!little_endian); | 421 !!little_endian); |
| 432 } | 422 } |
| 433 endmacro | 423 endmacro |
| 434 | 424 |
| 435 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) | 425 DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) |
| 436 | 426 |
| 437 // Setup the DataView constructor. | 427 // Setup the DataView constructor. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 468 "setUint32", DataViewSetUint32JS, | 458 "setUint32", DataViewSetUint32JS, |
| 469 | 459 |
| 470 "getFloat32", DataViewGetFloat32JS, | 460 "getFloat32", DataViewGetFloat32JS, |
| 471 "setFloat32", DataViewSetFloat32JS, | 461 "setFloat32", DataViewSetFloat32JS, |
| 472 | 462 |
| 473 "getFloat64", DataViewGetFloat64JS, | 463 "getFloat64", DataViewGetFloat64JS, |
| 474 "setFloat64", DataViewSetFloat64JS | 464 "setFloat64", DataViewSetFloat64JS |
| 475 ]); | 465 ]); |
| 476 | 466 |
| 477 })(); | 467 })(); |
| OLD | NEW |