Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/qml/compiler/qv4compileddata.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||
2 | - | |||||||||||||
3 | - | |||||||||||||
4 | - | |||||||||||||
5 | - | |||||||||||||
6 | - | |||||||||||||
7 | - | |||||||||||||
8 | namespace QV4 { | - | ||||||||||||
9 | - | |||||||||||||
10 | namespace CompiledData { | - | ||||||||||||
11 | - | |||||||||||||
12 | static_assert(sizeof(Unit::libraryVersionHash) >= 40 + 1, "Compile hash length exceeds reserved size in data structure. Please adjust and bump the format version"); | - | ||||||||||||
13 | - | |||||||||||||
14 | CompilationUnit::CompilationUnit(const Unit *unitData) | - | ||||||||||||
15 | { | - | ||||||||||||
16 | data = unitData; | - | ||||||||||||
17 | } executed 2391957 times by 146 tests: end of block Executed by:
| 2391957 | ||||||||||||
18 | bool CompilationUnit::saveToDisk(const QString &outputFileName, QString *errorString) | - | ||||||||||||
19 | - | |||||||||||||
20 | - | |||||||||||||
21 | - | |||||||||||||
22 | { | - | ||||||||||||
23 | errorString->clear(); | - | ||||||||||||
24 | QSaveFile cacheFile(outputFileName); | - | ||||||||||||
25 | if (!cacheFile.open(QIODevice::WriteOnly | QIODevice::Truncate)
| 0-2726 | ||||||||||||
26 | *errorString = cacheFile.errorString(); | - | ||||||||||||
27 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
28 | } | - | ||||||||||||
29 | - | |||||||||||||
30 | QByteArray modifiedUnit; | - | ||||||||||||
31 | modifiedUnit.resize(data->unitSize); | - | ||||||||||||
32 | memcpy(modifiedUnit.data(), data, data->unitSize); | - | ||||||||||||
33 | const char *dataPtr = modifiedUnit.data(); | - | ||||||||||||
34 | Unit *unitPtr; | - | ||||||||||||
35 | memcpy(&unitPtr, &dataPtr, sizeof(unitPtr)); | - | ||||||||||||
36 | unitPtr->flags |= Unit::StaticData; | - | ||||||||||||
37 | - | |||||||||||||
38 | qint64 headerWritten = cacheFile.write(modifiedUnit); | - | ||||||||||||
39 | if (headerWritten != modifiedUnit.size()
| 0-2726 | ||||||||||||
40 | *errorString = cacheFile.errorString(); | - | ||||||||||||
41 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
42 | } | - | ||||||||||||
43 | - | |||||||||||||
44 | if (!cacheFile.commit()
| 0-2726 | ||||||||||||
45 | *errorString = cacheFile.errorString(); | - | ||||||||||||
46 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
47 | } | - | ||||||||||||
48 | - | |||||||||||||
49 | return executed 2726 times by 125 tests: true;return true; Executed by:
executed 2726 times by 125 tests: return true; Executed by:
| 2726 | ||||||||||||
50 | - | |||||||||||||
51 | - | |||||||||||||
52 | - | |||||||||||||
53 | - | |||||||||||||
54 | - | |||||||||||||
55 | } | - | ||||||||||||
56 | - | |||||||||||||
57 | Unit *CompilationUnit::createUnitData(QmlIR::Document *irDocument) | - | ||||||||||||
58 | { | - | ||||||||||||
59 | if (!irDocument->javaScriptCompilationUnit->data
| 24-48529 | ||||||||||||
60 | return executed 48529 times by 141 tests: irDocument->jsGenerator.generateUnit(QV4::Compiler::JSUnitGenerator::GenerateWithoutStringTable);return irDocument->jsGenerator.generateUnit(QV4::Compiler::JSUnitGenerator::GenerateWithoutStringTable); Executed by:
executed 48529 times by 141 tests: return irDocument->jsGenerator.generateUnit(QV4::Compiler::JSUnitGenerator::GenerateWithoutStringTable); Executed by:
| 48529 | ||||||||||||
61 | - | |||||||||||||
62 | QQmlRefPointer<QV4::CompiledData::CompilationUnit> compilationUnit = irDocument->javaScriptCompilationUnit; | - | ||||||||||||
63 | QV4::CompiledData::Unit *jsUnit = const_cast<QV4::CompiledData::Unit*>(compilationUnit->data); | - | ||||||||||||
64 | auto ensureWritableUnit = [&jsUnit, &compilationUnit]() { | - | ||||||||||||
65 | if (jsUnit == compilationUnit->data
| 4-24 | ||||||||||||
66 | char *unitCopy = (char*)malloc(jsUnit->unitSize); | - | ||||||||||||
67 | memcpy(unitCopy, jsUnit, jsUnit->unitSize); | - | ||||||||||||
68 | jsUnit = reinterpret_cast<QV4::CompiledData::Unit*>(unitCopy); | - | ||||||||||||
69 | } executed 24 times by 1 test: end of block Executed by:
| 24 | ||||||||||||
70 | } executed 28 times by 1 test: ;end of block Executed by:
| 28 | ||||||||||||
71 | - | |||||||||||||
72 | QV4::Compiler::StringTableGenerator &stringTable = irDocument->jsGenerator.stringTable; | - | ||||||||||||
73 | - | |||||||||||||
74 | if (jsUnit->sourceFileIndex == quint32(0)
| 0-24 | ||||||||||||
75 | ensureWritableUnit(); | - | ||||||||||||
76 | jsUnit->sourceFileIndex = stringTable.registerString(irDocument->jsModule.fileName); | - | ||||||||||||
77 | jsUnit->finalUrlIndex = stringTable.registerString(irDocument->jsModule.finalUrl); | - | ||||||||||||
78 | } executed 24 times by 1 test: end of block Executed by:
| 24 | ||||||||||||
79 | - | |||||||||||||
80 | - | |||||||||||||
81 | - | |||||||||||||
82 | - | |||||||||||||
83 | QVector<quint32> changedSignals; | - | ||||||||||||
84 | QVector<QQmlJS::AST::FormalParameterList*> changedSignalParameters; | - | ||||||||||||
85 | for (QmlIR::Object *o: qAsConst(irDocument->objects)) { | - | ||||||||||||
86 | for (QmlIR::Binding *binding = o->firstBinding(); binding
| 38-62 | ||||||||||||
87 | if (!(binding->flags & QV4::CompiledData::Binding::IsSignalHandlerExpression)
| 10-52 | ||||||||||||
88 | continue; executed 52 times by 1 test: continue; Executed by:
| 52 | ||||||||||||
89 | - | |||||||||||||
90 | quint32 functionIndex = binding->value.compiledScriptIndex; | - | ||||||||||||
91 | QmlIR::CompiledFunctionOrExpression *foe = o->functionsAndExpressions->slowAt(functionIndex); | - | ||||||||||||
92 | if (!foe
| 0-10 | ||||||||||||
93 | continue; never executed: continue; | 0 | ||||||||||||
94 | - | |||||||||||||
95 | - | |||||||||||||
96 | changedSignals << o->runtimeFunctionIndices.at(functionIndex); | - | ||||||||||||
97 | - | |||||||||||||
98 | ((foe->node) ? static_cast<void>(0) : qt_assert("foe->node", __FILE__, 499)); | - | ||||||||||||
99 | ((QQmlJS::AST::cast<QQmlJS::AST::FunctionDeclaration*>(foe->node)) ? static_cast<void>(0) : qt_assert("QQmlJS::AST::cast<QQmlJS::AST::FunctionDeclaration*>(foe->node)", __FILE__, 500)); | - | ||||||||||||
100 | - | |||||||||||||
101 | QQmlJS::AST::FormalParameterList *parameters = QQmlJS::AST::cast<QQmlJS::AST::FunctionDeclaration*>(foe->node)->formals; | - | ||||||||||||
102 | changedSignalParameters << parameters; | - | ||||||||||||
103 | - | |||||||||||||
104 | if (parameters
| 4-6 | ||||||||||||
105 | const QStringList formals = parameters->formals(); | - | ||||||||||||
106 | for (const QString &arg : formals) | - | ||||||||||||
107 | stringTable.registerString(arg); executed 4 times by 1 test: stringTable.registerString(arg); Executed by:
| 4 | ||||||||||||
108 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||
109 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||||||||
110 | } executed 38 times by 1 test: end of block Executed by:
| 38 | ||||||||||||
111 | - | |||||||||||||
112 | QVector<quint32> signalParameterNameTable; | - | ||||||||||||
113 | quint32 signalParameterNameTableOffset = jsUnit->unitSize; | - | ||||||||||||
114 | - | |||||||||||||
115 | - | |||||||||||||
116 | if (!changedSignals.isEmpty()
| 8-16 | ||||||||||||
117 | if (jsUnit == compilationUnit->data
| 0-8 | ||||||||||||
118 | char *unitCopy = (char*)malloc(jsUnit->unitSize); | - | ||||||||||||
119 | memcpy(unitCopy, jsUnit, jsUnit->unitSize); | - | ||||||||||||
120 | jsUnit = reinterpret_cast<QV4::CompiledData::Unit*>(unitCopy); | - | ||||||||||||
121 | } never executed: end of block | 0 | ||||||||||||
122 | - | |||||||||||||
123 | for (int i = 0; i < changedSignals.count()
| 8-10 | ||||||||||||
124 | const uint functionIndex = changedSignals.at(i); | - | ||||||||||||
125 | - | |||||||||||||
126 | QV4::CompiledData::Function *function = const_cast<QV4::CompiledData::Function *>(jsUnit->functionAt(functionIndex)); | - | ||||||||||||
127 | ((function->nFormals == quint32(0)) ? static_cast<void>(0) : qt_assert("function->nFormals == quint32(0)", __FILE__, 528)); | - | ||||||||||||
128 | - | |||||||||||||
129 | function->formalsOffset = signalParameterNameTableOffset - jsUnit->functionOffsetTable()[functionIndex]; | - | ||||||||||||
130 | - | |||||||||||||
131 | if (QQmlJS::AST::FormalParameterList *parameters = changedSignalParameters.at(i)
| 4-6 | ||||||||||||
132 | const QStringList formals = parameters->formals(); | - | ||||||||||||
133 | for (const QString &arg : formals) | - | ||||||||||||
134 | signalParameterNameTable.append(stringTable.getStringId(arg)); executed 4 times by 1 test: signalParameterNameTable.append(stringTable.getStringId(arg)); Executed by:
| 4 | ||||||||||||
135 | - | |||||||||||||
136 | function->nFormals = formals.size(); | - | ||||||||||||
137 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||
138 | function->length = function->nFormals; | - | ||||||||||||
139 | - | |||||||||||||
140 | signalParameterNameTableOffset += function->nFormals * sizeof(quint32); | - | ||||||||||||
141 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||||||||
142 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
143 | - | |||||||||||||
144 | if (!signalParameterNameTable.isEmpty()
| 4-20 | ||||||||||||
145 | ensureWritableUnit(); | - | ||||||||||||
146 | ((jsUnit != compilationUnit->data) ? static_cast<void>(0) : qt_assert("jsUnit != compilationUnit->data", __FILE__, 547)); | - | ||||||||||||
147 | const uint signalParameterTableSize = signalParameterNameTable.count() * sizeof(quint32); | - | ||||||||||||
148 | uint newSize = jsUnit->unitSize + signalParameterTableSize; | - | ||||||||||||
149 | const uint oldSize = jsUnit->unitSize; | - | ||||||||||||
150 | char *unitWithSignalParameters = (char*)realloc(jsUnit, newSize); | - | ||||||||||||
151 | memcpy(unitWithSignalParameters + oldSize, signalParameterNameTable.constData(), signalParameterTableSize); | - | ||||||||||||
152 | jsUnit = reinterpret_cast<QV4::CompiledData::Unit*>(unitWithSignalParameters); | - | ||||||||||||
153 | jsUnit->unitSize = newSize; | - | ||||||||||||
154 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||
155 | - | |||||||||||||
156 | if (jsUnit != compilationUnit->data
| 0-24 | ||||||||||||
157 | jsUnit->flags &= ~QV4::CompiledData::Unit::StaticData; executed 24 times by 1 test: jsUnit->flags &= ~QV4::CompiledData::Unit::StaticData; Executed by:
| 24 | ||||||||||||
158 | - | |||||||||||||
159 | return executed 24 times by 1 test: jsUnit;return jsUnit; Executed by:
executed 24 times by 1 test: return jsUnit; Executed by:
| 24 | ||||||||||||
160 | } | - | ||||||||||||
161 | - | |||||||||||||
162 | QString Binding::valueAsString(const Unit *unit) const | - | ||||||||||||
163 | { | - | ||||||||||||
164 | switch (type) { | - | ||||||||||||
165 | case executed 4414 times by 19 tests: Type_Script:case Type_Script: Executed by:
executed 4414 times by 19 tests: case Type_Script: Executed by:
| 4414 | ||||||||||||
166 | case executed 272438 times by 118 tests: Type_String:case Type_String: Executed by:
executed 272438 times by 118 tests: case Type_String: Executed by:
| 272438 | ||||||||||||
167 | return executed 276852 times by 120 tests: unit->stringAt(stringIndex);return unit->stringAt(stringIndex); Executed by:
executed 276852 times by 120 tests: return unit->stringAt(stringIndex); Executed by:
| 276852 | ||||||||||||
168 | case never executed: Type_Boolean:case Type_Boolean: never executed: case Type_Boolean: | 0 | ||||||||||||
169 | return never executed: value.b ? ([]() noexcept -> QString { enum { Size = sizeof(u"" "true")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "true" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); returnreturn value.b ? ([]() noexcept -> QString { enum { Size = sizeof(u"" "true")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "true" }; QStringDataPtr holder = { qstring_literal.data_p...static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "false" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return qstring_literal_temp; }()); never executed: qstring_literal_temp;return qstring_literal_temp; never executed: }()) : ([]() noexcept -> QString { enum { Size = sizeof(u"" "false")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "false" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); returnreturn qstring_literal_temp; never executed: qstring_literal_temp;return qstring_literal_temp; never executed: }());return qstring_literal_temp; never executed: return value.b ? ([]() noexcept -> QString { enum { Size = sizeof(u"" "true")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "true" }; QStringDataPtr holder = { qstring_literal.data_p...static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "false" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return qstring_literal_temp; }()); | 0 | ||||||||||||
170 | case executed 184 times by 4 tests: Type_Number:case Type_Number: Executed by:
executed 184 times by 4 tests: case Type_Number: Executed by:
| 184 | ||||||||||||
171 | return executed 184 times by 4 tests: QString::number(valueAsNumber());return QString::number(valueAsNumber()); Executed by:
executed 184 times by 4 tests: return QString::number(valueAsNumber()); Executed by:
| 184 | ||||||||||||
172 | case never executed: Type_Invalid:case Type_Invalid: never executed: case Type_Invalid: | 0 | ||||||||||||
173 | return never executed: QString();return QString(); never executed: return QString(); | 0 | ||||||||||||
174 | - | |||||||||||||
175 | - | |||||||||||||
176 | - | |||||||||||||
177 | - | |||||||||||||
178 | - | |||||||||||||
179 | case executed 8 times by 3 tests: Type_TranslationById:case Type_TranslationById: Executed by:
executed 8 times by 3 tests: {case Type_TranslationById: Executed by:
| 8 | ||||||||||||
180 | QByteArray id = unit->stringAt(stringIndex).toUtf8(); | - | ||||||||||||
181 | return executed 8 times by 3 tests: qtTrId(id.constData(), value.translationData.number);return qtTrId(id.constData(), value.translationData.number); Executed by:
executed 8 times by 3 tests: return qtTrId(id.constData(), value.translationData.number); Executed by:
| 8 | ||||||||||||
182 | } | - | ||||||||||||
183 | case executed 42 times by 7 tests: Type_Translation:case Type_Translation: Executed by:
executed 42 times by 7 tests: {case Type_Translation: Executed by:
| 42 | ||||||||||||
184 | - | |||||||||||||
185 | const QString &path = unit->stringAt(unit->sourceFileIndex); | - | ||||||||||||
186 | int lastSlash = path.lastIndexOf(QLatin1Char('/')); | - | ||||||||||||
187 | QStringRef context = (
| 2-40 | ||||||||||||
188 | : QStringRef(); | - | ||||||||||||
189 | QByteArray contextUtf8 = context.toUtf8(); | - | ||||||||||||
190 | QByteArray comment = unit->stringAt(value.translationData.commentIndex).toUtf8(); | - | ||||||||||||
191 | QByteArray text = unit->stringAt(stringIndex).toUtf8(); | - | ||||||||||||
192 | return executed 42 times by 7 tests: QCoreApplication::translate(contextUtf8.constData(), text.constData(),return QCoreApplication::translate(contextUtf8.constData(), text.constData(), comment.constData(), value.translationData.number); Executed by:
executed 42 times by 7 tests: return QCoreApplication::translate(contextUtf8.constData(), text.constData(), comment.constData(), value.translationData.number); Executed by:
| 42 | ||||||||||||
193 | comment.constData(), value.translationData.number); executed 42 times by 7 tests: return QCoreApplication::translate(contextUtf8.constData(), text.constData(), comment.constData(), value.translationData.number); Executed by:
| 42 | ||||||||||||
194 | } | - | ||||||||||||
195 | - | |||||||||||||
196 | default never executed: :default: never executed: default: | 0 | ||||||||||||
197 | break; never executed: break; | 0 | ||||||||||||
198 | } | - | ||||||||||||
199 | return never executed: QString();return QString(); never executed: return QString(); | 0 | ||||||||||||
200 | } | - | ||||||||||||
201 | - | |||||||||||||
202 | - | |||||||||||||
203 | QString Binding::escapedString(const QString &string) | - | ||||||||||||
204 | { | - | ||||||||||||
205 | QString tmp = QLatin1String("\""); | - | ||||||||||||
206 | for (int i = 0; i < string.length()
| 0 | ||||||||||||
207 | const QChar &c = string.at(i); | - | ||||||||||||
208 | switch (c.unicode()) { | - | ||||||||||||
209 | case never executed: 0x08:case 0x08: never executed: case 0x08: | 0 | ||||||||||||
210 | tmp += QLatin1String("\\b"); | - | ||||||||||||
211 | break; never executed: break; | 0 | ||||||||||||
212 | case never executed: 0x09:case 0x09: never executed: case 0x09: | 0 | ||||||||||||
213 | tmp += QLatin1String("\\t"); | - | ||||||||||||
214 | break; never executed: break; | 0 | ||||||||||||
215 | case never executed: 0x0A:case 0x0A: never executed: case 0x0A: | 0 | ||||||||||||
216 | tmp += QLatin1String("\\n"); | - | ||||||||||||
217 | break; never executed: break; | 0 | ||||||||||||
218 | case never executed: 0x0B:case 0x0B: never executed: case 0x0B: | 0 | ||||||||||||
219 | tmp += QLatin1String("\\v"); | - | ||||||||||||
220 | break; never executed: break; | 0 | ||||||||||||
221 | case never executed: 0x0C:case 0x0C: never executed: case 0x0C: | 0 | ||||||||||||
222 | tmp += QLatin1String("\\f"); | - | ||||||||||||
223 | break; never executed: break; | 0 | ||||||||||||
224 | case never executed: 0x0D:case 0x0D: never executed: case 0x0D: | 0 | ||||||||||||
225 | tmp += QLatin1String("\\r"); | - | ||||||||||||
226 | break; never executed: break; | 0 | ||||||||||||
227 | case never executed: 0x22:case 0x22: never executed: case 0x22: | 0 | ||||||||||||
228 | tmp += QLatin1String("\\\""); | - | ||||||||||||
229 | break; never executed: break; | 0 | ||||||||||||
230 | case never executed: 0x27:case 0x27: never executed: case 0x27: | 0 | ||||||||||||
231 | tmp += QLatin1String("\\\'"); | - | ||||||||||||
232 | break; never executed: break; | 0 | ||||||||||||
233 | case never executed: 0x5C:case 0x5C: never executed: case 0x5C: | 0 | ||||||||||||
234 | tmp += QLatin1String("\\\\"); | - | ||||||||||||
235 | break; never executed: break; | 0 | ||||||||||||
236 | default never executed: :default: never executed: default: | 0 | ||||||||||||
237 | tmp += c; | - | ||||||||||||
238 | break; never executed: break; | 0 | ||||||||||||
239 | } | - | ||||||||||||
240 | } | - | ||||||||||||
241 | tmp += QLatin1Char('\"'); | - | ||||||||||||
242 | return never executed: tmp;return tmp; never executed: return tmp; | 0 | ||||||||||||
243 | } | - | ||||||||||||
244 | - | |||||||||||||
245 | QString Binding::valueAsScriptString(const Unit *unit) const | - | ||||||||||||
246 | { | - | ||||||||||||
247 | if (type == Type_String
| 0-4532 | ||||||||||||
248 | return never executed: escapedString(unit->stringAt(stringIndex));return escapedString(unit->stringAt(stringIndex)); never executed: return escapedString(unit->stringAt(stringIndex)); | 0 | ||||||||||||
249 | else | - | ||||||||||||
250 | return executed 4532 times by 14 tests: valueAsString(unit);return valueAsString(unit); Executed by:
executed 4532 times by 14 tests: return valueAsString(unit); Executed by:
| 4532 | ||||||||||||
251 | } | - | ||||||||||||
252 | void CompilationUnit::destroy() | - | ||||||||||||
253 | { | - | ||||||||||||
254 | - | |||||||||||||
255 | - | |||||||||||||
256 | - | |||||||||||||
257 | - | |||||||||||||
258 | - | |||||||||||||
259 | delete this; | - | ||||||||||||
260 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||||||||
261 | - | |||||||||||||
262 | - | |||||||||||||
263 | void Unit::generateChecksum() | - | ||||||||||||
264 | { | - | ||||||||||||
265 | memset(md5Checksum, 0, sizeof(md5Checksum)); | - | ||||||||||||
266 | - | |||||||||||||
267 | } executed 2383537 times by 146 tests: end of block Executed by:
| 2383537 | ||||||||||||
268 | - | |||||||||||||
269 | bool Unit::verifyHeader(QDateTime expectedSourceTimeStamp, QString *errorString) const | - | ||||||||||||
270 | { | - | ||||||||||||
271 | (void)expectedSourceTimeStamp; | - | ||||||||||||
272 | (void)errorString; | - | ||||||||||||
273 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
274 | - | |||||||||||||
275 | } | - | ||||||||||||
276 | - | |||||||||||||
277 | } | - | ||||||||||||
278 | - | |||||||||||||
279 | } | - | ||||||||||||
280 | - | |||||||||||||
281 | - | |||||||||||||
Switch to Source code | Preprocessed file |