| Index: lib/typedObjects/arrayTypes.js | 
| =================================================================== | 
| --- a/lib/typedObjects/arrayTypes.js | 
| +++ b/lib/typedObjects/arrayTypes.js | 
| @@ -185,16 +185,87 @@ function createSizeWatcher(elementType, | 
| removeBuffer(origBufferIndex, buffers, views); | 
| } | 
| } | 
| return newSize; | 
| } | 
| } | 
| +function push() | 
| +{ | 
| + let length = this.length | 0; | 
| + let newCount = arguments.length | 0; | 
| + this.length = length + newCount; | 
| + for (let i = 0; i < newCount; i++) | 
| + this.set(length + i, arguments[i]); | 
| + return length + newCount; | 
| +} | 
| + | 
| +function pop() | 
| +{ | 
| + let length = this.length | 0; | 
| + if (length == 0) | 
| + throw new Error("No elements in the array"); | 
| + | 
| + let result = this.get(length - 1); | 
| + this.length = this.length - 1; | 
| + return result; | 
| +} | 
| + | 
| +function splice(index, count) | 
| +{ | 
| + index = index | 0; | 
| + count = count | 0; | 
| + let length = this.length | 0; | 
| + if (index < 0) | 
| 
 
René Jeschke
2014/05/19 08:35:53
What about the negative indexing one can use on 's
 
Wladimir Palant
2014/05/19 15:22:02
You are right, I wasn't aware that splice supporte
 
 | 
| + index = 0; | 
| + if (index > length) | 
| + index = length; | 
| + if (index + count > length) | 
| + count = length - index; | 
| + | 
| + let newCount = (arguments.length | 0) - 2; | 
| + let diff = newCount - count; | 
| + let newLength = length + diff; | 
| + if (diff > 0) | 
| + { | 
| + this.length = newLength; | 
| + for (let i = length - 1; i >= index + count; i--) | 
| + this.set(i + diff, this.get(i)); | 
| + } | 
| + else if (diff < 0) | 
| + { | 
| + for (let i = index + count; i < length; i++) | 
| + this.set(i + diff, this.get(i)); | 
| + this.length = newLength; | 
| + } | 
| + | 
| + for (let i = 0; i < newCount; i++) | 
| + this.set(index + i, arguments[i + 2]); | 
| +} | 
| + | 
| +function unshift(value) | 
| +{ | 
| + let args = [0, 0].concat(Array.prototype.slice.apply(arguments)); | 
| + this.splice.apply(this, args); | 
| + return this.length | 0; | 
| +} | 
| + | 
| +function shift() | 
| +{ | 
| + let length = this.length | 0; | 
| + if (length == 0) | 
| + throw new Error("No elements in the array"); | 
| + | 
| + let result = this.get(0); | 
| + this.splice(0, 1); | 
| + return result; | 
| +} | 
| + | 
| function createArrayType(elementType, typeDescriptor, meta) | 
| { | 
| if (typeof meta != "object" || meta == null) | 
| meta = {}; | 
| // We need to make sure that all buffer chunks are big enough to hold a | 
| // reference in order to manage the free chunks as a linked list. Each array | 
| // buffer should be dedicated to arrays of particular size - the number of | 
| @@ -237,16 +308,21 @@ function createArrayType(elementType, ty | 
| typeDescriptor.arrayBufferIndex = int16; | 
| typeDescriptor.arrayByteOffset = uint32; | 
| typeDescriptor.getArrayBuffer = function() | 
| { | 
| return this.arrayBufferIndex >= 0 ? buffers[this.arrayBufferIndex] : null; | 
| }; | 
| typeDescriptor.length = uint32; | 
| typeDescriptor.size = uint32; | 
| + typeDescriptor.push = push; | 
| + typeDescriptor.pop = pop; | 
| + typeDescriptor.splice = splice; | 
| + typeDescriptor.unshift = unshift; | 
| + typeDescriptor.shift = shift; | 
| let elementShift = ilog2(elementType.referenceLength | 0); | 
| typeDescriptor.get = createGetter(elementGetter, elementShift); | 
| typeDescriptor.set = createSetter(elementSetter, elementShift); | 
| if (meta.hasOwnProperty("constructor") && typeof meta.constructor == "function") | 
| meta.constructor = createCombinedConstructor(meta.constructor); | 
| else |