Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Unified Diff: src/typedarray.js

Issue 13975012: First cut at impementing ES6 TypedArrays in V8. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Cleanup Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/typedarray.js
diff --git a/src/typedarray.js b/src/typedarray.js
index 2a71543104f85396d2b3f91bc3cc810e9e4b050f..8c634ddfbe68bf91e4525699895bc7eafa79e88e 100644
--- a/src/typedarray.js
+++ b/src/typedarray.js
@@ -82,14 +82,120 @@ function ArrayBufferSlice(start, end) {
return result;
}
+// --------------- Typed Arrays ---------------------
+
+function CreateTypedArrayConstructor(name, elementSize, arrayId, proto) {
rossberg 2013/04/15 13:11:03 The 'proto' argument is misnamed: it's not the pro
Dmitry Lomov (no reviews) 2013/04/15 15:40:58 Done.
+ return function (buffer, byteOffset, length) {
+ if (%_IsConstructCall()) {
+ if (!IS_ARRAYBUFFER(buffer)) {
+ throw MakeTypeError("Type error!");
+ }
+ var offset;
+ if (IS_UNDEFINED(byteOffset)) {
rossberg 2013/04/15 13:11:03 You can use ?: here
Dmitry Lomov (no reviews) 2013/04/15 15:40:58 Done.
+ offset = 0;
+ } else {
+ offset = TO_POSITIVE_INTEGER(byteOffset);
+ }
+ 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) {
+ throw MakeRangeError("invalid_typed_array_alignment",
+ "byte length", name, elementSize);
+ }
+ newByteLength = bufferByteLength - offset;
+ newLength = newByteLength / elementSize;
+ } else {
+ var newLength = TO_POSITIVE_INTEGER(length);
+ newByteLength = newLength * elementSize;
+ }
+ if (newByteLength > bufferByteLength) {
+ throw MakeRangeError("invalid_typed_array_length");
+ }
+ %TypedArrayInitialize(this, arrayId, buffer, offset, newLength, newByteLength);
rossberg 2013/04/15 13:11:03 Line too long
Dmitry Lomov (no reviews) 2013/04/15 15:40:58 Done.
+ } else {
+ return new proto(buffer, byteOffset, length);
+ }
+ }
+}
+
+function TypedArrayGetBuffer() {
+ return %TypedArrayGetBuffer(this);
+}
+
+function TypedArrayGetByteLength() {
+ return %TypedArrayGetByteLength(this);
+}
+
+function TypedArrayGetByteOffset() {
+ return %TypedArrayGetByteOffset(this);
+}
+
+function TypedArrayGetLength() {
+ return %TypedArrayGetLength(this);
+}
+
+
+var typedArrayDescs =
+ // arrayIds below should be synchronized with Runtime_TypedArrayInitialize.
+ [{name:"Uint8Array",
rossberg 2013/04/15 13:11:03 Style: put in a space after ':'
+ protoObject:global.__Uint8Array,
rossberg 2013/04/15 13:11:03 s/protoObject/constructor/g
+ arrayId:1,
+ elementSize:1},
+
+ {name:"Int8Array",
+ protoObject:global.__Int8Array,
+ arrayId:2,
+ elementSize:1},
+
+ {name:"Uint16Array",
+ protoObject:global.__Uint16Array,
+ arrayId:3,
+ elementSize:2},
+
+ {name:"Int16Array",
+ protoObject:global.__Int16Array,
+ arrayId:4,
+ elementSize:2},
+
+ {name:"Uint32Array",
+ protoObject:global.__Uint32Array,
+ arrayId:5,
+ elementSize:4},
+
+ {name:"Int32Array",
+ protoObject:global.__Int32Array,
+ arrayId:6,
+ elementSize:4},
+
+ {name:"Float32Array",
+ protoObject:global.__Float32Array,
+ arrayId:7,
+ elementSize:4},
+
+ {name:"Float64Array",
+ protoObject:global.__Float64Array,
+ arrayId:8,
+ elementSize:8}
+ ];
// -------------------------------------------------------------------
function SetUpArrayBuffer() {
%CheckIsBootstrapping();
- // Set up the Uint16Array constructor function.
+ // Set up the ArrayBuffer constructor function.
%SetCode($ArrayBuffer, ArrayBufferConstructor);
+ %FunctionSetPrototype($ArrayBuffer, new $Object());
// Set up the constructor property on the ArrayBuffer prototype object.
%SetProperty($ArrayBuffer.prototype, "constructor", $ArrayBuffer, DONT_ENUM);
@@ -99,6 +205,23 @@ function SetUpArrayBuffer() {
InstallFunctions($ArrayBuffer.prototype, DONT_ENUM, $Array(
"slice", ArrayBufferSlice
));
+ for (var i = 0; i < typedArrayDescs.length; i++) {
rossberg 2013/04/15 13:11:03 Hm, I'd prefer separating initialization of thyped
Dmitry Lomov (no reviews) 2013/04/15 15:40:58 Done.
+ var desc = typedArrayDescs[i];
+ var f = CreateTypedArrayConstructor(desc.name, desc.elementSize,
+ desc.arrayId, desc.protoObject);
+ %SetCode(desc.protoObject, f);
+ %FunctionSetPrototype(desc.protoObject, new $Object());
+
+ %SetProperty(desc.protoObject.prototype,
+ "constructor", desc.protoObject, DONT_ENUM);
+ %SetProperty(desc.protoObject.prototype,
+ "BYTES_PER_ELEMENT", desc.elementSize,
+ READ_ONLY | DONT_ENUM | DONT_DELETE);
+ InstallGetter(desc.protoObject.prototype, "buffer", TypedArrayGetBuffer);
+ InstallGetter(desc.protoObject.prototype, "byteOffset", TypedArrayGetByteOffset);
rossberg 2013/04/15 13:11:03 Line too long (and below)
Dmitry Lomov (no reviews) 2013/04/15 15:40:58 Done.
+ InstallGetter(desc.protoObject.prototype, "byteLength", TypedArrayGetByteLength);
+ InstallGetter(desc.protoObject.prototype, "length", TypedArrayGetLength);
+ }
}
SetUpArrayBuffer();
« src/runtime.cc ('K') | « src/runtime.cc ('k') | test/mjsunit/harmony/typedarrays.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698