[Setting] Only expose experimental features that are compiled in
[WebKit-https.git] / PerformanceTests / RexBench / Basic / number.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 NumberValue {
28     constructor(value = 0)
29     {
30         this._value = value;
31     }
32     
33     get value() { return this._value; }
34     
35     apply(state, parameters)
36     {
37         state.validate(parameters.length == 0, "Should not pass arguments to simple numeric variables");
38         return this._value;
39     }
40     
41     leftApply(state, parameters)
42     {
43         state.validate(parameters.length == 0, "Should not pass arguments to simple numeric variables");
44         return this;
45     }
46     
47     assign(value)
48     {
49         this._value = value;
50     }
51 }
52
53 class NumberArray {
54     constructor(dim = [11])
55     {
56         function allocateDim(index)
57         {
58             let result = new Array(dim[index]);
59             if (index + 1 < dim.length) {
60                 for (let i = 0; i < dim[index]; ++i)
61                     result[i] = allocateDim(index + 1);
62             } else {
63                 for (let i = 0; i < dim[index]; ++i)
64                     result[i] = new NumberValue();
65             }
66             return result;
67         }
68         
69         this._array = allocateDim(0);
70         this._dim = dim;
71     }
72     
73     apply(state, parameters)
74     {
75         return this.leftApply(state, parameters).apply(state, []);
76     }
77     
78     leftApply(state, parameters)
79     {
80         if (this._dim.length != parameters.length)
81             state.abort("Expected " + this._dim.length + " arguments but " + parameters.length + " were passed.");
82         let result = this._array;
83         for (var i = 0; i < parameters.length; ++i) {
84             let index = Math.floor(parameters[i]);
85             if (!(index >= state.program.base) || !(index < result.length))
86                 state.abort("Index out of bounds: " + index);
87             result = result[index];
88         }
89         return result;
90     }
91 }
92
93 class NumberFunction {
94     constructor(parameters, code)
95     {
96         this._parameters = parameters;
97         this._code = code;
98     }
99     
100     apply(state, parameters)
101     {
102         if (this._parameters.length != parameters.length)
103             state.abort("Expected " + this._parameters.length + " arguments but " + parameters.length + " were passed");
104         let oldValues = state.values;
105         state.values = new Map(oldValues);
106         for (let i = 0; i < parameters.length; ++i)
107             state.values.set(this._parameters[i], parameters[i]);
108         let result = this.code.evaluate(state);
109         state.values = oldValues;
110         return result;
111     }
112     
113     leftApply(state, parameters)
114     {
115         state.abort("Cannot use a function as an lvalue");
116     }
117 }
118
119 class NativeFunction {
120     constructor(callback)
121     {
122         this._callback = callback;
123     }
124     
125     apply(state, parameters)
126     {
127         if (this._callback.length != parameters.length)
128             state.abort("Expected " + this._callback.length + " arguments but " + parameters.length + " were passed");
129         return this._callback(...parameters);
130     }
131     
132     leftApply(state, parameters)
133     {
134         state.abort("Cannot use a native function as an lvalue");
135     }
136 }
137