diff options
Diffstat (limited to 'src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java')
-rw-r--r-- | src/classes/com/sun/gluegen/runtime/ProcAddressHelper.java | 32 |
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); + } + } + } } |