Index: lib/typedObjects/arrayTypes.js
===================================================================
--- a/lib/typedObjects/arrayTypes.js
+++ b/lib/typedObjects/arrayTypes.js
@@ -185,16 +185,91 @@ 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)
+  {
+    index += length;
+    if (index < 0)
+      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 +312,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
