8565fc1497886e38cd3e606107cb796220548c6f
[WebKit-https.git] / PerformanceTests / RexBench / Basic / state.js
1 /*
2  * Copyright (C) 2016-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 class State {
28     constructor(program)
29     {
30         this.values = new CaselessMap();
31         this.stringValues = new CaselessMap();
32         this.sideState = new WeakMap();
33         this.statement = null;
34         this.nextLineNumber = 0;
35         this.subStack = [];
36         this.dataIndex = 0;
37         this.program = program;
38         this.rng = createRNGWithFixedSeed();
39         
40         let addNative = (name, callback) => {
41             this.values.set(name, new NativeFunction(callback));
42         };
43         
44         addNative("abs", x => Math.abs(x));
45         addNative("atn", x => Math.atan(x));
46         addNative("cos", x => Math.cos(x));
47         addNative("exp", x => Math.exp(x));
48         addNative("int", x => Math.floor(x));
49         addNative("log", x => Math.log(x));
50         addNative("rnd", () => this.rng());
51         addNative("sgn", x => Math.sign(x));
52         addNative("sin", x => Math.sin(x));
53         addNative("sqr", x => Math.sqrt(x));
54         addNative("tan", x => Math.tan(x));
55     }
56     
57     getValue(name, numParameters)
58     {
59         if (this.values.has(name))
60             return this.values.get(name);
61
62         let result;
63         if (numParameters == 0)
64             result = new NumberValue();
65         else {
66             let dim = [];
67             while (numParameters--)
68                 dim.push(11);
69             result = new NumberArray(dim);
70         }
71         this.values.set(name, result);
72         return result;
73     }
74     
75     getSideState(key)
76     {
77         if (!this.sideState.has(key)) {
78             let result = {};
79             this.sideState.set(key, result);
80             return result;
81         }
82         return this.sideState.get(key);
83     }
84     
85     abort(text)
86     {
87         if (!this.statement)
88             throw new Error("At beginning of execution: " + text);
89         throw new Error("At " + this.statement.sourceLineNumber + ": " + text);
90     }
91     
92     validate(predicate, text)
93     {
94         if (!predicate)
95             this.abort(text);
96     }
97 }
98