On Thu, Dec 26, 2013 at 6:57 PM, Colin Fleming
<colin.mailingl...@gmail.com>wrote:

> The problem is that your approach requires creating the proxy class with
> the method bodies actually compiled into the body of the proxy class
> method, they can't be in fns in a proxy map as they are now. This is ok in
> the case where a method body is just the proxy-super call, but most aren't
> - they call proxy-super as part of a much larger method. Changing that is a
> fundamental change to the way proxies work, and IMO would be better served
> by creating a new form (extend-class or something similar) which would
> behave in a more similar way to reify but would allow extension.
>

If you read my previous post carefully, it says that *the proxy-super call*
(if any) would need to go into the method body. Think something like this.

Java:

public class Whatever extends SomeClass {
    public int someMethod (int x, String y) {
        x = fred(x,42);
        int foo = super.someMethod(x, y); // someMethod protected in
SomeClass
        return mumble(foo, thingy.frotz(x));
    }
}

proxy (now) (byte code equivalent of):

public class Whatever extends SomeClass {
    public Map<String,IFn> proxyMap = <some long&messy initializer>;

    public int someMethod (int x, String y) {
        return proxyMap.get("someMethod").invoke(this, x,y);
    }

    // And a similar thingy for each additional public-or-protected method
in SomeClass
}

public class WhateverSomeMethodVersion1 implements IFn {
    public Object invoke (Whatever th1s, Object x, Object y) {
        x = th1s.fred((int)(Integer)x,42);
        int foo = Class.forName("SomeClass")
            .getMethod("someMethod", Integer.TYPE, String.class)
            .invoke(th1s, (int)(Integer)x, (String)y); // Eww, reflection,
slow slow slow
        return th1s.mumble(foo, thingy.frotz((int)(Integer)x));
    }
}

proxy (proposed) (byte code equivalent of):

public class Whatever extends SomeClass {
    public Map<String,IFn> proxyMap = <some long&messy initializer>;

    public int proxySuperSomeMethod (Object x, Object y) {
        super.someMethod((int)(Integer)x, (String)y); // Needs .! or
whatever to emit
    }

    // And a similar thingy for each additional protected method in
SomeClass

    public int someMethod (int x, String y) {
        return proxyMap.get("someMethod").invoke(this, x,y);
    }

    // And a similar thingy for each additional public-or-protected method
in SomeClass
}

public class WhateverSomeMethodVersion1 implements IFn {
    public Object invoke (Whatever th1s, Object x, Object y) {
        x = th1s.fred((int)(Integer)x,42);
        int foo = th1s.proxySuperSomeMethod(x, y);
        return th1s.mumble(foo, thingy.frotz((int)(Integer)x));
    }
}


> I've considered writing such a thing myself due to the limitations and
> idiosyncrasies of proxy/genclass but I've not investigated whether it's
> even possible without hacking the compiler - I suspect it's not.
>

Not without implementing ".!" (or whatever name you prefer), or adding
another bytecode emitter specialized to produce proxySuperSomeMethods. I
guess every proxied class will need a proxy-hook subclass with

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to