diff options
Diffstat (limited to 'deps/v8/src/builtins/growable-fixed-array.tq')
-rw-r--r-- | deps/v8/src/builtins/growable-fixed-array.tq | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/deps/v8/src/builtins/growable-fixed-array.tq b/deps/v8/src/builtins/growable-fixed-array.tq new file mode 100644 index 0000000000..eb62e56c98 --- /dev/null +++ b/deps/v8/src/builtins/growable-fixed-array.tq @@ -0,0 +1,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{kEmptyFixedArray, 0, 0}; + } +} |