Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / StructType.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 StructType extends Type {
28     constructor(origin, name, typeParameters)
29     {
30         super();
31         this._origin = origin;
32         this._name = name;
33         this._typeParameters = typeParameters;
34         this._fields = new Map();
35     }
36     
37     add(field)
38     {
39         field.struct = this;
40         if (this._fields.has(field.name))
41             throw new WTypeError(field.origin.originString, "Duplicate field name: " + field.name);
42         this._fields.set(field.name, field);
43     }
44     
45     get name() { return this._name; }
46     get origin() { return this._origin; }
47     get typeParameters() { return this._typeParameters; }
48     
49     get fieldNames() { return this._fields.keys(); }
50     fieldByName(name) { return this._fields.get(name); }
51     get fields() { return this._fields.values(); }
52     get fieldMap() { return this._fields; }
53     get isPrimitive()
54     {
55         let result = true;
56         for (let field of this.fields)
57             result &= field.type.isPrimitive;
58         return result;
59     }
60     
61     instantiate(typeArguments = null)
62     {
63         let substitution = null;
64         let typeParameters = this.typeParameters;
65         
66         if (typeArguments) {
67             if (typeArguments.length != this.typeParameters.length)
68                 throw new WTypeError(this.origin.originString, "Wrong number of type arguments to instantiation");
69             
70             substitution = new Substitution(this.typeParameters, typeArguments);
71             typeParameters = [];
72         }
73         
74         let instantiateImmediates = new InstantiateImmediates();
75         let result = new StructType(this.origin, this.name, typeParameters);
76         for (let field of this.fields) {
77             let newField = field;
78             if (substitution)
79                 newField = newField.visit(substitution);
80             newField = newField.visit(instantiateImmediates);
81             result.add(newField);
82         }
83         
84         return result;
85     }
86     
87     populateDefaultValue(buffer, offset)
88     {
89         if (this.size == null)
90             throw new Error("Struct does not have layout: " + this + " " + describe(this));
91         for (let field of this.fields)
92             field.type.populateDefaultValue(buffer, offset + field.offset);
93     }
94     
95     toString()
96     {
97         return "struct " + this.name + "<" + this.typeParameters + "> { " + Array.from(this.fields).join("; ") + "; }";
98     }
99 }