2010/11/13 Vitja Makarov <[email protected]>: > 2010/11/13 Stefan Behnel <[email protected]>: >> Stefan Behnel, 08.11.2010 15:51: >>> Hi, >>> >>> I looked through your code and pushed a slightly cleaned up version of your >>> latest patch. >>> >>> Vitja Makarov, 07.11.2010 12:39: >>>> 2010/11/7 Vitja Makarov: >>>>> 2010/11/7 Stefan Behnel: >>>>>> Vitja Makarov, 06.11.2010 21:37: >>>>>>> I'm now trying to implement this: >>>>>>> >>>>>>> Is it correct: >>>>>>> >>>>>>> If parser detect use of kwargs in class definition it creates >>>>>>> Py3ClassDefNode >>>>>>> >>>>>>> I add this classes: >>>>>>> Nodes.Py3ClassDefNode - ClassDefNode replacement for python3 style >>>>>>> classes >>>>>>> ExprNodes.Py3ClassNode - ClassNode replacement for python3 style classes >>>>>>> >>>>>>> ExprNdoes.Py3MetaclassNode - contains metaclass >>>>>>> Holds value returned by __Pyx_Py3MetaclassGet(bases, mkw) >>>>>>> >>>>>>> ExprNodes.Py3NamespaceNode - contains namespace object >>>>>>> Value returned by __Pyx_Py3MetaclassPrepare(metaclass, base, name, >>>>>>> mkw), that calls __prepare__ if any. >>>>>> >>>>>> Why do you think these new classes are necessary? >>>>> >>>>> I think this objects are required to represent metaclass and namespace. >>>>> If we want real support for __prepare__ (simple version is attached in >>>>> trac) >>>>> >>>>> 1. extract metaclass from bases and keywordargs >>>>> 2. create namespace by calling metaclass __preapre__ >>>>> 3. fill namespace with class body >>>>> 4. create class >>>>> >>>>> I don't want to reuse ClassDefNode as it differs too much. To many >>>>> if/else. >>>>> So Py3ClassNode should hold metaclass and namespace objects, I add >>>>> Py3MetaclassNode and Py3NamespaceNode. >>>>> >>>>> Can I use PyTempNode for metaclass and namespace? >>>>> >>>>> Is there another way? >>>> >>>> Another way: >>>> >>>> if py3_metaclass: >>>> mkw = keyword_args.copy() >>>> mkw.update(starstar_args) >>>> metaclass = py3_metaclass_get(bases, mkw) >>>> dict = py3_namespace_prepare(metaclass, bases, name, mkw) >>>> else: >>>> dict = dict() >>>> >>>> # construct class body here... >>>> dict['foo'] = 'bar' >>>> >>>> if py3_metaclass: >>>> classobj = py3_metaclass_new(metaclass, name, bases, dict, mkw, >>>> modname) >>>> else: >>>> classobj = create_class(bases, dict, name, modname) >>>> >>>> 2 new object types here: metaclass, namespace. >>> >>> Yes, I think that's the way to go. The two new nodes should go into >>> ExprNodes, maybe named "PyClassMetaclassNode" and "PyClassNamespaceNode". >>> Both must have their "is_temp" set to True. >>> >>> The metaclass node will look up the metaclass in the type keywords and use >>> it as its node result value. >>> >>> The namespace node will be used by ExprNodes.ClassNode just like before but >>> should do the "prepare() or dict()" dance above. It obviously needs a >>> reference to the metaclass node to do that, in order to access its result >>> value. >>> >>> Using two new node classes here is the easiest way to do it as you only >>> need to pass around references to them. Otherwise, you'd have to manually >>> allocate temporary variables and pass around their names. That's not any >>> harder to do, but it's a lot more ugly. >>> >>> Note the disposal code call at the end of >>> PyClassDefNode.generate_execution_code(). You need to do that for both >>> nodes here, that will automatically take care to properly clean up the >>> Python references to their results (based on the value of their "is_temp" >>> attribute). >> >> Any news here? Anything I can help with? >> >> Stefan >> _______________________________________________ >> Cython-dev mailing list >> [email protected] >> http://codespeak.net/mailman/listinfo/cython-dev >> > > No time this week, I'll try on weekend. > Think there will be three new nodes: > > * PyClassKeywordArgsNode - will hold keyword args (keywords and > starstar), need this because dict should be used in __prepare__ and > class creation. > * PyClassMetaclassNode > * PyClassNamespaceNode > > Also new utility code will be added. > Btw that doesn't seems to be a big change ;) >
I've added patch in trac. It introduces new nodes: Py3ClassNode KeywordArgsNode PyClassBasesNode PyClassMetaclassNode PyClassNamespaceNode _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
