Revision: 17528
Author:   [email protected]
Date:     Wed Nov  6 16:28:38 2013 UTC
Log:      Ensure that typed array constructors are crankshaftable.

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

[email protected]

Review URL: https://codereview.chromium.org/59913003
http://code.google.com/p/v8/source/detail?r=17528

Modified:
 /branches/bleeding_edge/src/typedarray.js

=======================================
--- /branches/bleeding_edge/src/typedarray.js   Tue Nov  5 14:08:03 2013 UTC
+++ /branches/bleeding_edge/src/typedarray.js   Wed Nov  6 16:28:38 2013 UTC
@@ -48,65 +48,66 @@
 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) {
+    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",
-            "start offset", "NAME", ELEMENT_SIZE);
+          "byte length", "NAME", ELEMENT_SIZE);
       }
-      var bufferByteLength = %ArrayBufferGetByteLength(buffer);
-      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");
-      }
-      %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;
+    }
+    if (offset + newByteLength > bufferByteLength) {
+      throw MakeRangeError("invalid_typed_array_length");
     }
+    %TypedArrayInitialize(obj, ARRAY_ID, buffer, offset, newByteLength);
+  }

-    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);
-    }
+  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 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 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"])
@@ -283,7 +284,6 @@
         "set", TypedArraySet
   ));
 }
-

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

--
--
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