This is the mail archive of the
java@gcc.gnu.org
mailing list for the Java project.
Re: Incorrect Java methods called from CNI
On Mon, 2004-05-10 at 18:12, Bryce McKinlay wrote:
> Dave Menendez wrote:
>
> > movl (%eax), %edx
> > addl $56, %edx
> > movl -12(%ebp), %eax
> > movl %eax, (%esp)
> > movl (%edx), %eax
> > call *%eax
> >
> >
> >
> Looks like this is the call in question. Its offseting the vtable
> pointer by 56 bytes.
>
> Heres the vtable, run through c++filt, cleaned up a bit, and with byte
> offsets added:
>
> -8 .long 0
> -4 .long 0
> 0 .long Classification.class$
> 4 .long -37748735
> 8 .long java.lang.Object.finalize()
> 12 .long hashCode()
> 16 .long equals(java.lang.Object)
> 20 .long toString()
> 24 .long clone()
> 28 .long addClassificationListener(ClassificationListener)
> 32 .long fireClassificationChange()
> 36 .long getNumberOfListeners()
> 40 .long isImmutable()
> 44 .long removeAllListeners()
> 48 .long removeClassificationListener(ClassificationListener)
> 52 .long getClassification()
> 56 .long add(Marking)
> 60 .long clear()
> 64 .long clearMarkings()
> 68 .long combine(Classification)
> 72 .long compareTo(Classification)
> 76 .long contains(java.lang.Object)
>
> So, its obviously going to call add() - the offset to call clear()
> should be 60. For some reason, the C++ compiler's idea of where the
> method is in the vtable doesn't match the Java compiler's. Can you post
> the relavent portions of the .h file for this class, and the method
> declarations from the Java source code (not the code itself, just the
> name & access modifiers etc)?
>
> Bryce
>
I've attached both the C++ header generated by gcjh and the declarations
from the original java source, cleaned up a bit, but in the same order
in which they appear in both files.
class jblocks::security::classification::Classification : public ::jblocks::security::classification::AbstractClassificationModel
{
public:
Classification ();
Classification (::jblocks::security::classification::ClassificationBitSet *);
Classification (::jblocks::security::classification::ClassificationMarking *);
Classification (::java::lang::String *);
Classification (::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
virtual void add (::jblocks::security::classification::Marking *);
virtual void clear ();
public: // actually protected
virtual void clearMarkings ();
public:
virtual ::java::lang::Object *clone ();
virtual ::jblocks::security::classification::Classification *combine (::jblocks::security::classification::Classification *);
static ::jblocks::security::classification::Classification *combine (::jblocks::security::classification::Classification *, ::jblocks::security::classification::Classification *);
virtual jint compareTo (::jblocks::security::classification::Classification *);
virtual jboolean contains (::java::lang::Object *);
public: // actually protected
virtual void createFromBitSet (::jblocks::security::classification::ClassificationBitSet *);
public:
virtual jboolean equals (::java::lang::Object *);
virtual ::java::lang::String *getAbbreviation ();
virtual ::java::lang::String *getAbbreviation (::jblocks::security::classification::Classification *);
::jblocks::security::classification::ClassificationBitSet *getBitSet ();
virtual ::jblocks::security::classification::Classification *getClassification () { return this; }
virtual ::jblocks::security::classification::ClassificationMarking *getClassificationMarking () { return classificationMarking; }
virtual ::jblocks::security::classification::DeclassificationSet *getDeclassificationMarkings ();
public: // actually package-private
virtual ::jblocks::security::classification::DeclassificationSet *getDeclassificationSet () { return declassificationSet; }
public:
virtual ::jblocks::security::classification::DisseminationSet *getDisseminationMarkings ();
public: // actually package-private
virtual ::jblocks::security::classification::DisseminationSet *getDisseminationSet () { return disseminationSet; }
public:
virtual ::java::lang::String *getDocumentMarking ();
virtual ::java::lang::String *getMarking (jint);
virtual ::java::lang::String *getMarking (jint, ::jblocks::security::classification::Classification *);
virtual ::java::util::List *getMarkings ();
virtual ::java::util::List *getMarkings (::java::util::List *);
virtual ::jblocks::security::classification::NonICSet *getNonICMarkings ();
virtual ::jblocks::security::classification::NonICSet *getNonICSet () { return nonICSet; }
static ::jblocks::security::classification::ClassificationParser *getParser ();
virtual ::java::lang::String *getPortionMarking ();
virtual ::java::lang::String *getPortionMarking (::jblocks::security::classification::Classification *);
virtual ::jblocks::security::classification::SCIControlSystemSet *getSCIControlSystemMarkings ();
virtual ::jblocks::security::classification::SCIControlSystemSet *getSCIMarkings ();
public: // actually package-private
virtual ::jblocks::security::classification::SCIControlSystemSet *getSCISet () { return sciSet; }
public:
virtual ::java::lang::String *getTitle ();
virtual ::java::lang::String *getTitle (::jblocks::security::classification::Classification *);
virtual jint hashCode ();
virtual jboolean isImmutable () { return immutable; }
virtual jboolean isValid ();
static jboolean isValid (::java::lang::String *);
static jboolean isValid (::java::lang::String *, ::jblocks::security::classification::Classification *);
static ::jblocks::security::classification::Classification *parseMarking (::java::lang::String *);
static ::jblocks::security::classification::Classification *parseMarking (::java::lang::String *, ::jblocks::security::classification::Classification *);
virtual void remove (::java::lang::Object *);
virtual void setClassificationMarking (::jblocks::security::classification::ClassificationMarking *);
virtual void setDeclassificationMarkings (::jblocks::security::classification::DeclassificationSet *);
virtual void setDisseminationMarkings (::jblocks::security::classification::DisseminationSet *);
virtual void setImmutable ();
virtual void setNonICMarkings (::jblocks::security::classification::NonICSet *);
static void setParser (::jblocks::security::classification::ClassificationParser *);
virtual void setSCIControlSystemMarkings (::jblocks::security::classification::SCIControlSystemSet *);
virtual ::java::lang::String *toString ();
virtual void updateClassification (::jblocks::security::classification::Classification *);
virtual void validate ();
static void main (JArray< ::java::lang::String *> *);
static ::java::lang::String *classVersion;
static const jint SERIAL_VERSION = 1L;
static const jlong serialVersionUID = -7634463234120223030LL;
static ::jblocks::security::classification::Classification *VAR1;
static ::jblocks::security::classification::Classification *VAR2;
static ::jblocks::security::classification::Classification *VAR3;
static ::jblocks::security::classification::Classification *VAR4;
static ::jblocks::security::classification::Classification *VAR5;
static ::jblocks::security::classification::Classification *VAR6;
static ::jblocks::security::classification::Classification *VAR7;
static ::jblocks::security::classification::Classification *VAR8;
static ::jblocks::security::classification::Classification *VAR9;
static ::jblocks::security::classification::Classification *VAR10;
static ::jblocks::security::classification::Classification *VAR11;
static ::jblocks::security::classification::Classification *VAR12;
public: // actually protected
static ::jblocks::security::classification::ClassificationParser *parser;
::jblocks::security::classification::ClassificationMarking * __attribute__((aligned(__alignof__( ::jblocks::security::classification::AbstractClassificationModel )))) classificationMarking;
::jblocks::security::classification::DeclassificationSet *declassificationSet;
::jblocks::security::classification::DisseminationSet *disseminationSet;
jboolean immutable;
::jblocks::security::classification::NonICSet *nonICSet;
::jblocks::security::classification::SCIControlSystemSet *sciSet;
private:
JArray< ::java::lang::String *> *generatedMarkings;
public:
static ::java::lang::Class class$;
};
#endif /* __jblocks_security_classification_Classification__ */
public class Classification extends AbstractClassificationModel
implements Marking, Cloneable, Serializable
{
//////////////////////
// Public constants //
//////////////////////
public final static String classVersion = "4.3.3";
public final static byte SERIAL_VERSION = (byte) 0x01;
public final static long serialVersionUID = -7634463234120223030L;
public final static Classification VAR1 =
new Classification( ... );
public final static Classification VAR2 =
new Classification( ... );
public final static Classification VAR3 =
new Classification( ... );
public final static Classification VAR4 =
new Classification( ... );
public final static Classification VAR5 =
new Classification( ... );
public final static Classification VAR6 =
new Classification( ... );
public final static Classification VAR7 =
new Classification( ... );
public final static Classification VAR8 =
new Classification( ... );
public final static Classification VAR9 =
new Classification( ... );
public final static Classification VAR10 =
new Classification( ... );
public final static Classification VAR11 =
new Classification( ... );
public final static Classification VAR12 =
new Classification( ... );
static
{
VAR1.setImmutable();
VAR2.add( ... );
VAR2.setImmutable();
VAR3.add( ... );
VAR3.setImmutable();
VAR4.setImmutable();
VAR5.add( ... );
VAR5.setImmutable();
VAR6.add( ... );
VAR6.setImmutable();
VAR7.add( ... );
VAR7.setImmutable();
VAR8.setImmutable();
VAR9.add( ... );
VAR9.setImmutable();
VAR10.add( ... );
VAR10.setImmutable();
VAR11.add( ... );
VAR11.setImmutable();
VAR12.setImmutable();
}
/////////////////////////////////
// Protected shared properties //
/////////////////////////////////
/** The classification parser. */
protected static ClassificationParser parser = ...;
//////////////////////////
// Protected properties //
//////////////////////////
protected ClassificationMarking classificationMarking = null;
protected DeclassificationSet declassificationSet = null;
protected DisseminationSet disseminationSet = null;
protected boolean immutable = false;
protected NonICSet nonICSet = null;
protected SCIControlSystemSet sciSet = null;
////////////////////////
// Private properties //
////////////////////////
private transient String [] generatedMarkings = null;
public Classification()
public Classification( ClassificationBitSet bitSet )
public Classification( ClassificationMarking marking )
public Classification( String s )
throws InvalidClassificationException
public Classification( String secClass,
String secCtrlSys,
String secDissemCtrl,
String secDeclass )
throws InvalidClassificationException
public void add( Marking marking )
public void clear()
protected void clearMarkings()
public Object clone()
public Classification combine( Classification other )
throws InvalidClassificationException
public static Classification combine( Classification first,
Classification second )
throws InvalidClassificationException
public int compareTo( Classification other )
public boolean contains( Object marking )
protected void createFromBitSet( ClassificationBitSet bitSet )
public boolean equals( Object obj )
public String getAbbreviation()
public String getAbbreviation( Classification document)
public final ClassificationBitSet getBitSet()
public Classification getClassification()
public ClassificationMarking getClassificationMarking()
public DeclassificationSet getDeclassificationMarkings()
DeclassificationSet getDeclassificationSet()
public DisseminationSet getDisseminationMarkings()
DisseminationSet getDisseminationSet()
public String getDocumentMarking()
public String getMarking( int type )
public String getMarking( int type, Classification document )
public List getMarkings()
public List getMarkings( List markings )
public NonICSet getNonICMarkings()
public NonICSet getNonICSet()
public static ClassificationParser getParser()
public String getPortionMarking()
public String getPortionMarking( Classification document )
public SCIControlSystemSet getSCIControlSystemMarkings()
public SCIControlSystemSet getSCIMarkings()
SCIControlSystemSet getSCISet()
public String getTitle()
public String getTitle( Classification document )
public int hashCode()
public boolean isImmutable()
public boolean isValid()
public static boolean isValid( String s )
public static boolean isValid( String s, Classification docClassification )
public static Classification parseMarking( String s )
throws InvalidClassificationException
public static Classification parseMarking(String s,
Classification docClassification)
throws InvalidClassificationException
public void remove( Object marking )
public void setClassificationMarking( ClassificationMarking marking )
public void setDeclassificationMarkings( DeclassificationSet set )
public void setDisseminationMarkings( DisseminationSet set )
public synchronized void setImmutable()
public void setNonICMarkings( NonICSet set )
public static void setParser( ClassificationParser parser )
public void setSCIControlSystemMarkings( SCIControlSystemSet set )
public String toString()
public void updateClassification( Classification classification )
public void validate()
throws InvalidClassificationException
public static void main( String [] args )
}