Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Weird bytecode generated by AspectJ 1.2

Hi all-,
Can anyone explain why would AspectJ would generate
bad bytecode, so the JVM would reject it:
-----------------------------------------
     [java] There was 1 error:
     [java] 1)
testWriteRead(exceedsoft.test.StoreJTSObjectsTestCase)java.lang.V
erifyError: (class:
org/garret/perst/aspectj/PersistenceAspect, method:
<clinit>
 signature: ()V) Stack size too large
     [java]     at
com.vividsolutions.jts.geom.Coordinate.<init>(Unknown
Source)

     [java]     at
com.vividsolutions.jts.geom.Coordinate.<init>(Unknown
Source)
-----------------------------------------
I get this after binary aspect weaving with AspectJ
1.2 and running J2SE 1.4.2_05 undex XP. See
attachemnts for the problem (the attached JARS are not
woven into)

Thanks,
Hristo


		
__________________________________
Do you Yahoo!?
Yahoo! Mail - 50x more storage than other providers!
http://promotions.yahoo.com/new_mail

Attachment: me_com.vividsolutions.jts-1.4.0.jar
Description: me_com.vividsolutions.jts-1.4.0.jar

Attachment: me_org.garret.perst-229.jar
Description: me_org.garret.perst-229.jar

/*
 * Created on Jan 24, 2004
 */
package org.garret.perst.aspectj;

/**
 * Base interface for all classes automatically treated as persistent capable.
 * Programmer should either explicitly add this interface to all classes which he want to be persistent
 * capable or add this interface using AspectJ <code>declare parents:</code> construction.
 * This interface doesn't allow to access fields of external (non-this) object,
 * you should use getter/setter methods instead.
 * If you want to provide access to external fields you should use StrictAutoPersist interface.

 * @author Patrick Morris-Suzuki
 *
 */
public interface AutoPersist {

}
/*
 * Created on Jan 24, 2004
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package org.garret.perst.aspectj;

/**
 * @author Patrick Morris-Suzuki
 *
 */

import org.garret.perst.*;

privileged public aspect PersistenceAspect {
    declare parents: AutoPersist extends IPersistent;

    pointcut notPerstCode(): !within(org.garret.perst.*) && !within(org.garret.perst.impl.*) && !within(org.garret.perst.aspectj.*);
    
    pointcut persistentMethod(): 
        execution(!static * ((Persistent+ && !Persistent) || (AutoPersist+ && !(StrictAutoPersist+) && !AutoPersist)).*(..))
        && !execution(void *.recursiveLoading());
                
    /*
     * Load object at the beginning of each instance mehtod of persistent capable object
     */         
    before(IPersistent t) : persistentMethod() && this(t) {
        t.load();
    }

    /*
     * Read access to fields of persistent object
     */ 
    before(StrictAutoPersist t): get(!transient !static * StrictAutoPersist+.*) && notPerstCode() && target(t)
    {
        t.load();
    }

    /*
     * Read access to fields of persistent object
     */ 
    before(StrictAutoPersist t): set(!transient !static * StrictAutoPersist+.*) && notPerstCode() && target(t) 
    {
        t.loadAndModify();
    }

    /*
     * Automatically notice modifications to any fields.
     */
    before(AutoPersist t):  set(!transient !static * (AutoPersist+ && !(StrictAutoPersist+)).*)
        && notPerstCode() && !withincode(*.new(..)) && target(t)  
    {
        t.modify();
    }
    
    public void AutoPersist.assignOid(Storage s, int o, boolean r) {
        oid = o;
        storage = s;
        state = r? RAW : 0;
    }
    
    boolean around(AutoPersist me, Object other):
    execution(boolean AutoPersist+.equals(Object)) &&
        args(other) && target(me){
        if(other==null) return false;
        
        boolean isEqual;
        try{
            isEqual=proceed(me, other);
        } catch(ClassCastException excep){
                        if(!other.getClass().equals(me.getClass()))
                            return false;
                        else
                            throw excep;
        }
        if(!isEqual){
            if(other!=null && other instanceof IPersistent){
                if(((IPersistent)other).getOid()==me.oid) isEqual=true;
            }
        }
        return isEqual;
    }
    
    int around(AutoPersist me):
    execution(int AutoPersist+.hashCode()) && target(me){
        return me.oid;
    }
    
    public void AutoPersist.commit() {
        if (storage !=null)
            storage.commit();
    }
    
    public void AutoPersist.load() {
        if (storage != null && (state & RAW) != 0) { 
            storage.loadObject(this);
        }
    }
    
    public void AutoPersist.loadAndModify() {
        load();
        modify();
    }

    public final boolean AutoPersist.isRaw() { 
        return (state & RAW) != 0;
    } 
    
    public final boolean AutoPersist.isModified() { 
        return (state & DIRTY) != 0;
    } 
    
    public final boolean AutoPersist.isPersistent() { 
        return oid != 0;
    }
    
    public void AutoPersist.makePersistent(Storage storage) { 
        if (oid == 0) { 
            storage.storeObject(this);
        }
    }

    public void AutoPersist.store() {
        if ((state & RAW) != 0) { 
            throw new StorageError(StorageError.ACCESS_TO_STUB);
        }
        if (storage != null) { 
            storage.storeObject(this);
            state &= ~DIRTY;
        }
    }
    
    public void AutoPersist.modify() { 
        if ((state & DIRTY) == 0 && storage != null) { 
            if ((state & RAW) != 0) { 
                throw new StorageError(StorageError.ACCESS_TO_STUB);
            }
            storage.modifyObject(this);
            state |= DIRTY;
        }
    }
    
    public final int AutoPersist.getOid() {
        return oid;
    }
    
    public void AutoPersist.deallocate() { 
        if (storage != null) { 
            storage.deallocateObject(this);
            state = 0;
            storage = null;
        }
    }
    
    public boolean AutoPersist.recursiveLoading() {
        return false;
    }
    
    public final Storage AutoPersist.getStorage() {
        return storage;
    }
    
    public void AutoPersist.onLoad() {
    }
    
    public void AutoPersist.invalidate() { 
        state |= RAW;
    }
    
    public void AutoPersist.finalize() { 
        if ((state & DIRTY) != 0 && storage != null) { 
            storage.storeFinalizedObject(this);
            state &= ~DIRTY;
        }
    }
    
    public void AutoPersist.readExternal(java.io.ObjectInput s) throws java.io.IOException, ClassNotFoundException
    {
        oid = s.readInt();
    }

    public void AutoPersist.writeExternal(java.io.ObjectOutput s) throws java.io.IOException
    {
	s.writeInt(oid);
    }

    private transient Storage AutoPersist.storage;
    private transient int     AutoPersist.oid;
    private transient int     AutoPersist.state;
    
    private static final int RAW   = 1;
    private static final int DIRTY = 2;
}
/*
 * Created on Jan 25, 2004
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package org.garret.perst.aspectj;

/**
 * @author Patrick Morris-Suzuki
 *
 */

public aspect SafeHashAspect {

        declare precedence: PersistenceAspect+, SafeHashAspect;
        
        int around(SafeHashCode me):
                        execution(int SafeHashCode+.hashCode()) && target(me){
                return me.safeHashCode();
        }
}
 
/*
 * Created on Jan 25, 2004
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package org.garret.perst.aspectj;

/**
 * @author Patrick Morris-Suzuki
 *
 */
public interface SafeHashCode {
        public int safeHashCode();
}
/*
 * Created on Feb 08, 2004
 */
package org.garret.perst.aspectj;

/**
 * Base interface for all classes automatically treated as persistent capable which needs
 * to provide external access to their fields. Using this interface will significantly decrease 
 * efficiency of result code, because any access to instance fields of this class (doesn't matter access 
 * to self or foreign field) will be prepended by invocation of load() method. As far as 
 * OOP design rules recommend to made all fields private or protected and access them only through methods, 
 * I highly recommend you to avoid access to foreign fields and do not use this code. 
 * Access fields through getter methods will be in any case much efficient.
 */
public interface StrictAutoPersist extends AutoPersist {

}
import org.garret.perst.*;
import org.garret.perst.aspectj.*;

import com.vividsolutions.jts.geom.*;

privileged public aspect PerstGeometry
{
    declare parents: com.vividsolutions.jts.. implements AutoPersist;
    declare parents: org.geotools..           implements AutoPersist;
}

Back to the top