From 875cccb16ae5db0e24abd97fab1234f01b2cc5b4 Mon Sep 17 00:00:00 2001 From: avasseur Date: Thu, 11 Aug 2005 09:22:07 +0000 Subject: [PATCH] add test for proxy weaving and jit class weaving, update ltw doc --- .../src/org/aspectj/bridge/MessageWriter.java | 2 +- bridge/src/org/aspectj/bridge/Version.java | 20 ++- docs/adk15ProgGuideDB/ltw.xml | 22 +++ lib/asm/asm-2.0.jar | Bin 0 -> 33604 bytes tests/java5/ataspectj/ajc-ant.xml | 23 +++- .../ataspectj/ataspectj/UnweavableTest.java | 128 ++++++++++++++++++ .../ajc150/ataspectj/AtAjLTWTests.java | 8 +- .../systemtest/ajc150/ataspectj/ltw.xml | 3 + .../aspectj/weaver/bcel/AtAjAttributes.java | 1 + .../aspectj/weaver/tools/WeavingAdaptor.java | 2 +- 10 files changed, 193 insertions(+), 16 deletions(-) create mode 100644 lib/asm/asm-2.0.jar create mode 100644 tests/java5/ataspectj/ataspectj/UnweavableTest.java diff --git a/bridge/src/org/aspectj/bridge/MessageWriter.java b/bridge/src/org/aspectj/bridge/MessageWriter.java index bc9530314..b01940325 100644 --- a/bridge/src/org/aspectj/bridge/MessageWriter.java +++ b/bridge/src/org/aspectj/bridge/MessageWriter.java @@ -42,7 +42,7 @@ public class MessageWriter implements IMessageHandler { if (null != result) { writer.println(result); writer.flush(); - if (abortOnFailure + if (abortOnFailure && (message.isFailed() || message.isAbort())) { throw new AbortException(message); } diff --git a/bridge/src/org/aspectj/bridge/Version.java b/bridge/src/org/aspectj/bridge/Version.java index b24fb7983..b729ef55b 100644 --- a/bridge/src/org/aspectj/bridge/Version.java +++ b/bridge/src/org/aspectj/bridge/Version.java @@ -37,7 +37,7 @@ public class Version { * Time text set by build script using SIMPLE_DATE_FORMAT. * (if DEVELOPMENT version, invalid) */ - public static final String time_text = ""; + public static final String time_text = "mardi juil. 5, 2005 at 09:56:18 GMT"; /** * time in seconds-since-... format, used by programmatic clients. @@ -46,20 +46,18 @@ public class Version { public static final long time; /** format used by build script to set time_text */ - public static final String SIMPLE_DATE_FORMAT = "MM/dd/yy 'at' hh:mm:ss z"; + public static final String SIMPLE_DATE_FORMAT = "EEEE MMM d, yyyy 'at' HH:mm:ss z"; // if not DEVELOPMENT version, read time text using format used to set time static { long foundTime = NOTIME; - if (!DEVELOPMENT.equals(text)) { - try { - SimpleDateFormat format = new SimpleDateFormat(SIMPLE_DATE_FORMAT); - ParsePosition pos = new ParsePosition(0); - Date date = format.parse(time_text, pos); - foundTime = date.getTime(); - } catch (Throwable t) { - } - } + try { + SimpleDateFormat format = new SimpleDateFormat(SIMPLE_DATE_FORMAT); + ParsePosition pos = new ParsePosition(0); + Date date = format.parse(time_text, pos); + foundTime = date.getTime(); + } catch (Throwable t) { + } time = foundTime; } diff --git a/docs/adk15ProgGuideDB/ltw.xml b/docs/adk15ProgGuideDB/ltw.xml index 6366d1371..ae36255ac 100644 --- a/docs/adk15ProgGuideDB/ltw.xml +++ b/docs/adk15ProgGuideDB/ltw.xml @@ -364,6 +364,28 @@ + + + Special cases + + Those classes are not exposed to the LTW infrastructure, no matter + the configuration of the aop.xml file(s): + + All org.aspectj.* classes (and subpackages) - as those are needed by the infrastructure itself + All java.* and javax.* classes (and subpackages) + All sun.reflect.* classes - as those are JDK specific classes used when reflective calls occurs + + + + Despite those special cases, it is perfectly possible to have call pointcut on those classes members providing the callee + class is not itself a speciall case, as well as execution pointcut on subclasses of those providing subclasses are not themselves + a special case. + + + It is also worth understanding that dynamic proxy representations are exposed to the LTW infrastructure and are not considered + a special case. + + Runtime Requirements for Load-time Weaving diff --git a/lib/asm/asm-2.0.jar b/lib/asm/asm-2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..458fd703fbb6c434859812d905486c9de3f08be2 GIT binary patch literal 33604 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 - + @@ -101,4 +102,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/java5/ataspectj/ataspectj/UnweavableTest.java b/tests/java5/ataspectj/ataspectj/UnweavableTest.java new file mode 100644 index 000000000..4ce689723 --- /dev/null +++ b/tests/java5/ataspectj/ataspectj/UnweavableTest.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2005 Contributors. + * All rights reserved. + * This program and the accompanying materials are made available + * under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution and is available at + * http://eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alexandre Vasseur initial implementation + *******************************************************************************/ +package ataspectj; + +import junit.framework.TestCase; + +import java.lang.reflect.Proxy; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.security.ProtectionDomain; + +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.AnnotationVisitor; + +/** + * @author Alexandre Vasseur + */ +public class UnweavableTest extends TestCase { + + public void testUnweavableProxy() { + TestAspect.I = 0; + ISome some = getProxy(); + some.giveOne(); + assertEquals(1, TestAspect.I); + } + + static interface ISome { + public int giveOne(); + } + + ISome getProxy() { + return (ISome) Proxy.newProxyInstance( + ISome.class.getClassLoader(), + new Class[]{ISome.class}, + new InvocationHandler() { + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return new Integer(1); + } + } + ); + } + + @Aspect + public static class TestAspect { + + static int I = 0; + + @Before("execution(* ataspectj.UnweavableTest.ISome+.giveOne())") + public void before() { + I++; + } + } + + public void testJit() { + TestAspect.I = 0; + TestAspect2.I = 0; + ISome some = getJit(); + assertNotNull(some.getClass().getAnnotation(ASome.class)); + assertEquals(2, some.giveOne()); + assertEquals(1, TestAspect.I); + assertEquals(1, TestAspect2.I); + } + + @Retention(RetentionPolicy.RUNTIME) + static @interface ASome {} + + ISome getJit() { + ClassWriter cw = new ClassWriter(true, true); + cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "ataspectj/ISomeGen", null, "java/lang/Object", new String[]{"ataspectj/UnweavableTest$ISome"}); + AnnotationVisitor av = cw.visitAnnotation("Lataspectj/UnweavableTest$ASome;", true); + av.visitEnd(); + + MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "", "()V", null, new String[0]); + mv.visitVarInsn(Opcodes.ALOAD, 0); + mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "", "()V"); + mv.visitInsn(Opcodes.RETURN); + mv.visitMaxs(0, 0); + mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "giveOne", "()I", null, new String[0]); + mv.visitInsn(Opcodes.ICONST_2); + mv.visitInsn(Opcodes.IRETURN); + mv.visitMaxs(0, 0); + cw.visitEnd(); + + try { + ClassLoader loader = this.getClass().getClassLoader(); + Method def = ClassLoader.class.getDeclaredMethod("defineClass", new Class[]{String.class, byte[].class, int.class, int.class}); + def.setAccessible(true); + Class gen = (Class) def.invoke(loader, "ataspectj.ISomeGen", cw.toByteArray(), 0, cw.toByteArray().length); + return (ISome) gen.newInstance(); + } catch (Throwable t) { + fail(t.toString()); + return null; + } + } + + @Aspect + public static class TestAspect2 { + static int I = 0; + @Before("execution(* @ataspectj.UnweavableTest$ASome ataspectj..*.giveOne())") + public void before() { + I++; + } + } + + public static void main(String args[]) throws Throwable { + TestHelper.runAndThrowOnFailure(suite()); + } + + public static junit.framework.Test suite() { + return new junit.framework.TestSuite(UnweavableTest.class); + } + +} diff --git a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java index e414c63b4..a9f9afda4 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java +++ b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/AtAjLTWTests.java @@ -36,8 +36,7 @@ public class AtAjLTWTests extends XMLBasedAjcTestCase { public void testAjcLTWPerClauseTest_XnoWeave() { runTest("AjcLTW PerClauseTest -XnoWeave"); } -//FIXME AV - fails with ?? ataspectj\PerClauseTestAspects.java::0 the parameter jp is not bound in [all branches of] pointcut -// + public void testAjcLTWPerClauseTest_Xreweavable() { runTest("AjcLTW PerClauseTest -Xreweavable"); } @@ -78,4 +77,9 @@ public class AtAjLTWTests extends XMLBasedAjcTestCase { runTest("LTW Log"); } + public void testLTWUnweavable() { + // actually test that we do LTW proxy and jit classes + runTest("LTW Unweavable"); + } + } diff --git a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml index af74f5b81..fda448c22 100644 --- a/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml +++ b/tests/src/org/aspectj/systemtest/ajc150/ataspectj/ltw.xml @@ -98,5 +98,8 @@ + + + \ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/bcel/AtAjAttributes.java b/weaver/src/org/aspectj/weaver/bcel/AtAjAttributes.java index 004a45f0b..249e9d3fc 100644 --- a/weaver/src/org/aspectj/weaver/bcel/AtAjAttributes.java +++ b/weaver/src/org/aspectj/weaver/bcel/AtAjAttributes.java @@ -49,6 +49,7 @@ import org.aspectj.weaver.patterns.PerTypeWithin; import org.aspectj.weaver.patterns.Pointcut; import org.aspectj.weaver.patterns.SimpleScope; import org.aspectj.weaver.patterns.TypePattern; +import org.aspectj.lang.JoinPoint; /** * Annotation defined aspect reader. diff --git a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java index 4430667c2..9f098de0a 100644 --- a/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java +++ b/weaver/src/org/aspectj/weaver/tools/WeavingAdaptor.java @@ -197,7 +197,7 @@ public class WeavingAdaptor { ||*/ name.startsWith("org.aspectj.") || name.startsWith("java.") || name.startsWith("javax.")) - || name.startsWith("$Proxy")//JDK proxies + //|| name.startsWith("$Proxy")//JDK proxies//FIXME AV is that 1.3 proxy ? fe. ataspect.$Proxy0 is a java5 proxy... || name.startsWith("sun.reflect."));//JDK reflect } -- 2.39.5