blob: af9418b0c9168c51a283d7f21a56ae6eafe2f6a1 [file] [log] [blame]
// 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 {
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);
}
}
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);
}
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};
}
}