annotate generator/jumptable.cpp @ 282:256ab6cb8e85

Signals look-up andNew syntax for connect. The old one will not work from now on. This will allow for the signals overload. Although changes are done for both D1 and D2 versions, D1 won't work because of compiler bugs. I am tired of waiting for fixes.
author eldar
date Fri, 16 Oct 2009 02:43:59 +0000
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 }