On 21.11.2017 21:43, Leonard Brünings wrote:
Hi Jochen,

your first suggestion might do the trick and if closures disappear then there will be much more that doesn't work.

We currently do something like this:


   public void replaceImplicitThis(Expression invocation) {
     if (invocation instanceof MethodCallExpression) {
MethodCallExpression methodCallExpression = (MethodCallExpression)invocation;
       if (methodCallExpression.isImplicitThis()) {

         Expression target = referenceToCurrentClosure();
         methodCallExpression.setObjectExpression(target);
       }
     }
   }

   private MethodCallExpression referenceToCurrentClosure() {
     return new MethodCallExpression(
       new VariableExpression("this"),
       new ConstantExpression("each"),
       new ArgumentListExpression(
         new PropertyExpression(
new ClassExpression(ClassHelper.makeWithoutCaching(Closure.class)),
           new ConstantExpression("IDENTITY")
         )
       )
     );
   }

This looks a similar to your second suggestion.

similar in that both get the current reference, yes.

Could you give me a hint on how to write a BytecodeExpersion for "ALOAD 0"? Could I just use this in place of the other MethodCallExpression from referenceToCurrentClosure?

You use it in place of referenceToCurrentClosure,yes. Something like

                        new BytecodeExpression(ClassHelper.CLOSURE) {
                            public void visit(MethodVisitor mv) {
                                mv.visitVarInsn(ALOAD, 0);
                            }
                        });

frankly this is using a feature I do not like so much and that is that Groovy handles a call on a closure instance the same way as a call from within that closure instance (well, not 100% the same, there are differences).But in this case you profit from it. Otherwise you would need a way to express the implicit this as parameter... Maybe this is actually something we should do..

bye Jochen

Reply via email to