Skip to content
This repository was archived by the owner on Apr 27, 2022. It is now read-only.

Commit c61bd76

Browse files
committed
Fix python interface.
1 parent c3a10ab commit c61bd76

File tree

6 files changed

+47
-16
lines changed

6 files changed

+47
-16
lines changed

src/Make_cyg_ming.mak

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,9 @@ OBJ = \
788788
$(OUTDIR)/usercmd.o \
789789
$(OUTDIR)/userfunc.o \
790790
$(OUTDIR)/version.o \
791+
$(OUTDIR)/vim9compile.o \
792+
$(OUTDIR)/vim9execute.o \
793+
$(OUTDIR)/vim9script.o \
791794
$(OUTDIR)/viminfo.o \
792795
$(OUTDIR)/winclip.o \
793796
$(OUTDIR)/window.o
@@ -1153,6 +1156,12 @@ $(OUTDIR)/netbeans.o: netbeans.c $(INCL) version.h
11531156

11541157
$(OUTDIR)/version.o: version.c $(INCL) version.h
11551158

1159+
$(OUTDIR)/vim9compile.o: vim9compile.c $(INCL) version.h
1160+
1161+
$(OUTDIR)/vim9execute.o: vim9execute.c $(INCL) version.h
1162+
1163+
$(OUTDIR)/vim9script.o: vim9script.c $(INCL) version.h
1164+
11561165
$(OUTDIR)/viminfo.o: viminfo.c $(INCL) version.h
11571166

11581167
$(OUTDIR)/gui_dwrite.o: gui_dwrite.cpp gui_dwrite.h

src/Make_mvc.mak

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,9 @@ OBJ = \
791791
$(OUTDIR)\undo.obj \
792792
$(OUTDIR)\usercmd.obj \
793793
$(OUTDIR)\userfunc.obj \
794+
$(OUTDIR)\vim9compile.obj \
795+
$(OUTDIR)\vim9execute.obj \
796+
$(OUTDIR)\vim9script.obj \
794797
$(OUTDIR)\viminfo.obj \
795798
$(OUTDIR)\winclip.obj \
796799
$(OUTDIR)\window.obj \
@@ -1726,6 +1729,12 @@ $(OUTDIR)/userfunc.obj: $(OUTDIR) userfunc.c $(INCL)
17261729

17271730
$(OUTDIR)/version.obj: $(OUTDIR) version.c $(INCL) version.h
17281731

1732+
$(OUTDIR)/vim9compile.obj: $(OUTDIR) vim9compile.c $(INCL)
1733+
1734+
$(OUTDIR)/vim9execute.obj: $(OUTDIR) vim9execute.c $(INCL)
1735+
1736+
$(OUTDIR)/vim9script.obj: $(OUTDIR) vim9script.c $(INCL)
1737+
17291738
$(OUTDIR)/viminfo.obj: $(OUTDIR) viminfo.c $(INCL) version.h
17301739

17311740
$(OUTDIR)/window.obj: $(OUTDIR) window.c $(INCL)
@@ -1907,6 +1916,9 @@ proto.h: \
19071916
proto/undo.pro \
19081917
proto/usercmd.pro \
19091918
proto/userfunc.pro \
1919+
proto/vim9compile.pro \
1920+
proto/vim9execute.pro \
1921+
proto/vim9script.pro \
19101922
proto/viminfo.pro \
19111923
proto/window.pro \
19121924
$(SOUND_PRO) \

src/evalfunc.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5316,12 +5316,12 @@ f_range(typval_T *argvars, typval_T *rettv)
53165316
list_T *list = rettv->vval.v_list;
53175317

53185318
// Create a non-materialized list. This is much more efficient and
5319-
// works with ":for". If used otherwis range_list_materialize() must
5319+
// works with ":for". If used otherwise range_list_materialize() must
53205320
// be called.
53215321
list->lv_first = &range_list_item;
5322-
list->lv_last = (void *)start;
5323-
list->lv_idx_item = (void *)end;
5324-
list->lv_idx = stride;
5322+
list->lv_start = start;
5323+
list->lv_end = end;
5324+
list->lv_stride = stride;
53255325
list->lv_len = (end - start + 1) / stride;
53265326
}
53275327
}
@@ -5334,9 +5334,9 @@ range_list_materialize(list_T *list)
53345334
{
53355335
if (list->lv_first == &range_list_item)
53365336
{
5337-
varnumber_T start = (varnumber_T)list->lv_last;
5338-
varnumber_T end = (varnumber_T)list->lv_idx_item;
5339-
int stride = list->lv_idx;
5337+
varnumber_T start = list->lv_start;
5338+
varnumber_T end = list->lv_end;
5339+
int stride = list->lv_stride;
53405340
varnumber_T i;
53415341

53425342
list->lv_first = NULL;

src/if_py_both.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookup_dict)
785785
return NULL;
786786
}
787787

788+
range_list_materialize(list);
788789
for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
789790
{
790791
if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookup_dict)))
@@ -2255,6 +2256,7 @@ ListNew(PyTypeObject *subtype, list_T *list)
22552256
return NULL;
22562257
self->list = list;
22572258
++list->lv_refcount;
2259+
range_list_materialize(list);
22582260

22592261
pyll_add((PyObject *)(self), &self->ref, &lastlist);
22602262

@@ -2822,6 +2824,7 @@ ListIter(ListObject *self)
28222824
return NULL;
28232825
}
28242826

2827+
range_list_materialize(l);
28252828
list_add_watch(l, &lii->lw);
28262829
lii->lw.lw_item = l->lv_first;
28272830
lii->list = l;
@@ -3018,6 +3021,7 @@ FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs)
30183021
return NULL;
30193022
}
30203023
argslist = argstv.vval.v_list;
3024+
range_list_materialize(argslist);
30213025

30223026
argc = argslist->lv_len;
30233027
if (argc != 0)

src/list.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -476,8 +476,6 @@ list_find_nr(
476476

477477
if (l != NULL && l->lv_first == &range_list_item)
478478
{
479-
varnumber_T start = (varnumber_T)l->lv_last;
480-
int stride = l->lv_idx;
481479
long n = idx;
482480

483481
// not materialized range() list: compute the value.
@@ -493,7 +491,7 @@ list_find_nr(
493491
return -1L;
494492
}
495493

496-
return start + n * stride;
494+
return l->lv_start + n * l->lv_stride;
497495
}
498496

499497
li = list_find(l, idx);

src/structs.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,24 +1398,32 @@ struct listwatch_S
13981398
* Order of members is optimized to reduce padding.
13991399
* When created by range() it will at first have special value:
14001400
* lv_first == &range_list_item;
1401-
* lv_last == start
1402-
* lv_idx_item == end
1403-
* lv_idx == stride
1401+
* and use lv_start, lv_end, lv_stride.
14041402
*/
14051403
struct listvar_S
14061404
{
14071405
listitem_T *lv_first; // first item, NULL if none
1408-
listitem_T *lv_last; // last item, NULL if none
14091406
listwatch_T *lv_watch; // first watcher, NULL if none
1410-
listitem_T *lv_idx_item; // when not NULL item at index "lv_idx"
1407+
union {
1408+
struct { // used for non-materialized range list:
1409+
// "lv_first" is &range_list_item
1410+
varnumber_T lv_start;
1411+
varnumber_T lv_end;
1412+
int lv_stride;
1413+
};
1414+
struct { // used for materialized list
1415+
listitem_T *lv_last; // last item, NULL if none
1416+
listitem_T *lv_idx_item; // when not NULL item at index "lv_idx"
1417+
int lv_idx; // cached index of an item
1418+
};
1419+
};
14111420
list_T *lv_copylist; // copied list used by deepcopy()
14121421
list_T *lv_used_next; // next list in used lists list
14131422
list_T *lv_used_prev; // previous list in used lists list
14141423
int lv_refcount; // reference count
14151424
int lv_len; // number of items
14161425
int lv_with_items; // number of items following this struct that
14171426
// should not be freed
1418-
int lv_idx; // cached index of an item
14191427
int lv_copyID; // ID used by deepcopy()
14201428
char lv_lock; // zero, VAR_LOCKED, VAR_FIXED
14211429
};

0 commit comments

Comments
 (0)