arraybuffer.tq 5.13 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

namespace arraybuffer {

// #sec-get-arraybuffer.prototype.bytelength
transitioning javascript builtin ArrayBufferPrototypeGetByteLength(
    js-implicit context: NativeContext, receiver: JSAny)(): Number {
  // 1. Let O be the this value.
  // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
12
  const functionName = 'get ArrayBuffer.prototype.byteLength';
13 14
  const o = Cast<JSArrayBuffer>(receiver) otherwise
  ThrowTypeError(
15
      MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
16 17 18
  // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
  if (IsSharedArrayBuffer(o)) {
    ThrowTypeError(
19
        MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
20
  }
21
  // 4. Let length be O.[[ArrayBufferByteLength]].
22
  const length = o.byte_length;
23
  // 5. Return length.
24 25 26
  return Convert<Number>(length);
}

27 28
// #sec-get-arraybuffer.prototype.maxbytelength
transitioning javascript builtin ArrayBufferPrototypeGetMaxByteLength(
29 30 31
    js-implicit context: NativeContext, receiver: JSAny)(): Number {
  // 1. Let O be the this value.
  // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
32
  const functionName = 'get ArrayBuffer.prototype.maxByteLength';
33 34
  const o = Cast<JSArrayBuffer>(receiver) otherwise
  ThrowTypeError(
35
      MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
36 37
  // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
  if (IsSharedArrayBuffer(o)) {
38
    ThrowTypeError(
39 40
        MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
  }
41 42 43
  // 4. If IsDetachedBuffer(O) is true, return 0_F.
  if (IsDetachedBuffer(o)) {
    return 0;
44
  }
45 46 47 48 49
  // 5. If IsResizableArrayBuffer(O) is true, then
  //   a. Let length be O.[[ArrayBufferMaxByteLength]].
  // 6. Else,
  //   a. Let length be O.[[ArrayBufferByteLength]].
  // 7. Return F(length);
50
  dcheck(IsResizableArrayBuffer(o) || o.max_byte_length == o.byte_length);
51
  return Convert<Number>(o.max_byte_length);
52 53
}

54 55 56
// #sec-get-arraybuffer.prototype.resizable
transitioning javascript builtin ArrayBufferPrototypeGetResizable(
    js-implicit context: NativeContext, receiver: JSAny)(): Boolean {
57
  // 1. Let O be the this value.
58 59
  // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
  const functionName = 'get ArrayBuffer.prototype.resizable';
60 61 62 63 64 65 66
  const o = Cast<JSArrayBuffer>(receiver) otherwise
  ThrowTypeError(
      MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
  // 3. If IsSharedArrayBuffer(O) is true, throw a TypeError exception.
  if (IsSharedArrayBuffer(o)) {
    ThrowTypeError(
        MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
67
  }
68 69 70 71 72
  // 4. Return IsResizableArrayBuffer(O).
  if (IsResizableArrayBuffer(o)) {
    return True;
  }
  return False;
73 74
}

75 76 77
// #sec-get-growablesharedarraybuffer.prototype.maxbytelength
transitioning javascript builtin
SharedArrayBufferPrototypeGetMaxByteLength(
78 79
    js-implicit context: NativeContext, receiver: JSAny)(): Number {
  // 1. Let O be the this value.
80 81
  // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
  const functionName = 'get SharedArrayBuffer.prototype.maxByteLength';
82 83 84
  const o = Cast<JSArrayBuffer>(receiver) otherwise
  ThrowTypeError(
      MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
85 86
  // 3. If IsSharedArrayBuffer(O) is false, throw a TypeError exception.
  if (!IsSharedArrayBuffer(o)) {
87 88 89
    ThrowTypeError(
        MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
  }
90 91 92 93 94
  // 4. If IsResizableArrayBuffer(O) is true, then
  //   a. Let length be O.[[ArrayBufferMaxByteLength]].
  // 5. Else,
  //   a. Let length be O.[[ArrayBufferByteLength]].
  // 6. Return F(length);
95
  dcheck(IsResizableArrayBuffer(o) || o.max_byte_length == o.byte_length);
96
  return Convert<Number>(o.max_byte_length);
97 98
}

99 100 101
// #sec-get-sharedarraybuffer.prototype.growable
transitioning javascript builtin SharedArrayBufferPrototypeGetGrowable(
    js-implicit context: NativeContext, receiver: JSAny)(): Boolean {
102
  // 1. Let O be the this value.
103 104
  // 2. Perform ? RequireInternalSlot(O, [[ArrayBufferData]]).
  const functionName = 'get SharedArrayBuffer.prototype.growable';
105 106 107 108 109 110 111 112
  const o = Cast<JSArrayBuffer>(receiver) otherwise
  ThrowTypeError(
      MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
  // 3. If IsSharedArrayBuffer(O) is false, throw a TypeError exception.
  if (!IsSharedArrayBuffer(o)) {
    ThrowTypeError(
        MessageTemplate::kIncompatibleMethodReceiver, functionName, receiver);
  }
113 114 115 116 117
  // 4. Return IsResizableArrayBuffer(O).
  if (IsResizableArrayBuffer(o)) {
    return True;
  }
  return False;
118 119
}

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
// #sec-arraybuffer.isview
transitioning javascript builtin ArrayBufferIsView(arg: JSAny): Boolean {
  // 1. If Type(arg) is not Object, return false.
  // 2. If arg has a [[ViewedArrayBuffer]] internal slot, return true.
  // 3. Return false.
  typeswitch (arg) {
    case (JSArrayBufferView): {
      return True;
    }
    case (JSAny): {
      return False;
    }
  }
}

}  // namespace arraybuffer