src/share/classes/com/sun/tools/javah/LLNI.java

Tue, 13 Jan 2009 13:27:14 +0000

author
mcimadamore
date
Tue, 13 Jan 2009 13:27:14 +0000
changeset 184
905e151a185a
parent 1
9a66ca7c79fa
child 416
c287d51c57da
permissions
-rw-r--r--

6765045: Remove rawtypes warnings from langtools
Summary: Removed all occurrences of rawtypes warnings from langtools
Reviewed-by: jjg, bpatel

duke@1 1 /*
duke@1 2 * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
duke@1 7 * published by the Free Software Foundation. Sun designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
duke@1 9 * by Sun in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
duke@1 21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@1 22 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@1 23 * have any questions.
duke@1 24 */
duke@1 25
duke@1 26
duke@1 27 package com.sun.tools.javah;
duke@1 28
duke@1 29 import java.io.File;
duke@1 30 import java.io.OutputStream;
duke@1 31 import java.io.PrintWriter;
duke@1 32 import java.util.Hashtable;
duke@1 33 import com.sun.javadoc.*;
duke@1 34
duke@1 35 /*
duke@1 36 * @author Sucheta Dambalkar(Revised)
duke@1 37 */
duke@1 38 public class LLNI extends Gen {
duke@1 39
duke@1 40 protected final char pathChar = File.separatorChar;
duke@1 41 protected final char innerDelim = '$'; /* For inner classes */
mcimadamore@184 42 protected Hashtable<Object, Object> doneHandleTypes;
duke@1 43 MemberDoc []fields;
duke@1 44 MemberDoc [] methods;
duke@1 45 private boolean doubleAlign;
duke@1 46 private int padFieldNum = 0;
duke@1 47
duke@1 48
duke@1 49 LLNI(boolean doubleAlign, RootDoc root) {
duke@1 50 super(root);
duke@1 51 this.doubleAlign = doubleAlign;
duke@1 52 }
duke@1 53
duke@1 54
duke@1 55 protected String getIncludes() {
duke@1 56 return "";
duke@1 57 }
duke@1 58
duke@1 59 protected void write(OutputStream o, ClassDoc clazz)
duke@1 60 throws ClassNotFoundException {
duke@1 61 String cname = mangleClassName(clazz.qualifiedName());
duke@1 62 PrintWriter pw = wrapWriter(o);
duke@1 63 fields = clazz.fields();
duke@1 64 methods = clazz.methods();
duke@1 65 generateDeclsForClass(pw, clazz, cname);
duke@1 66 }
duke@1 67
duke@1 68 protected void generateDeclsForClass(PrintWriter pw,
duke@1 69 ClassDoc clazz, String cname)
duke@1 70 throws ClassNotFoundException {
mcimadamore@184 71 doneHandleTypes = new Hashtable<Object, Object>();
duke@1 72 /* The following handle types are predefined in "typedefs.h". Suppress
duke@1 73 inclusion in the output by generating them "into the blue" here. */
duke@1 74 genHandleType(null, "java.lang.Class");
duke@1 75 genHandleType(null, "java.lang.ClassLoader");
duke@1 76 genHandleType(null, "java.lang.Object");
duke@1 77 genHandleType(null, "java.lang.String");
duke@1 78 genHandleType(null, "java.lang.Thread");
duke@1 79 genHandleType(null, "java.lang.ThreadGroup");
duke@1 80 genHandleType(null, "java.lang.Throwable");
duke@1 81
duke@1 82 pw.println("/* LLNI Header for class " + clazz.qualifiedName() + " */" + lineSep);
duke@1 83 pw.println("#ifndef _Included_" + cname);
duke@1 84 pw.println("#define _Included_" + cname);
duke@1 85 pw.println("#include \"typedefs.h\"");
duke@1 86 pw.println("#include \"llni.h\"");
duke@1 87 pw.println("#include \"jni.h\"" + lineSep);
duke@1 88
duke@1 89 forwardDecls(pw, clazz);
duke@1 90 structSectionForClass(pw, clazz, cname);
duke@1 91 methodSectionForClass(pw, clazz, cname);
duke@1 92 pw.println("#endif");
duke@1 93 }
duke@1 94
duke@1 95 protected void genHandleType(PrintWriter pw, String clazzname) {
duke@1 96 String cname = mangleClassName(clazzname);
duke@1 97 if (!doneHandleTypes.containsKey(cname)) {
duke@1 98 doneHandleTypes.put(cname, cname);
duke@1 99 if (pw != null) {
duke@1 100 pw.println("#ifndef DEFINED_" + cname);
duke@1 101 pw.println(" #define DEFINED_" + cname);
duke@1 102 pw.println(" GEN_HANDLE_TYPES(" + cname + ");");
duke@1 103 pw.println("#endif" + lineSep);
duke@1 104 }
duke@1 105 }
duke@1 106 }
duke@1 107
duke@1 108 protected String mangleClassName(String s) {
duke@1 109 return s.replace('.', '_')
duke@1 110 .replace(pathChar, '_')
duke@1 111 .replace(innerDelim, '_');
duke@1 112 }
duke@1 113
duke@1 114 protected void forwardDecls(PrintWriter pw, ClassDoc clazz)
duke@1 115 throws ClassNotFoundException {
duke@1 116 ClassDoc clazzfield = null;
duke@1 117
duke@1 118 if (clazz.qualifiedName().equals("java.lang.Object"))
duke@1 119 return;
duke@1 120 genHandleType(pw, clazz.qualifiedName());
duke@1 121 ClassDoc superClass = clazz.superclass();
duke@1 122
duke@1 123 if(superClass != null){
duke@1 124 String superClassName = superClass.qualifiedName();
duke@1 125 forwardDecls(pw, superClass);
duke@1 126 }
duke@1 127
duke@1 128 for (int i = 0; i < fields.length; i++) {
duke@1 129 FieldDoc field = (FieldDoc)fields[i];
duke@1 130
duke@1 131 if (!field.isStatic()) {
duke@1 132 Type t = field.type();
duke@1 133 String tname = t.qualifiedTypeName();
duke@1 134 TypeSignature newTypeSig = new TypeSignature(root);
duke@1 135 String sig = newTypeSig.getTypeSignature(tname);
duke@1 136
duke@1 137 if (sig.charAt(0) != '[')
duke@1 138 forwardDeclsFromSig(pw, sig);
duke@1 139 }
duke@1 140 }
duke@1 141
duke@1 142 for (int i = 0; i < methods.length; i++) {
duke@1 143 MethodDoc method = (MethodDoc)methods[i];
duke@1 144
duke@1 145 if (method.isNative()) {
duke@1 146 Type retType = method.returnType();
duke@1 147 String typesig = method.signature();
duke@1 148 TypeSignature newTypeSig = new TypeSignature(root);
duke@1 149 String sig = newTypeSig.getTypeSignature(typesig, retType);
duke@1 150
duke@1 151 if (sig.charAt(0) != '[')
duke@1 152 forwardDeclsFromSig(pw, sig);
duke@1 153
duke@1 154 }
duke@1 155 }
duke@1 156 }
duke@1 157
duke@1 158 protected void forwardDeclsFromSig(PrintWriter pw, String sig) {
duke@1 159 int len = sig.length();
duke@1 160 int i = sig.charAt(0) == '(' ? 1 : 0;
duke@1 161
duke@1 162 /* Skip the initial "(". */
duke@1 163 while (i < len) {
duke@1 164 if (sig.charAt(i) == 'L') {
duke@1 165 int j = i + 1;
duke@1 166 while (sig.charAt(j) != ';') j++;
duke@1 167 genHandleType(pw, sig.substring(i + 1, j));
duke@1 168 i = j + 1;
duke@1 169 } else {
duke@1 170 i++;
duke@1 171 }
duke@1 172 }
duke@1 173 }
duke@1 174
duke@1 175 protected void structSectionForClass(PrintWriter pw,
duke@1 176 ClassDoc jclazz, String cname)
duke@1 177 throws ClassNotFoundException {
duke@1 178
duke@1 179 String jname = jclazz.qualifiedName();
duke@1 180
duke@1 181 if (cname.equals("java_lang_Object")) {
duke@1 182 pw.println("/* struct java_lang_Object is defined in typedefs.h. */");
duke@1 183 pw.println();
duke@1 184 return;
duke@1 185 }
duke@1 186 pw.println("#if !defined(__i386)");
duke@1 187 pw.println("#pragma pack(4)");
duke@1 188 pw.println("#endif");
duke@1 189 pw.println();
duke@1 190 pw.println("struct " + cname + " {");
duke@1 191 pw.println(" ObjHeader h;");
duke@1 192 pw.print(fieldDefs(jclazz, cname));
duke@1 193
duke@1 194 if (jname.equals("java.lang.Class"))
duke@1 195 pw.println(" Class *LLNI_mask(cClass);" +
duke@1 196 " /* Fake field; don't access (see oobj.h) */");
duke@1 197 pw.println("};" + lineSep + lineSep + "#pragma pack()");
duke@1 198 pw.println();
duke@1 199 return;
duke@1 200 }
duke@1 201
duke@1 202 private static class FieldDefsRes {
duke@1 203 public String className; /* Name of the current class. */
duke@1 204 public FieldDefsRes parent;
duke@1 205 public String s;
duke@1 206 public int byteSize;
duke@1 207 public boolean bottomMost;
duke@1 208 public boolean printedOne = false;
duke@1 209
duke@1 210 FieldDefsRes(ClassDoc clazz, FieldDefsRes parent, boolean bottomMost) {
duke@1 211 this.className = clazz.qualifiedName();
duke@1 212 this.parent = parent;
duke@1 213 this.bottomMost = bottomMost;
duke@1 214 int byteSize = 0;
duke@1 215 if (parent == null) this.s = "";
duke@1 216 else this.s = parent.s;
duke@1 217 }
duke@1 218 }
duke@1 219
duke@1 220 /* Returns "true" iff added a field. */
duke@1 221 private boolean doField(FieldDefsRes res, FieldDoc field,
duke@1 222 String cname, boolean padWord)
duke@1 223 throws ClassNotFoundException {
duke@1 224
duke@1 225 String fieldDef = addStructMember(field, cname, padWord);
duke@1 226 if (fieldDef != null) {
duke@1 227 if (!res.printedOne) { /* add separator */
duke@1 228 if (res.bottomMost) {
duke@1 229 if (res.s.length() != 0)
duke@1 230 res.s = res.s + " /* local members: */" + lineSep;
duke@1 231 } else {
duke@1 232 res.s = res.s + " /* inherited members from " +
duke@1 233 res.className + ": */" + lineSep;
duke@1 234 }
duke@1 235 res.printedOne = true;
duke@1 236 }
duke@1 237 res.s = res.s + fieldDef;
duke@1 238 return true;
duke@1 239 }
duke@1 240
duke@1 241 // Otherwise.
duke@1 242 return false;
duke@1 243 }
duke@1 244
duke@1 245 private int doTwoWordFields(FieldDefsRes res, ClassDoc clazz,
duke@1 246 int offset, String cname, boolean padWord)
duke@1 247 throws ClassNotFoundException {
duke@1 248 boolean first = true;
duke@1 249 FieldDoc[] fields = clazz.fields();
duke@1 250
duke@1 251 for (int i = 0; i <fields.length; i++) {
duke@1 252 FieldDoc field = fields[i];
duke@1 253 String tc =field.type().typeName();
duke@1 254 boolean twoWords = (tc.equals("long") || tc.equals("double"));
duke@1 255 if (twoWords && doField(res, field, cname, first && padWord)) {
duke@1 256 offset += 8; first = false;
duke@1 257 }
duke@1 258 }
duke@1 259 return offset;
duke@1 260 }
duke@1 261
duke@1 262 protected String fieldDefs(ClassDoc clazz, String cname)
duke@1 263 throws ClassNotFoundException {
duke@1 264 FieldDefsRes res = fieldDefs(clazz, cname, true);
duke@1 265 return res.s;
duke@1 266 }
duke@1 267
duke@1 268 protected FieldDefsRes fieldDefs(ClassDoc clazz, String cname,
duke@1 269 boolean bottomMost)
duke@1 270 throws ClassNotFoundException {
duke@1 271 FieldDefsRes res;
duke@1 272 int offset;
duke@1 273 boolean didTwoWordFields = false;
duke@1 274 ClassDoc superclazz = clazz.superclass();
duke@1 275
duke@1 276 if (superclazz != null) {
duke@1 277 String supername = superclazz.qualifiedName();
duke@1 278 res = new FieldDefsRes(clazz,
duke@1 279 fieldDefs(superclazz, cname, false),
duke@1 280 bottomMost);
duke@1 281 offset = res.parent.byteSize;
duke@1 282 } else {
duke@1 283 res = new FieldDefsRes(clazz, null, bottomMost);
duke@1 284 offset = 0;
duke@1 285 }
duke@1 286
duke@1 287 FieldDoc[] fields = clazz.fields();
duke@1 288
duke@1 289 for (int i = 0; i < fields.length; i++) {
duke@1 290 FieldDoc field = fields[i];
duke@1 291
duke@1 292 if (doubleAlign && !didTwoWordFields && (offset % 8) == 0) {
duke@1 293 offset = doTwoWordFields(res, clazz, offset, cname, false);
duke@1 294 didTwoWordFields = true;
duke@1 295 }
duke@1 296
duke@1 297 String tc = field.type().typeName();
duke@1 298 boolean twoWords = (tc.equals("long") ||tc.equals("double"));
duke@1 299
duke@1 300 if (!doubleAlign || !twoWords) {
duke@1 301 if (doField(res, field, cname, false)) offset += 4;
duke@1 302 }
duke@1 303
duke@1 304 }
duke@1 305
duke@1 306 if (doubleAlign && !didTwoWordFields) {
duke@1 307 if ((offset % 8) != 0) offset += 4;
duke@1 308 offset = doTwoWordFields(res, clazz, offset, cname, true);
duke@1 309 }
duke@1 310
duke@1 311 res.byteSize = offset;
duke@1 312 return res;
duke@1 313 }
duke@1 314
duke@1 315 /* OVERRIDE: This method handles instance fields */
duke@1 316 protected String addStructMember(FieldDoc member, String cname,
duke@1 317 boolean padWord)
duke@1 318 throws ClassNotFoundException {
duke@1 319 String res = null;
duke@1 320
duke@1 321 if (member.isStatic()) {
duke@1 322 res = addStaticStructMember(member, cname);
duke@1 323 // if (res == null) /* JNI didn't handle it, print comment. */
duke@1 324 // res = " /* Inaccessible static: " + member + " */" + lineSep;
duke@1 325 } else {
duke@1 326 if (padWord) res = " java_int padWord" + padFieldNum++ + ";" + lineSep;
duke@1 327 res = " " + llniType(member.type(), false, false) + " " + llniFieldName(member);
duke@1 328 if (isLongOrDouble(member.type())) res = res + "[2]";
duke@1 329 res = res + ";" + lineSep;
duke@1 330 }
duke@1 331 return res;
duke@1 332 }
duke@1 333
duke@1 334 static private final boolean isWindows =
duke@1 335 System.getProperty("os.name").startsWith("Windows");
duke@1 336
duke@1 337 /*
duke@1 338 * This method only handles static final fields.
duke@1 339 */
duke@1 340 protected String addStaticStructMember(FieldDoc field, String cname)
duke@1 341 throws ClassNotFoundException {
duke@1 342 String res = null;
duke@1 343 Object exp = null;
duke@1 344
duke@1 345 if (!field.isStatic())
duke@1 346 return res;
duke@1 347 if (!field.isFinal())
duke@1 348 return res;
duke@1 349
duke@1 350 exp = field.constantValue();
duke@1 351
duke@1 352 if (exp != null) {
duke@1 353 /* Constant. */
duke@1 354
duke@1 355 String cn = cname + "_" + field.name();
duke@1 356 String suffix = null;
duke@1 357 long val = 0;
duke@1 358 /* Can only handle int, long, float, and double fields. */
duke@1 359 if (exp instanceof Integer) {
duke@1 360 suffix = "L";
duke@1 361 val = ((Integer)exp).intValue();
duke@1 362 }
duke@1 363 if (exp instanceof Long) {
duke@1 364 // Visual C++ supports the i64 suffix, not LL
duke@1 365 suffix = isWindows ? "i64" : "LL";
duke@1 366 val = ((Long)exp).longValue();
duke@1 367 }
duke@1 368 if (exp instanceof Float) suffix = "f";
duke@1 369 if (exp instanceof Double) suffix = "";
duke@1 370 if (suffix != null) {
duke@1 371 // Some compilers will generate a spurious warning
duke@1 372 // for the integer constants for Integer.MIN_VALUE
duke@1 373 // and Long.MIN_VALUE so we handle them specially.
duke@1 374 if ((suffix.equals("L") && (val == Integer.MIN_VALUE)) ||
duke@1 375 (suffix.equals("LL") && (val == Long.MIN_VALUE))) {
duke@1 376 res = " #undef " + cn + lineSep
duke@1 377 + " #define " + cn
duke@1 378 + " (" + (val + 1) + suffix + "-1)" + lineSep;
duke@1 379 } else {
duke@1 380 res = " #undef " + cn + lineSep
duke@1 381 + " #define " + cn + " "+ exp.toString() + suffix + lineSep;
duke@1 382 }
duke@1 383 }
duke@1 384 }
duke@1 385 return res;
duke@1 386 }
duke@1 387
duke@1 388 protected void methodSectionForClass(PrintWriter pw,
duke@1 389 ClassDoc clazz, String cname)
duke@1 390 throws ClassNotFoundException {
duke@1 391 String methods = methodDecls(clazz, cname);
duke@1 392
duke@1 393 if (methods.length() != 0) {
duke@1 394 pw.println("/* Native method declarations: */" + lineSep);
duke@1 395 pw.println("#ifdef __cplusplus");
duke@1 396 pw.println("extern \"C\" {");
duke@1 397 pw.println("#endif" + lineSep);
duke@1 398 pw.println(methods);
duke@1 399 pw.println("#ifdef __cplusplus");
duke@1 400 pw.println("}");
duke@1 401 pw.println("#endif");
duke@1 402 }
duke@1 403 }
duke@1 404
duke@1 405 protected String methodDecls(ClassDoc clazz, String cname)
duke@1 406 throws ClassNotFoundException {
duke@1 407
duke@1 408 String res = "";
duke@1 409 for (int i = 0; i < methods.length; i++) {
duke@1 410 MethodDoc method = (MethodDoc)methods[i];
duke@1 411 if (method.isNative())
duke@1 412 res = res + methodDecl(method, clazz, cname);
duke@1 413 }
duke@1 414 return res;
duke@1 415 }
duke@1 416
duke@1 417 protected String methodDecl(MethodDoc method,
duke@1 418 ClassDoc clazz, String cname)
duke@1 419 throws ClassNotFoundException {
duke@1 420 String res = null;
duke@1 421
duke@1 422 Type retType = method.returnType();
duke@1 423 String typesig = method.signature();
duke@1 424 TypeSignature newTypeSig = new TypeSignature(root);
duke@1 425 String sig = newTypeSig.getTypeSignature(typesig, retType);
duke@1 426 boolean longName = needLongName(method, clazz);
duke@1 427
duke@1 428 if (sig.charAt(0) != '(')
duke@1 429 Util.error("invalid.method.signature", sig);
duke@1 430
duke@1 431
duke@1 432 res = "JNIEXPORT " + jniType(retType) + " JNICALL" + lineSep + jniMethodName(method, cname, longName)
duke@1 433 + "(JNIEnv *, " + cRcvrDecl(method, cname);
duke@1 434 Parameter[] params = method.parameters();
duke@1 435 Type argTypes[] = new Type[params.length];
duke@1 436 for(int p = 0; p < params.length; p++){
duke@1 437 argTypes[p] = params[p].type();
duke@1 438 }
duke@1 439
duke@1 440 /* It would have been nice to include the argument names in the
duke@1 441 declaration, but there seems to be a bug in the "BinaryField"
duke@1 442 class, causing the getArguments() method to return "null" for
duke@1 443 most (non-constructor) methods. */
duke@1 444 for (int i = 0; i < argTypes.length; i++)
duke@1 445 res = res + ", " + jniType(argTypes[i]);
duke@1 446 res = res + ");" + lineSep;
duke@1 447 return res;
duke@1 448 }
duke@1 449
duke@1 450 protected final boolean needLongName(MethodDoc method,
duke@1 451 ClassDoc clazz)
duke@1 452 throws ClassNotFoundException {
duke@1 453 String methodName = method.name();
duke@1 454 for (int i = 0; i < methods.length; i++) {
duke@1 455 MethodDoc memberMethod = (MethodDoc) methods[i];
duke@1 456 if ((memberMethod != method) &&
duke@1 457 memberMethod.isNative() && (methodName == memberMethod.name()))
duke@1 458 return true;
duke@1 459 }
duke@1 460 return false;
duke@1 461 }
duke@1 462
duke@1 463 protected final String jniMethodName(MethodDoc method, String cname,
duke@1 464 boolean longName) {
duke@1 465 String res = "Java_" + cname + "_" + method.name();
duke@1 466
duke@1 467 if (longName) {
duke@1 468 Type mType = method.returnType();
duke@1 469 Parameter[] params = method.parameters();
duke@1 470 Type argTypes[] = new Type[params.length];
duke@1 471 for(int p = 0; p < params.length; p++){
duke@1 472 argTypes[p] = params[p].type();
duke@1 473 }
duke@1 474
duke@1 475 res = res + "__";
duke@1 476 for (int i = 0; i < argTypes.length; i++){
duke@1 477 Type t = argTypes[i];
duke@1 478 String tname = t.typeName();
duke@1 479 TypeSignature newTypeSig = new TypeSignature(root);
duke@1 480 String sig = newTypeSig.getTypeSignature(tname);
duke@1 481 res = res + nameToIdentifier(sig);
duke@1 482 }
duke@1 483 }
duke@1 484 return res;
duke@1 485 }
duke@1 486
duke@1 487 protected final String jniType(Type t) {
duke@1 488 String elmT =t.typeName();
duke@1 489 if (t.dimension().indexOf("[]") != -1) {
duke@1 490 if(elmT.equals("boolean"))return "jbooleanArray";
duke@1 491 else if(elmT.equals("byte"))return "jbyteArray";
duke@1 492 else if(elmT.equals("char"))return "jcharArray";
duke@1 493 else if(elmT.equals("short"))return "jshortArray";
duke@1 494 else if(elmT.equals("int"))return "jintArray";
duke@1 495 else if(elmT.equals("long"))return "jlongArray";
duke@1 496 else if(elmT.equals("float"))return "jfloatArray";
duke@1 497 else if(elmT.equals("double"))return "jdoubleArray";
duke@1 498 else if((t.dimension().indexOf("[][]") != -1) || (t.asClassDoc() != null)) return "jobjectArray";
duke@1 499 } else {
duke@1 500 if(elmT.equals("void"))return "void";
duke@1 501 else if(elmT.equals("boolean"))return "jboolean";
duke@1 502 else if(elmT.equals("byte"))return "jbyte";
duke@1 503 else if(elmT.equals("char"))return "jchar";
duke@1 504 else if(elmT.equals("short"))return "jshort";
duke@1 505 else if(elmT.equals("int"))return "jint";
duke@1 506 else if(elmT.equals("long"))return "jlong";
duke@1 507 else if(elmT.equals("float"))return "jfloat";
duke@1 508 else if(elmT.equals("double"))return "jdouble";
duke@1 509 else if (t.asClassDoc() != null) {
duke@1 510 if (elmT.equals("String"))
duke@1 511 return "jstring";
duke@1 512 else if (t.asClassDoc().subclassOf(root.classNamed("java.lang.Class")))
duke@1 513 return "jclass";
duke@1 514 else
duke@1 515 return "jobject";
duke@1 516 }
duke@1 517 }
duke@1 518 Util.bug("jni.unknown.type");
duke@1 519 return null; /* dead code. */
duke@1 520 }
duke@1 521
duke@1 522 protected String llniType(Type t, boolean handleize, boolean longDoubleOK) {
duke@1 523 String res = null;
duke@1 524 String elmt = t.typeName();
duke@1 525 if (t.dimension().indexOf("[]") != -1) {
duke@1 526 if((t.dimension().indexOf("[][]") != -1)
duke@1 527 || (t.asClassDoc() != null)) res = "IArrayOfRef";
duke@1 528 else if(elmt.equals("boolean")) res = "IArrayOfBoolean";
duke@1 529 else if(elmt.equals("byte")) res = "IArrayOfByte";
duke@1 530 else if(elmt.equals("char")) res = "IArrayOfChar";
duke@1 531 else if(elmt.equals("int")) res = "IArrayOfInt";
duke@1 532 else if(elmt.equals("long")) res = "IArrayOfLong";
duke@1 533 else if(elmt.equals("float")) res = "IArrayOfFloat";
duke@1 534 else if(elmt.equals("double")) res = "IArrayOfDouble";
duke@1 535 if (!handleize) res = "DEREFERENCED_" + res;
duke@1 536 } else {
duke@1 537 if(elmt.equals("void")) res = "void";
duke@1 538 else if( (elmt.equals("boolean")) || (elmt.equals("byte"))
duke@1 539 ||(elmt.equals("char")) || (elmt.equals("short"))
duke@1 540 || (elmt.equals("int"))) res = "java_int";
duke@1 541 else if(elmt.equals("long")) res = longDoubleOK
duke@1 542 ? "java_long" : "val32 /* java_long */";
duke@1 543 else if(elmt.equals("float")) res = "java_float";
duke@1 544 else if(elmt.equals("double")) res = res = longDoubleOK
duke@1 545 ? "java_double" : "val32 /* java_double */";
duke@1 546 else if(t.asClassDoc() != null) {
duke@1 547 res = "I" + mangleClassName(t.asClassDoc().qualifiedName());
duke@1 548 if (!handleize) res = "DEREFERENCED_" + res;
duke@1 549 }
duke@1 550 }
duke@1 551 return res;
duke@1 552 }
duke@1 553
duke@1 554 protected final String cRcvrDecl(MemberDoc field, String cname) {
duke@1 555 return (field.isStatic() ? "jclass" : "jobject");
duke@1 556 }
duke@1 557
duke@1 558 protected String maskName(String s) {
duke@1 559 return "LLNI_mask(" + s + ")";
duke@1 560 }
duke@1 561
duke@1 562 protected String llniFieldName(MemberDoc field) {
duke@1 563 return maskName(field.name());
duke@1 564 }
duke@1 565
duke@1 566 protected final boolean isLongOrDouble(Type t) {
duke@1 567 String tc = t.typeName();
duke@1 568 return (tc.equals("long") || tc.equals("double"));
duke@1 569 }
duke@1 570
duke@1 571 /* Do unicode to ansi C identifier conversion.
duke@1 572 %%% This may not be right, but should be called more often. */
duke@1 573 protected final String nameToIdentifier(String name) {
duke@1 574 int len = name.length();
duke@1 575 StringBuffer buf = new StringBuffer(len);
duke@1 576 for (int i = 0; i < len; i++) {
duke@1 577 char c = name.charAt(i);
duke@1 578 if (isASCIILetterOrDigit(c))
duke@1 579 buf.append(c);
duke@1 580 else if (c == '/')
duke@1 581 buf.append('_');
duke@1 582 else if (c == '.')
duke@1 583 buf.append('_');
duke@1 584 else if (c == '_')
duke@1 585 buf.append("_1");
duke@1 586 else if (c == ';')
duke@1 587 buf.append("_2");
duke@1 588 else if (c == '[')
duke@1 589 buf.append("_3");
duke@1 590 else
duke@1 591 buf.append("_0" + ((int)c));
duke@1 592 }
duke@1 593 return new String(buf);
duke@1 594 }
duke@1 595
duke@1 596 protected final boolean isASCIILetterOrDigit(char c) {
duke@1 597 if (((c >= 'A') && (c <= 'Z')) ||
duke@1 598 ((c >= 'a') && (c <= 'z')) ||
duke@1 599 ((c >= '0') && (c <= '9')))
duke@1 600 return true;
duke@1 601 else
duke@1 602 return false;
duke@1 603 }
duke@1 604 }

mercurial