if (!Int32Array.__proto__.from) {
  Object.defineProperty(Int32Array.__proto__, 'from', {
    value: function(obj) {
      obj = Object(obj);
      if (!obj['length']) {
        return new this(0);
      }
      let typed_array = new this(obj.length);
      for (let i = 0; i < typed_array.length; i++) {
        typed_array[i] = obj[i];
      }
      return typed_array;
    }
  });
}

if (!Array.prototype.copyWithin) {
  Array.prototype.copyWithin = function(target, start, end) {
    let O = Object(this);
    let len = O.length >>> 0;
    let to = target | 0;
    let from = start | 0;
    let count = Math.min(Math.min(end | 0, len) - from, len - to);
    let direction = 1;
    if (from < to && to < (from + count)) {
      direction = -1;
      from += count - 1;
      to += count - 1;
    }
    while (count > 0) {
      O[to] = O[from];
      from += direction;
      to += direction;
      count--;
    }
    return O;
  };
}

if (!Array.prototype.fill) {
  Object.defineProperty(Array.prototype, 'fill', {
    value: function(value, start, end) {
      end = end | 0;
      let O = Object(this);
      let k = start | 0;
      while (k < end) {
        O[k] = value;
        k++;
      }
      return O;
    }
  });
}

if (!Int8Array.prototype.copyWithin) {
  Int8Array.prototype.copyWithin = Array.prototype.copyWithin;
}

if (!Int8Array.prototype.fill) {
  Int8Array.prototype.fill = Array.prototype.fill;
}

if (!Int32Array.prototype.fill) {
  Int32Array.prototype.fill = Array.prototype.fill;
}

if (!Int8Array.prototype.slice) {
  Object.defineProperty(Int8Array.prototype, 'slice', {
    value: function(begin, end) {
      return new Int8Array(Array.prototype.slice.call(this, begin, end));
    }
  });
}
