Mein Prob liegt darin, das du nen neuen Tuple erzeugen kannst
Das war nicht ganz richtig was ich da geschrieben hab, das ist mir aber erst jetzt aufgefallen, und es ist erstaunlich dass es anscheinend trotzdem lief, oder?
Auf jeden Fall sollte das sein:
Code: Alles auswählen
if( !( PyARB_Point = PyTuple_New(3) ) ) goto end_error;
Bemerke die 3, die sagt eben dass das Tupel drei Elemente hat, damit ist die Tupelgröße voralloziert, und ändert sich auch nie mehr. Mich wunderts dass es mit 0 (was ich aus Deinem PyList_New(0) übernommen hatte) geht; weil Du im Endeffekt hinter das Array schreibst was die Zeiger auf die Tupelelemente enthält (PyTuple_SET_ITEM ist nämlich nichts anderes als ein einfacher Index-Operator versteckt in einem Makro), und deswegen eigentlich das Programm nicht gehen sollte. Aber, okay, das hat wahrscheinlich was mit der Heap-Überallokation von Python zu tun, so dass Speicher nach dem Array auch schon allokiert ist, aber nicht benutzt war, usw.
Bei Listen stellt man mit dem entsprechenden Parameter ein vieviele Elemente vorallokiert sind (also wie groß das Array am Anfang _mindestens_ sein soll, meißtens ist es größer, weil Python bestimmte Schritte verwendet). Wenn Du dann einen PyList_Append machst und vorher schon mit Größe drei vorallokiert hast wird PyList_Append eigentlich nie fehlschlagen können, weil die Liste ja schon besteht. Dafür müßtest Du Dir aber den Quellcode noch mal genauer angucken. Zumindest würde mir da auch nix einfallen was fehlschlagen könnte.
Auf jeden Fall stiehlt PyList_Append die Referenz eben nicht (soweit ich weiß, wohlgemerkt, aber ich hab gerade im Handbuch nachgeguckt und da steht nix gegenteiliges), während PyTuple_SET_ITEM das sehr wohl macht. Dementsprechend mußt Du wenn Du ersteres benutzt das Element was Du in die Liste einträgst Py_DECREF()-fen, damit nur noch die Referenz aus der Liste draufzeigt, und keine "dangling reference" besteht die vergessen wird wenn Deine Methode sich beendet.
--- Heiko.