summaryrefslogtreecommitdiffstats
path: root/src/java/com/sun/gluegen/MethodBinding.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/sun/gluegen/MethodBinding.java')
-rw-r--r--src/java/com/sun/gluegen/MethodBinding.java639
1 files changed, 0 insertions, 639 deletions
diff --git a/src/java/com/sun/gluegen/MethodBinding.java b/src/java/com/sun/gluegen/MethodBinding.java
deleted file mode 100644
index 7b3984e..0000000
--- a/src/java/com/sun/gluegen/MethodBinding.java
+++ /dev/null
@@ -1,639 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import com.sun.gluegen.cgram.types.FunctionSymbol;
-import com.sun.gluegen.cgram.types.Type;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-
-/** Represents the binding of a C function to a Java method. Also used
- to represent calls through function pointers contained in
- structs. */
-
-public class MethodBinding {
-
- private FunctionSymbol sym;
- private String renamedMethodName;
- private HashSet<String> aliasedNames;
- private JavaType javaReturnType;
- private List<JavaType> javaArgumentTypes;
- private boolean computedSignatureProperties;
- private boolean argumentsUseNIO;
- private boolean signatureUsesNIO;
- private boolean signatureCanUseIndirectNIO;
- private boolean signatureUsesCompoundTypeWrappers;
- private boolean signatureUsesArraysOfCompoundTypeWrappers;
- private boolean signatureUsesCVoidPointers;
- private boolean signatureUsesCPrimitivePointers;
- private boolean signatureUsesCArrays;
- private boolean signatureUsesJavaPrimitiveArrays;
- private JavaType containingType;
- private Type containingCType;
- private int thisPointerIndex = -1;
-
- /**
- * Constructs a new MethodBinding that is an exact clone of the
- * argument, including the java return type and java argument
- * types. It's safe to modify this binding after construction.
- */
- public MethodBinding(MethodBinding bindingToCopy) {
- this.sym = bindingToCopy.sym;
-
- this.renamedMethodName = bindingToCopy.renamedMethodName;
- this.aliasedNames = new HashSet<String>(bindingToCopy.aliasedNames);
- this.containingType = bindingToCopy.containingType;
- this.containingCType = bindingToCopy.containingCType;
- this.javaReturnType = bindingToCopy.javaReturnType;
- this.javaArgumentTypes = ( null != bindingToCopy.javaArgumentTypes ) ? new ArrayList<JavaType>(bindingToCopy.javaArgumentTypes) : null;
- this.computedSignatureProperties = bindingToCopy.computedSignatureProperties;
- this.argumentsUseNIO = bindingToCopy.argumentsUseNIO;
- this.signatureUsesNIO = bindingToCopy.signatureUsesNIO;
- this.signatureCanUseIndirectNIO = bindingToCopy.signatureCanUseIndirectNIO;
- this.signatureUsesCompoundTypeWrappers = bindingToCopy.signatureUsesCompoundTypeWrappers;
- this.signatureUsesArraysOfCompoundTypeWrappers = bindingToCopy.signatureUsesArraysOfCompoundTypeWrappers;
- this.signatureUsesCVoidPointers = bindingToCopy.signatureUsesCVoidPointers;
- this.signatureUsesCPrimitivePointers = bindingToCopy.signatureUsesCPrimitivePointers;
- this.signatureUsesCArrays = bindingToCopy.signatureUsesCArrays;
- this.signatureUsesJavaPrimitiveArrays = bindingToCopy.signatureUsesJavaPrimitiveArrays;
- this.thisPointerIndex = bindingToCopy.thisPointerIndex;
- }
-
- /** Constructor for calling a C function. */
- public MethodBinding(FunctionSymbol sym) {
- this.sym = sym;
- this.aliasedNames = new HashSet<String>();
- }
-
- /** Constructor for calling a function pointer contained in a
- struct. */
- public MethodBinding(FunctionSymbol sym, JavaType containingType, Type containingCType) {
- this.sym = sym;
- this.containingType = containingType;
- this.containingCType = containingCType;
- this.aliasedNames = new HashSet<String>();
- }
-
- public void setJavaReturnType(JavaType type) {
- javaReturnType = type;
- computedSignatureProperties = false;
- }
-
- public void addJavaArgumentType(JavaType type) {
- if (javaArgumentTypes == null) {
- javaArgumentTypes = new ArrayList<JavaType>();
- }
- javaArgumentTypes.add(type);
- computedSignatureProperties = false;
- }
-
- public JavaType getJavaReturnType() {
- return javaReturnType;
- }
-
- public int getNumArguments() {
- return sym.getNumArguments();
- }
-
- public JavaType getJavaArgumentType(int i) {
- return javaArgumentTypes.get(i);
- }
-
- public Type getCReturnType() {
- return sym.getReturnType();
- }
-
- public Type getCArgumentType(int i) {
- return sym.getArgumentType(i);
- }
-
- public FunctionSymbol getCSymbol() {
- return sym;
- }
-
- /** Returns either the argument name specified by the underlying
- FunctionSymbol or a fabricated argument name based on the
- position. Note that it is currently not guaranteed that there
- are no namespace clashes with these fabricated argument
- names. */
- public String getArgumentName(int i) {
- String ret = sym.getArgumentName(i);
- if (ret != null) {
- return ret;
- }
- return "arg" + i;
- }
-
- public String getOrigName() {
- return sym.getName();
- }
-
- public String getName() {
- // Defaults to same as C symbol unless renamed
- if (renamedMethodName != null) {
- return renamedMethodName;
- }
- return sym.getName();
- }
-
- /** Supports renaming C function in Java binding. */
- public void renameMethodName(String name) {
- if (null != name) {
- renamedMethodName = name;
- aliasedNames.add(sym.getName());
- }
- }
-
- public void addAliasedName(String name) {
- aliasedNames.add(name);
- }
-
- public Collection<String> getAliasedNames() {
- return aliasedNames;
- }
-
- /** Creates a new MethodBinding replacing the specified Java
- argument type with a new argument type. If argumentNumber is
- less than 0 then replaces the return type. */
- public MethodBinding replaceJavaArgumentType(int argumentNumber, JavaType newArgType) {
-
- MethodBinding binding = (MethodBinding) clone();
- binding.javaArgumentTypes = null;
- if (argumentNumber < 0) {
- binding.setJavaReturnType(newArgType);
- } else {
- binding.setJavaReturnType(javaReturnType);
- }
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = getJavaArgumentType(i);
- if (i == argumentNumber) {
- type = newArgType;
- }
- binding.addJavaArgumentType(type);
- }
- return binding;
- }
-
- /**
- * Returns true if any of the outgoing arguments in the method's
- * signature require conversion or checking due to the use of New
- * I/O.
- */
- public boolean argumentsUseNIO() {
- computeSignatureProperties();
- return argumentsUseNIO;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature require conversion or checking due to
- * the use of New I/O.
- */
- public boolean signatureUsesNIO() {
- computeSignatureProperties();
- return signatureUsesNIO;
- }
-
- /**
- * Returns true if it is possible for any of the outgoing arguments
- * to be indirect NIO buffers.
- */
- public boolean signatureCanUseIndirectNIO() {
- computeSignatureProperties();
- return signatureCanUseIndirectNIO;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature use "compound type wrappers", or
- * NIO-based wrappers for C data structures.
- */
- public boolean signatureUsesCompoundTypeWrappers() {
- computeSignatureProperties();
- return signatureUsesCompoundTypeWrappers;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature use arrays of "compound type wrappers",
- * or NIO-based wrappers for C data structures.
- */
- public boolean signatureUsesArraysOfCompoundTypeWrappers() {
- computeSignatureProperties();
- return signatureUsesArraysOfCompoundTypeWrappers;
- }
-
- /**
- * Returns true if the function needs NIO-related
- * wrapping/unwrapping or conversion of various arguments. Currently
- * this returns the logical OR of signatureUsesNIO() and
- * signatureUsesCompoundTypeWrappers().
- */
- public boolean needsNIOWrappingOrUnwrapping() {
- return (signatureUsesNIO() || signatureUsesCompoundTypeWrappers());
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent C void* pointers.
- */
- public boolean signatureUsesCVoidPointers() {
- computeSignatureProperties();
- return signatureUsesCVoidPointers;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent C primitive pointers.
- */
- public boolean signatureUsesCPrimitivePointers() {
- computeSignatureProperties();
- return signatureUsesCPrimitivePointers;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent C arrays.
- */
- public boolean signatureUsesCArrays() {
- computeSignatureProperties();
- return signatureUsesCArrays;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent Java primitive arrays.
- */
- public boolean signatureUsesJavaPrimitiveArrays() {
- computeSignatureProperties();
- return signatureUsesJavaPrimitiveArrays;
- }
-
- /**
- * Computes summary information about the method's C and Java
- * signatures.
- */
- protected void computeSignatureProperties() {
- if (computedSignatureProperties)
- return;
-
- argumentsUseNIO = false;
- signatureUsesNIO = false;
- signatureCanUseIndirectNIO = false;
- signatureUsesCompoundTypeWrappers = false;
- signatureUsesArraysOfCompoundTypeWrappers = false;
- signatureUsesCVoidPointers = false;
- signatureUsesCPrimitivePointers = false;
- signatureUsesCArrays = false;
- signatureUsesJavaPrimitiveArrays = false;
-
- if (javaReturnType.isCompoundTypeWrapper()) {
- // Needs wrapping and/or setting of byte order (neither of which
- // can be done easily from native code)
- signatureUsesCompoundTypeWrappers = true;
- }
-
- if (javaReturnType.isNIOBuffer() ||
- javaReturnType.isArrayOfCompoundTypeWrappers()) {
- // Needs setting of byte order and possibly viewing as a
- // different buffer type which can't be done easily from native
- // code
- signatureUsesNIO = true;
- }
-
- Type cRetType = sym.getReturnType();
- if (cRetType.isArray()) {
- // Needs checking of array lengths
- signatureUsesCArrays = true;
- if (cRetType.asArray().getElementType().isPrimitive()) {
- signatureUsesCPrimitivePointers = true;
- }
- }
-
- if (cRetType.isPointer()) {
- if (cRetType.asPointer().getTargetType().isPrimitive()) {
- signatureUsesCPrimitivePointers = true;
- } else if (cRetType.asPointer().getTargetType().isVoid()) {
- signatureUsesCVoidPointers = true;
- }
- }
-
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType javaArgType = getJavaArgumentType(i);
- Type cArgType = getCArgumentType(i);
- if (javaArgType.isCompoundTypeWrapper()) {
- // Needs unwrapping of accessors
- signatureUsesCompoundTypeWrappers = true;
- }
-
- if (javaArgType.isArrayOfCompoundTypeWrappers()) {
- // Needs to be duplicated and this array lowered to an array
- // of Buffers for code emission
- signatureUsesArraysOfCompoundTypeWrappers = true;
- }
-
- if (javaArgType.isNIOBuffer() ||
- javaArgType.isNIOBufferArray()) {
- // Needs checking of direct buffer property
- signatureUsesNIO = true;
- argumentsUseNIO = true;
-
- if (javaArgType.isNIOBuffer()) {
- // Potential conversion to indirect buffer
- signatureCanUseIndirectNIO = true;
- }
- }
-
- if (cArgType.isArray()) {
- // Needs checking of array lengths
- signatureUsesCArrays = true;
- if (cArgType.asArray().getElementType().isPrimitive()) {
- signatureUsesCPrimitivePointers = true;
- }
- }
-
- if (cArgType.isPointer()) {
- // Handle both real C primitive pointers and any constructions
- // due to opaque directives
- if (cArgType.asPointer().getTargetType().isPrimitive() ||
- javaArgType.isCPrimitivePointerType()) {
- signatureUsesCPrimitivePointers = true;
- } else if (cArgType.asPointer().getTargetType().isVoid()) {
- signatureUsesCVoidPointers = true;
- }
- }
-
- if (javaArgType.isPrimitiveArray()) {
- // Needs getPrimitiveArrayCritical or similar construct
- // depending on native code calling convention
- signatureUsesJavaPrimitiveArrays = true;
- }
- }
-
- computedSignatureProperties = true;
- }
-
- /** Indicates whether this MethodBinding is for a function pointer
- contained in a struct. */
- public boolean hasContainingType() {
- return (getContainingType() != null);
- }
-
- /** Retrieves the containing type of this MethodBinding if it is for
- a function pointer contained in a struct. */
- public JavaType getContainingType() {
- return containingType;
- }
-
- /** Retrieves the containing C type of this MethodBinding if it is for
- a function pointer contained in a struct. */
- public Type getContainingCType() {
- return containingCType;
- }
-
- /** Find the leftmost argument matching the type of the containing
- type (for function pointer MethodBindings) and record that as a
- "this" pointer, meaning that it does not need to be explicitly
- passed at the Java level. */
- public void findThisPointer() {
- clearThisPointer();
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType arg = getJavaArgumentType(i);
- if (arg.equals(containingType)) {
- thisPointerIndex = i;
- break;
- }
-
- if (!arg.isJNIEnv()) {
- break; // this pointer must be leftmost argument excluding JNIEnvs
- }
- }
- }
-
- /** Clears any record of a this pointer for this MethodBinding. */
- public void clearThisPointer() {
- thisPointerIndex = -1;
- }
-
- /** Indicates whether the <i>i</i>th argument to this MethodBinding
- is actually a "this" pointer. */
- public boolean isArgumentThisPointer(int i) {
- return (thisPointerIndex == i);
- }
- @Override
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
-
- if (obj == null || ! (obj instanceof MethodBinding)) {
- return false;
- }
-
- MethodBinding other = (MethodBinding)obj;
- if ( !getName().equals(other.getName()) ||
- !sym.getType().equals(other.sym.getType()) ) { return false; }
- if (!(javaReturnType.equals(other.getJavaReturnType()))) { return false; }
- if (containingCType != null &&
- other.getContainingCType() != null &&
- (!(containingCType.equals(other.getContainingCType())))) {
- return false;
- }
- if (javaArgumentTypes.size() != other.javaArgumentTypes.size()) {
- return false;
- }
-
- for (int i = 0; i < javaArgumentTypes.size(); ++i) {
- Object typeThis = javaArgumentTypes.get(i);
- Object typeOther = other.getJavaArgumentType(i);
- if (!(typeThis.equals(typeOther))) {
- return false;
- }
- }
-
- return true;
- }
-
- @Override
- public int hashCode() {
- StringBuilder buf = new StringBuilder(200);
- buf.append(getName());
- buf.append(sym.getType().getName(true));
- buf.append(getJavaReturnType().getName());
- if (containingCType != null) {
- buf.append(containingCType.getName(true));
- }
-
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = getJavaArgumentType(i);
- if (type.isVoid()) {
- // Make sure this is the only param to the method; if it isn't,
- // there's something wrong with our parsing of the headers.
- assert(getNumArguments() == 1);
- continue;
- }
-
- buf.append(type.getName());
- }
- return buf.toString().hashCode();
- }
-
- /** Returns the signature of this binding. */
- @Override
- public String toString() {
- StringBuilder buf = new StringBuilder(200);
- buf.append(getJavaReturnType().getName());
- buf.append(' ');
- buf.append(getName());
- buf.append('(');
- boolean needComma = false;
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = getJavaArgumentType(i);
- if (type.isVoid()) {
- // Make sure this is the only param to the method; if it isn't,
- // there's something wrong with our parsing of the headers.
- assert(getNumArguments() == 1);
- continue;
- }
- if (type.isJNIEnv() || isArgumentThisPointer(i)) {
- // Don't need to expose these at the Java level
- continue;
- }
-
- if (needComma) {
- buf.append(", ");
- }
-
- buf.append(type.getName());
- buf.append(' ');
- buf.append(getArgumentName(i));
- needComma = true;
- }
- buf.append(')');
- return buf.toString();
- }
-
- @Override
- public final Object clone() {
- return new MethodBinding(this);
- }
-
- /** Returns a String containing the descriptor (signature in
- internal format) of this MethodBinding as it will be
- emitted. This is used to disambiguate between overloadings when
- manually specifying prologue and epilogue code, for example. */
- public String getDescriptor(boolean forImplementingMethodCall,
- boolean eraseBufferAndArrayTypes) {
- StringBuilder buf = new StringBuilder();
-
- buf.append('(');
-
- if (forImplementingMethodCall && hasContainingType()) {
- // Always emit outgoing "this" argument
- buf.append("Ljava/nio/ByteBuffer;");
- }
-
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = getJavaArgumentType(i);
- if (type.isVoid()) {
- // Make sure this is the only param to the method; if it isn't,
- // there's something wrong with our parsing of the headers.
- if (getNumArguments() != 1) {
- throw new InternalError(
- "\"void\" argument type found in " +
- "multi-argument function \"" + this + "\"");
- }
- continue;
- }
-
- if (type.isJNIEnv() || isArgumentThisPointer(i)) {
- // Don't need to expose these at the Java level
- continue;
- }
-
- buf.append(erasedTypeDescriptor(type, eraseBufferAndArrayTypes, false));
-
- // Add Buffer and array index offset arguments after each associated argument
- if (forImplementingMethodCall) {
- if (type.isNIOBuffer()) {
- buf.append('I');
- } else if (type.isNIOBufferArray()) {
- buf.append("[I");
- }
- }
-
- // Add offset argument after each primitive array
- if (type.isPrimitiveArray()) {
- buf.append('I');
- }
- }
-
- buf.append(')');
-
- // Emit return type for completeness even though we can't overload
- // based solely on return type
- buf.append(erasedTypeDescriptor(getJavaReturnType(), eraseBufferAndArrayTypes, false));
-
- return buf.toString();
- }
-
- protected String erasedTypeDescriptor(JavaType type, boolean eraseBufferAndArrayTypes, boolean skipBuffers) {
- if (eraseBufferAndArrayTypes) {
- if (type.isNIOBuffer() ||
- type.isPrimitiveArray()) {
- if (!skipBuffers) {
- // Direct buffers and arrays sent down as Object (but
- // returned as e.g. ByteBuffer)
- return "Ljava/lang/Object;";
- }
- } else if (type.isCompoundTypeWrapper()) {
- // Compound type wrappers are unwrapped to ByteBuffer
- return "Ljava/nio/ByteBuffer;";
- } else if (type.isArrayOfCompoundTypeWrappers()) {
- return "Ljava/nio/ByteBuffer;";
- }
- }
- return type.getDescriptor();
- }
-}
-