From 64b0148972c410a8f76c5f55ed866060886849a7 Mon Sep 17 00:00:00 2001
From: Michael Bien <mbien@fh-landshut.de>
Date: Sat, 24 Apr 2010 18:13:36 +0200
Subject: Refactored ProcAddressTable generation.  - ProcAddressTable is now
 the common superclass for all tables  - Removed ProcAddressHelpers and added
 FunctionAddressResolver extension mechanism

---
 .../gluegen/runtime/FunctionAddressResolver.java   |  46 ++++++++
 .../jogamp/gluegen/runtime/ProcAddressHelper.java  | 126 ---------------------
 .../jogamp/gluegen/runtime/ProcAddressTable.java   | 125 +++++++++++++++++++-
 .../runtime/opengl/GLProcAddressHelper.java        | 109 ------------------
 .../runtime/opengl/GLProcAddressResolver.java      |  61 ++++++++++
 5 files changed, 229 insertions(+), 238 deletions(-)
 create mode 100644 src/java/com/jogamp/gluegen/runtime/FunctionAddressResolver.java
 delete mode 100644 src/java/com/jogamp/gluegen/runtime/ProcAddressHelper.java
 delete mode 100644 src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressHelper.java
 create mode 100644 src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressResolver.java

(limited to 'src/java/com/jogamp/gluegen/runtime')

diff --git a/src/java/com/jogamp/gluegen/runtime/FunctionAddressResolver.java b/src/java/com/jogamp/gluegen/runtime/FunctionAddressResolver.java
new file mode 100644
index 0000000..621d8b3
--- /dev/null
+++ b/src/java/com/jogamp/gluegen/runtime/FunctionAddressResolver.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010, Michael Bien
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions 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 JogAmp nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Michael Bien BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Created on Saturday, April 24 2010 16:30
+ */
+package com.jogamp.gluegen.runtime;
+
+import com.jogamp.common.os.DynamicLookupHelper;
+
+/**
+ *
+ * @author Michael Bien
+ */
+public interface FunctionAddressResolver {
+
+    /**
+     * Resolves the name of the function bound to the method and returns the address.
+     */
+    public long resolve(String name, DynamicLookupHelper lookup);
+    
+}
diff --git a/src/java/com/jogamp/gluegen/runtime/ProcAddressHelper.java b/src/java/com/jogamp/gluegen/runtime/ProcAddressHelper.java
deleted file mode 100644
index 787eab5..0000000
--- a/src/java/com/jogamp/gluegen/runtime/ProcAddressHelper.java
+++ /dev/null
@@ -1,126 +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.jogamp.gluegen.runtime;
-
-import com.jogamp.common.os.DynamicLookupHelper;
-import java.security.*;
-
-// Debugging only
-import java.io.*;
-
-/** Helper class containing constants and methods to assist with the
-    manipulation of auto-generated ProcAddressTables. */
-
-public class ProcAddressHelper {
-  public static final String PROCADDRESS_VAR_PREFIX = "_addressof_";
-  protected static boolean DEBUG;
-  protected static String DEBUG_PREFIX;
-  protected static int debugNum;
-
-  static {
-    AccessController.doPrivileged(new PrivilegedAction() {
-        public Object run() {
-          DEBUG = (System.getProperty("gluegen.debug.ProcAddressHelper") != null);
-          if (DEBUG) {
-            DEBUG_PREFIX = System.getProperty("gluegen.debug.ProcAddressHelper.prefix");
-          }
-          return null;
-        }
-      });
-  }
-
-  protected static PrintStream getDebugOutStream() {
-    PrintStream out = null;
-    if (DEBUG) {
-      if (DEBUG_PREFIX != null) {
-        try {
-          out = new PrintStream(new BufferedOutputStream(new FileOutputStream(DEBUG_PREFIX + File.separatorChar +
-                                                                              "procaddresshelper-" + (++debugNum) + ".txt")));
-        } catch (IOException e) {
-          e.printStackTrace();
-          out = System.err;
-        }
-      } else {
-        out = System.err;
-      }
-    }
-    return out;
-  }
-
-  public static void resetProcAddressTable(Object table,
-                                           DynamicLookupHelper lookup) throws RuntimeException {
-    Class tableClass = table.getClass();
-    java.lang.reflect.Field[] fields = tableClass.getFields();
-    PrintStream dout = getDebugOutStream();
-    
-    if (DEBUG) {
-      dout.println("ProcAddressHelper.resetProcAddressTable(" + table.getClass().getName() + ")");
-    }
-    for (int i = 0; i < fields.length; ++i) {
-      String addressFieldName = fields[i].getName();
-      if (!addressFieldName.startsWith(ProcAddressHelper.PROCADDRESS_VAR_PREFIX)) {
-        // not a proc address variable
-        continue;
-      }
-      int startOfMethodName = ProcAddressHelper.PROCADDRESS_VAR_PREFIX.length();
-      String funcName = addressFieldName.substring(startOfMethodName);
-      try {
-        java.lang.reflect.Field addressField = fields[i];
-        assert(addressField.getType() == Long.TYPE);
-        long newProcAddress = lookup.dynamicLookupFunction(funcName);
-        // set the current value of the proc address variable in the table object
-        addressField.setLong(table, newProcAddress); 
-        if (DEBUG) {
-          dout.println("  " + addressField.getName() + " -> 0x" + Long.toHexString(newProcAddress));
-        }
-      } catch (Exception e) {
-        throw new RuntimeException("Can not get proc address for method \"" +
-                                   funcName + "\": Couldn't set value of field \"" + addressFieldName +
-                                   "\" in class " + tableClass.getName(), e);
-      }
-    }
-    if (DEBUG) {
-      dout.flush();
-      if (DEBUG_PREFIX != null) {
-        dout.close();
-      }
-    }
-  }
-}
diff --git a/src/java/com/jogamp/gluegen/runtime/ProcAddressTable.java b/src/java/com/jogamp/gluegen/runtime/ProcAddressTable.java
index 1e7d34b..448c945 100644
--- a/src/java/com/jogamp/gluegen/runtime/ProcAddressTable.java
+++ b/src/java/com/jogamp/gluegen/runtime/ProcAddressTable.java
@@ -33,9 +33,128 @@
  * in the design, construction, operation or maintenance of any nuclear
  * facility.
  */
-
 package com.jogamp.gluegen.runtime;
 
-public interface ProcAddressTable {
-  public long getAddressFor(String functionName);
+import com.jogamp.common.os.DynamicLookupHelper;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+/**
+ * Superclass for all generated ProcAddressTables.
+ * @author Kenneth Russel
+ * @author Michael Bien
+ * @author Sven Gothel
+ */
+public abstract class ProcAddressTable {
+
+    public static final String PROCADDRESS_VAR_PREFIX = "_addressof_";
+
+    protected static boolean DEBUG;
+    protected static String DEBUG_PREFIX;
+    protected static int debugNum;
+
+    private final FunctionAddressResolver resolver;
+
+    static {
+        AccessController.doPrivileged(new PrivilegedAction() {
+
+            public Object run() {
+                DEBUG = (System.getProperty("gluegen.debug.ProcAddressHelper") != null);
+                if (DEBUG) {
+                    DEBUG_PREFIX = System.getProperty("gluegen.debug.ProcAddressHelper.prefix");
+                }
+                return null;
+            }
+        });
+    }
+
+    public ProcAddressTable() {
+        this(new One2OneResolver());
+    }
+
+    public ProcAddressTable(FunctionAddressResolver resolver) {
+        this.resolver = resolver;
+    }
+
+    /**
+     * Returns the address for the given function name.
+     * @throws RuntimeException if the Table has not been initialized yet.
+     */
+    public abstract long getAddressFor(String functionName);
+
+
+    public void resetProcAddressTable(DynamicLookupHelper lookup) throws RuntimeException {
+
+        Class tableClass = getClass();
+        Field[] fields = tableClass.getFields();
+        PrintStream dout = getDebugOutStream();
+
+        if (DEBUG) {
+            dout.println("ProcAddressHelper.resetProcAddressTable(" + getClass().getName() + ")");
+        }
+        for (int i = 0; i < fields.length; ++i) {
+            String addressFieldName = fields[i].getName();
+            if (!addressFieldName.startsWith(PROCADDRESS_VAR_PREFIX)) {
+                // not a proc address variable
+                continue;
+            }
+            int startOfMethodName = PROCADDRESS_VAR_PREFIX.length();
+            String funcName = addressFieldName.substring(startOfMethodName);
+            try {
+                Field addressField = fields[i];
+                assert (addressField.getType() == Long.TYPE);
+
+                long newProcAddress = resolver.resolve(funcName, lookup);
+
+                // set the current value of the proc address variable in the table object
+                addressField.setLong(this, newProcAddress);
+                if (DEBUG) {
+                    dout.println("  " + addressField.getName() + " -> 0x" + Long.toHexString(newProcAddress));
+                }
+            } catch (Exception e) {
+                throw new RuntimeException("Can not get proc address for method \""
+                        + funcName + "\": Couldn't set value of field \"" + addressFieldName
+                        + "\" in class " + tableClass.getName(), e);
+            }
+        }
+        if (DEBUG) {
+            dout.flush();
+            if (DEBUG_PREFIX != null) {
+                dout.close();
+            }
+        }
+    }
+
+    protected static PrintStream getDebugOutStream() {
+        PrintStream out = null;
+        if (DEBUG) {
+            if (DEBUG_PREFIX != null) {
+                try {
+                    out = new PrintStream(new BufferedOutputStream(new FileOutputStream(DEBUG_PREFIX + File.separatorChar
+                            + "procaddresshelper-" + (++debugNum) + ".txt")));
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    out = System.err;
+                }
+            } else {
+                out = System.err;
+            }
+        }
+        return out;
+    }
+
+
+    private static class One2OneResolver implements FunctionAddressResolver {
+        public long resolve(String name, DynamicLookupHelper lookup) {
+            return lookup.dynamicLookupFunction(name);
+        }
+    }
+
+
 }
diff --git a/src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressHelper.java b/src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressHelper.java
deleted file mode 100644
index 2031d9e..0000000
--- a/src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressHelper.java
+++ /dev/null
@@ -1,109 +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.jogamp.gluegen.runtime.opengl;
-
-import com.jogamp.common.os.DynamicLookupHelper;
-import com.jogamp.gluegen.runtime.*;
-
-// Debugging only
-import java.io.PrintStream;
-
-/** Helper class containing constants and methods to assist with the
-    manipulation of auto-generated ProcAddressTables. */
-
-public class GLProcAddressHelper extends ProcAddressHelper {
-
-  public static void resetProcAddressTable(Object table,
-                                           DynamicLookupHelper lookup) throws RuntimeException {
-    Class tableClass = table.getClass();
-    java.lang.reflect.Field[] fields = tableClass.getFields();
-    PrintStream dout = getDebugOutStream();
-    
-    if (DEBUG) {
-      dout.println("ProcAddressHelper.resetProcAddressTable(" + table.getClass().getName() + ")");
-    }
-    for (int i = 0; i < fields.length; ++i) {
-      String addressFieldName = fields[i].getName();
-      if (!addressFieldName.startsWith(ProcAddressHelper.PROCADDRESS_VAR_PREFIX)) {
-        // not a proc address variable
-        continue;
-      }
-      int startOfMethodName = ProcAddressHelper.PROCADDRESS_VAR_PREFIX.length();
-      String funcNameBase = addressFieldName.substring(startOfMethodName);
-      java.lang.reflect.Field addressField;
-      try {
-        addressField = fields[i];
-        assert(addressField.getType() == Long.TYPE);
-      } catch (Exception e) {
-        throw new RuntimeException("Can not get proper proc address field for method \"" +
-                                   funcNameBase + "\": Couldn't get field \"" + addressFieldName +
-                                   "\" in class " + tableClass.getName(), e);
-      }
-      long newProcAddress = 0;
-      int  funcNamePermNum = GLExtensionNames.getFuncNamePermutationNumber(funcNameBase);
-      String funcName = null;
-      for(int j = 0; 0==newProcAddress && j < funcNamePermNum; j++) {
-          funcName = GLExtensionNames.getFuncNamePermutation(funcNameBase, j);
-          try {
-            newProcAddress = lookup.dynamicLookupFunction(funcName);
-          } catch (Exception e) { 
-            if (DEBUG) {
-              dout.println(e);
-              e.printStackTrace();
-            }
-          }
-      } 
-      try {
-        // set the current value of the proc address variable in the table object
-        addressField.setLong(table, newProcAddress); 
-        if (DEBUG) {
-          dout.println("  " + addressField.getName() + " "+funcName+" -> 0x" + Long.toHexString(newProcAddress));
-        }
-      } catch (Exception e) {
-        throw new RuntimeException("Can not set proc address field for method \"" +
-                                   funcNameBase + "\": Couldn't set field \"" + addressFieldName +
-                                   "\" in class " + tableClass.getName(), e);
-      }
-    }
-    if (DEBUG) {
-      dout.flush();
-      if (DEBUG_PREFIX != null) {
-        dout.close();
-      }
-    }
-  }
-}
diff --git a/src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressResolver.java b/src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressResolver.java
new file mode 100644
index 0000000..ebe4d26
--- /dev/null
+++ b/src/java/com/jogamp/gluegen/runtime/opengl/GLProcAddressResolver.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2010, Michael Bien
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions 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 JogAmp nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL Michael Bien BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Created on Saturday, April 24 2010 16:44
+ */
+package com.jogamp.gluegen.runtime.opengl;
+
+import com.jogamp.common.os.DynamicLookupHelper;
+import com.jogamp.gluegen.runtime.FunctionAddressResolver;
+
+/**
+ * @author Sven Gothel
+ * @author Michael Bien
+ */
+public class GLProcAddressResolver implements FunctionAddressResolver {
+
+
+    public long resolve(String name, DynamicLookupHelper lookup) {
+
+        int permutations = GLExtensionNames.getFuncNamePermutationNumber(name);
+
+        for (int i = 0; i < permutations; i++) {
+            String funcName = GLExtensionNames.getFuncNamePermutation(name, i);
+            try {
+                return lookup.dynamicLookupFunction(funcName);
+            } catch (Exception e) {
+//                if (DEBUG) {
+//                    dout.println(e);
+//                    e.printStackTrace();
+//                }
+            }
+        }
+
+        throw new RuntimeException("unresolveable function name: "+name);
+    }
+}
-- 
cgit v1.2.3