6948ff2bd3af457de6a021e13caf54e60c30b1ad
[WebKit-https.git] / Tools / WebGPUShadingLanguageRI / IntLiteralType.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 class IntLiteralType extends Type {
28     constructor(origin, value)
29     {
30         super();
31         this._origin = origin;
32         this._value = value;
33         this.intType = new TypeRef(origin, "int", []);
34     }
35     
36     get origin() { return this._origin; }
37     get value() { return this._value; }
38     
39     get isPrimitive() { return true; }
40     get isUnifiable() { return true; }
41     
42     typeVariableUnify(unificationContext, other)
43     {
44         if (!(other instanceof Type))
45             return false;
46         
47         return this._typeVariableUnifyImpl(unificationContext, other);
48     }
49     
50     unifyImpl(unificationContext, other)
51     {
52         return this.typeVariableUnify(unificationContext, other);
53     }
54     
55     verifyAsArgument(unificationContext)
56     {
57         let realThis = unificationContext.find(this);
58         return realThis.isNumber && realThis.canRepresent(this.value);
59     }
60     
61     verifyAsParameter(unificationContext)
62     {
63         throw new Error("IntLiteralType should never be used as a type parameter");
64     }
65     
66     conversionCost(unificationContext)
67     {
68         let realThis = unificationContext.find(this);
69         if (realThis.equals(this.intType))
70             return 0;
71         return 1;
72     }
73     
74     commitUnification(unificationContext)
75     {
76         this.type = TypeRef.wrap(unificationContext.find(this));
77     }
78     
79     toString()
80     {
81         return "intLiteralType<" + this.value + ">";
82     }
83 }
84