]> git.saurik.com Git - apple/javascriptcore.git/blame - replay/scripts/CodeGeneratorReplayInputsTemplates.py
JavaScriptCore-7601.1.46.3.tar.gz
[apple/javascriptcore.git] / replay / scripts / CodeGeneratorReplayInputsTemplates.py
CommitLineData
81345200
A
1#!/usr/bin/env python
2# Copyright (c) 2011 Google Inc. All rights reserved.
3# Copyright (c) 2012 Intel Corporation. All rights reserved.
4# Copyright (c) 2013, 2014 Apple Inc. All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions are
8# met:
9#
10# * Redistributions of source code must retain the above copyright
11# notice, this list of conditions and the following disclaimer.
12# * Redistributions in binary form must reproduce the above
13# copyright notice, this list of conditions and the following disclaimer
14# in the documentation and/or other materials provided with the
15# distribution.
16# * Neither the name of Google Inc. nor the names of its
17# contributors may be used to endorse or promote products derived from
18# this software without specific prior written permission.
19#
20# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32
33# Generator templates, which can be filled with string.Template.
34# Following are classes that fill the templates from the typechecked model.
35
36class Templates:
37 CopyrightBlock = (
38 """/*
39 * Copyright (C) 2014 Apple Inc. All rights reserved.
40 *
41 * Redistribution and use in source and binary forms, with or without
42 * modification, are permitted provided that the following conditions
43 * are met:
44 *
45 * 1. Redistributions of source code must retain the above copyright
46 * notice, this list of conditions and the following disclaimer.
47 * 2. Redistributions in binary form must reproduce the above copyright
48 * notice, this list of conditions and the following disclaimer in the
49 * documentation and/or other materials provided with the distribution.
50 *
51 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
52 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
53 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
54 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
55 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
56 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
57 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
58 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
59 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
60 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
61 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62 */
63
64// DO NOT EDIT THIS FILE. It is automatically generated from ${inputFilename}
65// by the script: JavaScriptCore/replay/scripts/CodeGeneratorReplayInputs.py""")
66
67 HeaderSkeleton = (
68 """${licenseBlock}
69
70#ifndef ${headerGuard}
71#define ${headerGuard}
72
73#if ${guardCondition}
74${includes}
75
76${typeForwardDeclarations}
77
78namespace ${inputsNamespace} {
79${inputForwardDeclarations}
80} // namespace ${inputsNamespace}
81
82namespace ${traitsNamespace} {
83${inputTraitDeclarations}
84${enumTraitDeclarations}
85} // namespace ${traitsNamespace}
86
87namespace ${inputsNamespace} {
88${inputClassDeclarations}
89} // namespace ${inputsNamespace}
90
ed1e77d3
A
91${inputTypeTraitDeclarations}
92
81345200
A
93${forEachMacro}
94
95#endif // ${guardCondition}
96
97#endif // ${filename}_h
98""")
99
100 InputTraitsDeclaration = (
101 """template<> ${structOrClass} InputTraits<${qualifiedInputName}> {
102 static InputQueue queue() { return InputQueue::${queueType}; }
ed1e77d3 103 static const String& type();
81345200
A
104
105 static void encode(JSC::EncodedValue&, const ${qualifiedInputName}&);
106 static bool decode(JSC::EncodedValue&, std::unique_ptr<${qualifiedInputName}>&);
107};""")
108
ed1e77d3
A
109 InputTypeTraitsDeclaration = (
110 """SPECIALIZE_TYPE_TRAITS_BEGIN(${qualifiedInputName})
111 static bool isType(const NondeterministicInputBase& input) { return input.type() == InputTraits<${qualifiedInputName}>::type(); }
112SPECIALIZE_TYPE_TRAITS_END()""")
113
81345200 114 EnumTraitDeclaration = (
ed1e77d3
A
115 """template<> ${structOrClass} EncodingTraits<${encodingTypeArgument}> {
116 typedef ${enumType} DecodedType;
81345200 117
ed1e77d3
A
118 static EncodedValue encodeValue(const ${enumType}& value);
119 static bool decodeValue(EncodedValue&, ${enumType}& value);
81345200
A
120};""")
121
122 EnumClassTraitDeclaration = (
ed1e77d3
A
123 """template<> ${structOrClass} EncodingTraits<${encodingTypeArgument}> {
124 typedef ${enumType} DecodedType;
81345200 125
ed1e77d3
A
126 static EncodedValue encodeValue(const ${enumType}& value);
127 static bool decodeValue(EncodedValue&, ${enumType}& value);
81345200
A
128};""")
129
130 InputClassDeclaration = (
131 """class ${inputName} : public ${baseClass} {
132public:
133${inputConstructor}
134${inputDestructor}
135${extraDeclarations}
136${memberGetters}
137${memberDeclarations}
138};""")
139
140 ImplementationSkeleton = (
141 """${licenseBlock}
142
143#include "config.h"
144#include "${filename}.h"
145
146#if ${guardCondition}
147${includes}
148
149namespace ${inputsNamespace} {
150${inputClassImplementations}
151} // namespace ${inputsNamespace}
152
153namespace ${traitsNamespace} {
154${inputTraitImplementations}
155${enumTraitImplementations}
156} // namespace ${traitsNamespace}
157
158#endif // ${guardCondition}
159""")
160
161 InputTraitsImplementation = (
ed1e77d3 162 """const String& InputTraits<${qualifiedInputName}>::type()
81345200 163{
ed1e77d3
A
164 static NeverDestroyed<const String> type(ASCIILiteral(${inputNameStringLiteral}));
165 return type;
81345200
A
166}
167
168void InputTraits<${qualifiedInputName}>::encode(EncodedValue& encodedValue, const ${qualifiedInputName}& input)
169{
170${encodeSteps}
171}
172
173bool InputTraits<${qualifiedInputName}>::decode(EncodedValue& encodedValue, std::unique_ptr<${qualifiedInputName}>& input)
174{
175${decodeSteps}
176 input = std::make_unique<${qualifiedInputName}>(${constructorArguments});
177 return true;
178}""")
179
180 EnumClassTraitImplementation = (
ed1e77d3 181 """EncodedValue EncodingTraits<${encodingTypeArgument}>::encodeValue(const ${enumType}& enumValue)
81345200
A
182{
183 switch (enumValue) {
184${encodeCases}
185 default: ASSERT_NOT_REACHED(); return EncodedValue::createString("Error!");
186 }
187}
188
ed1e77d3 189bool EncodingTraits<${encodingTypeArgument}>::decodeValue(EncodedValue& encodedValue, ${enumType}& enumValue)
81345200
A
190{
191 String enumString = encodedValue.convertTo<String>();
192${decodeCases}
193 return false;
194}""")
195
196 EnumClassEncodeCase = (
197 """ case ${qualifiedEnumValue}: return EncodedValue::createString("${enumStringValue}");""")
198
199 EnumClassDecodeCase = (
200 """ if (enumString == "${enumStringValue}") {
201 enumValue = ${qualifiedEnumValue};
202 return true;
203 }""")
204
205 EnumTraitImplementation = (
ed1e77d3 206 """EncodedValue EncodingTraits<${encodingTypeArgument}>::encodeValue(const ${enumType}& enumValue)
81345200
A
207{
208 EncodedValue encodedValue = EncodedValue::createArray();
209${encodeCases}
210 return encodedValue;
211}
212
ed1e77d3 213bool EncodingTraits<${encodingTypeArgument}>::decodeValue(EncodedValue& encodedValue, ${enumType}& enumValue)
81345200
A
214{
215 Vector<String> enumStrings;
216 if (!EncodingTraits<Vector<String>>::decodeValue(encodedValue, enumStrings))
217 return false;
218
ed1e77d3 219 for (const String& enumString : enumStrings) {
81345200
A
220${decodeCases}
221 }
222
223 return true;
224}""")
225
226 EnumEncodeCase = (
227 """ if (enumValue & ${qualifiedEnumValue}) {
228 encodedValue.append<String>(ASCIILiteral("${enumStringValue}"));
229 if (enumValue == ${qualifiedEnumValue})
230 return encodedValue;
231 }""")
232
233 EnumDecodeCase = (
ed1e77d3 234 """ ${branchKeyword} (enumString == "${enumStringValue}")
81345200
A
235 enumValue = static_cast<${qualifiedEnumName}>(enumValue | ${qualifiedEnumValue});""")
236
81345200
A
237 InputClassImplementation = (
238 """${inputName}::${inputName}(${constructorFormalsList})
239${initializerList}
240{
241}
242
243${inputName}::~${inputName}()
244{
245}""")