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