benchmarks/JetStream2/WSL/EPtr.js (48 lines of code) (raw):

/* * Copyright (C) 2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ "use strict"; class EPtr { constructor(buffer, offset) { if (offset == null || offset != offset) throw new Error("Bad offset: " + offset); this._buffer = buffer; this._offset = offset; } // The interpreter always passes around pointers to things. This means that sometimes we will // want to return a value but we have to "invent" a pointer to that value. No problem, this // function is here to help. // // In a real execution environment, uses of this manifest as SSA temporaries. static box(value) { return new EPtr(new EBuffer(1), 0).box(value); } box(value) { this._buffer.set(0, value); return this; } get buffer() { return this._buffer; } get offset() { return this._offset; } plus(offset) { return new EPtr(this.buffer, this.offset + offset); } loadValue() { return this.buffer.get(this.offset); } get(offset) { return this.buffer.get(this.offset + offset); } set(offset, value) { this.buffer.set(this.offset + offset, value); } copyFrom(other, size) { if (size == null) throw new Error("Cannot copy null size"); for (let i = size; i--;) this.set(i, other.get(i)); } toString() { return "B" + this.buffer.index + ":" + this.offset; } }