From: dslomov@chromium.org Date: Thu, 7 Nov 2013 14:56:40 +0000 (+0000) Subject: Speed up typed array constructors. X-Git-Tag: upstream/4.7.83~11840 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f3acd446ad2f280d2c306c01783fc18f93904ee6;p=platform%2Fupstream%2Fv8.git Speed up typed array constructors. - Avoid calls into ToPositiveInteger for valid cases of 'undefined' arguments. (Otherwise it calls into runtime). - Reduce the checks performed in case offset for TypedArrayFromArrayBuffer constructor is called with no offset argument. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/59763010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17567 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/typedarray.js b/src/typedarray.js index 20a50c5..d435803 100644 --- a/src/typedarray.js +++ b/src/typedarray.js @@ -49,15 +49,20 @@ endmacro macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { - var offset = ToPositiveInteger(byteOffset, "invalid_typed_array_length") - - if (offset % ELEMENT_SIZE !== 0) { - throw MakeRangeError("invalid_typed_array_alignment", - "start offset", "NAME", ELEMENT_SIZE); - } var bufferByteLength = buffer.byteLength; - if (offset > bufferByteLength) { - throw MakeRangeError("invalid_typed_array_offset"); + var offset; + if (IS_UNDEFINED(byteOffset)) { + offset = 0; + } else { + offset = ToPositiveInteger(byteOffset, "invalid_typed_array_length"); + + if (offset % ELEMENT_SIZE !== 0) { + throw MakeRangeError("invalid_typed_array_alignment", + "start offset", "NAME", ELEMENT_SIZE); + } + if (offset > bufferByteLength) { + throw MakeRangeError("invalid_typed_array_offset"); + } } var newByteLength; @@ -80,7 +85,8 @@ macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) } function NAMEConstructByLength(obj, length) { - var l = ToPositiveInteger(length, "invalid_typed_array_length"); + var l = IS_UNDEFINED(length) ? + 0 : ToPositiveInteger(length, "invalid_typed_array_length"); var byteLength = l * ELEMENT_SIZE; var buffer = new $ArrayBuffer(byteLength); %TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength); @@ -301,7 +307,8 @@ function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 throw MakeTypeError('data_view_not_array_buffer', []); } var bufferByteLength = %ArrayBufferGetByteLength(buffer); - var offset = ToPositiveInteger(byteOffset, 'invalid_data_view_offset'); + var offset = IS_UNDEFINED(byteOffset) ? + 0 : ToPositiveInteger(byteOffset, 'invalid_data_view_offset'); if (offset > bufferByteLength) { throw MakeRangeError('invalid_data_view_offset'); }