Version 3.23.0

Fixed loading message from an Error object.  (Chromium issue 306220)

Made Object.freeze/seal/preventExtensions observable. (issue 2975, 2941)

Made snapshots reproducible. (issue 2885)

Added missing negative dictionary lookup to NonexistentHandlerFrontend. (issue 2980)

Performance and stability improvements on all platforms.

git-svn-id: http://v8.googlecode.com/svn/trunk@17517 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
diff --git a/src/typedarray.js b/src/typedarray.js
index 1e67bc3..f2b5d2d 100644
--- a/src/typedarray.js
+++ b/src/typedarray.js
@@ -34,59 +34,71 @@
 
 
 // --------------- Typed Arrays ---------------------
+macro TYPED_ARRAYS(FUNCTION)
+// arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
+FUNCTION(1, Uint8Array, 1)
+FUNCTION(2, Int8Array, 1)
+FUNCTION(3, Uint16Array, 2)
+FUNCTION(4, Int16Array, 2)
+FUNCTION(5, Uint32Array, 4)
+FUNCTION(6, Int32Array, 4)
+FUNCTION(7, Float32Array, 4)
+FUNCTION(8, Float64Array, 8)
+FUNCTION(9, Uint8ClampedArray, 1)
+endmacro
 
-function CreateTypedArrayConstructor(name, elementSize, arrayId, constructor) {
-  function ConstructByArrayBuffer(obj, buffer, byteOffset, length) {
-    var offset = ToPositiveInteger(byteOffset, "invalid_typed_array_length")
+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")
 
-    if (offset % elementSize !== 0) {
-      throw MakeRangeError("invalid_typed_array_alignment",
-          "start offset", name, elementSize);
-    }
-    var bufferByteLength = %ArrayBufferGetByteLength(buffer);
-    if (offset > bufferByteLength) {
-      throw MakeRangeError("invalid_typed_array_offset");
-    }
-
-    var newByteLength;
-    var newLength;
-    if (IS_UNDEFINED(length)) {
-      if (bufferByteLength % elementSize !== 0) {
+      if (offset % ELEMENT_SIZE !== 0) {
         throw MakeRangeError("invalid_typed_array_alignment",
-          "byte length", name, elementSize);
+            "start offset", "NAME", ELEMENT_SIZE);
       }
-      newByteLength = bufferByteLength - offset;
-      newLength = newByteLength / elementSize;
-    } else {
-      var newLength = ToPositiveInteger(length, "invalid_typed_array_length");
-      newByteLength = newLength * elementSize;
-    }
-    if (offset + newByteLength > bufferByteLength) {
-      throw MakeRangeError("invalid_typed_array_length");
-    }
-    %TypedArrayInitialize(obj, arrayId, buffer, offset, newByteLength);
-  }
+      var bufferByteLength = %ArrayBufferGetByteLength(buffer);
+      if (offset > bufferByteLength) {
+        throw MakeRangeError("invalid_typed_array_offset");
+      }
 
-  function ConstructByLength(obj, length) {
-    var l = ToPositiveInteger(length, "invalid_typed_array_length");
-    var byteLength = l * elementSize;
-    var buffer = new $ArrayBuffer(byteLength);
-    %TypedArrayInitialize(obj, arrayId, buffer, 0, byteLength);
-  }
+      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);
+    }
 
-  function ConstructByArrayLike(obj, arrayLike) {
-    var length = arrayLike.length;
-    var l = ToPositiveInteger(length, "invalid_typed_array_length");
-    if(!%TypedArrayInitializeFromArrayLike(obj, arrayId, 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 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 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];
+        }
       }
     }
-  }
 
-  return function (arg1, arg2, arg3) {
     if (%_IsConstructCall()) {
       if (IS_ARRAYBUFFER(arg1)) {
         ConstructByArrayBuffer(this, arg1, arg2, arg3);
@@ -97,10 +109,12 @@
         ConstructByArrayLike(this, arg1);
       }
     } else {
-      throw MakeTypeError("constructor_not_function", [name])
+      throw MakeTypeError("constructor_not_function", ["NAME"])
     }
   }
-}
+endmacro
+
+TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR)
 
 function TypedArrayGetBuffer() {
   return %TypedArrayGetBuffer(this);
@@ -247,10 +261,8 @@
 
 // -------------------------------------------------------------------
 
-function SetupTypedArray(arrayId, name, constructor, elementSize) {
+function SetupTypedArray(constructor, fun, elementSize) {
   %CheckIsBootstrapping();
-  var fun = CreateTypedArrayConstructor(name, elementSize,
-                                        arrayId, constructor);
   %SetCode(constructor, fun);
   %FunctionSetPrototype(constructor, new $Object());
 
@@ -272,17 +284,12 @@
   ));
 }
 
-// arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
-SetupTypedArray(1, "Uint8Array", global.Uint8Array, 1);
-SetupTypedArray(2, "Int8Array", global.Int8Array, 1);
-SetupTypedArray(3, "Uint16Array", global.Uint16Array, 2);
-SetupTypedArray(4, "Int16Array", global.Int16Array, 2);
-SetupTypedArray(5, "Uint32Array", global.Uint32Array, 4);
-SetupTypedArray(6, "Int32Array", global.Int32Array, 4);
-SetupTypedArray(7, "Float32Array", global.Float32Array, 4);
-SetupTypedArray(8, "Float64Array", global.Float64Array, 8);
-SetupTypedArray(9, "Uint8ClampedArray", global.Uint8ClampedArray, 1);
 
+macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE)
+  SetupTypedArray (global.NAME, NAMEConstructor, ELEMENT_SIZE);
+endmacro
+
+TYPED_ARRAYS(SETUP_TYPED_ARRAY)
 
 // --------------------------- DataView -----------------------------