[ https://issues.apache.org/jira/browse/GROOVY-3015?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Eric Milles reassigned GROOVY-3015: ----------------------------------- Assignee: Eric Milles > Seems like ClosureMetaClass#invokeMethod does not respect the interceptable > nature of the owner/delegate > -------------------------------------------------------------------------------------------------------- > > Key: GROOVY-3015 > URL: https://issues.apache.org/jira/browse/GROOVY-3015 > Project: Groovy > Issue Type: Bug > Components: groovy-runtime > Affects Versions: 1.5.6 > Environment: Windows XP > Reporter: Erick Erickson > Assignee: Eric Milles > Priority: Major > Fix For: 4.x > > > Sample program and output. The closure and the method both call 'outer' > which calls 'inner', but the closure does NOT trace the call to 'outer' > See comments, including Jochen "blackdrag" Theodorou's at > http://www.nabble.com/implementing-GroovyInterceptable-behaves-differently-in-closures-and-methods-td19072057.html > ************program output > Entering shouldTraceOuterAndInnerClosure > Entering inner > Leaving inner > Leaving shouldTraceOuterAndInnerClosure > Entering shouldTraceOuterAndInnerMethod > Entering outer > Entering inner > Leaving inner > Leaving outer > Leaving shouldTraceOuterAndInnerMethod > *************end program output > ****************code starts > import org.codehaus.groovy.runtime.StringBufferWriter > import org.codehaus.groovy.runtime.InvokerHelper > class Traceable implements GroovyInterceptable { > private static int indent = 1 > Writer writer = new PrintWriter(System.out) > Object invokeMethod(String name, Object args) { > def result > def metaClass = InvokerHelper.getMetaClass(this) > writer.write("\n" + ' ' * indent + "Entering $name") > ++indent > result = metaClass.invokeMethod(this, name, args) > --indent > writer.write("\n" + ' ' * indent + "Leaving $name") > return result > } > } > class Whatever extends Traceable { > int outer() { > return inner() > } > int inner() { > return 1 > } > def shouldTraceOuterAndInnerClosure = { > return outer() > } > > int shouldTraceOuterAndInnerMethod() { > return outer() > } > } > def log = new StringBuffer() > def traceMe = new Whatever(writer : new StringBufferWriter(log)) > traceMe.shouldTraceOuterAndInnerClosure() > traceMe.shouldTraceOuterAndInnerMethod() > println log.toString() > *****************program ends************** -- This message was sent by Atlassian Jira (v8.3.4#803005)