Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / StructLayoutBuilder.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 StructLayoutBuilder extends Visitor {
28     constructor()
29     {
30         super();
31         this._offset = 0;
32     }
33     
34     visitReferenceType(node)
35     {
36     }
37     
38     visitStructType(node)
39     {
40         if (node.size != null)
41             return;
42         if (node.typeParameters.length)
43             throw new Error("Cannot do layout for generic type: " + node);
44         let oldOffset = this._offset;
45         this._offset = 0;
46         super.visitStructType(node);
47         node.size = this._offset;
48         this._offset += oldOffset;
49     }
50     
51     get offset() { return this._offset; }
52     
53     visitField(node)
54     {
55         super.visitField(node);
56         node.offset = this._offset;
57         let size = node.type.size;
58         if (size == null)
59             throw new Error("Type does not have size: " + node.type);
60         this._offset += size;
61     }
62     
63     visitNativeFuncInstance(node)
64     {
65         super.visitNativeFuncInstance(node);
66         node.func.didLayoutStructsInImplementationData(node.implementationData);
67     }
68     
69     visitTypeRef(node)
70     {
71         super.visitTypeRef(node);
72         node.type.visit(this);
73     }
74     
75     visitCallExpression(node)
76     {
77         for (let argument of node.argumentList)
78             Node.visit(argument, this);
79         let handleTypeArguments = actualTypeArguments => {
80             if (actualTypeArguments) {
81                 for (let argument of actualTypeArguments)
82                     argument.visit(this);
83             }
84         };
85         handleTypeArguments(node.instantiatedActualTypeArguments);
86         Node.visit(node.nativeFuncInstance, this);
87         Node.visit(node.resultType, this);
88     }
89 }
90