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

Reply via email to