comparison src/if_py_both.h @ 9119:39cc63e8df7c v7.4.1843

commit https://github.com/vim/vim/commit/2177f9fe18a927ef65ccebb0856722a28dc00252 Author: Bram Moolenaar <Bram@vim.org> Date: Wed May 25 20:39:09 2016 +0200 patch 7.4.1843 Problem: Tests involving Python are flaky. Solution: Set the pt_auto field. Add tests. (Nikolai Pavlov)
author Christian Brabandt <cb@256bit.org>
date Wed, 25 May 2016 20:45:06 +0200
parents df5f9284fcba
children 56c93626f6f3
comparison
equal deleted inserted replaced
9118:c35c9121c72b 9119:39cc63e8df7c
2833 char_u *name; 2833 char_u *name;
2834 int argc; 2834 int argc;
2835 typval_T *argv; 2835 typval_T *argv;
2836 dict_T *self; 2836 dict_T *self;
2837 pylinkedlist_T ref; 2837 pylinkedlist_T ref;
2838 int auto_rebind;
2838 } FunctionObject; 2839 } FunctionObject;
2839 2840
2840 static PyTypeObject FunctionType; 2841 static PyTypeObject FunctionType;
2841 2842
2842 #define NEW_FUNCTION(name, argc, argv, self) \ 2843 #define NEW_FUNCTION(name, argc, argv, self, pt_auto) \
2843 FunctionNew(&FunctionType, name, argc, argv, self) 2844 FunctionNew(&FunctionType, (name), (argc), (argv), (self), (pt_auto))
2844 2845
2845 static PyObject * 2846 static PyObject *
2846 FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv, 2847 FunctionNew(PyTypeObject *subtype, char_u *name, int argc, typval_T *argv,
2847 dict_T *selfdict) 2848 dict_T *selfdict, int auto_rebind)
2848 { 2849 {
2849 FunctionObject *self; 2850 FunctionObject *self;
2850 2851
2851 self = (FunctionObject *) subtype->tp_alloc(subtype, 0); 2852 self = (FunctionObject *) subtype->tp_alloc(subtype, 0);
2852 2853
2875 } 2876 }
2876 2877
2877 self->argc = argc; 2878 self->argc = argc;
2878 self->argv = argv; 2879 self->argv = argv;
2879 self->self = selfdict; 2880 self->self = selfdict;
2881 self->auto_rebind = selfdict == NULL ? TRUE : auto_rebind;
2880 2882
2881 if (self->argv || self->self) 2883 if (self->argv || self->self)
2882 pyll_add((PyObject *)(self), &self->ref, &lastfunc); 2884 pyll_add((PyObject *)(self), &self->ref, &lastfunc);
2883 2885
2884 return (PyObject *)(self); 2886 return (PyObject *)(self);
2887 static PyObject * 2889 static PyObject *
2888 FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) 2890 FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
2889 { 2891 {
2890 PyObject *self; 2892 PyObject *self;
2891 PyObject *selfdictObject; 2893 PyObject *selfdictObject;
2894 PyObject *autoRebindObject;
2892 PyObject *argsObject = NULL; 2895 PyObject *argsObject = NULL;
2893 char_u *name; 2896 char_u *name;
2894 typval_T selfdicttv; 2897 typval_T selfdicttv;
2895 typval_T argstv; 2898 typval_T argstv;
2896 list_T *argslist = NULL; 2899 list_T *argslist = NULL;
2897 dict_T *selfdict = NULL; 2900 dict_T *selfdict = NULL;
2898 int argc = 0; 2901 int argc = 0;
2902 int auto_rebind = TRUE;
2899 typval_T *argv = NULL; 2903 typval_T *argv = NULL;
2900 typval_T *curtv; 2904 typval_T *curtv;
2901 listitem_T *li; 2905 listitem_T *li;
2902 2906
2903 if (kwargs != NULL) 2907 if (kwargs != NULL)
2934 for (li = argslist->lv_first; li != NULL; li = li->li_next) 2938 for (li = argslist->lv_first; li != NULL; li = li->li_next)
2935 copy_tv(&li->li_tv, curtv++); 2939 copy_tv(&li->li_tv, curtv++);
2936 } 2940 }
2937 list_unref(argslist); 2941 list_unref(argslist);
2938 } 2942 }
2943 if (selfdict != NULL)
2944 {
2945 auto_rebind = FALSE;
2946 autoRebindObject = PyDict_GetItemString(kwargs, "auto_rebind");
2947 if (autoRebindObject != NULL)
2948 {
2949 auto_rebind = PyObject_IsTrue(autoRebindObject);
2950 if (auto_rebind == -1)
2951 {
2952 dict_unref(selfdict);
2953 list_unref(argslist);
2954 return NULL;
2955 }
2956 }
2957 }
2939 } 2958 }
2940 2959
2941 if (!PyArg_ParseTuple(args, "et", "ascii", &name)) 2960 if (!PyArg_ParseTuple(args, "et", "ascii", &name))
2942 { 2961 {
2943 dict_unref(selfdict); 2962 dict_unref(selfdict);
2945 clear_tv(&argv[argc]); 2964 clear_tv(&argv[argc]);
2946 PyMem_Free(argv); 2965 PyMem_Free(argv);
2947 return NULL; 2966 return NULL;
2948 } 2967 }
2949 2968
2950 self = FunctionNew(subtype, name, argc, argv, selfdict); 2969 self = FunctionNew(subtype, name, argc, argv, selfdict, auto_rebind);
2951 2970
2952 PyMem_Free(name); 2971 PyMem_Free(name);
2953 2972
2954 return self; 2973 return self;
2955 } 2974 }
2969 2988
2970 DESTRUCTOR_FINISH(self); 2989 DESTRUCTOR_FINISH(self);
2971 } 2990 }
2972 2991
2973 static char *FunctionAttrs[] = { 2992 static char *FunctionAttrs[] = {
2974 "softspace", "args", "self", 2993 "softspace", "args", "self", "auto_rebind",
2975 NULL 2994 NULL
2976 }; 2995 };
2977 2996
2978 static PyObject * 2997 static PyObject *
2979 FunctionDir(PyObject *self) 2998 FunctionDir(PyObject *self)
2999 } 3018 }
3000 else if (strcmp(name, "self") == 0) 3019 else if (strcmp(name, "self") == 0)
3001 return self->self == NULL 3020 return self->self == NULL
3002 ? AlwaysNone(NULL) 3021 ? AlwaysNone(NULL)
3003 : NEW_DICTIONARY(self->self); 3022 : NEW_DICTIONARY(self->self);
3023 else if (strcmp(name, "auto_rebind") == 0)
3024 return self->auto_rebind
3025 ? AlwaysTrue(NULL)
3026 : AlwaysFalse(NULL);
3004 else if (strcmp(name, "__members__") == 0) 3027 else if (strcmp(name, "__members__") == 0)
3005 return ObjectDir(NULL, FunctionAttrs); 3028 return ObjectDir(NULL, FunctionAttrs);
3006 return NULL; 3029 return NULL;
3007 } 3030 }
3008 3031
3033 else 3056 else
3034 { 3057 {
3035 pt->pt_argc = 0; 3058 pt->pt_argc = 0;
3036 pt->pt_argv = NULL; 3059 pt->pt_argv = NULL;
3037 } 3060 }
3061 pt->pt_auto = self->auto_rebind || !exported;
3038 pt->pt_dict = self->self; 3062 pt->pt_dict = self->self;
3039 if (exported && self->self) 3063 if (exported && self->self)
3040 ++pt->pt_dict->dv_refcount; 3064 ++pt->pt_dict->dv_refcount;
3041 if (exported) 3065 if (exported)
3042 pt->pt_name = vim_strsave(pt->pt_name); 3066 pt->pt_name = vim_strsave(pt->pt_name);
3074 } 3098 }
3075 } 3099 }
3076 3100
3077 if (self->argv || self->self) 3101 if (self->argv || self->self)
3078 { 3102 {
3103 vim_memset(&pt, 0, sizeof(partial_T));
3079 set_partial(self, &pt, FALSE); 3104 set_partial(self, &pt, FALSE);
3080 pt_ptr = &pt; 3105 pt_ptr = &pt;
3081 } 3106 }
3082 3107
3083 Py_BEGIN_ALLOW_THREADS 3108 Py_BEGIN_ALLOW_THREADS
3146 tv.vval.v_dict = self->self; 3171 tv.vval.v_dict = self->self;
3147 ++emsg_silent; 3172 ++emsg_silent;
3148 ga_concat(&repr_ga, tv2string(&tv, &tofree, numbuf, get_copyID())); 3173 ga_concat(&repr_ga, tv2string(&tv, &tofree, numbuf, get_copyID()));
3149 --emsg_silent; 3174 --emsg_silent;
3150 vim_free(tofree); 3175 vim_free(tofree);
3176 if (self->auto_rebind)
3177 ga_concat(&repr_ga, (char_u *)", auto_rebind=True");
3151 } 3178 }
3152 ga_append(&repr_ga, '>'); 3179 ga_append(&repr_ga, '>');
3153 ret = PyString_FromString((char *)repr_ga.ga_data); 3180 ret = PyString_FromString((char *)repr_ga.ga_data);
3154 ga_clear(&repr_ga); 3181 ga_clear(&repr_ga);
3155 return ret; 3182 return ret;
6267 case VAR_DICT: 6294 case VAR_DICT:
6268 return NEW_DICTIONARY(tv->vval.v_dict); 6295 return NEW_DICTIONARY(tv->vval.v_dict);
6269 case VAR_FUNC: 6296 case VAR_FUNC:
6270 return NEW_FUNCTION(tv->vval.v_string == NULL 6297 return NEW_FUNCTION(tv->vval.v_string == NULL
6271 ? (char_u *)"" : tv->vval.v_string, 6298 ? (char_u *)"" : tv->vval.v_string,
6272 0, NULL, NULL); 6299 0, NULL, NULL, TRUE);
6273 case VAR_PARTIAL: 6300 case VAR_PARTIAL:
6274 if (tv->vval.v_partial->pt_argc) 6301 if (tv->vval.v_partial->pt_argc)
6275 { 6302 {
6276 argv = PyMem_New(typval_T, (size_t)tv->vval.v_partial->pt_argc); 6303 argv = PyMem_New(typval_T, (size_t)tv->vval.v_partial->pt_argc);
6277 for (i = 0; i < tv->vval.v_partial->pt_argc; i++) 6304 for (i = 0; i < tv->vval.v_partial->pt_argc; i++)
6282 if (tv->vval.v_partial->pt_dict != NULL) 6309 if (tv->vval.v_partial->pt_dict != NULL)
6283 tv->vval.v_partial->pt_dict->dv_refcount++; 6310 tv->vval.v_partial->pt_dict->dv_refcount++;
6284 return NEW_FUNCTION(tv->vval.v_partial == NULL 6311 return NEW_FUNCTION(tv->vval.v_partial == NULL
6285 ? (char_u *)"" : tv->vval.v_partial->pt_name, 6312 ? (char_u *)"" : tv->vval.v_partial->pt_name,
6286 tv->vval.v_partial->pt_argc, argv, 6313 tv->vval.v_partial->pt_argc, argv,
6287 tv->vval.v_partial->pt_dict); 6314 tv->vval.v_partial->pt_dict,
6315 tv->vval.v_partial->pt_auto);
6288 case VAR_UNKNOWN: 6316 case VAR_UNKNOWN:
6289 case VAR_CHANNEL: 6317 case VAR_CHANNEL:
6290 case VAR_JOB: 6318 case VAR_JOB:
6291 Py_INCREF(Py_None); 6319 Py_INCREF(Py_None);
6292 return Py_None; 6320 return Py_None;