summaryrefslogtreecommitdiffstats
path: root/src/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java')
-rw-r--r--src/java/com/sun/gluegen/ConstantDefinition.java91
-rw-r--r--src/java/com/sun/gluegen/GlueEmitterControls.java8
-rw-r--r--src/java/com/sun/gluegen/GlueGen.java84
-rw-r--r--src/java/com/sun/gluegen/JavaConfiguration.java46
-rw-r--r--src/java/com/sun/gluegen/JavaEmitter.java54
-rw-r--r--src/java/com/sun/gluegen/JavaMethodBindingEmitter.java9
-rw-r--r--src/java/com/sun/gluegen/SymbolFilter.java64
-rw-r--r--src/java/com/sun/gluegen/UnifiedName.java216
-rw-r--r--src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java11
-rwxr-xr-xsrc/java/com/sun/gluegen/opengl/GLConfiguration.java36
-rw-r--r--src/java/com/sun/gluegen/opengl/GLEmitter.java453
-rw-r--r--src/java/com/sun/gluegen/opengl/GLUnifiedName.java115
-rw-r--r--src/java/com/sun/gluegen/pcpp/PCPP.java7
-rwxr-xr-xsrc/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java4
-rw-r--r--src/java/com/sun/gluegen/runtime/opengl/GLExtensionNames.java9
15 files changed, 487 insertions, 720 deletions
diff --git a/src/java/com/sun/gluegen/ConstantDefinition.java b/src/java/com/sun/gluegen/ConstantDefinition.java
new file mode 100644
index 0000000..e06903b
--- /dev/null
+++ b/src/java/com/sun/gluegen/ConstantDefinition.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2008 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.
+ *
+ */
+
+package com.sun.gluegen;
+
+import java.util.*;
+
+/** Represents the definition of a constant which was provided either
+ via a #define statement or through an enum definition. */
+public class ConstantDefinition {
+ private String name;
+ private String value;
+ private String enumName;
+ private Set/*<String>*/ aliases;
+
+ public ConstantDefinition(String name,
+ String value,
+ String enumName) {
+ this.name = name;
+ this.value = value;
+ this.enumName = enumName;
+ }
+
+ public boolean equals(ConstantDefinition other) {
+ return (equals(name, other.name) &&
+ equals(value, other.value) &&
+ equals(enumName, other.enumName));
+ }
+
+ private boolean equals(String s1, String s2) {
+ if (s1 == null || s2 == null) {
+ if (s1 == null && s2 == null) {
+ return true;
+ }
+ return false;
+ }
+
+ return s1.equals(s2);
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+ public String getName() { return name; }
+ public String getValue() { return value; }
+ /** Returns null if this definition was not part of an
+ enumeration, or if the enum was anonymous. */
+ public String getEnumName() { return enumName; }
+
+ public Set/*<String>*/ getAliases() {
+ return aliases;
+ }
+
+ public void addAlias(String alias) {
+ if (aliases == null) {
+ aliases = new LinkedHashSet/*<String>*/();
+ }
+ aliases.add(alias);
+ }
+}
diff --git a/src/java/com/sun/gluegen/GlueEmitterControls.java b/src/java/com/sun/gluegen/GlueEmitterControls.java
index 46ff9fd..659a4ee 100644
--- a/src/java/com/sun/gluegen/GlueEmitterControls.java
+++ b/src/java/com/sun/gluegen/GlueEmitterControls.java
@@ -50,4 +50,12 @@ public interface GlueEmitterControls {
/** Finds the full path name of the specified header file based on
the include directories specified on the command line. */
public String findHeaderFile(String headerFileName);
+
+ /** Runs the given filter on the #defines, enum definitions and
+ function symbols that this controller has parsed. It is valid to
+ call this method as soon as {@link GlueEmitter#beginEmission}
+ has been called on the GlueEmitter, and it is recommended to
+ call it from that method call. Calling it during glue code
+ emission may cause problems. */
+ public void runSymbolFilter(SymbolFilter filter);
}
diff --git a/src/java/com/sun/gluegen/GlueGen.java b/src/java/com/sun/gluegen/GlueGen.java
index 1a7c690..5d61fdb 100644
--- a/src/java/com/sun/gluegen/GlueGen.java
+++ b/src/java/com/sun/gluegen/GlueGen.java
@@ -54,6 +54,10 @@ public class GlueGen implements GlueEmitterControls {
private java.util.List forcedStructNames = new ArrayList();
private PCPP preprocessor;
+ // State for SymbolFilters
+ private java.util.List/*<ConstantDefinition>*/ constants;
+ private java.util.List/*<FunctionSymbol>*/ functions;
+
public void forceStructEmission(String typedefName) {
forcedStructNames.add(typedefName);
}
@@ -62,6 +66,18 @@ public class GlueGen implements GlueEmitterControls {
return preprocessor.findFile(headerFileName);
}
+ public void runSymbolFilter(SymbolFilter filter) {
+ filter.filterSymbols(constants, functions);
+ java.util.List/*<ConstantDefinition>*/ newConstants = filter.getConstants();
+ java.util.List/*<FunctionSymbol>*/ newFunctions = filter.getFunctions();
+ if (newConstants != null) {
+ constants = newConstants;
+ }
+ if (newFunctions != null) {
+ functions = newFunctions;
+ }
+ }
+
public void run(String[] args) {
try {
Reader reader = null;
@@ -198,43 +214,65 @@ public class GlueGen implements GlueEmitterControls {
MachineDescription md64 = new MachineDescription64Bit();
emit.setMachineDescription(md32, md64);
- // begin emission of glue code
- emit.beginEmission(this);
-
- emit.beginDefines();
- Set emittedDefines = new HashSet(100);
- // emit java equivalent of enum { ... } statements
+ // Repackage the enum and #define statements from the parser into a common format
+ // so that SymbolFilters can operate upon both identically
+ constants = new ArrayList/*<ConstantDefinition>*/();
for (Iterator iter = headerParser.getEnums().iterator(); iter.hasNext(); ) {
EnumType enumeration = (EnumType)iter.next();
+ String enumName = enumeration.getName();
+ if (enumName.equals("<anonymous>")) {
+ enumName = null;
+ }
// iterate over all values in the enumeration
for (int i = 0; i < enumeration.getNumEnumerates(); ++i) {
String enumElementName = enumeration.getEnumName(i);
- if (emittedDefines.contains(enumElementName) == false) {
- emittedDefines.add(enumElementName);
- String comment = null;
- if (! enumeration.getName().equals("<anonymous>")) {
- comment = "Defined as part of enum type \"" +
- enumeration.getName() + "\"";
- }
- emit.emitDefine(
- enumElementName,
- String.valueOf(enumeration.getEnumValue(i)),
- comment);
- }
+ String value = String.valueOf(enumeration.getEnumValue(i));
+ constants.add(new ConstantDefinition(enumElementName, value, enumName));
}
}
- // emit java equivalent of #define statements
for (Iterator iter = lexer.getDefines().iterator(); iter.hasNext(); ) {
Define def = (Define) iter.next();
- if (emittedDefines.contains(def.getName()) == false) {
+ constants.add(new ConstantDefinition(def.getName(), def.getValue(), null));
+ }
+
+ functions = headerParser.getParsedFunctions();
+
+ // begin emission of glue code
+ emit.beginEmission(this);
+
+ emit.beginDefines();
+ Set emittedDefines = new HashSet(100);
+ // emit java equivalent of enum { ... } statements
+ for (Iterator iter = constants.iterator(); iter.hasNext(); ) {
+ ConstantDefinition def = (ConstantDefinition) iter.next();
+ if (!emittedDefines.contains(def.getName())) {
emittedDefines.add(def.getName());
- emit.emitDefine(def.getName(), def.getValue(), null);
+ String comment = null;
+ Set/*<String>*/ aliases = def.getAliases();
+ if (aliases != null) {
+ comment = "Alias for: <code>";
+ for (Iterator i2 = aliases.iterator(); i2.hasNext(); ) {
+ String alias = (String) i2.next();
+ comment += " " + alias;
+ }
+ comment += "</code>";
+ }
+ if (def.getEnumName() != null) {
+ String enumName = "Defined as part of enum type \"" +
+ def.getEnumName() + "\"";
+ if (comment == null) {
+ comment = enumName;
+ } else {
+ comment += "<br>\n" + enumName;
+ }
+ }
+ emit.emitDefine(def.getName(),
+ def.getValue(),
+ comment);
}
}
emit.endDefines();
- java.util.List functions = headerParser.getParsedFunctions();
-
// Iterate through the functions finding structs that are referenced in
// the function signatures; these will be remembered for later emission
ReferencedStructs referencedStructs = new ReferencedStructs();
diff --git a/src/java/com/sun/gluegen/JavaConfiguration.java b/src/java/com/sun/gluegen/JavaConfiguration.java
index 91cb814..5693150 100644
--- a/src/java/com/sun/gluegen/JavaConfiguration.java
+++ b/src/java/com/sun/gluegen/JavaConfiguration.java
@@ -142,12 +142,9 @@ public class JavaConfiguration {
private Map/*<String,List<String>>*/ implementedInterfaces = new HashMap();
private Map/*<String,String>*/ parentClass = new HashMap();
private Map/*<String,String>*/ javaTypeRenames = new HashMap();
- private Map/*<String,String>*/ javaMethodRenames = new HashMap();
+ private Map/*<String,String>*/ javaSymbolRenames = new HashMap();
private Map/*<String,List<String>>*/ javaPrologues = new HashMap();
private Map/*<String,List<String>>*/ javaEpilogues = new HashMap();
- protected Map/*<String, UnifiedName>*/ uniqNameMap = new HashMap();
- public Map/*<String, UnifiedName>*/ getUniqNameMap() { return uniqNameMap; }
-
/** Reads the configuration file.
@param filename path to file that should be read
@@ -632,16 +629,9 @@ public class JavaConfiguration {
}
if (extendedIntfSymbolsOnly) {
- String uniSymbol;
- UnifiedName uniName = (UnifiedName) getUniqNameMap().get(symbol);
- if(null!=uniName) {
- uniSymbol=uniName.getUni();
- } else {
- uniSymbol=symbol;
- }
- if(!extendedIntfSymbols.contains(uniSymbol)) {
+ if(!extendedIntfSymbols.contains(symbol)) {
if(DEBUG_IGNORES) {
- System.err.println("Ignore Impl !extended: "+uniSymbol+": "+uniName);
+ System.err.println("Ignore Impl !extended: " + symbol);
}
return true;
}
@@ -742,12 +732,18 @@ public class JavaConfiguration {
return javaTypeName;
}
- /** Returns a replacement name for this function which should be
- used as the Java name for the bound method. It still calls the
- originally-named C function under the hood. Returns null if this
- function has not been explicitly renamed. */
- public String getJavaMethodRename(String functionName) {
- return (String) javaMethodRenames.get(functionName);
+ /** Returns a replacement name for this function or definition which
+ should be used as the Java name for the bound method or
+ constant. If a function, it still calls the originally-named C
+ function under the hood. Returns null if this symbol has not
+ been explicitly renamed. */
+ public String getJavaSymbolRename(String symbolName) {
+ return (String) javaSymbolRenames.get(symbolName);
+ }
+
+ /** Programmatically adds a rename directive for the given symbol. */
+ public void addJavaSymbolRename(String origName, String newName) {
+ javaSymbolRenames.put(origName, newName);
}
/** Returns true if the emission style is AllStatic. */
@@ -928,8 +924,10 @@ public class JavaConfiguration {
readParentClass(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("RenameJavaType")) {
readRenameJavaType(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("RenameJavaMethod")) {
- readRenameJavaMethod(tok, filename, lineNo);
+ } else if (cmd.equalsIgnoreCase("RenameJavaSymbol") ||
+ // Backward compatibility
+ cmd.equalsIgnoreCase("RenameJavaMethod")) {
+ readRenameJavaSymbol(tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("RuntimeExceptionType")) {
runtimeExceptionType = readString("RuntimeExceptionType", tok, filename, lineNo);
} else if (cmd.equalsIgnoreCase("UnsupportedExceptionType")) {
@@ -1404,13 +1402,13 @@ public class JavaConfiguration {
}
}
- protected void readRenameJavaMethod(StringTokenizer tok, String filename, int lineNo) {
+ protected void readRenameJavaSymbol(StringTokenizer tok, String filename, int lineNo) {
try {
String fromName = tok.nextToken();
String toName = tok.nextToken();
- javaMethodRenames.put(fromName, toName);
+ javaSymbolRenames.put(fromName, toName);
} catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"RenameJavaMethod\" command at line " + lineNo +
+ throw new RuntimeException("Error parsing \"RenameJavaSymbol\" command at line " + lineNo +
" in file \"" + filename + "\": missing expected parameter", e);
}
}
diff --git a/src/java/com/sun/gluegen/JavaEmitter.java b/src/java/com/sun/gluegen/JavaEmitter.java
index 2588158..ffd273f 100644
--- a/src/java/com/sun/gluegen/JavaEmitter.java
+++ b/src/java/com/sun/gluegen/JavaEmitter.java
@@ -103,6 +103,40 @@ public class JavaEmitter implements GlueEmitter {
machDesc64 = md64;
}
+ class ConstantRenamer implements SymbolFilter {
+ private List/*<ConstantDefinition>*/ constants;
+
+ public void filterSymbols(List/*<ConstantDefinition>*/ constants,
+ List/*<FunctionSymbol>*/ functions) {
+ this.constants = constants;
+ doWork();
+ }
+
+ public List/*<ConstantDefinition>*/ getConstants() {
+ return constants;
+ }
+
+ public List/*<FunctionSymbol>*/ getFunctions() {
+ return null;
+ }
+
+ private void doWork() {
+ List/*<ConstantDefinition>*/ newConstants = new ArrayList/*<ConstantDefinition>*/();
+ JavaConfiguration cfg = getConfig();
+ for (Iterator iter = constants.iterator(); iter.hasNext(); ) {
+ ConstantDefinition def = (ConstantDefinition) iter.next();
+ String rename = cfg.getJavaSymbolRename(def.getName());
+ if (rename != null) {
+ ConstantDefinition newDef = new ConstantDefinition(rename, def.getValue(), def.getEnumName());
+ newDef.addAlias(def.getName());
+ def = newDef;
+ }
+ newConstants.add(def);
+ }
+ constants = newConstants;
+ }
+ }
+
public void beginEmission(GlueEmitterControls controls) throws IOException
{
try
@@ -121,6 +155,9 @@ public class JavaEmitter implements GlueEmitter {
for (Iterator iter = cfg.forcedStructs().iterator(); iter.hasNext(); ) {
controls.forceStructEmission((String) iter.next());
}
+
+ // Handle renaming of constants
+ controls.runSymbolFilter(new ConstantRenamer());
}
public void endEmission()
@@ -322,7 +359,7 @@ public class JavaEmitter implements GlueEmitter {
}
}
- validateFunctionsToBind(funcsToBindSet);
+ // validateFunctionsToBind(funcsToBindSet);
ArrayList funcsToBind = new ArrayList(funcsToBindSet.size());
funcsToBind.addAll(funcsToBindSet);
@@ -628,19 +665,6 @@ public class JavaEmitter implements GlueEmitter {
}
}
- protected void validateFunctionsToBind(Set/*FunctionSymbol*/ funcsSet) {
- for (Iterator iter = funcsSet.iterator(); iter.hasNext(); ) {
- FunctionSymbol fsOrig = (FunctionSymbol) iter.next();
- String name = fsOrig.getName();
- UnifiedName uniName = UnifiedName.getOrPut(cfg.getUniqNameMap(), name);
- String renamedName = cfg.getJavaMethodRename(fsOrig.getName());
- if(null!=renamedName) {
- uniName.setUni(renamedName);
- uniName.remapAllNames(cfg.getUniqNameMap());
- }
- }
- }
-
/**
* Generate all appropriate Java bindings for the specified C function
* symbols.
@@ -1619,7 +1643,7 @@ public class JavaEmitter implements GlueEmitter {
MethodBinding binding = new MethodBinding(sym, containingType, containingCType);
- binding.setRenamedMethodName(cfg.getJavaMethodRename(sym.getName()));
+ binding.setRenamedMethodName(cfg.getJavaSymbolRename(sym.getName()));
if (cfg.returnsString(binding.getName())) {
PointerType prt = sym.getReturnType().asPointer();
diff --git a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
index 5e6f1cb..d6d7977 100644
--- a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
+++ b/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
@@ -814,15 +814,6 @@ public class JavaMethodBindingEmitter extends FunctionEmitter
writer.print("Entry point to C language function: ");
}
protected void emitBindingCSignature(MethodBinding binding, PrintWriter writer) {
- UnifiedName uniName = (UnifiedName) cfg.getUniqNameMap().get(binding.getCSymbol().getName());
- if(null!=uniName) {
- writer.print("- Alias for: <br> <code> ");
- writer.print(binding.getCSymbol().getType().toString(uniName.getOrigStringList(", "), tagNativeBinding));
- writer.print(" </code> ");
- return ; // done
- }
- writer.print(": <br> ");
-
writer.print("<code> ");
writer.print(binding.getCSymbol().toString(tagNativeBinding));
writer.print(" </code> ");
diff --git a/src/java/com/sun/gluegen/SymbolFilter.java b/src/java/com/sun/gluegen/SymbolFilter.java
new file mode 100644
index 0000000..1cc31aa
--- /dev/null
+++ b/src/java/com/sun/gluegen/SymbolFilter.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2008 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.
+ *
+ */
+
+package com.sun.gluegen;
+
+import java.util.List;
+
+/** Provides a mechanism by which the GlueEmitter can look at all of
+ the #defines, enum values and function symbols and perform certain
+ filtering and processing which requires all of them to be visible
+ simultaneously. */
+
+public interface SymbolFilter {
+ /**
+ * Filters the given constant and function symbols. The caller
+ * will query the SymbolFilter for its resulting constant and
+ * function symbol lists after this routine returns.
+ *
+ * @param defines a list of {@link com.sun.gluegen.cgram.Define Define} objects
+ * @param functions a list of {@link com.sun.gluegen.cgram.types.FunctionSymbol FunctionSymbol} objects
+ */
+ public void filterSymbols(List/*<ConstantDefinition>*/ constants,
+ List/*<FunctionSymbol>*/ functions);
+
+ /** Returns the filtered list of constants. This method may return
+ a new list, the original list, or null, in which case the
+ original list will be used. */
+ public List/*<ConstantDefinition>*/ getConstants();
+
+ /** Returns the filtered list of function symbols. This method may
+ return a new list, the original list, or null, in which case
+ the original list will be used. */
+ public List/*<FunctionSymbol>*/ getFunctions();
+}
diff --git a/src/java/com/sun/gluegen/UnifiedName.java b/src/java/com/sun/gluegen/UnifiedName.java
deleted file mode 100644
index ec1cdb3..0000000
--- a/src/java/com/sun/gluegen/UnifiedName.java
+++ /dev/null
@@ -1,216 +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.
- *
- */
-
-package com.sun.gluegen;
-
-import java.util.*;
-
-public class UnifiedName implements Cloneable {
-
- public UnifiedName(String name) {
- nameUni=name;
- nameList=new ArrayList();
- nameSet=new HashSet();
- add(name);
- }
-
- protected UnifiedName(UnifiedName un) {
- nameUni=un.nameUni;
- nameList=new ArrayList(un.nameList);
- nameSet=new HashSet(un.nameSet);
- }
-
- public void reset() {
- resetUni();
- resetOriginal();
- }
-
- public void resetUni() {
- nameSet.remove(nameUni);
- nameUni=(String)nameList.get(0);
- }
-
- public void resetOriginal() {
- nameList.clear();
- nameSet.clear();
- add(nameUni);
- }
-
- public void setUni(String name) {
- if(!nameUni.equals(name)) {
- nameUni=name;
- add(name);
- }
- }
-
- /**
- * unique in case this name reflects only one
- * original entry (no extension unification)
- */
- public boolean isUnique() {
- return nameSet.size()==1;
- }
-
- public void add(String name) {
- if (nameSet.add(name)) {
- nameList.add(name);
- }
- }
- public void addAll(Collection col) {
- for (Iterator iter = col.iterator(); iter.hasNext(); ) {
- Object obj = iter.next();
- if( obj instanceof String ) {
- add((String)obj);
- } else {
- throw new ClassCastException("not a String: "+obj);
- }
- }
-
- }
-
- public boolean contains(UnifiedName un) {
- boolean res = contains(un.nameUni);
- for (Iterator iter = un.nameList.iterator(); !res && iter.hasNext(); ) {
- res = contains((String)iter.next());
- }
- return res;
- }
-
- public boolean contains(String name) {
- return nameSet.contains(name);
- }
-
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
- if(obj instanceof UnifiedName) {
- UnifiedName un = (UnifiedName)obj;
- return nameUni.equals(un.nameUni) && nameSet.equals(un.nameSet);
- }
- return false;
- }
-
- public Object clone() {
- return new UnifiedName(this);
- }
-
- public int hashCode() {
- return nameSet.hashCode();
- }
-
- public String getUni() { return nameUni; }
- public List getNameList() { return nameList; }
- public Set getNameSet() { return nameSet; }
-
- public int size() { return nameList.size(); }
- public String get(int i) { return (String)nameList.get(i); }
-
- public void remapAllNames(Map map) {
- List allNames = new ArrayList();
- // 1st pass: collect all other x-mappings to this one
- for (Iterator iter = nameList.iterator(); iter.hasNext(); ) {
- UnifiedName un = (UnifiedName) map.get((String)iter.next());
- if(null!=un && this!=un) {
- allNames.addAll(un.getNameList());
- }
- }
- addAll(allNames);
-
- // 2nd pass: map all containing names
- for (Iterator iter = nameList.iterator(); iter.hasNext(); ) {
- map.put((String)iter.next(), this);
- }
- }
-
- public static UnifiedName getOrPut(Map map, String name) {
- UnifiedName un = (UnifiedName)map.get(name);
- if(null==un) {
- un = new UnifiedName(name);
- un.remapAllNames(map);
- }
- return un;
- }
-
- public String getCommentString() {
- return getCommentString(true, " ");
- }
- public String getCommentString(boolean encloseCommentStartEnd, String seperator) {
- if(nameList.size()==1 && ((String)nameList.get(0)).equals(nameUni)) {
- return new String();
- }
- String res = new String();
- if(encloseCommentStartEnd) {
- res = res.concat(" /** ");
- }
- res = res.concat("Alias for: <code>");
- res = res.concat(getOrigStringList(seperator));
- res = res.concat("</code> ");
- if(encloseCommentStartEnd) {
- res = res.concat("*/");
- }
- return res;
- }
- public String getOrigStringList(String seperator) {
- String res = new String();
- for (Iterator iter = nameList.iterator(); iter.hasNext(); ) {
- res = res.concat((String)iter.next());
- if(iter.hasNext()) {
- res = res.concat(seperator);
- }
- }
- return res;
- }
-
- public String toString() {
- if(nameList.size()==1 && ((String)nameList.get(0)).equals(nameUni)) {
- return nameUni;
- }
- String res = nameUni + " /* " ;
- for (Iterator iter = nameList.iterator(); iter.hasNext(); ) {
- res = res.concat((String)iter.next()+", ");
- }
- res = res.concat(" */");
- return res;
- }
-
- protected String nameUni;
- protected List nameList;
- protected HashSet nameSet;
-
-}
-
diff --git a/src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java b/src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java
index 13660b9..4226f46 100644
--- a/src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java
+++ b/src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java
@@ -92,7 +92,7 @@ public class BuildStaticGLInfo
{
// Handles function pointer
protected static Pattern funcPattern =
- Pattern.compile("^(EGLAPI|GLAPI|extern)?(\\s*)(\\w+)(\\*)?(\\s+)(EGLAPIENTRY|GLAPIENTRY|APIENTRY|WINAPI)?(\\s*)([ew]?gl\\w+)\\s?(\\(.*)");
+ Pattern.compile("^(GLAPI|GL_API|GL_APICALL|EGLAPI|extern)?(\\s*)(\\w+)(\\*)?(\\s+)(GLAPIENTRY|GL_APIENTRY|APIENTRY|EGLAPIENTRY|WINAPI)?(\\s*)([ew]?gl\\w+)\\s?(\\(.*)");
protected static Pattern associationPattern =
Pattern.compile("\\#ifndef ([EW]?GL[X]?_[A-Za-z0-9_]+)");
protected static Pattern definePattern =
@@ -188,12 +188,13 @@ public class BuildStaticGLInfo
// Handles #ifndef GL_... #define GL_...
!identifier.equals(activeAssociation)) {
addAssociation(identifier, activeAssociation);
+ // System.err.println(" ADDING ASSOCIATION: " + identifier + " " + activeAssociation);
}
} else if ((m = associationPattern.matcher(line)).matches()) {
// found a new #ifndef GL_XXX block
activeAssociation = m.group(1);
- //System.err.println("FOUND NEW ASSOCIATION BLOCK: " + activeAssociation);
+ // System.err.println("FOUND NEW ASSOCIATION BLOCK: " + activeAssociation);
}
}
reader.close();
@@ -217,10 +218,14 @@ public class BuildStaticGLInfo
return (String) declarationToExtensionMap.get(identifier);
}
- public Set getDeclarations(String extension) {
+ public Set/*<String>*/ getDeclarations(String extension) {
return (Set) extensionToDeclarationMap.get(extension);
}
+ public Set/*<String>*/ getExtensions() {
+ return extensionToDeclarationMap.keySet();
+ }
+
public void emitJavaCode(PrintWriter output, String packageName) {
output.println("package " + packageName + ";");
output.println();
diff --git a/src/java/com/sun/gluegen/opengl/GLConfiguration.java b/src/java/com/sun/gluegen/opengl/GLConfiguration.java
index 3d61b60..3013848 100755
--- a/src/java/com/sun/gluegen/opengl/GLConfiguration.java
+++ b/src/java/com/sun/gluegen/opengl/GLConfiguration.java
@@ -50,11 +50,16 @@ public class GLConfiguration extends ProcAddressConfiguration {
// The following data members support ignoring an entire extension at a time
private List/*<String>*/ glHeaders = new ArrayList();
private Set/*<String>*/ ignoredExtensions = new HashSet();
+ private Set/*<String>*/ extensionsRenamedIntoCore = new HashSet();
private BuildStaticGLInfo glInfo;
// Maps function names to the kind of buffer object it deals with
private Map/*<String,GLEmitter.BufferObjectKind>*/ bufferObjectKinds = new HashMap();
private GLEmitter emitter;
private Set/*String*/ dropUniqVendorExtensions = new HashSet();
+ // This directive is off by default but can help automatically
+ // indicate which extensions have been folded into the core OpenGL
+ // namespace, and if not, then why not
+ private boolean autoUnifyExtensions;
public GLConfiguration(GLEmitter emitter) {
super();
@@ -72,6 +77,15 @@ public class GLConfiguration extends ProcAddressConfiguration {
String sym = readString("IgnoreExtension", tok, filename, lineNo);
ignoredExtensions.add(sym);
}
+ else if (cmd.equalsIgnoreCase("RenameExtensionIntoCore"))
+ {
+ String sym = readString("RenameExtensionIntoCore", tok, filename, lineNo);
+ extensionsRenamedIntoCore.add(sym);
+ }
+ else if (cmd.equalsIgnoreCase("AutoUnifyExtensions"))
+ {
+ autoUnifyExtensions = readBoolean("AutoUnifyExtensions", tok, filename, lineNo).booleanValue();
+ }
else if (cmd.equalsIgnoreCase("GLHeader"))
{
String sym = readString("GLHeader", tok, filename, lineNo);
@@ -228,6 +242,13 @@ public class GLConfiguration extends ProcAddressConfiguration {
return shouldIgnoreExtension(symbol, checkEXT) || super.shouldIgnoreInImpl(symbol);
}
+ /** Should we automatically ignore extensions that have already been
+ fully subsumed into the OpenGL core namespace, and if they have
+ not been, indicate which definition is not already in the core? */
+ public boolean getAutoUnifyExtensions() {
+ return autoUnifyExtensions;
+ }
+
/** shall the non unified (uniq) vendor extensions be dropped ? */
public boolean getDropUniqVendorExtensions(String extName) {
return dropUniqVendorExtensions.contains(extName);
@@ -258,4 +279,19 @@ public class GLConfiguration extends ProcAddressConfiguration {
}
}
}
+
+ /** Returns the information about the association between #defines,
+ function symbols and the OpenGL extensions they are defined
+ in. */
+ public BuildStaticGLInfo getGLInfo() {
+ return glInfo;
+ }
+
+ /** Returns the OpenGL extensions that should have all of their
+ constant definitions and functions renamed into the core
+ namespace; for example, glGenFramebuffersEXT to
+ glGenFramebuffers and GL_FRAMEBUFFER_EXT to GL_FRAMEBUFFER. */
+ public Set/*<String>*/ getExtensionsRenamedIntoCore() {
+ return extensionsRenamedIntoCore;
+ }
}
diff --git a/src/java/com/sun/gluegen/opengl/GLEmitter.java b/src/java/com/sun/gluegen/opengl/GLEmitter.java
index ab92e9d..d49f9f1 100644
--- a/src/java/com/sun/gluegen/opengl/GLEmitter.java
+++ b/src/java/com/sun/gluegen/opengl/GLEmitter.java
@@ -70,226 +70,165 @@ public class GLEmitter extends ProcAddressEmitter
public void beginEmission(GlueEmitterControls controls) throws IOException
{
getGLConfig().parseGLHeaders(controls);
+ renameExtensionsIntoCore();
+ if (getGLConfig().getAutoUnifyExtensions()) {
+ unifyExtensions(controls);
+ }
super.beginEmission(controls);
}
- class DefineEntry implements Cloneable {
- public DefineEntry(String namestr, String valuestr, String optionalComment) {
- this.name=new GLUnifiedName(namestr);
- this.value=getJavaValue(namestr, valuestr);
- this.type=getJavaType(namestr, this.value);
- this.radix=getJavaRadix(namestr, valuestr);
- this.optionalComment=optionalComment;
- }
-
- protected DefineEntry(GLUnifiedName name, String type, Object value, int radix, String optionalComment) {
- this.name=name;
- this.value=value;
- this.type=type;
- this.radix=radix;
- this.optionalComment=optionalComment;
- }
-
- public Object clone() {
- return new DefineEntry((GLUnifiedName)name.clone(), type, value, radix, optionalComment);
- }
-
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
- if(null==obj || !(obj instanceof DefineEntry)) return false;
- DefineEntry de = (DefineEntry) obj;
- return name.getUni().equals(de.name.getUni()) &&
- type.equals(de.type) &&
- value.equals(de.value);
- }
-
- public String toString() {
- String res = " public static final " + type + " " + name + " = ";
- if(16!=radix) {
- res = res + value;
- } else {
- res = res.concat("0x");
- if(value instanceof Integer) {
- res = res.concat( Integer.toString( ((Integer)value).intValue(), radix ).toUpperCase() );
- } else if(value instanceof Long) {
- res = res.concat( Long.toString( ((Long)value).longValue(), radix ).toUpperCase() );
- } else {
- res = res + value;
- }
- }
-
- return res.concat(";");
- }
-
- public String getOptCommentString() {
- if (optionalComment != null && optionalComment.length() > 0) {
- return " /** " + optionalComment + " */";
+ protected void renameExtensionsIntoCore() {
+ // This method handles renaming of entire extensions into the
+ // OpenGL core namespace. For example, it is used to move certain
+ // OpenGL ES (OES) extensions into the core namespace which are
+ // already in the core namespace in desktop OpenGL. It builds upon
+ // renaming mechanisms that are built elsewhere.
+
+ GLConfiguration config = getGLConfig();
+ BuildStaticGLInfo glInfo = config.getGLInfo();
+ for (Iterator iter = config.getExtensionsRenamedIntoCore().iterator();
+ iter.hasNext(); ) {
+ String extension = (String) iter.next();
+ Set/*<String>*/ declarations = glInfo.getDeclarations(extension);
+ if (declarations != null) {
+ for (Iterator i2 = declarations.iterator(); i2.hasNext(); ) {
+ String decl = (String) i2.next();
+ boolean isGLFunction = GLExtensionNames.isGLFunction(decl);
+ boolean isGLEnumeration = false;
+ if (!isGLFunction) {
+ isGLEnumeration = GLExtensionNames.isGLEnumeration(decl);
+ }
+ if (isGLFunction || isGLEnumeration) {
+ String renamed = GLExtensionNames.normalize(decl, isGLFunction);
+ config.addJavaSymbolRename(decl, renamed);
+ }
}
- return new String();
+ }
}
+ }
- public void add(String name) {
- this.name.add(name);
- }
- public boolean isExtensionVEN() {
- return name.isExtensionVEN();
- }
- public void normalizeVEN() {
- name.normalizeVEN();
- }
- public boolean shouldIgnoreInInterface(GLConfiguration cfg) {
- return GLEmitter.this.shouldIgnoreInInterface(name, cfg);
- }
+ class ExtensionUnifier implements SymbolFilter {
+ private List/*<ConstantDefinition>*/ constants;
+ private List/*<FunctionSymbol>*/ functions;
- protected GLUnifiedName name;
- protected Object value;
- protected String type;
- protected int radix;
- protected String optionalComment;
- }
+ public void filterSymbols(List/*<ConstantDefinition>*/ constants,
+ List/*<FunctionSymbol>*/ functions) {
+ this.constants = constants;
+ this.functions = functions;
+ doWork();
+ }
- protected boolean shouldIgnoreInInterface(GLUnifiedName name, GLConfiguration cfg) {
- boolean res = cfg.shouldIgnoreInInterface(name.getUni(), name.isUnique());
- if(JavaConfiguration.DEBUG_IGNORES) {
- if(res) {
- System.err.println("Ignore Intf Uni: "+name);
- }
- } /*
- for (Iterator iter = name.getNameList().iterator(); !res && iter.hasNext(); ) {
- String s = (String)iter.next();
- res = cfg.shouldIgnoreInInterface(s, false);
- if(JavaConfiguration.DEBUG_IGNORES) {
- if(res) {
- System.err.println("Ignore Intf Ext: "+name+", "+s);
- }
- }
- } */
- return res;
- }
+ public List/*<ConstantDefinition>*/ getConstants() {
+ return constants;
+ }
+
+ public List/*<FunctionSymbol>*/ getFunctions() {
+ return functions;
+ }
- protected boolean shouldIgnoreInImpl(GLUnifiedName name, GLConfiguration cfg) {
- boolean res = cfg.shouldIgnoreInImpl(name.getUni(), name.isUnique());
- if(JavaConfiguration.DEBUG_IGNORES) {
- if(res) {
- System.err.println("Ignore Impl Uni: "+name);
+ private void doWork() {
+ BuildStaticGLInfo glInfo = getGLConfig().getGLInfo();
+ if (glInfo == null) {
+ return;
}
- }
- /*
- if(!cfg.extendedIntfSymbolsOnly()) {
- for (Iterator iter = name.getNameList().iterator(); !res && iter.hasNext(); ) {
- String s = (String)iter.next();
- res = cfg.shouldIgnoreInImpl(s, false);
- if(JavaConfiguration.DEBUG_IGNORES) {
- if(res) {
- System.err.println("Ignore Impl Ext: "+name+", "+s);
+ // Try to retain a "good" ordering for these symbols
+ Map/*<String, ConstantDefinition>*/ constantMap = new LinkedHashMap();
+ Map/*<String, FunctionSymbol>*/ functionMap = new LinkedHashMap();
+ for (Iterator iter = constants.iterator(); iter.hasNext(); ) {
+ ConstantDefinition def = (ConstantDefinition) iter.next();
+ constantMap.put(def.getName(), def);
+ }
+ for (Iterator iter = functions.iterator(); iter.hasNext(); ) {
+ FunctionSymbol sym = (FunctionSymbol) iter.next();
+ functionMap.put(sym.getName(), sym);
+ }
+ // Go through all of the declared extensions.
+ // For each extension, look at its #define and function symbols.
+ // If we find all of the extension's symbols in the core API under
+ // non-ARB (or whatever is the suffix) names, then remove this extension
+ // from the public API. If it turns out that we are running on hardware
+ // that doesn't support the core version of these APIs, the runtime
+ // will take care of looking up the extension version of these entry
+ // points.
+ Set/*<String>*/ extensionNames = glInfo.getExtensions();
+ for (Iterator iter1 = extensionNames.iterator(); iter1.hasNext(); ) {
+ String extension = (String) iter1.next();
+ Set/*<String>*/ declarations = glInfo.getDeclarations(extension);
+ boolean isExtension = true;
+ boolean shouldUnify = true;
+ String cause = null;
+ for (Iterator iter2 = declarations.iterator(); iter2.hasNext(); ) {
+ String decl = (String) iter2.next();
+ boolean isFunc = !decl.startsWith("GL_");
+ if (!GLExtensionNames.isExtension(decl, isFunc)) {
+ isExtension = false;
+ break;
}
- }
- }
- } */
- return res;
- }
-
- protected LinkedHashMap/*<String name, DefineEntry entry>*/ defineMap = new LinkedHashMap();
-
- public void beginDefines() throws Exception
- {
- super.beginDefines();
- }
-
- /**
- * Pass-1 Unify ARB extensions with the same value
- */
- public void emitDefine(String name, String value, String optionalComment) throws Exception {
- if (cfg.allStatic() || cfg.emitInterface()) {
- // unify ARB and map names
- DefineEntry deNew = new DefineEntry(name, value, optionalComment);
- DefineEntry deExist = (DefineEntry) defineMap.get(deNew.name.getUni());
- if(deExist!=null) {
- // non ARB counterpart exist ..
- if(deNew.equals(deExist)) {
- if(deNew.getOptCommentString().length()>deExist.getOptCommentString().length()) {
- deExist.optionalComment=deNew.optionalComment;
- }
- deExist.add(name);
- return; // done ..
- }
- deNew.name.resetUni();
- System.err.println("WARNING: Normalized ARB entry with different value exists (keep ARB orig):"+
- "\n\tDef: "+deExist+
- "\n\tNew: "+deNew);
+ // See whether we're emitting glue code for this
+ // entry point or definition at all
+ if (isFunc) {
+ if (!functionMap.containsKey(decl)) {
+ isExtension = false;
+ break;
+ }
+ } else {
+ if (!constantMap.containsKey(decl)) {
+ isExtension = false;
+ break;
+ }
+ }
+ cause = decl;
+ String unifiedName = GLExtensionNames.normalize(decl, isFunc);
+ // NOTE that we look up the unified name in the
+ // BuildStaticGLInfo's notion of the APIs -- since
+ // we might not be emitting glue code for the
+ // headers that actually contain the core entry
+ // point. Think of the case where we are parsing the
+ // GLES2 gl2.h, which contains certain desktop
+ // OpenGL extensions that have been moved into the
+ // core, but later generating the implementing glue
+ // code (not the interface) for the desktop gl.h /
+ // glext.h.
+ shouldUnify = (glInfo.getExtension(unifiedName) != null);
+ // if (isFunc) {
+ // shouldUnify = functionMap.containsKey(unifiedName);
+ // } else {
+ // shouldUnify = constantMap.containsKey(unifiedName);
+ // }
+ if (!shouldUnify) {
+ break;
+ }
+ }
+ if (isExtension) {
+ if (shouldUnify) {
+ for (Iterator iter2 = declarations.iterator(); iter2.hasNext(); ) {
+ String decl = (String) iter2.next();
+ boolean isFunc = !decl.startsWith("GL_");
+ if (isFunc) {
+ functionMap.remove(decl);
+ } else {
+ constantMap.remove(decl);
+ }
+ }
+ System.err.println("INFO: unified extension " + extension + " into core API");
+ } else {
+ System.err.println("INFO: didn't unify extension " + extension + " into core API because of " + cause);
+ }
+ }
+ }
+ constants = new ArrayList();
+ for (Iterator iter = constantMap.keySet().iterator(); iter.hasNext(); ) {
+ constants.add(constantMap.get(iter.next()));
+ }
+ functions = new ArrayList();
+ for (Iterator iter = functionMap.keySet().iterator(); iter.hasNext(); ) {
+ functions.add(functionMap.get(iter.next()));
+ }
}
- defineMap.put(deNew.name.getUni(), deNew);
- }
}
- /**
- * Pass-2 Unify vendor extensions,
- * if exist as an ARB extension with the same value.
- * Pass-3 Emit all ..
- */
- public void endDefines() throws Exception
- {
- if (cfg.allStatic() || cfg.emitInterface()) {
- Iterator/*<DefineEntry>*/ deIter = null;
-
- // unify VEN
- deIter = defineMap.values().iterator();
- while( deIter.hasNext() ) {
- DefineEntry de = (DefineEntry) deIter.next();
- if(de.isExtensionVEN()) {
- String extSuffix = GLExtensionNames.getExtensionSuffix(de.name.getUni(), false);
- DefineEntry deUni = (DefineEntry) de.clone();
- deUni.normalizeVEN();
- DefineEntry deExist = (DefineEntry) defineMap.get(deUni.name.getUni());
- if(null!=deExist) {
- if(deUni.equals(deExist)) {
- if(deUni.getOptCommentString().length()>deExist.getOptCommentString().length()) {
- deExist.optionalComment=deUni.optionalComment;
- }
- deIter.remove();
- deExist.add(de.name.getUni());
- } else {
- if( ((GLConfiguration)cfg).getDropUniqVendorExtensions(extSuffix) ) {
- deIter.remove(); // remove non unified (uniq) vendor extension
- System.err.println("INFO: Drop uniq VEN entry: "+de.name.getUni());
- } else {
- System.err.println("INFO: Normalized VEN entry with different value exists (keep VEN orig):"+
- "\n\tDef: "+deExist+
- "\n\tNew: "+de);
- }
- }
- } else if( ((GLConfiguration)cfg).getDropUniqVendorExtensions(extSuffix) ) {
- deIter.remove(); // remove non unified (uniq) vendor extension
- System.err.println("INFO: Drop uniq VEN entry: "+de.name.getUni());
- }
- }
- }
-
- // add mapping and emit ..
- deIter = defineMap.values().iterator();
- while( deIter.hasNext() ) {
- DefineEntry de = (DefineEntry) deIter.next();
- if (de.shouldIgnoreInInterface((GLConfiguration)cfg)) {
- continue;
- }
- String comment = de.getOptCommentString();
- if (comment.length() != 0) {
- javaWriter().println(comment);
- } else {
- comment = de.name.getCommentString();
- if (comment.length() != 0) {
- de.name.resetOriginal(); // just shorten the comment space
- javaWriter().println(comment);
- }
- }
- javaWriter().println(de.toString());
- }
- }
- defineMap.clear();
-
- super.endDefines();
+ private void unifyExtensions(GlueEmitterControls controls) {
+ controls.runSymbolFilter(new ExtensionUnifier());
}
protected JavaConfiguration createConfig() {
@@ -368,108 +307,6 @@ public class GLEmitter extends ProcAddressEmitter
// Internals only below this point
//
- protected void validateFunctionsToBind(Set/*FunctionSymbol*/ funcsSet) {
-
- String localCallingConvention = ((GLConfiguration)cfg).getLocalProcAddressCallingConvention4All();
- if(null==localCallingConvention) {
- localCallingConvention="GL_APIENTRY";
- }
- ArrayList newUniFuncs = new ArrayList();
-
- // 1st Pass: map function names and process ARB extensions
- for (Iterator iter = funcsSet.iterator(); iter.hasNext(); ) {
- FunctionSymbol fsOrig = (FunctionSymbol) iter.next();
- String fname = fsOrig.getName();
- GLUnifiedName uniName;
- {
- uniName = (GLUnifiedName) GLUnifiedName.getOrPut(cfg.getUniqNameMap(), fname);
- String renamedName = cfg.getJavaMethodRename(fname);
- if(null!=renamedName) {
- fname = renamedName;
- uniName.setUni(fname);
- uniName.remapAllNames(cfg.getUniqNameMap());
- }
- }
-
- if(GLExtensionNames.isExtensionARB(fname, true)) {
- if(!((GLConfiguration)cfg).skipProcAddressGen(fname)) {
- // Do not process ignored functions with this logic
- // because if we do then we will not be able to later
- // tell that the function should be ignored
- if (!((GLConfiguration)cfg).shouldIgnoreInImpl(fname)) {
- FunctionSymbol fsUni = new FunctionSymbol(uniName.getUni(), fsOrig.getType());
- if(!funcsSet.contains(fsUni)) {
- newUniFuncs.add(fsUni); // add new uni name
- System.err.println("INFO: New ARB Normalized Function:"+
- "\n\tARB: "+fsOrig+
- "\n\tUNI: "+fsUni);
- } else {
- System.err.println("INFO: Dub ARB Normalized Function:"+
- "\n\tARB: "+fsOrig+
- "\n\tDUB: "+fsUni);
- }
-
- iter.remove(); // remove ARB function
- // make the function being dynamical fetched, due to it's dynamic naming scheme
- ((GLConfiguration)cfg).addForceProcAddressGen(uniName.getUni());
- // Make sure we produce the right calling convention for
- // the typedefed function pointers on Windows
- ((GLConfiguration)cfg).addLocalProcAddressCallingConvention(uniName.getUni(), localCallingConvention);
- }
- }
- }
- if(JavaConfiguration.DEBUG_IGNORES) {
- System.err.println("1st Pass: "+uniName);
- }
- }
- funcsSet.addAll(newUniFuncs);
-
- // 2nd Pass: Unify VEN extensions
- for (Iterator iter = funcsSet.iterator(); iter.hasNext(); ) {
- FunctionSymbol fsOrig = (FunctionSymbol) iter.next();
- String fname = fsOrig.getName();
- GLUnifiedName uniName = (GLUnifiedName)cfg.getUniqNameMap().get(fname);
- if(null==uniName) {
- throw new RuntimeException("no mapping found for: "+fname);
- }
-
- if(GLExtensionNames.isExtensionVEN(fname, true)) {
- uniName.normalizeVEN();
- uniName.remapAllNames(cfg.getUniqNameMap());
- String extSuffix = GLExtensionNames.getExtensionSuffix(fname, true);
- FunctionSymbol fsUni = new FunctionSymbol(uniName.getUni(), fsOrig.getType());
- if(funcsSet.contains(fsUni)) {
- iter.remove(); // remove VEN function (already incl. as ARB)
- System.err.println("INFO: Dub VEN Function:"+
- "\n\tVEN: "+fsOrig+
- "\n\tDUB: "+fsUni);
- } else if( ((GLConfiguration)cfg).getDropUniqVendorExtensions(extSuffix) ) {
- iter.remove(); // remove non unified (uniq) vendor extension
- System.err.println("INFO: Drop uniq VEN Function: "+fsOrig.getName());
- }
- }
- if(JavaConfiguration.DEBUG_IGNORES) {
- System.err.println("2nd Pass: "+uniName);
- }
- }
-
- // 3rd Pass: Remove all ignored functions
- for (Iterator iter = funcsSet.iterator(); iter.hasNext(); ) {
- FunctionSymbol fsOrig = (FunctionSymbol) iter.next();
- GLUnifiedName uniName = (GLUnifiedName)cfg.getUniqNameMap().get(fsOrig.getName());
- if(null==uniName) {
- throw new RuntimeException("no mapping found for: "+fsOrig.getName());
- }
- if (cfg.shouldIgnoreInImpl(fsOrig.getName())) {
- if(JavaConfiguration.DEBUG_IGNORES) {
- System.err.println("INFO: Ignored: Remove Function:"+ uniName);
- }
- iter.remove(); // remove ignored function
- }
- }
- }
-
-
protected void generateModifiedEmitters(JavaMethodBindingEmitter baseJavaEmitter, List emitters) {
List superEmitters = new ArrayList();
super.generateModifiedEmitters(baseJavaEmitter, superEmitters);
diff --git a/src/java/com/sun/gluegen/opengl/GLUnifiedName.java b/src/java/com/sun/gluegen/opengl/GLUnifiedName.java
deleted file mode 100644
index 64ca302..0000000
--- a/src/java/com/sun/gluegen/opengl/GLUnifiedName.java
+++ /dev/null
@@ -1,115 +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.
- *
- */
-
-package com.sun.gluegen.opengl;
-
-import java.util.*;
-import com.sun.gluegen.UnifiedName;
-import com.sun.gluegen.runtime.opengl.GLExtensionNames;
-
-public class GLUnifiedName extends UnifiedName implements Cloneable {
-
- public GLUnifiedName(String name) {
- super(name);
- isGLFunc = GLExtensionNames.isGLFunction(name);
- isGLEnum = GLExtensionNames.isGLEnumeration(name);
- if(isGLFunc || isGLEnum) {
- setUni(GLExtensionNames.normalizeARB(name, isGLFunc));
- }
- }
-
- protected GLUnifiedName(GLUnifiedName un) {
- super(un);
- this.isGLFunc=un.isGLFunc;
- this.isGLEnum=un.isGLEnum;
- }
-
- public boolean isExtensionARB() {
- boolean res = false;
- if(isGLFunc||isGLEnum) {
- res = GLExtensionNames.isExtensionARB(nameUni, isGLFunc);
- for (Iterator iter = nameList.iterator(); !res && iter.hasNext(); ) {
- res = GLExtensionNames.isExtensionARB((String)iter.next(), isGLFunc);
- }
- }
- return res;
- }
-
- public void normalizeVEN() {
- if(isGLFunc||isGLEnum) {
- setUni(GLExtensionNames.normalizeVEN(nameUni, isGLFunc));
- }
- }
-
- public boolean isExtensionVEN() {
- boolean res = false;
- if(isGLFunc||isGLEnum) {
- res = GLExtensionNames.isExtensionVEN(nameUni, isGLFunc);
- for (Iterator iter = nameList.iterator(); !res && iter.hasNext(); ) {
- res = GLExtensionNames.isExtensionVEN((String)iter.next(), isGLFunc);
- }
- }
- return res;
- }
-
- public boolean isExtension() {
- boolean res = false;
- if(isGLFunc||isGLEnum) {
- res = GLExtensionNames.isExtension(nameUni, isGLFunc);
- for (Iterator iter = nameList.iterator(); !res && iter.hasNext(); ) {
- res = GLExtensionNames.isExtension((String)iter.next(), isGLFunc);
- }
- }
- return res;
- }
-
- public static UnifiedName getOrPut(Map map, String name) {
- GLUnifiedName un = (GLUnifiedName)map.get(name);
- if(null==un) {
- un = new GLUnifiedName(name);
- un.remapAllNames(map);
- }
- return un;
- }
-
- public Object clone() {
- return new GLUnifiedName(this);
- }
-
- protected boolean isGLFunc, isGLEnum;
-}
-
diff --git a/src/java/com/sun/gluegen/pcpp/PCPP.java b/src/java/com/sun/gluegen/pcpp/PCPP.java
index af33635..4523032 100644
--- a/src/java/com/sun/gluegen/pcpp/PCPP.java
+++ b/src/java/com/sun/gluegen/pcpp/PCPP.java
@@ -415,8 +415,9 @@ public class PCPP {
int sz = values.size();
if (sz == 0) {
// definition to nothing, like "#define FOO"
- String oldDef = (String) defineMap.put(name, "");
- if (oldDef != null) {
+ String value = "";
+ String oldDef = (String) defineMap.put(name, value);
+ if (oldDef != null && !oldDef.equals(value)) {
System.err.println("WARNING: \"" + name + "\" redefined from \"" +
oldDef + "\" to \"\"");
}
@@ -431,7 +432,7 @@ public class PCPP {
// Value is numeric constant like "#define FOO 5".
// Put it in the #define map
String oldDef = (String)defineMap.put(name, value);
- if (oldDef != null) {
+ if (oldDef != null && !oldDef.equals(value)) {
System.err.println("WARNING: \"" + name + "\" redefined from \"" +
oldDef + "\" to \"" + value + "\"");
}
diff --git a/src/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java b/src/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java
index 6fb1ad8..8f849ac 100755
--- a/src/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java
+++ b/src/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java
@@ -181,10 +181,6 @@ public class ProcAddressEmitter extends JavaEmitter
// Internals only below this point
//
- protected void validateFunctionsToBind(Set/*FunctionSymbol*/ funcsSet) {
- super.validateFunctionsToBind(funcsSet);
- }
-
protected void generateModifiedEmitters(JavaMethodBindingEmitter baseJavaEmitter, List emitters) {
if (getConfig().manuallyImplement(baseJavaEmitter.getName())) {
// User will provide Java-side implementation of this routine;
diff --git a/src/java/com/sun/gluegen/runtime/opengl/GLExtensionNames.java b/src/java/com/sun/gluegen/runtime/opengl/GLExtensionNames.java
index 5182e9d..3c6f600 100644
--- a/src/java/com/sun/gluegen/runtime/opengl/GLExtensionNames.java
+++ b/src/java/com/sun/gluegen/runtime/opengl/GLExtensionNames.java
@@ -144,6 +144,15 @@ public class GLExtensionNames {
public static final boolean isExtensionVEN(String str, boolean isGLFunc) {
return isExtension(extensionsVEN, str, isGLFunc);
}
+ public static final String normalize(String str, boolean isGLFunc) {
+ if (isExtensionARB(str, isGLFunc)) {
+ return normalizeARB(str, isGLFunc);
+ }
+ if (isExtensionVEN(str, isGLFunc)) {
+ return normalizeVEN(str, isGLFunc);
+ }
+ return str;
+ }
public static final boolean isExtension(String str, boolean isGLFunc) {
return isExtension(extensionsARB, str, isGLFunc) ||
isExtension(extensionsVEN, str, isGLFunc);