From 6e6658a5e9e1665d18f3b4eb8d94609592b56228 Mon Sep 17 00:00:00 2001 From: aclement Date: Thu, 9 Mar 2006 17:24:19 +0000 Subject: [PATCH] 101411: -XaddSerialVersionUID --- .../aspectj/apache/bcel/generic/ClassGen.java | 160 +++++++++++++++++- docs/devGuideDB/ajc.xml | 10 ++ lib/bcel/bcel-src.zip | Bin 875632 -> 877328 bytes lib/bcel/bcel.jar | Bin 598789 -> 602647 bytes .../org/aspectj/ajdt/ajc/BuildArgParser.java | 2 + .../org/aspectj/ajdt/ajc/messages.properties | 2 + .../internal/core/builder/AjBuildConfig.java | 8 + .../internal/core/builder/AjBuildManager.java | 1 + .../core/builder/AjCompilerOptions.java | 1 + tests/features151/serialveruid/AnAspect.java | 5 + tests/features151/serialveruid/Basic.java | 19 +++ .../serialveruid/BigHorribleClass.java | 28 +++ .../systemtest/ajc151/AllTestsAspectJ151.java | 1 + .../ajc151/SerialVersionUIDTests.java | 35 ++++ .../systemtest/ajc151/serialversionuid.xml | 37 ++++ weaver/src/org/aspectj/weaver/Lint.java | 3 + weaver/src/org/aspectj/weaver/World.java | 6 + .../aspectj/weaver/XlintDefault.properties | 1 + .../org/aspectj/weaver/bcel/LazyClassGen.java | 37 +++- 19 files changed, 352 insertions(+), 4 deletions(-) create mode 100644 tests/features151/serialveruid/AnAspect.java create mode 100644 tests/features151/serialveruid/Basic.java create mode 100644 tests/features151/serialveruid/BigHorribleClass.java create mode 100644 tests/src/org/aspectj/systemtest/ajc151/SerialVersionUIDTests.java create mode 100644 tests/src/org/aspectj/systemtest/ajc151/serialversionuid.xml diff --git a/bcel-builder/src/org/aspectj/apache/bcel/generic/ClassGen.java b/bcel-builder/src/org/aspectj/apache/bcel/generic/ClassGen.java index bec436bf6..9e21b271e 100644 --- a/bcel-builder/src/org/aspectj/apache/bcel/generic/ClassGen.java +++ b/bcel-builder/src/org/aspectj/apache/bcel/generic/ClassGen.java @@ -54,7 +54,14 @@ package org.aspectj.apache.bcel.generic; * . */ +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.lang.reflect.Modifier; +import java.security.MessageDigest; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -77,8 +84,10 @@ import org.aspectj.apache.bcel.generic.annotation.AnnotationGen; * existing java class (file). * * @see JavaClass - * @version $Id: ClassGen.java,v 1.5 2005/03/10 12:15:04 aclement Exp $ + * @version $Id: ClassGen.java,v 1.6 2006/03/09 17:25:48 aclement Exp $ * @author M. Dahm + * + * Upgraded, Andy Clement 9th Mar 06 - calculates SUID */ public class ClassGen extends AccessFlags implements Cloneable { /* Corresponds to the fields found in a JavaClass object. @@ -538,4 +547,153 @@ public class ClassGen extends AccessFlags implements Cloneable { public final boolean isEnum() { return (access_flags & Constants.ACC_ENUM) != 0; } + + /** + * Calculate the SerialVersionUID for a class. + */ + public long getSUID() { + try { + Field[] fields = getFields(); + Method[] methods = getMethods(); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + + // 1. classname + dos.writeUTF(getClassName()); + + // 2. classmodifiers: ACC_PUBLIC, ACC_FINAL, ACC_INTERFACE, and ACC_ABSTRACT + int classmods = 0; + classmods|=(isPublic()?Constants.ACC_PUBLIC:0); + classmods|=(isFinal()?Constants.ACC_FINAL:0); + classmods|=(isInterface()?Constants.ACC_INTERFACE:0); + if (isInterface() && isAbstract()) { // remove abstract if we have it but have no methods + if (methods.length>0) classmods|=Constants.ACC_ABSTRACT; + } + dos.writeInt(classmods); + + // 3. ordered list of interfaces + List list = new ArrayList(); + String[] names = getInterfaceNames(); + if (names!=null) { + Arrays.sort(names); + for (int i = 0; i < names.length; i++) dos.writeUTF(names[i]); + } + + // 4. ordered list of fields (ignoring private static and private transient fields): + // (relevant modifiers are ACC_PUBLIC, ACC_PRIVATE, + // ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_VOLATILE, + // ACC_TRANSIENT) + list.clear(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + if (!(field.isPrivate() && field.isStatic()) && + !(field.isPrivate() && field.isTransient())) list.add(field); + } + Collections.sort(list,new FieldComparator()); + int relevantFlags = Constants.ACC_PUBLIC | Constants.ACC_PRIVATE | Constants.ACC_PROTECTED | + Constants.ACC_STATIC | Constants.ACC_FINAL | Constants.ACC_VOLATILE | Constants.ACC_TRANSIENT; + for (Iterator iter = list.iterator(); iter.hasNext();) { + Field f = (Field) iter.next(); + dos.writeUTF(f.getName()); + dos.writeInt(relevantFlags&f.getModifiers()); + dos.writeUTF(f.getType().getSignature()); + } + + // some up front method processing: discover clinit, init and ordinary methods of interest: + list.clear(); // now used for methods + List ctors = new ArrayList(); + boolean hasClinit = false; + for (int i = 0; i < methods.length; i++) { + Method m = methods[i]; + boolean couldBeInitializer = m.getName().charAt(0)=='<'; + if (couldBeInitializer && m.getName().equals("")) { + hasClinit=true; + } else if (couldBeInitializer && m.getName().equals("")) { + if (!m.isPrivate()) ctors.add(m); + } else { + if (!m.isPrivate()) list.add(m); + } + } + Collections.sort(ctors, new ConstructorComparator()); + Collections.sort(list, new MethodComparator()); + + + // 5. If a class initializer exists, write out the following: + // 1. The name of the method, . + // 2. The modifier of the method, java.lang.reflect.Modifier.STATIC, written as a 32-bit integer. + // 3. The descriptor of the method, ()V. + if (hasClinit) { + dos.writeUTF(""); + dos.writeInt(Modifier.STATIC); + dos.writeUTF("()V"); + } + + // for methods and constructors: + // ACC_PUBLIC, ACC_PRIVATE, ACC_PROTECTED, ACC_STATIC, ACC_FINAL, ACC_SYNCHRONIZED, + // ACC_NATIVE, ACC_ABSTRACT and ACC_STRICT + relevantFlags = + Constants.ACC_PUBLIC | Constants.ACC_PRIVATE | Constants.ACC_PROTECTED | + Constants.ACC_STATIC | Constants.ACC_FINAL | Constants.ACC_SYNCHRONIZED | + Constants.ACC_NATIVE | Constants.ACC_ABSTRACT | Constants.ACC_STRICT; + + // 6. sorted non-private constructors + for (Iterator iter = ctors.iterator(); iter.hasNext();) { + Method m = (Method) iter.next(); + dos.writeUTF(m.getName()); // + dos.writeInt(relevantFlags & m.getModifiers()); + dos.writeUTF(m.getSignature().replace('/','.')); + } + + // 7. sorted non-private methods + for (Iterator iter = list.iterator(); iter.hasNext();) { + Method m = (Method) iter.next(); + dos.writeUTF(m.getName()); + dos.writeInt(relevantFlags & m.getModifiers()); + dos.writeUTF(m.getSignature().replace('/','.')); + } + dos.flush(); + dos.close(); + byte[] bs = baos.toByteArray(); + MessageDigest md = MessageDigest.getInstance("SHA"); + byte[] result = md.digest(bs); + + long suid = 0L; + int pos = result.length>8?7:result.length-1; // use the bytes we have + while (pos>=0) { + suid = suid<<8 | ((long)result[pos--]&0xff); + } + + // if it was definetly 8 everytime... + // long suid = ((long)(sha[0]&0xff) | (long)(sha[1]&0xff) << 8 | + // (long)(sha[2]&0xff) << 16 | (long)(sha[3]&0xff) << 24 | + // (long)(sha[4]&0xff) << 32 | (long)(sha[5]&0xff) << 40 | + // (long)(sha[6]&0xff) << 48 | (long)(sha[7]&0xff) << 56); + return suid; + } catch (Exception e) { + System.err.println("Unable to calculate suid for "+getClassName()); + throw new RuntimeException(e); + } + } + + private static class FieldComparator implements Comparator { + public int compare(Object arg0, Object arg1) { + return ((Field)arg0).getName().compareTo(((Field)arg1).getName()); + } + } + private static class ConstructorComparator implements Comparator { + public int compare(Object arg0, Object arg1) { + // can ignore the name... + return ((Method)arg0).getSignature().compareTo(((Method)arg1).getSignature()); + } + } + private static class MethodComparator implements Comparator { + public int compare(Object arg0, Object arg1) { + Method m1 = (Method)arg0; + Method m2 = (Method)arg1; + int result = m1.getName().compareTo(m2.getName()); + if (result!=0) return result; + return m1.getSignature().compareTo(m2.getSignature()); + } + } } diff --git a/docs/devGuideDB/ajc.xml b/docs/devGuideDB/ajc.xml index 109bac741..30ca3b901 100644 --- a/docs/devGuideDB/ajc.xml +++ b/docs/devGuideDB/ajc.xml @@ -431,6 +431,16 @@ + + -XaddSerialVersionUID + Causes the compiler to calculate and add + the SerialVersionUID field to any type implementing + Serializable that is affected by an aspect. The field + is calculated based on the class before weaving has + taken place. + + + -Xreweavable[:compress] (Experimental - deprecated as now default) diff --git a/lib/bcel/bcel-src.zip b/lib/bcel/bcel-src.zip index 68ddd550243db65b8c2f0859c3d4f377f0b50f1c..770d77312575e75813c53ddd9738fa8d1620e058 100644 GIT binary patch delta 15814 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 delta 14133 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 Gg7<%*It1we diff --git a/lib/bcel/bcel.jar b/lib/bcel/bcel.jar index e96515cb91f9d55c748fb8c16d0451810a007923..d6237720c7cd26762b2b3ad9ba81321d094e4553 100644 GIT binary patch delta 26455 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%0DIa;41?0g)8tZ;LCfy~1yAyCkBN`<(V;lh;X` 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 Nr(ePC_81at*MD=ba?=0+ delta 22588 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 WH;^>iRr*!>!BiT}-4AXcX#WS%5M7)A diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java index fccb824ee..f2749997d 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/BuildArgParser.java @@ -533,6 +533,8 @@ public class BuildArgParser extends Main { buildConfig.setGenerateJavadocsInModelMode(true); } else if (arg.equals("-Xdev:NoAtAspectJProcessing")) { buildConfig.setNoAtAspectJAnnotationProcessing(true); + } else if (arg.equals("-XaddSerialVersionUID")) { + buildConfig.setAddSerialVerUID(true); } else if (arg.equals("-Xdev:Pinpoint")) { buildConfig.setXdevPinpointMode(true); } else if (arg.equals("-Xjoinpoints:arrayconstruction")) { diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties index 16111cb0f..16e6e4eaf 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/ajc/messages.properties @@ -132,6 +132,8 @@ xoption.usage = {0} non-standard options:\n\ \t by AspectJ.\n\ \t-XserializableAspects allows aspects to implement serializable\n\ \t-XterminateAfterCompilation compile classes then terminate before weaving\n\ +\t-XaddSerialVersionUID calculates and adds the serialVersionUID to any\n\ +\t serializable type woven by an aspect\n\ \t-Xajruntimelevel: allows code to be generated that targets\n\ \t a 1.2 or a 1.5 level AspectJ runtime (default 1.5)\n\ \t-XhasMember allow hasmethod() and hasfield type patterns in\n\ diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java index c616cfeb0..472180fd6 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildConfig.java @@ -388,6 +388,7 @@ public class AjBuildConfig { } setOutxmlName(global.getOutxmlName()); setXconfigurationInfo(global.getXconfigurationInfo()); + setAddSerialVerUID(global.isAddSerialVerUID()); } void join(Collection local, Collection global) { @@ -523,6 +524,13 @@ public class AjBuildConfig { public boolean isXdevPinpoint() { return options.xdevPinpoint; } + + public void setAddSerialVerUID(boolean b) { + options.addSerialVerUID = b; + } + public boolean isAddSerialVerUID() { + return options.addSerialVerUID; + } public boolean isXNotReweavable() { diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java index d2a7e88c8..f46dbd4d4 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjBuildManager.java @@ -633,6 +633,7 @@ public class AjBuildManager implements IOutputClassFileNameProvider,IBinarySourc cp.addAll(buildConfig.getClasspath()); BcelWorld bcelWorld = new BcelWorld(cp, handler, null); bcelWorld.setBehaveInJava5Way(buildConfig.getBehaveInJava5Way()); + bcelWorld.setAddSerialVerUID(buildConfig.isAddSerialVerUID()); bcelWorld.performExtraConfiguration(buildConfig.getXconfigurationInfo()); bcelWorld.setTargetAspectjRuntimeLevel(buildConfig.getTargetAspectjRuntimeLevel()); bcelWorld.setOptionalJoinpoints(buildConfig.getXJoinpoints()); diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjCompilerOptions.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjCompilerOptions.java index 54a271c27..6407b6da7 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjCompilerOptions.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/core/builder/AjCompilerOptions.java @@ -80,6 +80,7 @@ public class AjCompilerOptions extends CompilerOptions { public String targetAspectjRuntimeLevel = Constants.RUNTIME_LEVEL_DEFAULT; public String xConfigurationInfo; + public boolean addSerialVerUID = false; // these next four not exposed by IDEs public boolean generateModel = false; diff --git a/tests/features151/serialveruid/AnAspect.java b/tests/features151/serialveruid/AnAspect.java new file mode 100644 index 000000000..eff8137e8 --- /dev/null +++ b/tests/features151/serialveruid/AnAspect.java @@ -0,0 +1,5 @@ +aspect AnAspect { + before(): staticinitialization(BigHorribleClass) { + + } +} \ No newline at end of file diff --git a/tests/features151/serialveruid/Basic.java b/tests/features151/serialveruid/Basic.java new file mode 100644 index 000000000..f2093d59b --- /dev/null +++ b/tests/features151/serialveruid/Basic.java @@ -0,0 +1,19 @@ +import java.io.Serializable; +import java.lang.reflect.Field; + +public class Basic implements Serializable { + public static void main(String[] args) { + try { + Basic b = (Basic)Basic.class.newInstance(); + Field f = Basic.class.getDeclaredField("serialVersionUID"); + long l = f.getLong(b); + System.err.println("SerialVersionUID is "+l); + } catch (Exception e) { + System.err.println("Problem: "+e.toString()); + } + } +} + +aspect X { + before(): staticinitialization(Basic) {} +} \ No newline at end of file diff --git a/tests/features151/serialveruid/BigHorribleClass.java b/tests/features151/serialveruid/BigHorribleClass.java new file mode 100644 index 000000000..7668307b2 --- /dev/null +++ b/tests/features151/serialveruid/BigHorribleClass.java @@ -0,0 +1,28 @@ +import java.io.Serializable; +import java.lang.reflect.Field; + +public class BigHorribleClass implements Serializable,Comparable { + public static void main(String[] args) { + try { + BigHorribleClass b = (BigHorribleClass)BigHorribleClass.class.newInstance(); + Field f = BigHorribleClass.class.getDeclaredField("serialVersionUID"); + long l = f.getLong(b); + System.err.println("SerialVersionUID is "+l); + } catch (Exception e) { + System.err.println("Problem: "+e.toString()); + } + } + + public int anInt; + + public static boolean aBoolean = false; + + public long foo = 376; + + public void m() {} + public int compareTo(Object o) { return 0;} + public String m2(boolean b,long l, String s) { return "";} + + public static transient short fo2 = 3; + +} \ No newline at end of file diff --git a/tests/src/org/aspectj/systemtest/ajc151/AllTestsAspectJ151.java b/tests/src/org/aspectj/systemtest/ajc151/AllTestsAspectJ151.java index a3929851a..8f64f29d8 100644 --- a/tests/src/org/aspectj/systemtest/ajc151/AllTestsAspectJ151.java +++ b/tests/src/org/aspectj/systemtest/ajc151/AllTestsAspectJ151.java @@ -21,6 +21,7 @@ public class AllTestsAspectJ151 { suite.addTest(Ajc151Tests.suite()); suite.addTest(NewarrayJoinpointTests.suite()); suite.addTest(AtAroundTests.suite()); + suite.addTest(SerialVersionUIDTests.suite()); //$JUnit-END$ return suite; } diff --git a/tests/src/org/aspectj/systemtest/ajc151/SerialVersionUIDTests.java b/tests/src/org/aspectj/systemtest/ajc151/SerialVersionUIDTests.java new file mode 100644 index 000000000..fc0c0d276 --- /dev/null +++ b/tests/src/org/aspectj/systemtest/ajc151/SerialVersionUIDTests.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2006 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Andy Clement - initial implementation + *******************************************************************************/ +package org.aspectj.systemtest.ajc151; + +import java.io.File; + +import junit.framework.Test; + +import org.aspectj.testing.XMLBasedAjcTestCase; + + +public class SerialVersionUIDTests extends XMLBasedAjcTestCase { + + public void testTheBasics() { runTest("basic"); } + public void testTheBasicsWithLint() { runTest("basic - lint"); } + public void testHorrible() { runTest("horrible"); } + + // + public static Test suite() { + return XMLBasedAjcTestCase.loadSuite(SerialVersionUIDTests.class); + } + + protected File getSpecFile() { + return new File("../tests/src/org/aspectj/systemtest/ajc151/serialversionuid.xml"); + } + +} diff --git a/tests/src/org/aspectj/systemtest/ajc151/serialversionuid.xml b/tests/src/org/aspectj/systemtest/ajc151/serialversionuid.xml new file mode 100644 index 000000000..c18adaed7 --- /dev/null +++ b/tests/src/org/aspectj/systemtest/ajc151/serialversionuid.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/Lint.java b/weaver/src/org/aspectj/weaver/Lint.java index 2ca50ad85..f2542367c 100644 --- a/weaver/src/org/aspectj/weaver/Lint.java +++ b/weaver/src/org/aspectj/weaver/Lint.java @@ -114,6 +114,9 @@ public class Lint { public final Kind swallowedExceptionInCatchBlock = new Kind("swallowedExceptionInCatchBlock","exception swallowed in catch block"); + public final Kind calculatingSerialVersionUID = + new Kind("calculatingSerialVersionUID","calculated SerialVersionUID for type {0} to be {1}"); + // there are a lot of messages in the cant find type family - I'm defining an umbrella lint warning that // allows a user to control their severity (for e.g. ltw or binary weaving) public final Kind cantFindType = diff --git a/weaver/src/org/aspectj/weaver/World.java b/weaver/src/org/aspectj/weaver/World.java index 5f9cf6d01..870ba7f43 100644 --- a/weaver/src/org/aspectj/weaver/World.java +++ b/weaver/src/org/aspectj/weaver/World.java @@ -90,6 +90,9 @@ public abstract class World implements Dump.INode { /** Flags for the new joinpoints that are 'optional' */ private boolean optionalJoinpoint_ArrayConstruction = false; // Command line flag: "arrayconstruction" + private boolean addSerialVerUID = false; + + private Properties extraConfiguration = null; // Records whether ASM is around ... so we might use it for delegates @@ -1061,6 +1064,9 @@ public abstract class World implements Dump.INode { workInProgress1.remove(baseClass); } + public void setAddSerialVerUID(boolean b) { addSerialVerUID=b;} + public boolean isAddSerialVerUID() { return addSerialVerUID;} + public void flush() { // System.err.println("BEFORE FLUSHING"); // System.err.println(typeMap.toString()); diff --git a/weaver/src/org/aspectj/weaver/XlintDefault.properties b/weaver/src/org/aspectj/weaver/XlintDefault.properties index bef407969..70063a74e 100644 --- a/weaver/src/org/aspectj/weaver/XlintDefault.properties +++ b/weaver/src/org/aspectj/weaver/XlintDefault.properties @@ -40,3 +40,4 @@ cantFindTypeAffectingJPMatch = warning unorderedAdviceAtShadow=ignore swallowedExceptionInCatchBlock=warning +calculatingSerialVersionUID=ignore \ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java b/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java index 3d485ab02..6533ea131 100644 --- a/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java +++ b/weaver/src/org/aspectj/weaver/bcel/LazyClassGen.java @@ -39,6 +39,7 @@ import org.aspectj.apache.bcel.classfile.Method; import org.aspectj.apache.bcel.classfile.Signature; import org.aspectj.apache.bcel.classfile.Unknown; import org.aspectj.apache.bcel.classfile.annotation.Annotation; +import org.aspectj.apache.bcel.generic.BasicType; import org.aspectj.apache.bcel.generic.ClassGen; import org.aspectj.apache.bcel.generic.ConstantPoolGen; import org.aspectj.apache.bcel.generic.FieldGen; @@ -69,6 +70,7 @@ import org.aspectj.weaver.WeaverStateInfo; import org.aspectj.weaver.World; import org.aspectj.weaver.AjAttribute.WeaverVersionInfo; + /** * Lazy lazy lazy. * We don't unpack the underlying class unless necessary. Things @@ -99,6 +101,8 @@ public final class LazyClassGen { private boolean isSerializable = false; private boolean hasSerialVersionUIDField = false; + private boolean serialVersionUIDRequiresInitialization = false; + private long calculatedSerialVersionUID; private boolean hasClinit = false; // --- @@ -279,12 +283,28 @@ public final class LazyClassGen { hasClinit = true; } } + + // Do we need to calculate an SUID and add it? + if (!hasSerialVersionUIDField && world.isAddSerialVerUID()) { + calculatedSerialVersionUID = myGen.getSUID(); + Field fg = new FieldGen( + Constants.ACC_PRIVATE|Constants.ACC_FINAL|Constants.ACC_STATIC, + BasicType.LONG,"serialVersionUID",getConstantPoolGen()).getField(); + addField(fg); + hasSerialVersionUIDField=true; + serialVersionUIDRequiresInitialization=true; + // warn about what we've done? + if (world.getLint().calculatingSerialVersionUID.isEnabled()) + world.getLint().calculatingSerialVersionUID.signal( + new String[]{getClassName(),Long.toString(calculatedSerialVersionUID)+"L"},null,null); + } } Method[] methods = myGen.getMethods(); for (int i = 0; i < methods.length; i++) { addMethodGen(new LazyMethodGen(methods[i], this)); } + } public static boolean hasSerialVersionUIDField (ResolvedType type) { @@ -935,10 +955,21 @@ public final class LazyClassGen { // } private void addAjcInitializers() { - if (tjpFields.size() == 0) return; + if (tjpFields.size() == 0 && !serialVersionUIDRequiresInitialization) return; + InstructionList il = null; + + if (tjpFields.size()>0) { + il = initializeAllTjps(); + } + + if (serialVersionUIDRequiresInitialization) { + if (il==null) { + il= new InstructionList(); + } + il.append(new PUSH(getConstantPoolGen(),calculatedSerialVersionUID)); + il.append(getFactory().createFieldAccess(getClassName(), "serialVersionUID", BasicType.LONG, Constants.PUTSTATIC)); + } - InstructionList il = initializeAllTjps(); - getStaticInitializer().getBody().insert(il); } -- 2.39.5