diff options
Diffstat (limited to 'src/java/com/sun/gluegen')
20 files changed, 237 insertions, 104 deletions
diff --git a/src/java/com/sun/gluegen/GlueGen.java b/src/java/com/sun/gluegen/GlueGen.java index 866f602..b03109c 100644 --- a/src/java/com/sun/gluegen/GlueGen.java +++ b/src/java/com/sun/gluegen/GlueGen.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -48,7 +49,23 @@ import com.sun.gluegen.pcpp.*; import static java.lang.System.*; -/** Glue code generator for C functions and data structures. */ +/** + * Glue code generator for C functions and data structures.<br> + * <br> + * Gluegen has build-in types (terminal symbols) for:<br> + * <br> + * <table border="1"> + * <tr><th>type</th> <th>java</th> <th>native-x32</th><th>native-x64</th><th>type</th> <th>signed</th></tr> + * <tr><th>__int32</th> <th>32bit</th><th>32bit</th> <th>32bit</th> <th>integer</th><th>signed or unsigned</th></tr> + * <tr><th>int32_t</th> <th>32bit</th><th>32bit</th> <th>32bit</th> <th>integer</th><th>signed</th></tr> + * <tr><th>uint32_t</th> <th>32bit</th><th>32bit</th> <th>32bit</th> <th>integer</th><th>unsigned</th></tr> + * <tr><th>__int64</th> <th>64bit</th><th>64bit</th> <th>64bit</th> <th>integer</th><th>signed or unsigned</th></tr> + * <tr><th>int64_t</th> <th>64bit</th><th>64bit</th> <th>64bit</th> <th>integer</th><th>signed</th></tr> + * <tr><th>uint64_t</th> <th>64bit</th><th>64bit</th> <th>64bit</th> <th>integer</th><th>unsigned</th></tr> + * <tr><th>ptrdiff_t</th> <th>64bit</th><th>32bit</th> <th>64bit</th> <th>integer</th><th>signed</th></tr> + * <tr><th>size_t</th> <th>64bit</th><th>32bit</th> <th>64bit</th> <th>integer</th><th>unsigned</th></tr> + * </table> + */ public class GlueGen implements GlueEmitterControls { static{ @@ -127,6 +144,7 @@ public class GlueGen implements GlueEmitterControls { } HeaderParser headerParser = new HeaderParser(); + headerParser.setDebug(debug); TypeDictionary td = new TypeDictionary(); headerParser.setTypedefDictionary(td); TypeDictionary sd = new TypeDictionary(); diff --git a/src/java/com/sun/gluegen/JavaConfiguration.java b/src/java/com/sun/gluegen/JavaConfiguration.java index 7a1e45e..f4cf0bd 100644 --- a/src/java/com/sun/gluegen/JavaConfiguration.java +++ b/src/java/com/sun/gluegen/JavaConfiguration.java @@ -1,6 +1,7 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * + * Copyright (c) 2010 JogAmp Community. All rights reserved. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: diff --git a/src/java/com/sun/gluegen/JavaEmitter.java b/src/java/com/sun/gluegen/JavaEmitter.java index c7156c3..5fc07b0 100644 --- a/src/java/com/sun/gluegen/JavaEmitter.java +++ b/src/java/com/sun/gluegen/JavaEmitter.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/java/com/sun/gluegen/JavaType.java b/src/java/com/sun/gluegen/JavaType.java index dbdabe4..a7e9fcf 100644 --- a/src/java/com/sun/gluegen/JavaType.java +++ b/src/java/com/sun/gluegen/JavaType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/java/com/sun/gluegen/TypeInfo.java b/src/java/com/sun/gluegen/TypeInfo.java index 4a626bc..10df349 100644 --- a/src/java/com/sun/gluegen/TypeInfo.java +++ b/src/java/com/sun/gluegen/TypeInfo.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are diff --git a/src/java/com/sun/gluegen/cgram/GnuCParser.g b/src/java/com/sun/gluegen/cgram/GnuCParser.g index 7de057c..7b4c8f8 100644 --- a/src/java/com/sun/gluegen/cgram/GnuCParser.g +++ b/src/java/com/sun/gluegen/cgram/GnuCParser.g @@ -308,13 +308,19 @@ typeSpecifier [int specCount] returns [int retSpecCount] | "char" | "short" | "int" - | "__int32" - | "__int64" | "long" | "float" | "double" | "signed" | "unsigned" + | "__int32" + | "int32_t" + | "uint32_t" + | "__int64" + | "int64_t" + | "uint64_t" + | "ptrdiff_t" + | "size_t" | structOrUnionSpecifier ( options{warnWhenFollowAmbig=false;}: attributeDecl )* | enumSpecifier | { specCount==0 }? typedefName diff --git a/src/java/com/sun/gluegen/cgram/HeaderParser.g b/src/java/com/sun/gluegen/cgram/HeaderParser.g index 7c13968..9040c29 100644 --- a/src/java/com/sun/gluegen/cgram/HeaderParser.g +++ b/src/java/com/sun/gluegen/cgram/HeaderParser.g @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -56,6 +57,16 @@ options { /** Name assigned to a anonymous EnumType (e.g., "enum { ... }"). */ public static final String ANONYMOUS_ENUM_NAME = "<anonymous>"; + boolean debug = false; + + public boolean getDebug() { + return debug; + } + + public void setDebug(boolean debug) { + this.debug = debug; + } + /** Set the dictionary mapping typedef names to types for this HeaderParser. Must be done before parsing. */ public void setTypedefDictionary(TypeDictionary dict) { @@ -88,13 +99,13 @@ options { } /** Pre-define the list of EnumTypes for this HeaderParser. Must be - done before parsing. */ + done before parsing. */ public void setEnums(List/*<EnumType>*/ enumTypes) { // FIXME: Need to take the input set of EnumTypes, extract all // the enumerates from each EnumType, and fill in the enumHash // so that each enumerate maps to the enumType to which it // belongs. - throw new RuntimeException("setEnums is Unimplemented!"); + throw new RuntimeException("setEnums is Unimplemented!"); } /** Returns the EnumTypes this HeaderParser processed. */ @@ -176,24 +187,53 @@ options { boolean isTypedef() { return isTypedef; } - // for easier debugging - public String toString() { - String tStr = "Type=NULL_REF"; - if (type == origType) { - tStr = "Type=ORIG_TYPE"; - } else if (type != null) { - tStr = "Type: name=\"" + type.getCVAttributesString() + " " + + // for easier debugging + public String toString() { + String tStr = "Type=NULL_REF"; + if (type == origType) { + tStr = "Type=ORIG_TYPE"; + } else if (type != null) { + tStr = "Type: name=\"" + type.getCVAttributesString() + " " + type.getName() + "\"; signature=\"" + type + "\"; class " + - type.getClass().getName(); - } - String oStr = "OrigType=NULL_REF"; - if (origType != null) { - oStr = "OrigType: name=\"" + origType.getCVAttributesString() + " " + + type.getClass().getName(); + } + String oStr = "OrigType=NULL_REF"; + if (origType != null) { + oStr = "OrigType: name=\"" + origType.getCVAttributesString() + " " + origType.getName() + "\"; signature=\"" + origType + "\"; class " + - origType.getClass().getName(); - } - return "<["+tStr + "] [" + oStr + "] " + " isTypedef=" + isTypedef+">"; - } + origType.getClass().getName(); + } + return "<["+tStr + "] [" + oStr + "] " + " isTypedef=" + isTypedef+">"; + } + } + + private String getTypeString(Type t) { + StringBuffer sb = new StringBuffer(); + sb.append("["); + sb.append(t); + sb.append(", size: "); + if(null!=t) { + SizeThunk st = t.getSize(); + if(null!=st) { + sb.append(st.getClass().getName()); + } else { + sb.append("undef"); + } + } + sb.append("]"); + return sb.toString(); + } + + private void debugPrintln(String msg) { + if(debug) { + System.err.println(msg); + } + } + + private void debugPrint(String msg) { + if(debug) { + System.err.print(msg); + } } private boolean doDeclaration; // Used to only process function typedefs @@ -231,12 +271,12 @@ options { private void processDeclaration(Type returnType) { if (doDeclaration) { FunctionSymbol sym = new FunctionSymbol(declId, new FunctionType(null, null, returnType, 0)); - if (parameters != null) { // handle funcs w/ empty parameter lists (e.g., "foo()") + if (parameters != null) { // handle funcs w/ empty parameter lists (e.g., "foo()") for (Iterator iter = parameters.iterator(); iter.hasNext(); ) { ParameterDeclaration pd = (ParameterDeclaration) iter.next(); sym.addArgument(pd.type(), pd.id()); } - } + } functions.add(sym); } } @@ -276,29 +316,29 @@ options { } /** Utility function: creates a new EnumType with the given name, or - returns an existing one if it has already been created. */ + returns an existing one if it has already been created. */ private EnumType getEnumType(String enumTypeName) { - EnumType enumType = null; - Iterator it = enumHash.values().iterator(); - while (it.hasNext()) { - EnumType potentialMatch = (EnumType)it.next(); - if (potentialMatch.getName().equals(enumTypeName)) { - enumType = potentialMatch; - break; - } - } - - if (enumType == null) { + EnumType enumType = null; + Iterator it = enumHash.values().iterator(); + while (it.hasNext()) { + EnumType potentialMatch = (EnumType)it.next(); + if (potentialMatch.getName().equals(enumTypeName)) { + enumType = potentialMatch; + break; + } + } + + if (enumType == null) { // This isn't quite correct. In theory the enum should expand to // the size of the largest element, so if there were a long long // entry the enum should expand to e.g. int64. However, using // "long" here (which is what used to be the case) was // definitely incorrect and caused problems. - enumType = new EnumType(enumTypeName, SizeThunk.INT); - } - - return enumType; - } + enumType = new EnumType(enumTypeName, SizeThunk.INT); + } + + return enumType; + } // Map used to canonicalize types. For example, we may typedef // struct foo { ... } *pfoo; subsequent references to struct foo* should @@ -343,17 +383,17 @@ declarator[TypeBox tb] returns [String s] { /* TypeBox becomes function pointer in this case */ FunctionType ft = new FunctionType(null, null, tb.type(), 0); if (params == null) { - // If the function pointer has no declared parameters, it's a - // void function. I'm not sure if the parameter name is - // ever referenced anywhere when the type is VoidType, so + // If the function pointer has no declared parameters, it's a + // void function. I'm not sure if the parameter name is + // ever referenced anywhere when the type is VoidType, so // just in case I'll set it to a comment string so it will - // still compile if written out to code anywhere. - ft.addArgument(new VoidType(0), "/*unnamed-void*/"); - } else { - for (Iterator iter = params.iterator(); iter.hasNext(); ) { + // still compile if written out to code anywhere. + ft.addArgument(new VoidType(0), "/*unnamed-void*/"); + } else { + for (Iterator iter = params.iterator(); iter.hasNext(); ) { ParameterDeclaration pd = (ParameterDeclaration) iter.next(); ft.addArgument(pd.type(), pd.id()); - } + } } tb.setType(canonicalize(new PointerType(SizeThunk.POINTER, ft, @@ -457,15 +497,21 @@ typeSpecifier[int attributes] returns [Type t] { int cvAttrs = attrs2CVAttrs(attributes); boolean unsigned = ((attributes & UNSIGNED) != 0); } - : "void" { t = new VoidType(cvAttrs); } - | "char" { t = new IntType("char" , SizeThunk.CHAR, unsigned, cvAttrs); } - | "short" { t = new IntType("short", SizeThunk.SHORT, unsigned, cvAttrs); } - | "int" { t = new IntType("int" , SizeThunk.INT, unsigned, cvAttrs); } - | "long" { t = new IntType("long" , SizeThunk.LONG, unsigned, cvAttrs); } - | "__int32" { t = new IntType("__int32", SizeThunk.INT, unsigned, cvAttrs); } - | "__int64" { t = new IntType("__int64", SizeThunk.INT64, unsigned, cvAttrs); } - | "float" { t = new FloatType("float", SizeThunk.FLOAT, cvAttrs); } - | "double" { t = new DoubleType("double", SizeThunk.DOUBLE, cvAttrs); } + : "void" { t = new VoidType(cvAttrs); } + | "char" { t = new IntType("char" , SizeThunk.CHAR, unsigned, cvAttrs); } + | "short" { t = new IntType("short", SizeThunk.SHORT, unsigned, cvAttrs); } + | "int" { t = new IntType("int" , SizeThunk.INT, unsigned, cvAttrs); } + | "long" { t = new IntType("long" , SizeThunk.LONG, unsigned, cvAttrs); } + | "float" { t = new FloatType("float", SizeThunk.FLOAT, cvAttrs); } + | "double" { t = new DoubleType("double", SizeThunk.DOUBLE, cvAttrs); } + | "__int32" { t = new IntType("__int32", SizeThunk.INT, unsigned, cvAttrs); } + | "int32_t" { t = new IntType("int32_t", SizeThunk.INT, false, cvAttrs); /* TS: always signed */ } + | "uint32_t" { t = new IntType("uint32_t", SizeThunk.INT, true, cvAttrs); /* TS: always unsigned */ } + | "__int64" { t = new IntType("__int64", SizeThunk.INT64, unsigned, cvAttrs); } + | "int64_t" { t = new IntType("int64_t", SizeThunk.INT64, false, cvAttrs); /* TS: always signed */ } + | "uint64_t" { t = new IntType("uint64_t", SizeThunk.INT64, true, cvAttrs); /* TS: always unsigned */ } + | "ptrdiff_t" { t = new IntType("ptrdiff_t", SizeThunk.POINTER, false, cvAttrs); /* TS: always signed */ } + | "size_t" { t = new IntType("size_t", SizeThunk.POINTER, true, cvAttrs); /* TS: always unsigned */ } | t = structSpecifier[cvAttrs] ( attributeDecl )* | t = unionSpecifier [cvAttrs] ( attributeDecl )* | t = enumSpecifier [cvAttrs] @@ -481,8 +527,10 @@ typeSpecifier[int attributes] returns [Type t] { typedefName[int cvAttrs] returns [Type t] { t = null; } : #(NTypedefName id : ID) - { - t = canonicalize(lookupInTypedefDictionary(id.getText()).getCVVariant(cvAttrs)); + { + Type tdict = lookupInTypedefDictionary(id.getText()); + t = canonicalize(tdict.getCVVariant(cvAttrs)); + debugPrintln("Adding typedef canon : [" + id.getText() + "] -> [" + tdict + "] -> "+getTypeString(t)); } ; @@ -575,7 +623,7 @@ structDeclarator[CompoundType containingType, Type t] returns [boolean addedAny] // I haven't implemented it yet because I'm not sure how to get the // "enumName" *before* executing the enumList rule. enumSpecifier [int cvAttrs] returns [Type t] { - t = null; + t = null; } : #( "enum" ( ( ID LCURLY )=> i:ID LCURLY enumList[(EnumType)(t = getEnumType(i.getText()))] RCURLY @@ -586,18 +634,18 @@ enumSpecifier [int cvAttrs] returns [Type t] { ; enumList[EnumType enumeration] { - long defaultEnumerantValue = 0; + long defaultEnumerantValue = 0; } : ( defaultEnumerantValue = enumerator[enumeration, defaultEnumerantValue] )+ ; enumerator[EnumType enumeration, long defaultValue] returns [long newDefaultValue] { - newDefaultValue = defaultValue; + newDefaultValue = defaultValue; } : eName:ID ( ASSIGN eVal:expr )? { long value = 0; if (eVal != null) { - String vTxt = eVal.getAllChildrenText(); + String vTxt = eVal.getAllChildrenText(); if (enumHash.containsKey(vTxt)) { EnumType oldEnumType = (EnumType) enumHash.get(vTxt); value = oldEnumType.getEnumValue(vTxt); @@ -605,7 +653,7 @@ enumerator[EnumType enumeration, long defaultValue] returns [long newDefaultValu try { value = Long.decode(vTxt).longValue(); } catch (NumberFormatException e) { - System.err.println("NumberFormatException: ID[" + eName.getText() + "], VALUE=[" + vTxt + "]"); + System.err.println("NumberFormatException: ID[" + eName.getText() + "], VALUE=[" + vTxt + "]"); throw e; } } @@ -613,25 +661,25 @@ enumerator[EnumType enumeration, long defaultValue] returns [long newDefaultValu value = defaultValue; } - newDefaultValue = value+1; - String eTxt = eName.getText(); - if (enumHash.containsKey(eTxt)) { - EnumType oldEnumType = (EnumType) enumHash.get(eTxt); - long oldValue = oldEnumType.getEnumValue(eTxt); - System.err.println("WARNING: redefinition of enumerated value '" + eTxt + "';" + - " existing definition is in enumeration '" + oldEnumType.getName() + - "' with value " + oldValue + " and new definition is in enumeration '" + - enumeration.getName() + "' with value " + value); - // remove old definition - oldEnumType.removeEnumerate(eTxt); - } - // insert new definition - enumeration.addEnum(eTxt, value); - enumHash.put(eTxt, enumeration); - //System.err.println("ENUM [" + enumeration.getName() + "]: " + eTxt + " = " + enumeration.getEnumValue(eTxt) + - // " (new default = " + newDefaultValue + ")"); - } - ; + newDefaultValue = value+1; + String eTxt = eName.getText(); + if (enumHash.containsKey(eTxt)) { + EnumType oldEnumType = (EnumType) enumHash.get(eTxt); + long oldValue = oldEnumType.getEnumValue(eTxt); + System.err.println("WARNING: redefinition of enumerated value '" + eTxt + "';" + + " existing definition is in enumeration '" + oldEnumType.getName() + + "' with value " + oldValue + " and new definition is in enumeration '" + + enumeration.getName() + "' with value " + value); + // remove old definition + oldEnumType.removeEnumerate(eTxt); + } + // insert new definition + enumeration.addEnum(eTxt, value); + enumHash.put(eTxt, enumeration); + debugPrintln("ENUM [" + enumeration.getName() + "]: " + eTxt + " = " + enumeration.getEnumValue(eTxt) + + " (new default = " + newDefaultValue + ")"); + } + ; initDeclList[TypeBox tb] : ( initDecl[tb] )+ @@ -642,8 +690,8 @@ initDecl[TypeBox tb] { } : #( NInitDecl declName = declarator[tb] { - //System.err.println("GOT declName: " + declName + " TB=" + tb); - } + debugPrintln("GOT declName: " + declName + " TB=" + tb); + } ( attributeDecl )* ( ASSIGN initializer | COLON expr @@ -652,11 +700,18 @@ initDecl[TypeBox tb] { { if ((declName != null) && (tb != null) && tb.isTypedef()) { Type t = tb.type(); - //System.err.println("Adding typedef mapping: [" + declName + "] -> [" + t + "]"); + debugPrint("Adding typedef mapping: [" + declName + "] -> "+getTypeString(t)); if (!t.hasTypedefName()) { t.setName(declName); + debugPrint(" - declName -> "+getTypeString(t)); + } else { + // copy type to preserve declName ! + t = (Type) t.clone(); + t.setName(declName); + debugPrint(" - copy -> "+getTypeString(t)); } t = canonicalize(t); + debugPrintln(" - canon -> "+getTypeString(t)); typedefDictionary.put(declName, t); // Clear out PointerGroup effects in case another typedef variant follows tb.reset(); @@ -667,7 +722,7 @@ initDecl[TypeBox tb] { pointerGroup[TypeBox tb] { int x = 0; int y = 0; } : #( NPointerGroup ( STAR { x = 0; y = 0; } ( y = typeQualifier { x |= y; } )* { - //System.err.println("IN PTR GROUP: TB=" + tb); + debugPrintln("IN PTR GROUP: TB=" + tb); if (tb != null) { tb.setType(canonicalize(new PointerType(SizeThunk.POINTER, tb.type(), diff --git a/src/java/com/sun/gluegen/cgram/types/ArrayType.java b/src/java/com/sun/gluegen/cgram/types/ArrayType.java index 31ec13c..6ef4682 100644 --- a/src/java/com/sun/gluegen/cgram/types/ArrayType.java +++ b/src/java/com/sun/gluegen/cgram/types/ArrayType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -44,7 +45,7 @@ package com.sun.gluegen.cgram.types; not be known; if the length is unknown then a negative number should be passed in to the constructor. */ -public class ArrayType extends Type { +public class ArrayType extends Type implements Cloneable { private Type elementType; private int length; private String computedName; diff --git a/src/java/com/sun/gluegen/cgram/types/BitType.java b/src/java/com/sun/gluegen/cgram/types/BitType.java index b5a5337..fc6f851 100644 --- a/src/java/com/sun/gluegen/cgram/types/BitType.java +++ b/src/java/com/sun/gluegen/cgram/types/BitType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -41,7 +42,7 @@ package com.sun.gluegen.cgram.types; /** Represents a bitfield in a struct. */ -public class BitType extends IntType { +public class BitType extends IntType implements Cloneable { private IntType underlyingType; private int sizeInBits; private int offset; diff --git a/src/java/com/sun/gluegen/cgram/types/CompoundType.java b/src/java/com/sun/gluegen/cgram/types/CompoundType.java index 9b982fd..51efad5 100644 --- a/src/java/com/sun/gluegen/cgram/types/CompoundType.java +++ b/src/java/com/sun/gluegen/cgram/types/CompoundType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -45,7 +46,7 @@ import java.util.*; and unions. The boolean type accessors indicate how the type is really defined. */ -public class CompoundType extends Type { +public class CompoundType extends Type implements Cloneable { private CompoundTypeKind kind; // The name "foo" in the construct "struct foo { ... }"; private String structName; @@ -66,6 +67,12 @@ public class CompoundType extends Type { this.structName = structName; } + public Object clone() { + CompoundType n = (CompoundType) super.clone(); + n.fields = (ArrayList) this.fields.clone(); + return n; + } + @Override public int hashCode() { if (computedHashcode) { diff --git a/src/java/com/sun/gluegen/cgram/types/DoubleType.java b/src/java/com/sun/gluegen/cgram/types/DoubleType.java index 7e295cd..cc4ffba 100644 --- a/src/java/com/sun/gluegen/cgram/types/DoubleType.java +++ b/src/java/com/sun/gluegen/cgram/types/DoubleType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -39,7 +40,7 @@ package com.sun.gluegen.cgram.types; /** Represents a double-word floating-point type (C type "double".) */ -public class DoubleType extends PrimitiveType { +public class DoubleType extends PrimitiveType implements Cloneable { public DoubleType(String name, SizeThunk size, int cvAttributes) { super(name, size, cvAttributes); diff --git a/src/java/com/sun/gluegen/cgram/types/EnumType.java b/src/java/com/sun/gluegen/cgram/types/EnumType.java index b06ed9a..c6f8541 100644 --- a/src/java/com/sun/gluegen/cgram/types/EnumType.java +++ b/src/java/com/sun/gluegen/cgram/types/EnumType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -38,11 +39,13 @@ */ package com.sun.gluegen.cgram.types; -import java.util.*; +import java.util.ArrayList; +import java.util.NoSuchElementException; + /** Describes enumerated types. Enumerations are like ints except that they have a set of named values. */ -public class EnumType extends IntType { +public class EnumType extends IntType implements Cloneable { private IntType underlyingType; @@ -65,7 +68,7 @@ public class EnumType extends IntType { } } - private List<Enum> enums; + private ArrayList<Enum> enums; public EnumType(String name) { super(name, SizeThunk.LONG, false, CVAttributes.CONST); @@ -82,6 +85,13 @@ public class EnumType extends IntType { this.underlyingType = underlyingType; } + public Object clone() { + EnumType n = (EnumType) super.clone(); + n.underlyingType = (IntType) this.underlyingType.clone(); + n.enums = (ArrayList) this.enums.clone(); + return n; + } + @Override public boolean equals(Object arg) { if (arg == this) { diff --git a/src/java/com/sun/gluegen/cgram/types/FloatType.java b/src/java/com/sun/gluegen/cgram/types/FloatType.java index 91b45b4..2e80be9 100644 --- a/src/java/com/sun/gluegen/cgram/types/FloatType.java +++ b/src/java/com/sun/gluegen/cgram/types/FloatType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -41,12 +42,11 @@ package com.sun.gluegen.cgram.types; /** Represents a single-word floating-point type (C type "float".) */ -public class FloatType extends PrimitiveType { +public class FloatType extends PrimitiveType implements Cloneable { public FloatType(String name, SizeThunk size, int cvAttributes) { super(name, size, cvAttributes); } - @Override public boolean equals(Object arg) { if (arg == this) { diff --git a/src/java/com/sun/gluegen/cgram/types/FunctionType.java b/src/java/com/sun/gluegen/cgram/types/FunctionType.java index d36f839..35b62b7 100644 --- a/src/java/com/sun/gluegen/cgram/types/FunctionType.java +++ b/src/java/com/sun/gluegen/cgram/types/FunctionType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -42,7 +43,7 @@ import java.util.*; /** Describes a function type, used to model both function declarations and (via PointerType) function pointers. */ -public class FunctionType extends Type { +public class FunctionType extends Type implements Cloneable { private Type returnType; private ArrayList<Type> argumentTypes; @@ -53,6 +54,13 @@ public class FunctionType extends Type { this.returnType = returnType; } + public Object clone() { + FunctionType n = (FunctionType) super.clone(); + n.argumentTypes = (ArrayList) this.argumentTypes.clone(); + n.argumentNames = (ArrayList) this.argumentNames.clone(); + return n; + } + @Override public boolean equals(Object arg) { if (arg == this) { diff --git a/src/java/com/sun/gluegen/cgram/types/IntType.java b/src/java/com/sun/gluegen/cgram/types/IntType.java index b94e7bb..fbbd939 100644 --- a/src/java/com/sun/gluegen/cgram/types/IntType.java +++ b/src/java/com/sun/gluegen/cgram/types/IntType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -38,7 +39,7 @@ */ package com.sun.gluegen.cgram.types; -public class IntType extends PrimitiveType { +public class IntType extends PrimitiveType implements Cloneable { private boolean unsigned; private boolean typedefedUnsigned; diff --git a/src/java/com/sun/gluegen/cgram/types/PointerType.java b/src/java/com/sun/gluegen/cgram/types/PointerType.java index 712c4ee..cfd54c5 100644 --- a/src/java/com/sun/gluegen/cgram/types/PointerType.java +++ b/src/java/com/sun/gluegen/cgram/types/PointerType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -38,7 +39,7 @@ */ package com.sun.gluegen.cgram.types; -public class PointerType extends Type { +public class PointerType extends Type implements Cloneable { private Type targetType; private String computedName; diff --git a/src/java/com/sun/gluegen/cgram/types/PrimitiveType.java b/src/java/com/sun/gluegen/cgram/types/PrimitiveType.java index 8b6e096..27cd3dd 100644 --- a/src/java/com/sun/gluegen/cgram/types/PrimitiveType.java +++ b/src/java/com/sun/gluegen/cgram/types/PrimitiveType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -38,7 +39,7 @@ */ package com.sun.gluegen.cgram.types; -public abstract class PrimitiveType extends Type { +public abstract class PrimitiveType extends Type implements Cloneable { protected PrimitiveType(String name, SizeThunk size, int cvAttributes) { super(name, size, cvAttributes); diff --git a/src/java/com/sun/gluegen/cgram/types/SizeThunk.java b/src/java/com/sun/gluegen/cgram/types/SizeThunk.java index 74feef9..fcc96be 100755 --- a/src/java/com/sun/gluegen/cgram/types/SizeThunk.java +++ b/src/java/com/sun/gluegen/cgram/types/SizeThunk.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -45,10 +46,18 @@ package com.sun.gluegen.cgram.types; 32-bit and 64-bit) from the same internal representation of the various types involved. */ -public abstract class SizeThunk { +public abstract class SizeThunk implements Cloneable { // Private constructor because there are only a few of these private SizeThunk() {} + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException ex) { + throw new InternalError(); + } + } + public abstract long compute(MachineDescription machDesc); public static final SizeThunk CHAR = new SizeThunk() { diff --git a/src/java/com/sun/gluegen/cgram/types/Type.java b/src/java/com/sun/gluegen/cgram/types/Type.java index 4df034b..e43acb2 100644 --- a/src/java/com/sun/gluegen/cgram/types/Type.java +++ b/src/java/com/sun/gluegen/cgram/types/Type.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -45,7 +46,7 @@ import java.util.List; double. All types have an associated name. Structs and unions are modeled as "compound" types -- composed of fields of primitive or other types. */ -public abstract class Type { +public abstract class Type implements Cloneable { private String name; private SizeThunk size; @@ -60,6 +61,14 @@ public abstract class Type { hasTypedefName = false; } + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException ex) { + throw new InternalError(); + } + } + /** Returns the name of this type. The returned string is suitable for use as a type specifier. Does not include any const/volatile attributes. */ diff --git a/src/java/com/sun/gluegen/cgram/types/VoidType.java b/src/java/com/sun/gluegen/cgram/types/VoidType.java index 779a661..4c3c077 100644 --- a/src/java/com/sun/gluegen/cgram/types/VoidType.java +++ b/src/java/com/sun/gluegen/cgram/types/VoidType.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -38,7 +39,7 @@ */ package com.sun.gluegen.cgram.types; -public class VoidType extends Type { +public class VoidType extends Type implements Cloneable { public VoidType(int cvAttributes) { this("void", cvAttributes); |