summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/growable-fixed-array.tq
blob: a11e3e6cbdc4ab58d643c852f5ffacf38c662154 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// Copyright 2019 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 growable_fixed_array {
  // TODO(pwong): Support FixedTypedArrays.
  struct GrowableFixedArray {
    Push(obj: Object) {
      this.EnsureCapacity();
      this.array.objects[this.length++] = obj;
    }
    ResizeFixedArray(newCapacity: intptr): FixedArray {
      assert(this.length >= 0);
      assert(newCapacity >= 0);
      assert(newCapacity >= this.length);
      const first: intptr = 0;
      return ExtractFixedArray(
          this.array, first, this.length, newCapacity, kFixedArrays);
    }
    EnsureCapacity() {
      assert(this.length <= this.capacity);
      if (this.capacity == this.length) {
        // Growth rate is analog to JSObject::NewElementsCapacity:
        // new_capacity = (current_capacity + (current_capacity >> 1)) + 16.
        this.capacity = this.capacity + (this.capacity >> 1) + 16;
        this.array = this.ResizeFixedArray(this.capacity);
      }
    }
    ToJSArray(implicit context: Context)(): JSArray {
      const nativeContext: NativeContext = LoadNativeContext(context);
      const map: Map = LoadJSArrayElementsMap(PACKED_ELEMENTS, nativeContext);
      const fixedArray: FixedArray = this.ResizeFixedArray(this.length);
      const lengthSmi = Convert<Smi>(this.length);
      return AllocateJSArray(map, fixedArray, lengthSmi);
    }

    array: FixedArray;
    capacity: intptr;
    length: intptr;
  }

  macro NewGrowableFixedArray(): GrowableFixedArray {
    return GrowableFixedArray{array: kEmptyFixedArray, capacity: 0, length: 0};
  }
}