[C++-sig] Re: Boost.Python v2: Keywords

Nikolay Mladenov nickm at sitius.com
Wed Feb 5 22:43:13 CET 2003


An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20030205/4d6885b4/attachment.htm>
-------------- next part --------------
35a36
>       , m_nkeyword_values(0)
42d42
<             
48a49,50
>             object tpl (handle<>(PyTuple_New(names_and_defaults[i].default_value?2:1)));
> 
50,51c52,53
<                 m_arg_names.ptr()
<                 , i + keyword_offset
---
>                 tpl.ptr()
>                 , 0
55a58,72
>             if(names_and_defaults[i].default_value){
>                 PyTuple_SET_ITEM(
>                     tpl.ptr()
>                     , 1
>                     , incref(names_and_defaults[i].default_value.get())
>                     );
>                 ++m_nkeyword_values;
>             }
> 
> 
>             PyTuple_SET_ITEM(
>                 m_arg_names.ptr()
>                 , i + keyword_offset
>                 , incref(tpl.ptr())
>                 );
82c99
<         if (total_args >= f->m_min_arity && total_args <= f->m_max_arity)
---
>         if (total_args+f->m_nkeyword_values >= f->m_min_arity && total_args <= f->m_max_arity)
85c102
<             if (nkeywords > 0)
---
>             if (nkeywords > 0 || total_args < f->m_min_arity)
94,95c111,112
<                     // build a new arg tuple
<                     args2 = handle<>(PyTuple_New(total_args));
---
>                     // build a new arg tuple, will adjust its size later
>                     args2 = handle<>(PyTuple_New(f->m_max_arity));
102c119,120
<                     for (std::size_t j = nargs; j < total_args; ++j)
---
>                     std::size_t j = nargs, k = nargs, size=PyTuple_GET_SIZE(f->m_arg_names.ptr());
>                     for (; j < f->m_max_arity && j<size ; ++j)
103a122,123
>                         PyObject* kwd=PyTuple_GET_ITEM(f->m_arg_names.ptr(), j);
> 
105c125
<                             keywords, PyTuple_GET_ITEM(f->m_arg_names.ptr(), j));
---
>                             keywords, PyTuple_GET_ITEM(kwd, 0));
108a129,132
>                             if(PyTuple_GET_SIZE(kwd)>1)
>                                 value = PyTuple_GET_ITEM(kwd, 1);
>                             if (!value)
>                             {
112a137
>                         }else ++k;
114a140,156
> 
>                     if(args2.get()){
>                         //check if we proccessed all the arguments
>                         if(k < total_args)
>                             args2 = handle<>();
> 
>                         //adjust the parameter tuple size
>                         if(j<f->m_max_arity){
>                             handle<> args3( PyTuple_New(j) );
>                             for(size_t l=0; l!=j; ++l)
>                             {
>                                 PyTuple_SET_ITEM(args3.get(), l, PyTuple_GET_ITEM(args3.get(), l));
>                                 PyTuple_SET_ITEM(args2.get(), l, 0);
>                             }
>                             args2 = args3;
>                         }
>                     }


More information about the Cplusplus-sig mailing list