Mercurial > vim
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; |