Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / CreateLiteralType.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 function createLiteralType(config)
28 {
29     class GenericLiteralType extends Type {
30         constructor(origin, value)
31         {
32             super();
33             this._origin = origin;
34             this._value = value;
35             this.preferredType = new TypeRef(origin, config.preferredTypeName, []);
36         }
37         
38         get origin() { return this._origin; }
39         get value() { return this._value; }
40         
41         get isPrimitive() { return true; }
42         get isUnifiable() { return true; }
43         get isLiteral() { return true; }
44         
45         typeVariableUnify(unificationContext, other)
46         {
47             if (!(other instanceof Type))
48                 return false;
49             
50             return this._typeVariableUnifyImpl(unificationContext, other);
51         }
52         
53         unifyImpl(unificationContext, other)
54         {
55             return this.typeVariableUnify(unificationContext, other);
56         }
57         
58         prepareToVerify(unificationContext)
59         {
60             let realThis = unificationContext.find(this);
61             if (realThis instanceof TypeVariable || realThis.isLiteral) {
62                 return () => {
63                     if (realThis.unify(unificationContext, this.preferredType))
64                         return {result: true};
65                     return {result: false, reason: "Type mismatch between " + unificationContext.find(realThis) + " and " + this.preferredType};
66                 };
67             }
68         }
69         
70         verifyAsArgument(unificationContext)
71         {
72             return config.verifyAsArgument.call(this, unificationContext);
73         }
74         
75         verifyAsParameter(unificationContext)
76         {
77             throw new Error("GenericLiteralType should never be used as a type parameter");
78         }
79         
80         conversionCost(unificationContext)
81         {
82             let realThis = unificationContext.find(this);
83             if (realThis.equals(this.preferredType))
84                 return 0;
85             return 1;
86         }
87         
88         commitUnification(unificationContext)
89         {
90             this.type = unificationContext.find(this).visit(new AutoWrapper());
91         }
92         
93         toString()
94         {
95             return config.preferredTypeName + "LiteralType<" + this.value + ">";
96         }
97     }
98     
99     return GenericLiteralType;
100 }
101