annotate generator/jumptable.cpp @ 393:1049b01aebd2

Fixed generator segfaults on OS X 10.6. Regarding the change to dgenerator.cpp, I am not actually sure if 0 is the correct value to pass, but it seems to work and the code which had been there before was just plain incorrect ? it read past the list boundaries.
author David Nadlinger <code@klickverbot.at>
date Sat, 28 Aug 2010 02:55:55 +0200
parents 1349940724eb
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /****************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
2 **
e78566595089 initial import
mandel
parents:
diff changeset
3 ** Copyright (C) 1992-2008 Nokia. All rights reserved.
e78566595089 initial import
mandel
parents:
diff changeset
4 **
e78566595089 initial import
mandel
parents:
diff changeset
5 ** This file is part of Qt Jambi.
e78566595089 initial import
mandel
parents:
diff changeset
6 **
e78566595089 initial import
mandel
parents:
diff changeset
7 ** * Commercial Usage
e78566595089 initial import
mandel
parents:
diff changeset
8 * Licensees holding valid Qt Commercial licenses may use this file in
e78566595089 initial import
mandel
parents:
diff changeset
9 * accordance with the Qt Commercial License Agreement provided with the
e78566595089 initial import
mandel
parents:
diff changeset
10 * Software or, alternatively, in accordance with the terms contained in
e78566595089 initial import
mandel
parents:
diff changeset
11 * a written agreement between you and Nokia.
e78566595089 initial import
mandel
parents:
diff changeset
12 *
e78566595089 initial import
mandel
parents:
diff changeset
13 *
e78566595089 initial import
mandel
parents:
diff changeset
14 * GNU General Public License Usage
e78566595089 initial import
mandel
parents:
diff changeset
15 * Alternatively, this file may be used under the terms of the GNU
e78566595089 initial import
mandel
parents:
diff changeset
16 * General Public License versions 2.0 or 3.0 as published by the Free
e78566595089 initial import
mandel
parents:
diff changeset
17 * Software Foundation and appearing in the file LICENSE.GPL included in
e78566595089 initial import
mandel
parents:
diff changeset
18 * the packaging of this file. Please review the following information
e78566595089 initial import
mandel
parents:
diff changeset
19 * to ensure GNU General Public Licensing requirements will be met:
e78566595089 initial import
mandel
parents:
diff changeset
20 * http://www.fsf.org/licensing/licenses/info/GPLv2.html and
e78566595089 initial import
mandel
parents:
diff changeset
21 * http://www.gnu.org/copyleft/gpl.html. In addition, as a special
e78566595089 initial import
mandel
parents:
diff changeset
22 * exception, Nokia gives you certain additional rights. These rights
e78566595089 initial import
mandel
parents:
diff changeset
23 * are described in the Nokia Qt GPL Exception version 1.2, included in
e78566595089 initial import
mandel
parents:
diff changeset
24 * the file GPL_EXCEPTION.txt in this package.
e78566595089 initial import
mandel
parents:
diff changeset
25 *
e78566595089 initial import
mandel
parents:
diff changeset
26 * Qt for Windows(R) Licensees
e78566595089 initial import
mandel
parents:
diff changeset
27 * As a special exception, Nokia, as the sole copyright holder for Qt
e78566595089 initial import
mandel
parents:
diff changeset
28 * Designer, grants users of the Qt/Eclipse Integration plug-in the
e78566595089 initial import
mandel
parents:
diff changeset
29 * right for the Qt/Eclipse Integration to link to functionality
e78566595089 initial import
mandel
parents:
diff changeset
30 * provided by Qt Designer and its related libraries.
e78566595089 initial import
mandel
parents:
diff changeset
31 *
e78566595089 initial import
mandel
parents:
diff changeset
32 *
e78566595089 initial import
mandel
parents:
diff changeset
33 * If you are unsure which license is appropriate for your use, please
e78566595089 initial import
mandel
parents:
diff changeset
34 * contact the sales department at qt-sales@nokia.com.
e78566595089 initial import
mandel
parents:
diff changeset
35
e78566595089 initial import
mandel
parents:
diff changeset
36 **
e78566595089 initial import
mandel
parents:
diff changeset
37 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
e78566595089 initial import
mandel
parents:
diff changeset
38 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e78566595089 initial import
mandel
parents:
diff changeset
39 **
e78566595089 initial import
mandel
parents:
diff changeset
40 ****************************************************************************/
e78566595089 initial import
mandel
parents:
diff changeset
41
e78566595089 initial import
mandel
parents:
diff changeset
42 #include "jumptable.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "cppimplgenerator.h"
e78566595089 initial import
mandel
parents:
diff changeset
44 #include "reporthandler.h"
e78566595089 initial import
mandel
parents:
diff changeset
45 #include "fileout.h"
e78566595089 initial import
mandel
parents:
diff changeset
46
e78566595089 initial import
mandel
parents:
diff changeset
47
e78566595089 initial import
mandel
parents:
diff changeset
48 static QHash<QString, QString> shortNames;
e78566595089 initial import
mandel
parents:
diff changeset
49 static QHash<char, QString> expandNamesJNI;
e78566595089 initial import
mandel
parents:
diff changeset
50 static QHash<char, QString> expandNamesJava;
e78566595089 initial import
mandel
parents:
diff changeset
51
e78566595089 initial import
mandel
parents:
diff changeset
52 bool JumpTableGenerator::active = false;
e78566595089 initial import
mandel
parents:
diff changeset
53
e78566595089 initial import
mandel
parents:
diff changeset
54 static QString simplifyName(const QString &name, const QString &context, const QString &funcName)
e78566595089 initial import
mandel
parents:
diff changeset
55 {
e78566595089 initial import
mandel
parents:
diff changeset
56 if (shortNames.size() == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
57 shortNames.insert("jboolean", "Z");
e78566595089 initial import
mandel
parents:
diff changeset
58 shortNames.insert("jbyte", "B");
e78566595089 initial import
mandel
parents:
diff changeset
59 shortNames.insert("jchar", "C");
e78566595089 initial import
mandel
parents:
diff changeset
60 shortNames.insert("jshort", "S");
e78566595089 initial import
mandel
parents:
diff changeset
61 shortNames.insert("jint", "I");
e78566595089 initial import
mandel
parents:
diff changeset
62 shortNames.insert("jlong", "J");
e78566595089 initial import
mandel
parents:
diff changeset
63 shortNames.insert("jfloat", "F");
e78566595089 initial import
mandel
parents:
diff changeset
64 shortNames.insert("jdouble", "D");
e78566595089 initial import
mandel
parents:
diff changeset
65 shortNames.insert("jobject", "L");
e78566595089 initial import
mandel
parents:
diff changeset
66 shortNames.insert("void", "V");
e78566595089 initial import
mandel
parents:
diff changeset
67
e78566595089 initial import
mandel
parents:
diff changeset
68 // Because QBool is specialcased in the typesystem to do
e78566595089 initial import
mandel
parents:
diff changeset
69 // automatic conversions from between bool and jboolean, we
e78566595089 initial import
mandel
parents:
diff changeset
70 // need to handle bool specially here.
e78566595089 initial import
mandel
parents:
diff changeset
71 shortNames.insert("bool", "Z");
e78566595089 initial import
mandel
parents:
diff changeset
72 }
e78566595089 initial import
mandel
parents:
diff changeset
73
e78566595089 initial import
mandel
parents:
diff changeset
74 QString sn = ((const QHash<QString, QString> &) shortNames).value(name);
e78566595089 initial import
mandel
parents:
diff changeset
75 if (sn.isEmpty()) {
e78566595089 initial import
mandel
parents:
diff changeset
76 printf("Failed to translate to shortname: %s in %s :: %s\n",
e78566595089 initial import
mandel
parents:
diff changeset
77 qPrintable(name),
e78566595089 initial import
mandel
parents:
diff changeset
78 qPrintable(context),
e78566595089 initial import
mandel
parents:
diff changeset
79 qPrintable(funcName));
e78566595089 initial import
mandel
parents:
diff changeset
80 }
e78566595089 initial import
mandel
parents:
diff changeset
81
e78566595089 initial import
mandel
parents:
diff changeset
82 return shortNames.value(name);
e78566595089 initial import
mandel
parents:
diff changeset
83 }
e78566595089 initial import
mandel
parents:
diff changeset
84
e78566595089 initial import
mandel
parents:
diff changeset
85 static QString expandNameJNI(const QChar &c) {
e78566595089 initial import
mandel
parents:
diff changeset
86 if (expandNamesJNI.size() == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
87 expandNamesJNI.insert('Z', "jboolean");
e78566595089 initial import
mandel
parents:
diff changeset
88 expandNamesJNI.insert('B', "jbyte");
e78566595089 initial import
mandel
parents:
diff changeset
89 expandNamesJNI.insert('C', "jchar");
e78566595089 initial import
mandel
parents:
diff changeset
90 expandNamesJNI.insert('S', "jshort");
e78566595089 initial import
mandel
parents:
diff changeset
91 expandNamesJNI.insert('I', "jint");
e78566595089 initial import
mandel
parents:
diff changeset
92 expandNamesJNI.insert('J', "jlong");
e78566595089 initial import
mandel
parents:
diff changeset
93 expandNamesJNI.insert('F', "jfloat");
e78566595089 initial import
mandel
parents:
diff changeset
94 expandNamesJNI.insert('D', "jdouble");
e78566595089 initial import
mandel
parents:
diff changeset
95 expandNamesJNI.insert('L', "jobject");
e78566595089 initial import
mandel
parents:
diff changeset
96 expandNamesJNI.insert('V', "void");
e78566595089 initial import
mandel
parents:
diff changeset
97 }
e78566595089 initial import
mandel
parents:
diff changeset
98
e78566595089 initial import
mandel
parents:
diff changeset
99 QString n = ((const QHash<char, QString> &) expandNamesJNI).value(c.toLatin1());
e78566595089 initial import
mandel
parents:
diff changeset
100 if (n.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
101 printf("Failed to translate to expanded names: %c\n", c.toLatin1());
e78566595089 initial import
mandel
parents:
diff changeset
102
e78566595089 initial import
mandel
parents:
diff changeset
103 return n;
e78566595089 initial import
mandel
parents:
diff changeset
104 }
e78566595089 initial import
mandel
parents:
diff changeset
105
e78566595089 initial import
mandel
parents:
diff changeset
106 static QString expandNameJava(const QChar &c) {
e78566595089 initial import
mandel
parents:
diff changeset
107 if (expandNamesJava.size() == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
108 expandNamesJava.insert('Z', "boolean");
e78566595089 initial import
mandel
parents:
diff changeset
109 expandNamesJava.insert('B', "byte");
e78566595089 initial import
mandel
parents:
diff changeset
110 expandNamesJava.insert('C', "char");
e78566595089 initial import
mandel
parents:
diff changeset
111 expandNamesJava.insert('S', "short");
e78566595089 initial import
mandel
parents:
diff changeset
112 expandNamesJava.insert('I', "int");
e78566595089 initial import
mandel
parents:
diff changeset
113 expandNamesJava.insert('J', "long");
e78566595089 initial import
mandel
parents:
diff changeset
114 expandNamesJava.insert('F', "float");
e78566595089 initial import
mandel
parents:
diff changeset
115 expandNamesJava.insert('D', "double");
e78566595089 initial import
mandel
parents:
diff changeset
116 expandNamesJava.insert('L', "Object");
e78566595089 initial import
mandel
parents:
diff changeset
117 expandNamesJava.insert('V', "void");
e78566595089 initial import
mandel
parents:
diff changeset
118 }
e78566595089 initial import
mandel
parents:
diff changeset
119
e78566595089 initial import
mandel
parents:
diff changeset
120 QString n = ((const QHash<char, QString> &) expandNamesJava).value(c.toLatin1());
e78566595089 initial import
mandel
parents:
diff changeset
121 if (n.isEmpty())
e78566595089 initial import
mandel
parents:
diff changeset
122 printf("Failed to translate to expanded names: %c\n", c.toLatin1());
e78566595089 initial import
mandel
parents:
diff changeset
123
e78566595089 initial import
mandel
parents:
diff changeset
124 return n;
e78566595089 initial import
mandel
parents:
diff changeset
125 }
e78566595089 initial import
mandel
parents:
diff changeset
126
e78566595089 initial import
mandel
parents:
diff changeset
127
e78566595089 initial import
mandel
parents:
diff changeset
128 void JumpTablePreprocessor::generate()
e78566595089 initial import
mandel
parents:
diff changeset
129 {
e78566595089 initial import
mandel
parents:
diff changeset
130 ReportHandler::setContext("JumpTablePreprocessor");
e78566595089 initial import
mandel
parents:
diff changeset
131 foreach (AbstractMetaClass *cl, m_classes) {
e78566595089 initial import
mandel
parents:
diff changeset
132 process(cl);
e78566595089 initial import
mandel
parents:
diff changeset
133 }
e78566595089 initial import
mandel
parents:
diff changeset
134 }
e78566595089 initial import
mandel
parents:
diff changeset
135
e78566595089 initial import
mandel
parents:
diff changeset
136 void JumpTablePreprocessor::process(AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
137 {
e78566595089 initial import
mandel
parents:
diff changeset
138 // Skip generate=no classes, such as QFutureIterator
e78566595089 initial import
mandel
parents:
diff changeset
139 if (cls->typeEntry()->codeGeneration() != TypeEntry::GenerateAll) {
e78566595089 initial import
mandel
parents:
diff changeset
140 // printf("skipping class: %s, generation is : %x vs %x\n",
e78566595089 initial import
mandel
parents:
diff changeset
141 // qPrintable(cls->name()),
e78566595089 initial import
mandel
parents:
diff changeset
142 // cls->typeEntry()->codeGeneration(),
e78566595089 initial import
mandel
parents:
diff changeset
143 // TypeEntry::GenerateAll);
e78566595089 initial import
mandel
parents:
diff changeset
144 return;
e78566595089 initial import
mandel
parents:
diff changeset
145 }
e78566595089 initial import
mandel
parents:
diff changeset
146
e78566595089 initial import
mandel
parents:
diff changeset
147 QString package = cls->package();
e78566595089 initial import
mandel
parents:
diff changeset
148
e78566595089 initial import
mandel
parents:
diff changeset
149 if (!m_table.contains(package))
e78566595089 initial import
mandel
parents:
diff changeset
150 m_table[package] = SignatureTable();
e78566595089 initial import
mandel
parents:
diff changeset
151
e78566595089 initial import
mandel
parents:
diff changeset
152
e78566595089 initial import
mandel
parents:
diff changeset
153 SignatureTable &signatureList = m_table[package];
e78566595089 initial import
mandel
parents:
diff changeset
154
e78566595089 initial import
mandel
parents:
diff changeset
155 // Native callbacks (all java functions require native callbacks)
e78566595089 initial import
mandel
parents:
diff changeset
156 AbstractMetaFunctionList class_funcs = cls->functionsInTargetLang();
e78566595089 initial import
mandel
parents:
diff changeset
157 foreach (AbstractMetaFunction *function, class_funcs) {
e78566595089 initial import
mandel
parents:
diff changeset
158 if (!function->isEmptyFunction())
e78566595089 initial import
mandel
parents:
diff changeset
159 process(function, &signatureList);
e78566595089 initial import
mandel
parents:
diff changeset
160 }
e78566595089 initial import
mandel
parents:
diff changeset
161
e78566595089 initial import
mandel
parents:
diff changeset
162
e78566595089 initial import
mandel
parents:
diff changeset
163 class_funcs = cls->queryFunctions(AbstractMetaClass::NormalFunctions
e78566595089 initial import
mandel
parents:
diff changeset
164 | AbstractMetaClass::AbstractFunctions
e78566595089 initial import
mandel
parents:
diff changeset
165 | AbstractMetaClass::NotRemovedFromTargetLang);
e78566595089 initial import
mandel
parents:
diff changeset
166 foreach (AbstractMetaFunction *function, class_funcs) {
e78566595089 initial import
mandel
parents:
diff changeset
167 if (function->implementingClass() != cls) {
e78566595089 initial import
mandel
parents:
diff changeset
168 process(function, &signatureList);
e78566595089 initial import
mandel
parents:
diff changeset
169 }
e78566595089 initial import
mandel
parents:
diff changeset
170 }
e78566595089 initial import
mandel
parents:
diff changeset
171 }
e78566595089 initial import
mandel
parents:
diff changeset
172
e78566595089 initial import
mandel
parents:
diff changeset
173
e78566595089 initial import
mandel
parents:
diff changeset
174 QString JumpTablePreprocessor::signature(const AbstractMetaFunction *func)
e78566595089 initial import
mandel
parents:
diff changeset
175 {
e78566595089 initial import
mandel
parents:
diff changeset
176 QString signature;
e78566595089 initial import
mandel
parents:
diff changeset
177 QString context = func->implementingClass()->name();
e78566595089 initial import
mandel
parents:
diff changeset
178 QString functionSignature = func->signature();
e78566595089 initial import
mandel
parents:
diff changeset
179
e78566595089 initial import
mandel
parents:
diff changeset
180 if (func->argumentRemoved(0))
e78566595089 initial import
mandel
parents:
diff changeset
181 signature = "V";
e78566595089 initial import
mandel
parents:
diff changeset
182 else
e78566595089 initial import
mandel
parents:
diff changeset
183 signature = simplifyName(CppImplGenerator::jniReturnName(func), context, functionSignature);
e78566595089 initial import
mandel
parents:
diff changeset
184
e78566595089 initial import
mandel
parents:
diff changeset
185 AbstractMetaArgumentList args = func->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
186 foreach (const AbstractMetaArgument *a, args) {
e78566595089 initial import
mandel
parents:
diff changeset
187 if (!func->argumentRemoved(a->argumentIndex() + 1)) {
e78566595089 initial import
mandel
parents:
diff changeset
188 if (!a->type()->hasNativeId())
e78566595089 initial import
mandel
parents:
diff changeset
189 signature += simplifyName(CppImplGenerator::translateType(a->type(), EnumAsInts),
e78566595089 initial import
mandel
parents:
diff changeset
190 context, functionSignature);
e78566595089 initial import
mandel
parents:
diff changeset
191 else
e78566595089 initial import
mandel
parents:
diff changeset
192 signature += "J";
e78566595089 initial import
mandel
parents:
diff changeset
193 }
e78566595089 initial import
mandel
parents:
diff changeset
194 }
e78566595089 initial import
mandel
parents:
diff changeset
195
e78566595089 initial import
mandel
parents:
diff changeset
196 return signature;
e78566595089 initial import
mandel
parents:
diff changeset
197 }
e78566595089 initial import
mandel
parents:
diff changeset
198
e78566595089 initial import
mandel
parents:
diff changeset
199
e78566595089 initial import
mandel
parents:
diff changeset
200 void JumpTablePreprocessor::process(AbstractMetaFunction *func, SignatureTable *table)
e78566595089 initial import
mandel
parents:
diff changeset
201 {
e78566595089 initial import
mandel
parents:
diff changeset
202 if (!func->needsCallThrough())
e78566595089 initial import
mandel
parents:
diff changeset
203 return;
e78566595089 initial import
mandel
parents:
diff changeset
204
e78566595089 initial import
mandel
parents:
diff changeset
205
e78566595089 initial import
mandel
parents:
diff changeset
206 if (func->jumpTableId() >= 0) {
e78566595089 initial import
mandel
parents:
diff changeset
207 // printf("%s::%s already has an ID=%d, for declaring=%s, owner=%s\n",
e78566595089 initial import
mandel
parents:
diff changeset
208 // qPrintable(func->implementingClass()->name()),
e78566595089 initial import
mandel
parents:
diff changeset
209 // qPrintable(func->signature()),
e78566595089 initial import
mandel
parents:
diff changeset
210 // func->jumpTableId(),
e78566595089 initial import
mandel
parents:
diff changeset
211 // qPrintable(func->declaringClass()->name()),
e78566595089 initial import
mandel
parents:
diff changeset
212 // qPrintable(func->ownerClass()->name()));
e78566595089 initial import
mandel
parents:
diff changeset
213 return;
e78566595089 initial import
mandel
parents:
diff changeset
214 }
e78566595089 initial import
mandel
parents:
diff changeset
215
e78566595089 initial import
mandel
parents:
diff changeset
216 QString sig = signature(func);
e78566595089 initial import
mandel
parents:
diff changeset
217
e78566595089 initial import
mandel
parents:
diff changeset
218 AbstractMetaFunctionList &list = (*table)[sig];
e78566595089 initial import
mandel
parents:
diff changeset
219 list.append(func);
e78566595089 initial import
mandel
parents:
diff changeset
220 func->setJumpTableId(list.size());
e78566595089 initial import
mandel
parents:
diff changeset
221 }
e78566595089 initial import
mandel
parents:
diff changeset
222
e78566595089 initial import
mandel
parents:
diff changeset
223
e78566595089 initial import
mandel
parents:
diff changeset
224 JumpTableGenerator::JumpTableGenerator(JumpTablePreprocessor *pp, PriGenerator *pri)
e78566595089 initial import
mandel
parents:
diff changeset
225 : m_preprocessor(pp),
e78566595089 initial import
mandel
parents:
diff changeset
226 m_prigenerator(pri)
e78566595089 initial import
mandel
parents:
diff changeset
227 {
e78566595089 initial import
mandel
parents:
diff changeset
228 active = true;
e78566595089 initial import
mandel
parents:
diff changeset
229 }
e78566595089 initial import
mandel
parents:
diff changeset
230
e78566595089 initial import
mandel
parents:
diff changeset
231
e78566595089 initial import
mandel
parents:
diff changeset
232 void JumpTableGenerator::generate()
e78566595089 initial import
mandel
parents:
diff changeset
233 {
e78566595089 initial import
mandel
parents:
diff changeset
234 for (PackageJumpTable::const_iterator it = m_preprocessor->table()->constBegin();
e78566595089 initial import
mandel
parents:
diff changeset
235 it != m_preprocessor->table()->constEnd(); ++it) {
e78566595089 initial import
mandel
parents:
diff changeset
236 QString package = it.key();
e78566595089 initial import
mandel
parents:
diff changeset
237 generatePackage(package, it.value());
e78566595089 initial import
mandel
parents:
diff changeset
238 }
e78566595089 initial import
mandel
parents:
diff changeset
239 }
e78566595089 initial import
mandel
parents:
diff changeset
240
e78566595089 initial import
mandel
parents:
diff changeset
241
e78566595089 initial import
mandel
parents:
diff changeset
242 void JumpTableGenerator::generatePackage(const QString &packageName, const SignatureTable &table)
e78566595089 initial import
mandel
parents:
diff changeset
243 {
e78566595089 initial import
mandel
parents:
diff changeset
244 generateNativeTable(packageName, table);
e78566595089 initial import
mandel
parents:
diff changeset
245 generateJavaTable(packageName, table);
e78566595089 initial import
mandel
parents:
diff changeset
246 }
e78566595089 initial import
mandel
parents:
diff changeset
247
e78566595089 initial import
mandel
parents:
diff changeset
248
e78566595089 initial import
mandel
parents:
diff changeset
249 void JumpTableGenerator::generateJavaTable(const QString &packageName,
e78566595089 initial import
mandel
parents:
diff changeset
250 const SignatureTable &table)
e78566595089 initial import
mandel
parents:
diff changeset
251 {
e78566595089 initial import
mandel
parents:
diff changeset
252 QString tableFile = QString("%1/%2/JTbl.java")
e78566595089 initial import
mandel
parents:
diff changeset
253 .arg(outputDirectory())
e78566595089 initial import
mandel
parents:
diff changeset
254 .arg(QString(packageName).replace(".", "/"));
e78566595089 initial import
mandel
parents:
diff changeset
255
e78566595089 initial import
mandel
parents:
diff changeset
256 printf("Generating jump table (.java): %s\n", qPrintable(tableFile));
e78566595089 initial import
mandel
parents:
diff changeset
257
e78566595089 initial import
mandel
parents:
diff changeset
258 FileOut file(tableFile);
e78566595089 initial import
mandel
parents:
diff changeset
259
e78566595089 initial import
mandel
parents:
diff changeset
260 QTextStream &s = file.stream;
e78566595089 initial import
mandel
parents:
diff changeset
261
e78566595089 initial import
mandel
parents:
diff changeset
262 s << "package " << packageName << ";" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
263 s << "class JTbl {" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
264
e78566595089 initial import
mandel
parents:
diff changeset
265
e78566595089 initial import
mandel
parents:
diff changeset
266 for (SignatureTable::const_iterator sit = table.constBegin(); sit != table.constEnd(); ++sit) {
e78566595089 initial import
mandel
parents:
diff changeset
267 QString signature = sit.key();
e78566595089 initial import
mandel
parents:
diff changeset
268
e78566595089 initial import
mandel
parents:
diff changeset
269 QString ret = expandNameJava(signature.at(0));
e78566595089 initial import
mandel
parents:
diff changeset
270
e78566595089 initial import
mandel
parents:
diff changeset
271 s << " static native " << ret << " " << signature << "(int id, long nid";
e78566595089 initial import
mandel
parents:
diff changeset
272
e78566595089 initial import
mandel
parents:
diff changeset
273 for (int i=1; i<signature.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
274 s << ", " << expandNameJava(signature.at(i)) << " a" << i;
e78566595089 initial import
mandel
parents:
diff changeset
275 }
e78566595089 initial import
mandel
parents:
diff changeset
276
e78566595089 initial import
mandel
parents:
diff changeset
277 s << ", Object _this);" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
278 }
e78566595089 initial import
mandel
parents:
diff changeset
279
e78566595089 initial import
mandel
parents:
diff changeset
280 s << "}" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
281 }
e78566595089 initial import
mandel
parents:
diff changeset
282
e78566595089 initial import
mandel
parents:
diff changeset
283
e78566595089 initial import
mandel
parents:
diff changeset
284 void JumpTableGenerator::generateNativeTable(const QString &packageName,
e78566595089 initial import
mandel
parents:
diff changeset
285 const SignatureTable &table)
e78566595089 initial import
mandel
parents:
diff changeset
286 {
e78566595089 initial import
mandel
parents:
diff changeset
287 QString tableFile = QString("%1/%2/nativejumptable.cpp")
e78566595089 initial import
mandel
parents:
diff changeset
288 .arg(outputDirectory())
e78566595089 initial import
mandel
parents:
diff changeset
289 .arg(CppGenerator::subDirectoryForPackage(packageName));
e78566595089 initial import
mandel
parents:
diff changeset
290
e78566595089 initial import
mandel
parents:
diff changeset
291 FileOut file(tableFile);
e78566595089 initial import
mandel
parents:
diff changeset
292
e78566595089 initial import
mandel
parents:
diff changeset
293 QString pkgSubDir = QString(packageName).replace(".", "_");
238
1349940724eb Generate a classes list for cmake.
SokoL_SD
parents: 1
diff changeset
294 m_prigenerator->addSource(packageName, "nativejumptable.cpp");
1
e78566595089 initial import
mandel
parents:
diff changeset
295
e78566595089 initial import
mandel
parents:
diff changeset
296 printf("Generating jump table (.cpp): %s\n", qPrintable(tableFile));
e78566595089 initial import
mandel
parents:
diff changeset
297
e78566595089 initial import
mandel
parents:
diff changeset
298 QTextStream &s = file.stream;
e78566595089 initial import
mandel
parents:
diff changeset
299
e78566595089 initial import
mandel
parents:
diff changeset
300 s << "#include <qtjambi_global.h>" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
301
e78566595089 initial import
mandel
parents:
diff changeset
302 for (SignatureTable::const_iterator sit = table.constBegin(); sit != table.constEnd(); ++sit) {
e78566595089 initial import
mandel
parents:
diff changeset
303 QString signature = sit.key();
e78566595089 initial import
mandel
parents:
diff changeset
304
e78566595089 initial import
mandel
parents:
diff changeset
305 QString ret = expandNameJNI(signature.at(0));
e78566595089 initial import
mandel
parents:
diff changeset
306
e78566595089 initial import
mandel
parents:
diff changeset
307 s << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
308 << "extern \"C\" Q_DECL_EXPORT " << ret << " JNICALL QTJAMBI_FUNCTION_PREFIX(Java_"
e78566595089 initial import
mandel
parents:
diff changeset
309 << QString(packageName).replace("_", "_1").replace(".", "_") << "_JTbl_" << signature << ")" << endl
e78566595089 initial import
mandel
parents:
diff changeset
310 << "(JNIEnv *e, jclass, jint id, jlong nid";
e78566595089 initial import
mandel
parents:
diff changeset
311
e78566595089 initial import
mandel
parents:
diff changeset
312 for (int i=1; i<signature.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
313 s << ", " << expandNameJNI(signature.at(i)) << " a" << i;
e78566595089 initial import
mandel
parents:
diff changeset
314 }
e78566595089 initial import
mandel
parents:
diff changeset
315
e78566595089 initial import
mandel
parents:
diff changeset
316 s << ", jobject __this)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
317 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
318 << "Q_UNUSED(__this);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
319 << "Q_UNUSED(nid);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
320 << "switch (id) { " << endl;
e78566595089 initial import
mandel
parents:
diff changeset
321
e78566595089 initial import
mandel
parents:
diff changeset
322 AbstractMetaFunctionList functions = sit.value();
e78566595089 initial import
mandel
parents:
diff changeset
323 bool hasReturn = signature.at(0) != 'V';
e78566595089 initial import
mandel
parents:
diff changeset
324
e78566595089 initial import
mandel
parents:
diff changeset
325 foreach (AbstractMetaFunction *f, functions) {
e78566595089 initial import
mandel
parents:
diff changeset
326 const AbstractMetaClass *cls = f->ownerClass();
e78566595089 initial import
mandel
parents:
diff changeset
327 s << endl
e78566595089 initial import
mandel
parents:
diff changeset
328 << "// " << cls->name() << "::" << f->signature() << ", declaring=" << f->declaringClass()->name() << ", implementing=" << f->implementingClass()->name() << endl
e78566595089 initial import
mandel
parents:
diff changeset
329 << "case " << f->jumpTableId() << ":" << endl
e78566595089 initial import
mandel
parents:
diff changeset
330 << "extern ";
e78566595089 initial import
mandel
parents:
diff changeset
331 CppImplGenerator::writeFunctionName(s, f, cls, CppImplGenerator::ReturnType);
e78566595089 initial import
mandel
parents:
diff changeset
332 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
333 CppImplGenerator::writeFinalFunctionArguments(s, f);
e78566595089 initial import
mandel
parents:
diff changeset
334 s << ";" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
335
e78566595089 initial import
mandel
parents:
diff changeset
336 if (hasReturn && !f->isConstructor())
e78566595089 initial import
mandel
parents:
diff changeset
337 s << "return ";
e78566595089 initial import
mandel
parents:
diff changeset
338
e78566595089 initial import
mandel
parents:
diff changeset
339 CppImplGenerator::writeFunctionName(s, f, cls, 0);
e78566595089 initial import
mandel
parents:
diff changeset
340
e78566595089 initial import
mandel
parents:
diff changeset
341 s << "(e";
e78566595089 initial import
mandel
parents:
diff changeset
342
e78566595089 initial import
mandel
parents:
diff changeset
343 if (f->isStatic())
e78566595089 initial import
mandel
parents:
diff changeset
344 s << ", 0";
e78566595089 initial import
mandel
parents:
diff changeset
345 else if (f->isConstructor())
e78566595089 initial import
mandel
parents:
diff changeset
346 s << ", __this";
e78566595089 initial import
mandel
parents:
diff changeset
347 else
e78566595089 initial import
mandel
parents:
diff changeset
348 s << ", __this, nid";
e78566595089 initial import
mandel
parents:
diff changeset
349
e78566595089 initial import
mandel
parents:
diff changeset
350 for (int i=1; i<signature.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
351 s << ", a" << i;
e78566595089 initial import
mandel
parents:
diff changeset
352 }
e78566595089 initial import
mandel
parents:
diff changeset
353
e78566595089 initial import
mandel
parents:
diff changeset
354 s << ");" << endl
e78566595089 initial import
mandel
parents:
diff changeset
355 << "break;" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
356 }
e78566595089 initial import
mandel
parents:
diff changeset
357
e78566595089 initial import
mandel
parents:
diff changeset
358 s << "} // switch..." << endl;
e78566595089 initial import
mandel
parents:
diff changeset
359
e78566595089 initial import
mandel
parents:
diff changeset
360 if (hasReturn)
e78566595089 initial import
mandel
parents:
diff changeset
361 s << "return 0;" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
362
e78566595089 initial import
mandel
parents:
diff changeset
363 s << "} // " << signature << endl;
e78566595089 initial import
mandel
parents:
diff changeset
364 }
e78566595089 initial import
mandel
parents:
diff changeset
365 }
e78566595089 initial import
mandel
parents:
diff changeset
366
e78566595089 initial import
mandel
parents:
diff changeset
367 bool JumpTableGenerator::isJumpTableActive() {
e78566595089 initial import
mandel
parents:
diff changeset
368 return active;
e78566595089 initial import
mandel
parents:
diff changeset
369 }