summaryrefslogtreecommitdiffstats
path: root/src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java')
-rw-r--r--src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java b/src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java
index 4d40fd487..4cf0b76d3 100644
--- a/src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java
+++ b/src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ * 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
@@ -39,8 +39,36 @@
package com.sun.gluegen.runtime;
-/** Contains constants used in glue code generation. */
+/** 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_";
+
+ public static void resetProcAddressTable(Object table,
+ DynamicLookupHelper lookup) throws RuntimeException {
+ Class tableClass = table.getClass();
+ java.lang.reflect.Field[] fields = tableClass.getDeclaredFields();
+
+ 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 = tableClass.getDeclaredField(addressFieldName);
+ 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);
+ } 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);
+ }
+ }
+ }
}