summaryrefslogtreecommitdiffstats
path: root/src/classes/com/sun/gluegen/procaddress
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/com/sun/gluegen/procaddress')
-rwxr-xr-xsrc/classes/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java191
-rwxr-xr-xsrc/classes/com/sun/gluegen/procaddress/ProcAddressConfiguration.java256
-rwxr-xr-xsrc/classes/com/sun/gluegen/procaddress/ProcAddressEmitter.java370
-rwxr-xr-xsrc/classes/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java153
4 files changed, 0 insertions, 970 deletions
diff --git a/src/classes/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java b/src/classes/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java
deleted file mode 100755
index 423f009e2..000000000
--- a/src/classes/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.sun.gluegen.procaddress;
-
-import java.io.*;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-
-public class ProcAddressCMethodBindingEmitter extends CMethodBindingEmitter {
- private boolean callThroughProcAddress;
- private static String procAddressJavaTypeName =
- JavaType.createForClass(Long.TYPE).jniTypeName();
- private ProcAddressEmitter emitter;
-
- public ProcAddressCMethodBindingEmitter(CMethodBindingEmitter methodToWrap,
- final boolean callThroughProcAddress,
- ProcAddressEmitter emitter) {
- super(
- new MethodBinding(methodToWrap.getBinding()) {
- public String getName() {
- if (callThroughProcAddress) {
- return ProcAddressEmitter.WRAP_PREFIX + super.getName();
- } else {
- return super.getName();
- }
- }
-
- public String getRenamedMethodName() {
- if (callThroughProcAddress) {
- return ProcAddressEmitter.WRAP_PREFIX + super.getRenamedMethodName();
- } else {
- return super.getRenamedMethodName();
- }
- }
- },
- methodToWrap.getDefaultOutput(),
- methodToWrap.getJavaPackageName(),
- methodToWrap.getJavaClassName(),
- methodToWrap.getIsOverloadedBinding(),
- methodToWrap.getIsJavaMethodStatic(),
- true,
- methodToWrap.forIndirectBufferAndArrayImplementation()
- );
-
- if (methodToWrap.getReturnValueCapacityExpression() != null) {
- setReturnValueCapacityExpression(methodToWrap.getReturnValueCapacityExpression());
- }
- if (methodToWrap.getReturnValueLengthExpression() != null) {
- setReturnValueLengthExpression(methodToWrap.getReturnValueLengthExpression());
- }
- setTemporaryCVariableDeclarations(methodToWrap.getTemporaryCVariableDeclarations());
- setTemporaryCVariableAssignments (methodToWrap.getTemporaryCVariableAssignments ());
-
- setCommentEmitter(defaultCommentEmitter);
- this.callThroughProcAddress = callThroughProcAddress;
- this.emitter = emitter;
- }
-
- protected int emitArguments(PrintWriter writer) {
- int numEmitted = super.emitArguments(writer);
- if (callThroughProcAddress) {
- if (numEmitted > 0)
- {
- writer.print(", ");
- }
- writer.print(procAddressJavaTypeName);
- writer.print(" procAddress");
- ++numEmitted;
- }
-
- return numEmitted;
- }
-
- protected void emitBodyVariableDeclarations(PrintWriter writer) {
- if (callThroughProcAddress) {
- // create variable for the function pointer with the right type, and set
- // it to the value of the passed-in glProcAddress
- FunctionSymbol cSym = getBinding().getCSymbol();
- String funcPointerTypedefName =
- emitter.getFunctionPointerTypedefName(cSym);
-
- writer.print(" ");
- writer.print(funcPointerTypedefName);
- writer.print(" ptr_");
- writer.print(cSym.getName());
- writer.println(";");
- }
-
- super.emitBodyVariableDeclarations(writer);
- }
-
- protected void emitBodyVariablePreCallSetup(PrintWriter writer,
- boolean emittingPrimitiveArrayCritical) {
- super.emitBodyVariablePreCallSetup(writer, emittingPrimitiveArrayCritical);
-
- if (callThroughProcAddress) {
- if (!emittingPrimitiveArrayCritical) {
- // set the function pointer to the value of the passed-in glProcAddress
- FunctionSymbol cSym = getBinding().getCSymbol();
- String funcPointerTypedefName = emitter.getFunctionPointerTypedefName(cSym);
-
- String ptrVarName = "ptr_" + cSym.getName();
-
- writer.print(" ");
- writer.print(ptrVarName);
- writer.print(" = (");
- writer.print(funcPointerTypedefName);
- writer.println(") (intptr_t) procAddress;");
-
- writer.println(" assert(" + ptrVarName + " != NULL);");
- }
- }
- }
-
- protected void emitBodyCallCFunction(PrintWriter writer) {
- if (!callThroughProcAddress) {
- super.emitBodyCallCFunction(writer);
- } else {
- // Make the call to the actual C function
- writer.print(" ");
-
- // WARNING: this code assumes that the return type has already been
- // typedef-resolved.
- Type cReturnType = binding.getCReturnType();
-
- if (!cReturnType.isVoid()) {
- writer.print("_res = ");
- }
- MethodBinding binding = getBinding();
- if (binding.hasContainingType()) {
- // FIXME: this can and should be handled and unified with the
- // associated code in the CMethodBindingEmitter
- throw new IllegalStateException("Cannot call through function pointer because binding has containing type: " + binding);
- }
-
- // call throught the run-time function pointer
- writer.print("(* ptr_");
- writer.print(binding.getCSymbol().getName());
- writer.print(") ");
- writer.print("(");
- emitBodyPassCArguments(writer);
- writer.println(");");
- }
- }
-
- protected String jniMangle(MethodBinding binding) {
- StringBuffer buf = new StringBuffer(super.jniMangle(binding));
- if (callThroughProcAddress) {
- jniMangle(Long.TYPE, buf, false); // to account for the additional _addr_ parameter
- }
- return buf.toString();
- }
-}
diff --git a/src/classes/com/sun/gluegen/procaddress/ProcAddressConfiguration.java b/src/classes/com/sun/gluegen/procaddress/ProcAddressConfiguration.java
deleted file mode 100755
index 54dd2cbf8..000000000
--- a/src/classes/com/sun/gluegen/procaddress/ProcAddressConfiguration.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.sun.gluegen.procaddress;
-
-import java.io.*;
-import java.text.*;
-import java.util.*;
-
-import com.sun.gluegen.*;
-
-public class ProcAddressConfiguration extends JavaConfiguration
-{
- private boolean emitProcAddressTable = false;
- private String tableClassPackage;
- private String tableClassName = "ProcAddressTable";
- private Set/*<String>*/ skipProcAddressGen = new HashSet();
- private List/*<String>*/ forceProcAddressGen = new ArrayList();
- private String getProcAddressTableExpr;
- private ConvNode procAddressNameConverter;
-
- protected void dispatch(String cmd, StringTokenizer tok, File file, String filename, int lineNo) throws IOException {
- if (cmd.equalsIgnoreCase("EmitProcAddressTable"))
- {
- emitProcAddressTable =
- readBoolean("EmitProcAddressTable", tok, filename, lineNo).booleanValue();
- }
- else if (cmd.equalsIgnoreCase("ProcAddressTablePackage"))
- {
- tableClassPackage = readString("ProcAddressTablePackage", tok, filename, lineNo);
- }
- else if (cmd.equalsIgnoreCase("ProcAddressTableClassName"))
- {
- tableClassName = readString("ProcAddressTableClassName", tok, filename, lineNo);
- }
- else if (cmd.equalsIgnoreCase("SkipProcAddressGen"))
- {
- String sym = readString("SkipProcAddressGen", tok, filename, lineNo);
- skipProcAddressGen.add(sym);
- }
- else if (cmd.equalsIgnoreCase("ForceProcAddressGen"))
- {
- String sym = readString("ForceProcAddressGen", tok, filename, lineNo);
- forceProcAddressGen.add(sym);
- }
- else if (cmd.equalsIgnoreCase("GetProcAddressTableExpr"))
- {
- getProcAddressTableExpr = readGetProcAddressTableExpr(tok, filename, lineNo);
- }
- else if (cmd.equalsIgnoreCase("ProcAddressNameExpr"))
- {
- readProcAddressNameExpr(tok, filename, lineNo);
- }
- else
- {
- super.dispatch(cmd,tok,file,filename,lineNo);
- }
- }
-
- protected String readGetProcAddressTableExpr(StringTokenizer tok, String filename, int lineNo) {
- try {
- String restOfLine = tok.nextToken("\n\r\f");
- return restOfLine.trim();
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"GetProcAddressTableExpr\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void setProcAddressNameExpr(String expr) {
- // Parse this into something allowing us to map from a function
- // name to the typedef'ed function pointer name
- List/*<String>*/ tokens = new ArrayList/*<String>*/();
- StringTokenizer tok1 = new StringTokenizer(expr);
- while (tok1.hasMoreTokens()) {
- String sstr = tok1.nextToken();
- StringTokenizer tok2 = new StringTokenizer(sstr, "$()", true);
- while (tok2.hasMoreTokens()) {
- tokens.add(tok2.nextToken());
- }
- }
-
- // Now that the string is flattened out, convert it to nodes
- procAddressNameConverter = makeConverter(tokens.iterator());
- if (procAddressNameConverter == null) {
- throw new NoSuchElementException("Error creating converter from string");
- }
- }
-
- protected void readProcAddressNameExpr(StringTokenizer tok, String filename, int lineNo) {
- try {
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- setProcAddressNameExpr(restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ProcAddressNameExpr\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- private static ConvNode makeConverter(Iterator/*<String>*/ iter) {
- List/*<ConvNode>*/ result = new ArrayList/*<ConvNode>*/();
- while (iter.hasNext()) {
- String str = (String) iter.next();
- if (str.equals("$")) {
- String command = (String) iter.next();
- String openParen = (String) iter.next();
- if (!openParen.equals("(")) {
- throw new NoSuchElementException("Expected \"(\"");
- }
- boolean uppercase = false;
- if (command.equalsIgnoreCase("UPPERCASE")) {
- uppercase = true;
- } else if (!command.equalsIgnoreCase("LOWERCASE")) {
- throw new NoSuchElementException("Unknown ProcAddressNameExpr command \"" + command + "\"");
- }
- result.add(new CaseNode(uppercase, makeConverter(iter)));
- } else if (str.equals(")")) {
- // Fall through and return
- } else if (str.indexOf('{') >= 0) {
- result.add(new FormatNode(str));
- } else {
- result.add(new ConstStringNode(str));
- }
- }
- if (result.size() == 0) {
- return null;
- } else if (result.size() == 1) {
- return (ConvNode) result.get(0);
- } else {
- return new ConcatNode(result);
- }
- }
-
- /** Helper class for converting a function name to the typedef'ed
- function pointer name */
- static abstract class ConvNode {
- abstract String convert(String funcName);
- }
-
- static class FormatNode extends ConvNode {
- private MessageFormat msgFmt;
-
- FormatNode(String fmt) {
- msgFmt = new MessageFormat(fmt);
- }
-
- String convert(String funcName) {
- StringBuffer buf = new StringBuffer();
- msgFmt.format(new Object[] { funcName }, buf, null);
- return buf.toString();
- }
- }
-
- static class ConstStringNode extends ConvNode {
- private String str;
-
- ConstStringNode(String str) {
- this.str = str;
- }
-
- String convert(String funcName) {
- return str;
- }
- }
-
- static class ConcatNode extends ConvNode {
- private List/*<ConvNode>*/ children;
-
- ConcatNode(List/*<ConvNode>*/ children) {
- this.children = children;
- }
-
- String convert(String funcName) {
- StringBuffer res = new StringBuffer();
- for (Iterator iter = children.iterator(); iter.hasNext(); ) {
- ConvNode node = (ConvNode) iter.next();
- res.append(node.convert(funcName));
- }
- return res.toString();
- }
- }
-
- static class CaseNode extends ConvNode {
- private boolean upperCase;
- private ConvNode child;
-
- CaseNode(boolean upperCase, ConvNode child) {
- this.upperCase = upperCase;
- this.child = child;
- }
-
- public String convert(String funcName) {
- if (upperCase) {
- return child.convert(funcName).toUpperCase();
- } else {
- return child.convert(funcName).toLowerCase();
- }
- }
- }
-
- public boolean emitProcAddressTable() { return emitProcAddressTable; }
- public String tableClassPackage() { return tableClassPackage; }
- public String tableClassName() { return tableClassName; }
- public boolean skipProcAddressGen (String name) { return skipProcAddressGen.contains(name); }
- public List getForceProcAddressGen() { return forceProcAddressGen; }
- public String getProcAddressTableExpr() {
- if (getProcAddressTableExpr == null) {
- throw new RuntimeException("GetProcAddressTableExpr was not defined in .cfg file");
- }
- return getProcAddressTableExpr;
- }
- public String convertToFunctionPointerName(String funcName) {
- if (procAddressNameConverter == null) {
- throw new RuntimeException("ProcAddressNameExpr was not defined in .cfg file");
- }
-
- return procAddressNameConverter.convert(funcName);
- }
-}
diff --git a/src/classes/com/sun/gluegen/procaddress/ProcAddressEmitter.java b/src/classes/com/sun/gluegen/procaddress/ProcAddressEmitter.java
deleted file mode 100755
index 75fb59c2f..000000000
--- a/src/classes/com/sun/gluegen/procaddress/ProcAddressEmitter.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.sun.gluegen.procaddress;
-
-import java.io.*;
-import java.text.MessageFormat;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-import com.sun.gluegen.runtime.*;
-
-/**
- * A subclass of JavaEmitter that modifies the normal emission of C
- * and Java code to allow dynamic lookups of the C entry points
- * associated with the Java methods.
- */
-
-public class ProcAddressEmitter extends JavaEmitter
-{
- public static final String PROCADDRESS_VAR_PREFIX = ProcAddressHelper.PROCADDRESS_VAR_PREFIX;
- protected static final String WRAP_PREFIX = "dispatch_";
- private TypeDictionary typedefDictionary;
- private PrintWriter tableWriter;
- private String tableClassPackage;
- private String tableClassName;
-
- public void beginFunctions(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception
- {
- this.typedefDictionary = typedefDictionary;
-
- if (getProcAddressConfig().emitProcAddressTable())
- {
- beginProcAddressTable();
- }
- super.beginFunctions(typedefDictionary, structDictionary, canonMap);
- }
-
- public void endFunctions() throws Exception
- {
- if (getProcAddressConfig().emitProcAddressTable())
- {
- endProcAddressTable();
- }
- super.endFunctions();
- }
-
- public void beginStructs(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception {
- super.beginStructs(typedefDictionary, structDictionary, canonMap);
- }
-
- public String runtimeExceptionType() {
- return getConfig().runtimeExceptionType();
- }
-
- protected JavaConfiguration createConfig() {
- return new ProcAddressConfiguration();
- }
-
- protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception
- {
- return generateMethodBindingEmittersImpl(sym);
- }
-
- protected boolean needsModifiedEmitters(FunctionSymbol sym) {
- if (!needsProcAddressWrapper(sym) ||
- getConfig().isUnimplemented(sym.getName())) {
- return false;
- }
-
- return true;
- }
-
- private List generateMethodBindingEmittersImpl(FunctionSymbol sym) throws Exception
- {
- List defaultEmitters = super.generateMethodBindingEmitters(sym);
-
- // if the superclass didn't generate any bindings for the symbol, let's
- // honor that (for example, the superclass might have caught an Ignore
- // direction that matched the symbol's name).
- if (defaultEmitters.isEmpty())
- {
- return defaultEmitters;
- }
-
- // Don't do anything special if this symbol doesn't require
- // modifications
- if (!needsModifiedEmitters(sym))
- {
- return defaultEmitters;
- }
-
- ArrayList modifiedEmitters = new ArrayList(defaultEmitters.size());
-
- if (needsProcAddressWrapper(sym)) {
- if (getProcAddressConfig().emitProcAddressTable()) {
- // emit an entry in the GL proc address table for this method.
- emitProcAddressTableEntryForSymbol(sym);
- }
- }
-
- for (Iterator iter = defaultEmitters.iterator(); iter.hasNext(); )
- {
- FunctionEmitter emitter = (FunctionEmitter) iter.next();
- if (emitter instanceof JavaMethodBindingEmitter)
- {
- generateModifiedEmitters((JavaMethodBindingEmitter) emitter, modifiedEmitters);
- }
- else if (emitter instanceof CMethodBindingEmitter)
- {
- generateModifiedEmitters((CMethodBindingEmitter) emitter, modifiedEmitters);
- }
- else
- {
- throw new RuntimeException("Unexpected emitter type: " +
- emitter.getClass().getName());
- }
- }
-
- return modifiedEmitters;
- }
-
- /**
- * Returns the name of the typedef for a pointer to the function
- * represented by the argument as defined by the ProcAddressNameExpr
- * in the .cfg file. For example, in the OpenGL headers, if the
- * argument is the function "glFuncName", the value returned will be
- * "PFNGLFUNCNAMEPROC". This returns a valid string regardless of
- * whether or not the typedef is actually defined.
- */
- protected String getFunctionPointerTypedefName(FunctionSymbol sym) {
- return getProcAddressConfig().convertToFunctionPointerName(sym.getName());
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- protected void generateModifiedEmitters(JavaMethodBindingEmitter baseJavaEmitter, List emitters) {
- if (getConfig().manuallyImplement(baseJavaEmitter.getName())) {
- // User will provide Java-side implementation of this routine;
- // pass through any emitters which will produce signatures for
- // it unmodified
- emitters.add(baseJavaEmitter);
- return;
- }
-
- // See whether we need a proc address entry for this one
- boolean callThroughProcAddress = needsProcAddressWrapper(baseJavaEmitter.getBinding().getCSymbol());
-
- ProcAddressJavaMethodBindingEmitter emitter =
- new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter,
- callThroughProcAddress,
- getProcAddressConfig().getProcAddressTableExpr(),
- baseJavaEmitter.isForImplementingMethodCall(),
- this);
- emitters.add(emitter);
-
- // If this emitter doesn't have a body (i.e., is a public native
- // call), we need to force it to emit a body, and produce another
- // one to act as the entry point
- if (baseJavaEmitter.signatureOnly() &&
- baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.PUBLIC) &&
- baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.NATIVE) &&
- callThroughProcAddress) {
- emitter.setEmitBody(true);
- emitter.removeModifier(JavaMethodBindingEmitter.NATIVE);
- emitter = new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter,
- callThroughProcAddress,
- getProcAddressConfig().getProcAddressTableExpr(),
- true,
- this);
- emitter.setForImplementingMethodCall(true);
- emitters.add(emitter);
- }
- }
-
- protected void generateModifiedEmitters(CMethodBindingEmitter baseCEmitter, List emitters)
- {
- // See whether we need a proc address entry for this one
- boolean callThroughProcAddress = needsProcAddressWrapper(baseCEmitter.getBinding().getCSymbol());
- // Note that we don't care much about the naming of the C argument
- // variables so to keep things simple we ignore the buffer object
- // property for the binding
-
- // The C-side JNI binding for this particular function will have an
- // extra final argument, which is the address (the OpenGL procedure
- // address) of the function it needs to call
- ProcAddressCMethodBindingEmitter res = new ProcAddressCMethodBindingEmitter(baseCEmitter, callThroughProcAddress, this);
- MessageFormat exp = baseCEmitter.getReturnValueCapacityExpression();
- if (exp != null) {
- res.setReturnValueCapacityExpression(exp);
- }
- emitters.add(res);
- }
-
- protected boolean needsProcAddressWrapper(FunctionSymbol sym)
- {
- String symName = sym.getName();
-
- ProcAddressConfiguration config = getProcAddressConfig();
-
- // We should only generate code to call through a function pointer
- // if the symbol has an associated function pointer typedef.
- String funcPointerTypedefName = getFunctionPointerTypedefName(sym);
- boolean shouldWrap = typedefDictionary.containsKey(funcPointerTypedefName);
- //System.err.println(funcPointerTypedefName + " defined: " + shouldWrap);
-
- if (config.skipProcAddressGen(symName)) {
- shouldWrap = false;
- }
-
- if (shouldWrap)
- {
- // Hoist argument names from function pointer if not supplied in prototype
- FunctionType typedef = typedefDictionary.get(funcPointerTypedefName).asPointer().getTargetType().asFunction();
- FunctionType fun = sym.getType();
- int numarg = typedef.getNumArguments();
- for ( int i =0; i < numarg; i++ )
- {
- if ( fun.getArgumentName(i) == null )
- fun.setArgumentName(i,typedef.getArgumentName(i));
- }
- }
-
- return shouldWrap;
- }
-
- private void beginProcAddressTable() throws Exception
- {
- tableClassPackage = getProcAddressConfig().tableClassPackage();
- tableClassName = getProcAddressConfig().tableClassName();
-
- // Table defaults to going into the impl directory unless otherwise overridden
- String implPackageName = tableClassPackage;
- if (implPackageName == null) {
- implPackageName = getImplPackageName();
- }
- String jImplRoot =
- getJavaOutputDir() + File.separator +
- CodeGenUtils.packageAsPath(implPackageName);
-
- tableWriter = openFile(jImplRoot + File.separator + tableClassName + ".java");
-
- CodeGenUtils.emitAutogeneratedWarning(tableWriter, this);
-
- tableWriter.println("package " + implPackageName + ";");
- tableWriter.println();
- for (Iterator iter = getConfig().imports().iterator(); iter.hasNext(); ) {
- tableWriter.println("import " + ((String) iter.next()) + ";");
- }
- tableWriter.println();
-
- tableWriter.println("/**");
- tableWriter.println(" * This table is a cache of pointers to the dynamically-linkable C");
- tableWriter.println(" * functions this autogenerated Java binding has exposed. Some");
- tableWriter.println(" * libraries such as OpenGL, OpenAL and others define function pointer");
- tableWriter.println(" * signatures rather than statically linkable entry points for the");
- tableWriter.println(" * purposes of being able to query at run-time whether a particular");
- tableWriter.println(" * extension is available. This table acts as a cache of these");
- tableWriter.println(" * function pointers. Each function pointer is typically looked up at");
- tableWriter.println(" * run-time by a platform-dependent mechanism such as dlsym(),");
- tableWriter.println(" * wgl/glXGetProcAddress(), or alGetProcAddress(). The associated");
- tableWriter.println(" * autogenerated Java and C code accesses the fields in this table to");
- tableWriter.println(" * call the various functions. If the field containing the function");
- tableWriter.println(" * pointer is 0, the function is considered to be unavailable and can");
- tableWriter.println(" * not be called.");
- tableWriter.println(" */");
- tableWriter.println("public class " + tableClassName);
- tableWriter.println("{");
-
- for (Iterator iter = getProcAddressConfig().getForceProcAddressGen().iterator(); iter.hasNext(); ) {
- emitProcAddressTableEntryForString((String) iter.next());
- }
- }
-
- private void endProcAddressTable() throws Exception
- {
- PrintWriter w = tableWriter;
-
- w.println(" /**");
- w.println(" * This is a convenience method to get (by name) the native function");
- w.println(" * pointer for a given function. It lets you avoid having to");
- w.println(" * manually compute the &quot;" + PROCADDRESS_VAR_PREFIX + " + ");
- w.println(" * &lt;functionName&gt;&quot; member variable name and look it up via");
- w.println(" * reflection; it also will throw an exception if you try to get the");
- w.println(" * address of an unknown function, or one that is statically linked");
- w.println(" * and therefore does not have a function pointer in this table.");
- w.println(" *");
- w.println(" * @throws RuntimeException if the function pointer was not found in");
- w.println(" * this table, either because the function was unknown or because");
- w.println(" * it was statically linked.");
- w.println(" */");
- w.println(" public long getAddressFor(String functionName) {");
- w.println(" String addressFieldName = com.sun.gluegen.runtime.ProcAddressHelper.PROCADDRESS_VAR_PREFIX + functionName;");
- w.println(" try { ");
- w.println(" java.lang.reflect.Field addressField = getClass().getField(addressFieldName);");
- w.println(" return addressField.getLong(this);");
- w.println(" } catch (Exception e) {");
- w.println(" // The user is calling a bogus function or one which is not");
- w.println(" // runtime linked");
- w.println(" throw new RuntimeException(");
- w.println(" \"WARNING: Address query failed for \\\"\" + functionName +");
- w.println(" \"\\\"; it's either statically linked or is not a known \" +");
- w.println(" \"function\", e);");
- w.println(" } ");
- w.println(" }");
-
- w.println("} // end of class " + tableClassName);
- w.flush();
- w.close();
- }
-
- protected void emitProcAddressTableEntryForSymbol(FunctionSymbol cFunc)
- {
- emitProcAddressTableEntryForString(cFunc.getName());
- }
-
- protected void emitProcAddressTableEntryForString(String str)
- {
- tableWriter.print(" public long ");
- tableWriter.print(PROCADDRESS_VAR_PREFIX);
- tableWriter.print(str);
- tableWriter.println(";");
- }
-
- protected ProcAddressConfiguration getProcAddressConfig() {
- return (ProcAddressConfiguration) getConfig();
- }
-}
diff --git a/src/classes/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java b/src/classes/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java
deleted file mode 100755
index a020ad715..000000000
--- a/src/classes/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- *
- * Sun gratefully acknowledges that this software was originally authored
- * and developed by Kenneth Bradley Russell and Christopher John Kline.
- */
-
-package com.sun.gluegen.procaddress;
-
-import java.io.*;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-
-/** A specialization of JavaMethodBindingEmitter with knowledge of how
- to call through a function pointer. */
-
-public class ProcAddressJavaMethodBindingEmitter extends JavaMethodBindingEmitter {
- private final CommentEmitter commentEmitterForWrappedMethod =
- new WrappedMethodCommentEmitter();
-
- private boolean callThroughProcAddress;
- private String getProcAddressTableExpr;
- private boolean changeNameAndArguments;
- private ProcAddressEmitter emitter;
-
- public ProcAddressJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap,
- boolean callThroughProcAddress,
- String getProcAddressTableExpr,
- boolean changeNameAndArguments,
- ProcAddressEmitter emitter) {
- super(methodToWrap);
- this.callThroughProcAddress = callThroughProcAddress;
- this.getProcAddressTableExpr = getProcAddressTableExpr;
- this.changeNameAndArguments = changeNameAndArguments;
- this.emitter = emitter;
- if (callThroughProcAddress) {
- setCommentEmitter(new WrappedMethodCommentEmitter());
- }
-
- if (methodToWrap.getBinding().hasContainingType())
- {
- throw new IllegalArgumentException(
- "Cannot create proc. address wrapper; method has containing type: \"" +
- methodToWrap.getBinding() + "\"");
- }
- }
-
- public ProcAddressJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap) {
- this(methodToWrap,
- methodToWrap.callThroughProcAddress,
- methodToWrap.getProcAddressTableExpr,
- methodToWrap.changeNameAndArguments,
- methodToWrap.emitter);
- }
-
- public String getName() {
- String res = super.getName();
- if (changeNameAndArguments) {
- return ProcAddressEmitter.WRAP_PREFIX + res;
- }
- return res;
- }
-
- protected int emitArguments(PrintWriter writer) {
- int numEmitted = super.emitArguments(writer);
- if (callThroughProcAddress) {
- if (changeNameAndArguments) {
- if (numEmitted > 0) {
- writer.print(", ");
- }
-
- writer.print("long procAddress");
- ++numEmitted;
- }
- }
-
- return numEmitted;
- }
-
- protected String getImplMethodName(boolean direct) {
- String name = super.getImplMethodName(direct);
- if (callThroughProcAddress) {
- return ProcAddressEmitter.WRAP_PREFIX + name;
- }
- return name;
- }
-
- protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
- super.emitPreCallSetup(binding, writer);
-
- if (callThroughProcAddress) {
- String procAddressVariable =
- ProcAddressEmitter.PROCADDRESS_VAR_PREFIX + binding.getName();
- writer.println(" final long __addr_ = " + getProcAddressTableExpr + "." + procAddressVariable + ";");
- writer.println(" if (__addr_ == 0) {");
- writer.println(" throw new " + emitter.runtimeExceptionType() + "(\"Method \\\"" + binding.getName() + "\\\" not available\");");
- writer.println(" }");
- }
- }
-
- protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean indirect) {
- int numEmitted = super.emitCallArguments(binding, writer, indirect);
- if (callThroughProcAddress) {
- if (numEmitted > 0) {
- writer.print(", ");
- }
- writer.print("__addr_");
- ++numEmitted;
- }
-
- return numEmitted;
- }
-
- /** This class emits the comment for the wrapper method */
- private class WrappedMethodCommentEmitter extends JavaMethodBindingEmitter.DefaultCommentEmitter {
- protected void emitBeginning(FunctionEmitter methodEmitter, PrintWriter writer) {
- writer.print("Entry point (through function pointer) to C language function <br>: ");
- }
- }
-}