code: function ArrayBufferSlice(start, end) {
    if (!IS_ARRAYBUFFER(this)) {
      throw MakeTypeError(kIncompatibleMethodReceiver,
                          'ArrayBuffer.prototype.slice', this);
    }
  
    var relativeStart = TO_INTEGER(start);
    if (!IS_UNDEFINED(end)) {
      end = TO_INTEGER(end);
    }
    var first;
    var byte_length = %_ArrayBufferGetByteLength(this);
    if (relativeStart < 0) {
      first = MaxSimple(byte_length + relativeStart, 0);
    } else {
      first = MinSimple(relativeStart, byte_length);
    }
    var relativeEnd = IS_UNDEFINED(end) ? byte_length : end;
    var fin;
    if (relativeEnd < 0) {
      fin = MaxSimple(byte_length + relativeEnd, 0);
    } else {
      fin = MinSimple(relativeEnd, byte_length);
    }
  
    if (fin < first) {
      fin = first;
    }
    var newLen = fin - first;
    var constructor = SpeciesConstructor(this, GlobalArrayBuffer, true);
    var result = new constructor(newLen);
    if (!IS_ARRAYBUFFER(result)) {
      throw MakeTypeError(kIncompatibleMethodReceiver,
                          'ArrayBuffer.prototype.slice', result);
    }
    // Checks for detached source/target ArrayBuffers are done inside of
    // %ArrayBufferSliceImpl; the reordering of checks does not violate
    // the spec because all exceptions thrown are TypeErrors.
    if (result === this) {
      throw MakeTypeError(kArrayBufferSpeciesThis);
    }
    if (%_ArrayBufferGetByteLength(result) < newLen) {
      throw MakeTypeError(kArrayBufferTooShort);
    }
  
    %ArrayBufferSliceImpl(this, result, first, newLen);
    return result;
  }
docs: ES6 Draft 15.13.5.5.3