Reviewers: Yang,

Message:
PTAL.

Description:
Ensure that typed array constructors are crankshaftable.

Also, do not allocate sub-closures for every call to typed array constructor.

Please review this at https://codereview.chromium.org/59913003/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+46, -46 lines):
  M src/typedarray.js


Index: src/typedarray.js
diff --git a/src/typedarray.js b/src/typedarray.js
index f2b5d2da2c311e0ba47b4925e29cb26d73088202..20a50c5c1bcfa43c747e1d9cb59bd4eca8f643be 100644
--- a/src/typedarray.js
+++ b/src/typedarray.js
@@ -48,65 +48,66 @@ FUNCTION(9, Uint8ClampedArray, 1)
 endmacro

 macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE)
-  function NAMEConstructor(arg1, arg2, arg3) {
-    function ConstructByArrayBuffer(obj, buffer, byteOffset, length) {
- var offset = ToPositiveInteger(byteOffset, "invalid_typed_array_length")
+  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 = %ArrayBufferGetByteLength(buffer);
-      if (offset > bufferByteLength) {
-        throw MakeRangeError("invalid_typed_array_offset");
-      }
+    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 newByteLength;
-      var newLength;
-      if (IS_UNDEFINED(length)) {
-        if (bufferByteLength % ELEMENT_SIZE !== 0) {
-          throw MakeRangeError("invalid_typed_array_alignment",
-            "byte length", "NAME", ELEMENT_SIZE);
-        }
-        newByteLength = bufferByteLength - offset;
-        newLength = newByteLength / ELEMENT_SIZE;
-      } else {
- var newLength = ToPositiveInteger(length, "invalid_typed_array_length");
-        newByteLength = newLength * ELEMENT_SIZE;
-      }
-      if (offset + newByteLength > bufferByteLength) {
-        throw MakeRangeError("invalid_typed_array_length");
+    var newByteLength;
+    var newLength;
+    if (IS_UNDEFINED(length)) {
+      if (bufferByteLength % ELEMENT_SIZE !== 0) {
+        throw MakeRangeError("invalid_typed_array_alignment",
+          "byte length", "NAME", ELEMENT_SIZE);
       }
-      %TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
+      newByteLength = bufferByteLength - offset;
+      newLength = newByteLength / ELEMENT_SIZE;
+    } else {
+ var newLength = ToPositiveInteger(length, "invalid_typed_array_length");
+      newByteLength = newLength * ELEMENT_SIZE;
     }
-
-    function ConstructByLength(obj, length) {
-      var l = ToPositiveInteger(length, "invalid_typed_array_length");
-      var byteLength = l * ELEMENT_SIZE;
-      var buffer = new $ArrayBuffer(byteLength);
-      %TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength);
+    if (offset + newByteLength > bufferByteLength) {
+      throw MakeRangeError("invalid_typed_array_length");
     }
+    %TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
+  }

-    function ConstructByArrayLike(obj, arrayLike) {
-      var length = arrayLike.length;
-      var l = ToPositiveInteger(length, "invalid_typed_array_length");
- if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) {
-        for (var i = 0; i < l; i++) {
-          // It is crucial that we let any execptions from arrayLike[i]
-          // propagate outside the function.
-          obj[i] = arrayLike[i];
-        }
+  function NAMEConstructByLength(obj, length) {
+    var l = ToPositiveInteger(length, "invalid_typed_array_length");
+    var byteLength = l * ELEMENT_SIZE;
+    var buffer = new $ArrayBuffer(byteLength);
+    %TypedArrayInitialize(obj, ARRAY_ID, buffer, 0, byteLength);
+  }
+
+  function NAMEConstructByArrayLike(obj, arrayLike) {
+    var length = arrayLike.length;
+    var l = ToPositiveInteger(length, "invalid_typed_array_length");
+    if(!%TypedArrayInitializeFromArrayLike(obj, ARRAY_ID, arrayLike, l)) {
+      for (var i = 0; i < l; i++) {
+        // It is crucial that we let any execptions from arrayLike[i]
+        // propagate outside the function.
+        obj[i] = arrayLike[i];
       }
     }
+  }
+
+  function NAMEConstructor(arg1, arg2, arg3) {

     if (%_IsConstructCall()) {
       if (IS_ARRAYBUFFER(arg1)) {
-        ConstructByArrayBuffer(this, arg1, arg2, arg3);
+        NAMEConstructByArrayBuffer(this, arg1, arg2, arg3);
       } else if (IS_NUMBER(arg1) || IS_STRING(arg1) ||
                  IS_BOOLEAN(arg1) || IS_UNDEFINED(arg1)) {
-        ConstructByLength(this, arg1);
+        NAMEConstructByLength(this, arg1);
       } else {
-        ConstructByArrayLike(this, arg1);
+        NAMEConstructByArrayLike(this, arg1);
       }
     } else {
       throw MakeTypeError("constructor_not_function", ["NAME"])
@@ -284,7 +285,6 @@ function SetupTypedArray(constructor, fun, elementSize) {
   ));
 }

-
 macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE)
   SetupTypedArray (global.NAME, NAMEConstructor, ELEMENT_SIZE);
 endmacro


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to