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 ;) _______________________________________________ Cython-dev mailing list [email protected] http://codespeak.net/mailman/listinfo/cython-dev
