growable-fixed-array.tq 1.64 KB
Newer Older
1 2 3 4 5
// 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 {
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
// TODO(pwong): Support FixedTypedArrays.
struct GrowableFixedArray {
  macro Push(obj: Object) {
    this.EnsureCapacity();
    this.array.objects[this.length++] = obj;
  }
  macro 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);
  }
  macro 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);
26
    }
27
  }
28

29 30 31 32 33 34 35
  macro ToJSArray(implicit context: Context)(): JSArray {
    const nativeContext: NativeContext = LoadNativeContext(context);
    const map: Map =
        LoadJSArrayElementsMap(ElementsKind::PACKED_ELEMENTS, nativeContext);
    const fixedArray: FixedArray = this.ResizeFixedArray(this.length);
    const lengthSmi = Convert<Smi>(this.length);
    return AllocateJSArray(map, fixedArray, lengthSmi);
36
  }
37 38 39 40 41 42 43 44 45 46

  array: FixedArray;
  // TODO(v8:4153): make capacity and length uintptr
  capacity: intptr;
  length: intptr;
}

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