Index: src/typedarray.js |
diff --git a/src/typedarray.js b/src/typedarray.js |
index e86c86cb880c8bbb2f5b49e0d3be84370b121c5e..109d627008daeb7115c60196aabbafadc84edeca 100644 |
--- a/src/typedarray.js |
+++ b/src/typedarray.js |
@@ -57,7 +57,7 @@ macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
length = ToPositiveInteger(length, "invalid_typed_array_length"); |
} |
- var bufferByteLength = %_ArrayBufferGetByteLength(buffer); |
+ var bufferByteLength = %ArrayBufferGetByteLength(buffer); |
var offset; |
if (IS_UNDEFINED(byteOffset)) { |
offset = 0; |
@@ -125,6 +125,7 @@ macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
} |
function NAMEConstructor(arg1, arg2, arg3) { |
+ |
if (%_IsConstructCall()) { |
if (IS_ARRAYBUFFER(arg1)) { |
NAMEConstructByArrayBuffer(this, arg1, arg2, arg3); |
@@ -138,52 +139,34 @@ macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
throw MakeTypeError("constructor_not_function", ["NAME"]) |
} |
} |
+endmacro |
- function NAME_GetBuffer() { |
- if (!(%_ClassOf(this) === 'NAME')) { |
- throw MakeTypeError('incompatible_method_receiver', |
- ["NAME.buffer", this]); |
- } |
- return %TypedArrayGetBuffer(this); |
- } |
+TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) |
- function NAME_GetByteLength() { |
- if (!(%_ClassOf(this) === 'NAME')) { |
- throw MakeTypeError('incompatible_method_receiver', |
- ["NAME.byteLength", this]); |
- } |
- return %_ArrayBufferViewGetByteLength(this); |
- } |
+function TypedArrayGetBuffer() { |
+ return %TypedArrayGetBuffer(this); |
+} |
- function NAME_GetByteOffset() { |
- if (!(%_ClassOf(this) === 'NAME')) { |
- throw MakeTypeError('incompatible_method_receiver', |
- ["NAME.byteOffset", this]); |
- } |
- return %_ArrayBufferViewGetByteOffset(this); |
- } |
+function TypedArrayGetByteLength() { |
+ return %TypedArrayGetByteLength(this); |
+} |
- function NAME_GetLength() { |
- if (!(%_ClassOf(this) === 'NAME')) { |
- throw MakeTypeError('incompatible_method_receiver', |
- ["NAME.length", this]); |
- } |
- return %_TypedArrayGetLength(this); |
- } |
+function TypedArrayGetByteOffset() { |
+ return %TypedArrayGetByteOffset(this); |
+} |
- var $NAME = global.NAME; |
+function TypedArrayGetLength() { |
+ return %TypedArrayGetLength(this); |
+} |
- function NAMESubArray(begin, end) { |
- if (!(%_ClassOf(this) === 'NAME')) { |
- throw MakeTypeError('incompatible_method_receiver', |
- ["NAME.subarray", this]); |
- } |
+function CreateSubArray(elementSize, constructor) { |
+ return function(begin, end) { |
var beginInt = TO_INTEGER(begin); |
if (!IS_UNDEFINED(end)) { |
end = TO_INTEGER(end); |
} |
- var srcLength = %_TypedArrayGetLength(this); |
+ var srcLength = %TypedArrayGetLength(this); |
if (beginInt < 0) { |
beginInt = MathMax(0, srcLength + beginInt); |
} else { |
@@ -201,14 +184,11 @@ macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) |
} |
var newLength = endInt - beginInt; |
var beginByteOffset = |
- %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; |
- return new $NAME(%TypedArrayGetBuffer(this), |
- beginByteOffset, newLength); |
+ %TypedArrayGetByteOffset(this) + beginInt * elementSize; |
+ return new constructor(%TypedArrayGetBuffer(this), |
+ beginByteOffset, newLength); |
} |
-endmacro |
- |
-TYPED_ARRAYS(TYPED_ARRAY_CONSTRUCTOR) |
- |
+} |
function TypedArraySetFromArrayLike(target, source, sourceLength, offset) { |
if (offset > 0) { |
@@ -316,34 +296,34 @@ function TypedArraySet(obj, offset) { |
// ------------------------------------------------------------------- |
-function SetupTypedArrays() { |
-macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE) |
+function SetupTypedArray(constructor, fun, elementSize) { |
%CheckIsBootstrapping(); |
- %SetCode(global.NAME, NAMEConstructor); |
- %FunctionSetPrototype(global.NAME, new $Object()); |
+ %SetCode(constructor, fun); |
+ %FunctionSetPrototype(constructor, new $Object()); |
- %SetProperty(global.NAME, "BYTES_PER_ELEMENT", ELEMENT_SIZE, |
+ %SetProperty(constructor, "BYTES_PER_ELEMENT", elementSize, |
READ_ONLY | DONT_ENUM | DONT_DELETE); |
- %SetProperty(global.NAME.prototype, |
- "constructor", global.NAME, DONT_ENUM); |
- %SetProperty(global.NAME.prototype, |
- "BYTES_PER_ELEMENT", ELEMENT_SIZE, |
+ %SetProperty(constructor.prototype, |
+ "constructor", constructor, DONT_ENUM); |
+ %SetProperty(constructor.prototype, |
+ "BYTES_PER_ELEMENT", elementSize, |
READ_ONLY | DONT_ENUM | DONT_DELETE); |
- InstallGetter(global.NAME.prototype, "buffer", NAME_GetBuffer); |
- InstallGetter(global.NAME.prototype, "byteOffset", NAME_GetByteOffset); |
- InstallGetter(global.NAME.prototype, "byteLength", NAME_GetByteLength); |
- InstallGetter(global.NAME.prototype, "length", NAME_GetLength); |
+ InstallGetter(constructor.prototype, "buffer", TypedArrayGetBuffer); |
+ InstallGetter(constructor.prototype, "byteOffset", TypedArrayGetByteOffset); |
+ InstallGetter(constructor.prototype, "byteLength", TypedArrayGetByteLength); |
+ InstallGetter(constructor.prototype, "length", TypedArrayGetLength); |
- InstallFunctions(global.NAME.prototype, DONT_ENUM, $Array( |
- "subarray", NAMESubArray, |
+ InstallFunctions(constructor.prototype, DONT_ENUM, $Array( |
+ "subarray", CreateSubArray(elementSize, constructor), |
"set", TypedArraySet |
)); |
+} |
+ |
+macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE) |
+ SetupTypedArray (global.NAME, NAMEConstructor, ELEMENT_SIZE); |
endmacro |
TYPED_ARRAYS(SETUP_TYPED_ARRAY) |
-} |
- |
-SetupTypedArrays(); |
// --------------------------- DataView ----------------------------- |
@@ -361,7 +341,7 @@ function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 |
byteLength = TO_INTEGER(byteLength); |
} |
- var bufferByteLength = %_ArrayBufferGetByteLength(buffer); |
+ var bufferByteLength = %ArrayBufferGetByteLength(buffer); |
var offset = IS_UNDEFINED(byteOffset) ? 0 : byteOffset; |
if (offset > bufferByteLength) { |
@@ -393,7 +373,7 @@ function DataViewGetByteOffset() { |
throw MakeTypeError('incompatible_method_receiver', |
['DataView.byteOffset', this]); |
} |
- return %_ArrayBufferViewGetByteOffset(this); |
+ return %DataViewGetByteOffset(this); |
} |
function DataViewGetByteLength() { |
@@ -401,7 +381,7 @@ function DataViewGetByteLength() { |
throw MakeTypeError('incompatible_method_receiver', |
['DataView.byteLength', this]); |
} |
- return %_ArrayBufferViewGetByteLength(this); |
+ return %DataViewGetByteLength(this); |
} |
macro DATA_VIEW_TYPES(FUNCTION) |