Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java')
-rw-r--r--bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java880
1 files changed, 0 insertions, 880 deletions
diff --git a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java b/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
deleted file mode 100644
index a793ae3fde..0000000000
--- a/bundles/org.eclipse.swt.tools/JNI Generation/org/eclipse/swt/tools/internal/NativesGenerator.java
+++ /dev/null
@@ -1,880 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swt.tools.internal;
-
-import java.lang.reflect.*;
-import java.util.HashSet;
-import java.util.Iterator;
-
-public class NativesGenerator extends JNIGenerator {
-
-boolean enterExitMacro;
-
-public NativesGenerator() {
- enterExitMacro = true;
-}
-
-public void generateCopyright() {
- generateMetaData("swt_copyright");
-}
-
-public void generateIncludes() {
- String outputName = getOutputName();
- outputln("#include \"swt.h\"");
- output("#include \"");
- output(outputName);
- outputln("_structs.h\"");
- output("#include \"");
- output(outputName);
- outputln("_stats.h\"");
- outputln();
-}
-
-public void generate(Class clazz, String methodName) {
- Method[] methods = clazz.getDeclaredMethods();
- int count = 0;
- for (int i = 0; i < methods.length; i++) {
- if (methods[i].getName().startsWith(methodName)) count++;
- }
- Method[] result = new Method[count];
- count = 0;
- for (int i = 0; i < methods.length; i++) {
- if (methods[i].getName().startsWith(methodName)) result[count++] = methods[i];
- }
- generate(result);
-}
-
-public void generate(Class clazz) {
- Method[] methods = clazz.getDeclaredMethods();
- int i = 0;
- for (; i < methods.length; i++) {
- Method method = methods[i];
- if ((method.getModifiers() & Modifier.NATIVE) != 0) break;
- }
- if (i == methods.length) return;
- sort(methods);
- generateNativeMacro(clazz);
- generateExcludes(methods);
- generate(methods);
-}
-
-public void generate(Method[] methods) {
- sort(methods);
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
- if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
- generate(method);
- if (progress != null) progress.step();
- }
-}
-
-public void generate(Method method) {
- MethodData methodData = getMetaData().getMetaData(method);
- if (methodData.getFlag(FLAG_NO_GEN)) return;
- Class returnType = method.getReturnType();
- Class[] paramTypes = method.getParameterTypes();
- String function = getFunctionName(method);
-
- if (!(returnType == Void.TYPE || returnType.isPrimitive() || isSystemClass(returnType) || returnType == String.class)) {
- output("Warning: bad return type. :");
- outputln(method.toString());
- return;
- }
-
- generateSourceStart(function);
- if (isCPP) {
- output("extern \"C\" ");
- generateFunctionPrototype(method, function, paramTypes, returnType, true);
- outputln(";");
- }
- generateFunctionPrototype(method, function, paramTypes, returnType, false);
- generateFunctionBody(method, methodData, function, paramTypes, returnType);
- generateSourceEnd(function);
- outputln();
-}
-
-public void setEnterExitMacro(boolean enterExitMacro) {
- this.enterExitMacro = enterExitMacro;
-}
-
-void generateExcludes(Method[] methods) {
- HashSet excludes = new HashSet();
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
- if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
- MethodData methodData = getMetaData().getMetaData(method);
- String exclude = methodData.getExclude();
- if (exclude.length() != 0) {
- excludes.add(exclude);
- }
- }
- for (Iterator iter = excludes.iterator(); iter.hasNext();) {
- String exclude = (String)iter.next();
- outputln(exclude);
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
- if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
- MethodData methodData = getMetaData().getMetaData(method);
- String methodExclude = methodData.getExclude();
- if (exclude.equals(methodExclude)) {
- output("#define NO_");
- outputln(getFunctionName(method));
- }
- }
- outputln("#endif");
- outputln();
- }
-}
-
-void generateNativeMacro(Class clazz) {
- output("#define ");
- output(getClassName(clazz));
- output("_NATIVE(func) Java_");
- output(toC(clazz.getName()));
- outputln("_##func");
- outputln();
-}
-
-boolean generateGetParameter(Method method, int i, Class paramType, ParameterData paramData, boolean critical, int indent) {
- if (paramType.isPrimitive() || isSystemClass(paramType)) return false;
- String iStr = String.valueOf(i);
- for (int j = 0; j < indent; j++) output("\t");
- output("if (arg");
- output(iStr);
- output(") if ((lparg");
- output(iStr);
- output(" = ");
- if (paramType.isArray()) {
- Class componentType = paramType.getComponentType();
- if (componentType.isPrimitive()) {
- if (critical) {
- if (isCPP) {
- output("(");
- output(getTypeSignature2(componentType));
- output("*)");
- output("env->GetPrimitiveArrayCritical(arg");
- } else {
- output("(*env)->GetPrimitiveArrayCritical(env, arg");
- }
- output(iStr);
- output(", NULL)");
- } else {
- if (isCPP) {
- output("env->Get");
- } else {
- output("(*env)->Get");
- }
- output(getTypeSignature1(componentType));
- if (isCPP) {
- output("ArrayElements(arg");
- } else {
- output("ArrayElements(env, arg");
- }
- output(iStr);
- output(", NULL)");
- }
- } else {
- throw new Error("not done");
- }
- } else if (paramType == String.class) {
- if (paramData.getFlag(FLAG_UNICODE)) {
- if (isCPP) {
- output("env->GetStringChars(arg");
- } else {
- output("(*env)->GetStringChars(env, arg");
- }
- output(iStr);
- output(", NULL)");
- } else {
- if (isCPP) {
- output("env->GetStringUTFChars(arg");
- } else {
- output("(*env)->GetStringUTFChars(env, arg");
- }
- output(iStr);
- output(", NULL)");
- }
- } else {
- if (paramData.getFlag(FLAG_NO_IN)) {
- output("&_arg");
- output(iStr);
- } else {
- output("get");
- output(getClassName(paramType));
- output("Fields(env, arg");
- output(iStr);
- output(", &_arg");
- output(iStr);
- output(")");
- }
- }
- outputln(") == NULL) goto fail;");
- return true;
-}
-
-void generateSetParameter(int i, Class paramType, ParameterData paramData, boolean critical) {
- if (paramType.isPrimitive() || isSystemClass(paramType)) return;
- String iStr = String.valueOf(i);
- if (paramType.isArray()) {
- output("\tif (arg");
- output(iStr);
- output(" && lparg");
- output(iStr);
- output(") ");
- Class componentType = paramType.getComponentType();
- if (componentType.isPrimitive()) {
- if (critical) {
- if (isCPP) {
- output("env->ReleasePrimitiveArrayCritical(arg");
- } else {
- output("(*env)->ReleasePrimitiveArrayCritical(env, arg");
- }
- output(iStr);
- } else {
- if (isCPP) {
- output("env->Release");
- } else {
- output("(*env)->Release");
- }
- output(getTypeSignature1(componentType));
- if (isCPP) {
- output("ArrayElements(arg");
- } else {
- output("ArrayElements(env, arg");
- }
- output(iStr);
- }
- output(", lparg");
- output(iStr);
- output(", ");
- if (paramData.getFlag(FLAG_NO_OUT)) {
- output("JNI_ABORT");
- } else {
- output("0");
- }
- output(");");
- } else {
- throw new Error("not done");
- }
- outputln();
- } else if (paramType == String.class) {
- output("\tif (arg");
- output(iStr);
- output(" && lparg");
- output(iStr);
- output(") ");
- if (paramData.getFlag(FLAG_UNICODE)) {
- if (isCPP) {
- output("env->ReleaseStringChars(arg");
- } else {
- output("(*env)->ReleaseStringChars(env, arg");
- }
- } else {
- if (isCPP) {
- output("env->ReleaseStringUTFChars(arg");
- } else {
- output("(*env)->ReleaseStringUTFChars(env, arg");
- }
- }
- output(iStr);
- output(", lparg");
- output(iStr);
- outputln(");");
- } else {
- if (!paramData.getFlag(FLAG_NO_OUT)) {
- output("\tif (arg");
- output(iStr);
- output(" && lparg");
- output(iStr);
- output(") ");
- output("set");
- output(getClassName(paramType));
- output("Fields(env, arg");
- output(iStr);
- output(", lparg");
- output(iStr);
- outputln(");");
- }
- }
-}
-
-void generateExitMacro(Method method, String function) {
- if (!enterExitMacro) return;
- output("\t");
- output(getClassName(method.getDeclaringClass()));
- output("_NATIVE_EXIT(env, that, ");
- output(function);
- outputln("_FUNC);");
-}
-
-void generateEnterMacro(Method method, String function) {
- if (!enterExitMacro) return;
- output("\t");
- output(getClassName(method.getDeclaringClass()));
- output("_NATIVE_ENTER(env, that, ");
- output(function);
- outputln("_FUNC);");
-}
-
-boolean generateLocalVars(Method method, Class[] paramTypes, Class returnType) {
- boolean needsReturn = enterExitMacro;
- for (int i = 0; i < paramTypes.length; i++) {
- Class paramType = paramTypes[i];
- if (paramType.isPrimitive() || isSystemClass(paramType)) continue;
- ParameterData paramData = getMetaData().getMetaData(method, i);
- output("\t");
- if (paramType.isArray()) {
- Class componentType = paramType.getComponentType();
- if (componentType.isPrimitive()) {
- output(getTypeSignature2(componentType));
- output(" *lparg" + i);
- output("=NULL;");
- } else {
- throw new Error("not done");
- }
- } else if (paramType == String.class) {
- if (paramData.getFlag(FLAG_UNICODE)) {
- output("const jchar *lparg" + i);
- } else {
- output("const char *lparg" + i);
- }
- output("= NULL;");
- } else {
- output(getClassName(paramType));
- output(" _arg" + i);
- if (paramData.getFlag(FLAG_INIT)) output("={0}");
- output(", *lparg" + i);
- output("=NULL;");
- }
- outputln();
- needsReturn = true;
- }
- if (needsReturn) {
- if (returnType != Void.TYPE) {
- output("\t");
- output(getTypeSignature2(returnType));
- outputln(" rc = 0;");
- }
- }
- return needsReturn;
-}
-
-boolean generateGetters(Method method, Class[] paramTypes) {
- boolean genFailTag = false;
- int criticalCount = 0;
- for (int i = 0; i < paramTypes.length; i++) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (!isCritical(paramType, paramData)) {
- genFailTag |= generateGetParameter(method, i, paramType, paramData, false, 1);
- } else {
- criticalCount++;
- }
- }
- if (criticalCount != 0) {
- outputln("#ifdef JNI_VERSION_1_2");
- outputln("\tif (IS_JNI_1_2) {");
- for (int i = 0; i < paramTypes.length; i++) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (isCritical(paramType, paramData)) {
- genFailTag |= generateGetParameter(method, i, paramType, paramData, true, 2);
- }
- }
- outputln("\t} else");
- outputln("#endif");
- outputln("\t{");
- for (int i = 0; i < paramTypes.length; i++) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (isCritical(paramType, paramData)) {
- genFailTag |= generateGetParameter(method, i, paramType, paramData, false, 2);
- }
- }
- outputln("\t}");
- }
- return genFailTag;
-}
-
-void generateSetters(Method method, Class[] paramTypes) {
- int criticalCount = 0;
- for (int i = paramTypes.length - 1; i >= 0; i--) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (isCritical(paramType, paramData)) {
- criticalCount++;
- }
- }
- if (criticalCount != 0) {
- outputln("#ifdef JNI_VERSION_1_2");
- outputln("\tif (IS_JNI_1_2) {");
- for (int i = paramTypes.length - 1; i >= 0; i--) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (isCritical(paramType, paramData)) {
- output("\t");
- generateSetParameter(i, paramType, paramData, true);
- }
- }
- outputln("\t} else");
- outputln("#endif");
- outputln("\t{");
- for (int i = paramTypes.length - 1; i >= 0; i--) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (isCritical(paramType, paramData)) {
- output("\t");
- generateSetParameter(i, paramType, paramData, false);
- }
- }
- outputln("\t}");
- }
- for (int i = paramTypes.length - 1; i >= 0; i--) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (!isCritical(paramType, paramData)) {
- generateSetParameter(i, paramType, paramData, false);
- }
- }
-}
-
-void generateDynamicFunctionCall(Method method, MethodData methodData, Class[] paramTypes, Class returnType, boolean needsReturn) {
- outputln("/*");
- generateFunctionCall(method, methodData, paramTypes, returnType, needsReturn);
- outputln("*/");
- outputln("\t{");
-
- String name = method.getName();
- if (name.startsWith("_")) name = name.substring(1);
- if (getPlatform().equals("win32")) {
- outputln("\t\tstatic int initialized = 0;");
- outputln("\t\tstatic HMODULE hm = NULL;");
- outputln("\t\tstatic FARPROC fp = NULL;");
- if (returnType != Void.TYPE) {
- if (needsReturn) {
- outputln("\t\trc = 0;");
- }
- }
- outputln("\t\tif (!initialized) {");
- output("\t\t\tif (!hm) hm = LoadLibrary(");
- output(name);
- outputln("_LIB);");
- output("\t\t\tif (hm) fp = GetProcAddress(hm, \"");
- output(name);
- outputln("\");");
- outputln("\t\t\tinitialized = 1;");
- outputln("\t\t}");
- outputln("\t\tif (fp) {");
- output("\t\t");
- generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
- output("fp");
- generateFunctionCallRightSide(method, methodData, paramTypes, 0);
- output(";");
- outputln();
- outputln("\t\t}");
- } else if (getPlatform().equals("carbon")) {
- outputln("\t\tstatic int initialized = 0;");
- outputln("\t\tstatic CFBundleRef bundle = NULL;");
- output("\t\ttypedef ");
- output(getTypeSignature2(returnType));
- output(" (*FPTR)(");
- for (int i = 0; i < paramTypes.length; i++) {
- if (i != 0) output(", ");
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- String cast = paramData.getCast();
- if (cast.length() > 2) {
- output(cast.substring(1, cast.length() - 1));
- } else {
- output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT)));
- }
- }
- outputln(");");
- outputln("\t\tstatic FPTR fptr;");
- if (returnType != Void.TYPE) {
- if (needsReturn) {
- outputln("\t\trc = 0;");
- }
- }
- outputln("\t\tif (!initialized) {");
- output("\t\t\tif (!bundle) bundle = CFBundleGetBundleWithIdentifier(CFSTR(");
- output(name);
- outputln("_LIB));");
- output("\t\t\tif (bundle) fptr = (FPTR)CFBundleGetFunctionPointerForName(bundle, CFSTR(\"");
- output(name);
- outputln("\"));");
- outputln("\t\t\tinitialized = 1;");
- outputln("\t\t}");
- outputln("\t\tif (fptr) {");
- output("\t\t");
- generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
- output("(*fptr)");
- generateFunctionCallRightSide(method, methodData, paramTypes, 0);
- output(";");
- outputln();
- outputln("\t\t}");
- } else {
- outputln("\t\tstatic int initialized = 0;");
- outputln("\t\tstatic void *handle = NULL;");
- output("\t\ttypedef ");
- output(getTypeSignature2(returnType));
- output(" (*FPTR)(");
- for (int i = 0; i < paramTypes.length; i++) {
- if (i != 0) output(", ");
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- String cast = paramData.getCast();
- if (cast.length() > 2) {
- output(cast.substring(1, cast.length() - 1));
- } else {
- output(getTypeSignature4(paramType, paramData.getFlag(FLAG_STRUCT)));
- }
- }
- outputln(");");
- outputln("\t\tstatic FPTR fptr;");
- if (returnType != Void.TYPE) {
- if (needsReturn) {
- outputln("\t\trc = 0;");
- }
- }
- outputln("\t\tif (!initialized) {");
- output("\t\t\tif (!handle) handle = dlopen(");
- output(name);
- outputln("_LIB, RTLD_LAZY);");
- output("\t\t\tif (handle) fptr = (FPTR)dlsym(handle, \"");
- output(name);
- outputln("\");");
- outputln("\t\t\tinitialized = 1;");
- outputln("\t\t}");
- outputln("\t\tif (fptr) {");
- output("\t\t");
- generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
- output("(*fptr)");
- generateFunctionCallRightSide(method, methodData, paramTypes, 0);
- output(";");
- outputln();
- outputln("\t\t}");
- }
-
- outputln("\t}");
-}
-
-void generateFunctionCallLeftSide(Method method, MethodData methodData, Class returnType, boolean needsReturn) {
- output("\t");
- if (returnType != Void.TYPE) {
- if (needsReturn) {
- output("rc = ");
- } else {
- output("return ");
- }
- output("(");
- output(getTypeSignature2(returnType));
- output(")");
- }
- if (methodData.getFlag(FLAG_ADDRESS)) {
- output("&");
- }
- if (methodData.getFlag(FLAG_JNI)) {
- output(isCPP ? "env->" : "(*env)->");
- }
-}
-
-void generateFunctionCallRightSide(Method method, MethodData methodData, Class[] paramTypes, int paramStart) {
- if (!methodData.getFlag(FLAG_CONST)) {
- output("(");
- if (methodData.getFlag(FLAG_JNI)) {
- if (!isCPP) output("env, ");
- }
- for (int i = paramStart; i < paramTypes.length; i++) {
- Class paramType = paramTypes[i];
- ParameterData paramData = getMetaData().getMetaData(method, i);
- if (i != paramStart) output(", ");
- if (paramData.getFlag(FLAG_STRUCT)) output("*");
- output(paramData.getCast());
- if (paramData.getFlag(FLAG_GCOBJECT)) output("TO_OBJECT(");
- if (i == paramTypes.length - 1 && paramData.getFlag(FLAG_SENTINEL)) {
- output("NULL");
- } else {
- if (!paramType.isPrimitive() && !isSystemClass(paramType)) output("lp");
- output("arg" + i);
- }
- if (paramData.getFlag(FLAG_GCOBJECT)) output(")");
- }
- output(")");
- }
-}
-
-void generateFunctionCall(Method method, MethodData methodData, Class[] paramTypes, Class returnType, boolean needsReturn) {
- String copy = (String)methodData.getParam("copy");
- boolean makeCopy = copy.length() != 0 && isCPP && returnType != Void.TYPE;
- if (makeCopy) {
- output("\t");
- output(copy);
- output(" temp = ");
- } else {
- generateFunctionCallLeftSide(method, methodData, returnType, needsReturn);
- }
- int paramStart = 0;
- String name = method.getName();
- if (name.startsWith("_")) name = name.substring(1);
- if (name.equalsIgnoreCase("call")) {
- output("(");
- ParameterData paramData = getMetaData().getMetaData(method, 0);
- String cast = paramData.getCast();
- if (cast.length() != 0 && !cast.equals("()")) {
- output(cast);
- } else {
- output("(");
- output(getTypeSignature2(returnType));
- output(" (*)())");
- }
- output("arg0)");
- paramStart = 1;
- } else if (name.startsWith("VtblCall")) {
- output("((");
- output(getTypeSignature2(returnType));
- output(" (STDMETHODCALLTYPE *)(");
- for (int i = 1; i < paramTypes.length; i++) {
- if (i != 1) output(", ");
- Class paramType = paramTypes[i];
- output(getTypeSignature4(paramType));
- }
- output("))(*(");
- output(getTypeSignature4(paramTypes[1]));
- output(" **)arg1)[arg0])");
- paramStart = 1;
- } else if (methodData.getFlag(FLAG_CPP) || methodData.getFlag(FLAG_SETTER) || methodData.getFlag(FLAG_GETTER) || methodData.getFlag(FLAG_ADDER)) {
- if (methodData.getFlag(FLAG_GCOBJECT)) {
- output("TO_HANDLE(");
- }
- output("(");
- ParameterData paramData = getMetaData().getMetaData(method, 0);
- if (paramData.getFlag(FLAG_STRUCT)) output("*");
- String cast = paramData.getCast();
- if (cast.length() != 0 && !cast.equals("()")) {
- output(cast);
- }
- if (paramData.getFlag(FLAG_GCOBJECT)) {
- output("TO_OBJECT(");
- }
- output("arg0");
- if (paramData.getFlag(FLAG_GCOBJECT)) {
- output(")");
- }
- output(")->");
- String accessor = methodData.getAccessor();
- if (accessor.length() != 0) {
- output(accessor);
- } else {
- int index = -1;
- if ((index = name.indexOf('_')) != -1) {
- output(name.substring(index + 1, name.length()));
- } else {
- output(name);
- }
- }
- paramStart = 1;
- } else if (methodData.getFlag(FLAG_GCNEW)) {
- output("TO_HANDLE(gcnew ");
- String accessor = methodData.getAccessor();
- if (accessor.length() != 0) {
- output(accessor);
- } else {
- int index = -1;
- if ((index = name.indexOf('_')) != -1) {
- output(name.substring(index + 1));
- } else {
- output(name);
- }
- }
- } else if (methodData.getFlag(FLAG_NEW)) {
- output("new ");
- String accessor = methodData.getAccessor();
- if (accessor.length() != 0) {
- output(accessor);
- } else {
- int index = -1;
- if ((index = name.indexOf('_')) != -1) {
- output(name.substring(0, index));
- } else {
- output(name);
- }
- }
- } else if (methodData.getFlag(FLAG_DELETE)) {
- output("delete ");
- ParameterData paramData = getMetaData().getMetaData(method, 0);
- String cast = paramData.getCast();
- if (cast.length() != 0 && !cast.equals("()")) {
- output(cast);
- } else {
- output("(");
- output(name.substring(0, name.indexOf("_")));
- output(" *)");
- }
- outputln("arg0;");
- return;
- } else {
- if (methodData.getFlag(FLAG_GCOBJECT)) {
- output("TO_HANDLE(");
- }
- String accessor = methodData.getAccessor();
- if (accessor.length() != 0) {
- output(accessor);
- } else {
- output(name);
- }
- }
- if ((methodData.getFlag(FLAG_SETTER) && paramTypes.length == 3) || (methodData.getFlag(FLAG_GETTER) && paramTypes.length == 2)) {
- output("[arg1]");
- paramStart++;
- }
- if (methodData.getFlag(FLAG_SETTER)) output(" = ");
- if (methodData.getFlag(FLAG_ADDER)) output(" += ");
- if (!methodData.getFlag(FLAG_GETTER)) {
- generateFunctionCallRightSide(method, methodData, paramTypes, paramStart);
- }
- if (methodData.getFlag(FLAG_GCNEW) || methodData.getFlag(FLAG_GCOBJECT)) {
- output(")");
- }
- output(";");
- outputln();
- if (makeCopy) {
- outputln("\t{");
- output("\t\t");
- output(copy);
- output("* copy = new ");
- output(copy);
- outputln("();");
- outputln("\t\t*copy = temp;");
- output("\t\trc = ");
- output("(");
- output(getTypeSignature2(returnType));
- output(")");
- outputln("copy;");
- outputln("\t}");
- }
-}
-
-void generateReturn(Method method, Class returnType, boolean needsReturn) {
- if (needsReturn && returnType != Void.TYPE) {
- outputln("\treturn rc;");
- }
-}
-
-void generateMemmove(Method method, String function, Class[] paramTypes) {
- generateEnterMacro(method, function);
- output("\t");
- boolean get = paramTypes[0].isPrimitive();
- String className = getClassName(paramTypes[get ? 1 : 0]);
- output(get ? "if (arg1) get" : "if (arg0) set");
- output(className);
- output(get ? "Fields(env, arg1, (" : "Fields(env, arg0, (");
- output(className);
- output(get ? " *)arg0)" : " *)arg1)");
- outputln(";");
- generateExitMacro(method, function);
-}
-
-void generateFunctionBody(Method method, MethodData methodData, String function, Class[] paramTypes, Class returnType) {
- outputln("{");
-
- /* Custom GTK memmoves. */
- String name = method.getName();
- if (name.startsWith("_")) name = name.substring(1);
- boolean isMemove = (name.equals("memmove") || name.equals("MoveMemory")) && paramTypes.length == 2 && returnType == Void.TYPE;
- if (isMemove) {
- generateMemmove(method, function, paramTypes);
- } else {
- boolean needsReturn = generateLocalVars(method, paramTypes, returnType);
- generateEnterMacro(method, function);
- boolean genFailTag = generateGetters(method, paramTypes);
- if (methodData.getFlag(FLAG_DYNAMIC)) {
- generateDynamicFunctionCall(method, methodData, paramTypes, returnType, needsReturn);
- } else {
- generateFunctionCall(method, methodData, paramTypes, returnType, needsReturn);
- }
- if (genFailTag) outputln("fail:");
- generateSetters(method, paramTypes);
- generateExitMacro(method, function);
- generateReturn(method, returnType, needsReturn);
- }
-
- outputln("}");
-}
-
-void generateFunctionPrototype(Method method, String function, Class[] paramTypes, Class returnType, boolean singleLine) {
- output("JNIEXPORT ");
- output(getTypeSignature2(returnType));
- output(" JNICALL ");
- output(getClassName(method.getDeclaringClass()));
- output("_NATIVE(");
- output(function);
- if (singleLine) {
- output(")");
- output("(JNIEnv *env, ");
- } else {
- outputln(")");
- output("\t(JNIEnv *env, ");
- }
- if ((method.getModifiers() & Modifier.STATIC) != 0) {
- output("jclass");
- } else {
- output("jobject");
- }
- output(" that");
- for (int i = 0; i < paramTypes.length; i++) {
- Class paramType = paramTypes[i];
- output(", ");
- output(getTypeSignature2(paramType));
- output(" arg" + i);
- }
- output(")");
- if (!singleLine) outputln();
-}
-
-void generateSourceStart(String function) {
- output("#ifndef NO_");
- outputln(function);
-}
-
-void generateSourceEnd(String function) {
- outputln("#endif");
-}
-
-boolean isCritical(Class paramType, ParameterData paramData) {
- return paramType.isArray() && paramType.getComponentType().isPrimitive() && paramData.getFlag(FLAG_CRITICAL);
-}
-
-boolean isSystemClass(Class type) {
- return type == Object.class || type == Class.class;
-}
-
-public static void main(String[] args) {
-// args = new String[]{"org.eclipse.swt.internal.win32.OS"};
- if (args.length < 1) {
- System.out.println("Usage: java NativesGenerator <className1> <className2>");
- return;
- }
- try {
- NativesGenerator gen = new NativesGenerator();
- for (int i = 0; i < args.length; i++) {
- String clazzName = args[i];
- Class clazz = Class.forName(clazzName);
- gen.generate(clazz);
-// gen.generate(clazz, "CommandBar_Destroy");
- }
- } catch (Exception e) {
- System.out.println("Problem");
- e.printStackTrace(System.out);
- }
-}
-
-}

Back to the top