Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / EBuffer.js
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25 "use strict";
26
27 let eBufferCount = 0;
28 let canAllocateEBuffers = true;
29
30 class EBuffer {
31     constructor(size)
32     {
33         if (!canAllocateEBuffers)
34             throw new Error("Trying to allocate EBuffer while allocation is disallowed");
35         this._index = eBufferCount++;
36         this._array = new Array(size);
37     }
38     
39     static setCanAllocateEBuffers(value, callback)
40     {
41         let oldCanAllocateEBuffers = canAllocateEBuffers;
42         canAllocateEBuffers = value;
43         try {
44             return callback();
45         } finally {
46             canAllocateEBuffers = oldCanAllocateEBuffers;
47         }
48     }
49     
50     static disallowAllocation(callback)
51     {
52         return EBuffer.setCanAllocateEBuffers(false, callback);
53     }
54     
55     static allowAllocation(callback)
56     {
57         return EBuffer.setCanAllocateEBuffers(true, callback);
58     }
59     
60     get(index)
61     {
62         if (index < 0 || index >= this._array.length)
63             throw new Error("Out of bounds buffer access (buffer = " + this + ", index = " + index + ")");
64         return this._array[index];
65     }
66     
67     set(index, value)
68     {
69         if (index < 0 || index >= this._array.length)
70             throw new Error("out of bounds buffer access (buffer = " + this + ", index = " + index + ")");
71         this._array[index] = value;
72     }
73     
74     get index() { return this._index; }
75     
76     toString()
77     {
78         return "B" + this._index + ":[" + this._array + "]";
79     }
80 }