[Compiler-sig] Re: [selfish-devel] Ugly hacks: modifying instance_getattr
echuck@mindspring.com
echuck@mindspring.com
Mon, 27 Nov 2000 11:03:31 -0500
You have lost me. Why do you want to hack on "obj.foo()"?
Tripp Lilley <tripp@perspex.com> wrote:
> This isn't exactly a compilation issue, but it's somewhat related, and I
didn't see an obvious "ugly hacks" or "interpreter devloper" list
mentioned anywhere out front.
I have modified my interpreter so that, in the LOAD_ATTR case statement,
it peeks ahead in the code and looks to see if the next opcode is
"CALL_FUNCTION". If so, I'd like to use slightly different getattr steps
to resolve the attribute reference.
For resolution of the call o.XXX( ), I'd like my getattr to use these
steps:
- if an attribute called __meth_XXX__ exists, return it.
- if an attribute called __getmethod__ exists, call it to allow
it to resolve the attribute. If it returns "None", continue
looking for the attribute.
- continue with "normal" attribute resolution semantics
Basically, the idea is to be able to trap attribute accesses that are
going to be immediately used as method invocations. Why?
http://sourceforge.net/projects/selfish/
But that's another story. At this point, I can, more or less, determine
the right "context" in which I want to apply these semantics. With the
hack to eval_code2, I trap bytecode method invocations, and with a
modification to PyObject_CallMethod, I trap C API method invocations.
What I now need to do is pass that contextual "hint" down into the
various flavours of getattr.
What's the most "friendly" way of approaching that? Since I can't use
default arguments, adding another parameter to getattrofunc would mean
I'd have to modify all of the modules to pass the parameter. Yuck. I
can't use a global variable because of thread safety issues (and because
that's ugly and I refuse :) ). Is there some thread state to which I
have access from within a getattrofunc?
One disgusting possibility that occured to me was to modify the object
being searched, temporarily replacing its tp_getattro member with a
wrapper that would prepend the method semantics. I've temporarily shot
that one down because it means I have to investigate what type of object
it is, so I can apply the correct prepend (ie: a module might or might
not support the "method" mechanisms I'm proposing). However, I'm willing
to revisit that...
The other alternative is that I'm doing Something I Shouldn't Be
Doing(tm).
--
Tripp Lilley * tripp@perspex.com *
http://stargate.eheart.sg505.net/~tlilley/
-----------------------------------------------------------------------------
"This whole textual substitution thing is pissing me off.
I feel like I'm programming in Tcl."
- Eric Frias, former roommate, hacking partner extraordinaire
_______________________________________________
selfish-devel mailing list
selfish-devel@lists.sourceforge.net
http://lists.sourceforge.net/mailman/listinfo/selfish-devel