X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpython%2Ftaglist.c;h=0a30c08e3ad9371bd5072fcef4f17b305f6a35e7;hb=879d0eec420fe0fd5ddcd56c8fe62b82a6744edd;hp=a5d28d1a6dfd7275e3c0c94d041100f1746fa4a9;hpb=84245258e84d865fb1b5a0a6a781c099946398df;p=swftools.git diff --git a/lib/python/taglist.c b/lib/python/taglist.c index a5d28d1..0a30c08 100644 --- a/lib/python/taglist.c +++ b/lib/python/taglist.c @@ -15,6 +15,16 @@ typedef struct { PyObject* taglist; } TagListObject; //---------------------------------------------------------------------------- +static void taglist_showcontents(PyObject* self) +{ + TagListObject*taglist = (TagListObject*)self; + int t, l = PyList_Size(taglist->taglist); + for(t=0;ttaglist, t); + mylog(" %08x(%d) taglist_showcontents item=%08x(%d)\n", (int)self, self->ob_refcnt, item, item->ob_refcnt); + } +} +//---------------------------------------------------------------------------- PyObject * taglist_new() { TagListObject* taglist = PyObject_New(TagListObject, &TagListClass); @@ -29,22 +39,19 @@ PyObject * taglist_new2(TAG*tag) mylog("+%08x(%d) taglist_new2 tag=%08x", (int)taglist, taglist->ob_refcnt, tag); PyObject* tagmap = tagmap_new(); - swf_FoldAllTags(tag); - - int nr=0; + int nr=0, len=0; TAG*t = tag; TAG*last = t; - while(t) {nr++;last=t;t=t->next;} + while(t) {len++;last=t;t=t->next;} if(last && last->id==ST_END) { - swf_DeleteTag(last); - nr--; + swf_DeleteTag(0, last); last = 0; + len--; + if(len==0) tag = 0; } - taglist->taglist = PyList_New(nr); + taglist->taglist = PyList_New(len); - mylog("+%08x(%d) taglist_new2: %d items", (int)taglist, taglist->ob_refcnt, nr); - nr = 0; t = tag; while(t) { @@ -61,6 +68,7 @@ PyObject * taglist_new2(TAG*tag) } nr++; t=t->next; + Py_DECREF(newtag); } Py_DECREF(tagmap); return (PyObject*)taglist; @@ -69,6 +77,13 @@ PyObject * taglist_new2(TAG*tag) TAG* taglist_getTAGs(PyObject*self) { PyObject* tagmap = tagmap_new(); + TAG* tag = taglist_getTAGs2(self, tagmap, 1); + Py_DECREF(tagmap); + return tag; +} +//---------------------------------------------------------------------------- +TAG* taglist_getTAGs2(PyObject*self, PyObject*tagmap, int addDependencies) +{ if(!PY_CHECK_TYPE(self,&TagListClass)) { PyErr_SetString(PyExc_Exception, setError("Not a taglist (%08x).", self)); return 0; @@ -84,17 +99,30 @@ TAG* taglist_getTAGs(PyObject*self) mylog(" %08x(%d) taglist_getTAGs", (int)self, self->ob_refcnt); for(t=0;ttaglist, t); - tag = tag_getTAG(item, tag, tagmap); - if(!tag) { - //pass through errors - Py_DECREF(tagmap); - return 0; + if(addDependencies) { + PyObject* deps = tag_getDependencies(item); + int l = PyList_Size(deps); + int t; + for(t=0;tob_refcnt, tag); } - Py_DECREF(tagmap); return firstTag; } //---------------------------------------------------------------------------- @@ -140,15 +168,6 @@ static PyObject * taglist_optimizeOrder(PyObject* self, PyObject* args) return PY_NONE; } //---------------------------------------------------------------------------- -static void taglist_dealloc(PyObject* self) -{ - TagListObject*taglist = (TagListObject*)self; - mylog("-%08x(%d) taglist_dealloc\n", (int)self, self->ob_refcnt); - Py_DECREF(taglist->taglist); - taglist->taglist = 0; - PyObject_Del(self); -} -//---------------------------------------------------------------------------- static PyMethodDef taglist_functions[] = {{"foldAll", taglist_foldAll, METH_VARARGS, "fold all sprites (movieclips) in the list"}, {"unfoldAll", taglist_unfoldAll, METH_VARARGS, "unfold (expand) all sprites (movieclips) in the list"}, @@ -191,25 +210,15 @@ static PyObject * taglist_concat(PyObject * self, PyObject* list) PyObject*tag = 0; PY_ASSERT_TYPE(self, &TagListClass); TagListObject*taglist = (TagListObject*)self; - mylog(" %08x(%d) taglist_concat %08x", (int)self, self->ob_refcnt, list); + mylog(" %08x(%d) taglist_concat %08x(%d)", (int)self, self->ob_refcnt, list, list->ob_refcnt); if (PyArg_Parse(list, "O!", &TagClass, &tag)) { - mylog(" %08x(%d) taglist_concat: Tag %08x", (int)self, self->ob_refcnt, tag); - list = tag_getDependencies(tag); - int l = PyList_Size(list); - int t; - mylog(" %08x(%d) taglist_concat: Tag: %d dependencies", (int)self, self->ob_refcnt, l); - for(t=0;tob_refcnt, tag); + mylog(" %08x(%d) taglist_concat: Adding Tag %08x(%d)", (int)self, self->ob_refcnt, tag, tag->ob_refcnt); PyList_Append(taglist->taglist, tag); + } else { + mylog(" %08x(%d) taglist_concat: Already contains Tag %08x(%d)", (int)self, self->ob_refcnt, tag, tag->ob_refcnt); } - mylog(" %08x(%d) taglist_concat: done", (int)self, self->ob_refcnt); Py_INCREF(self); return self; /* copy tag, so we don't have to do INCREF(tag) (and don't @@ -239,7 +248,6 @@ static PyObject * taglist_concat(PyObject * self, PyObject* list) if (PyList_Check(list)) { int l = PyList_Size(list); int t; - mylog(" %08x(%d) taglist_concat: List", (int)self, self->ob_refcnt); for(t=0;tob_refcnt); TagListObject*taglist2 = (TagListObject*)list; return taglist_concat(self, taglist2->taglist); @@ -279,11 +286,23 @@ static PyObject * taglist_item(PyObject * self, int index) { TagListObject*taglist = (TagListObject*)self; PyObject*tag; - mylog(" %08x(%d) taglist_item(%d)", (int)self, self->ob_refcnt, index); tag = PyList_GetItem(taglist->taglist, index); + if(!tag) + return 0; + mylog(" %08x(%d) taglist_item(%d): %08x", (int)self, self->ob_refcnt, index, tag); Py_INCREF(tag); return tag; } +//---------------------------------------------------------------------------- +static void taglist_dealloc(PyObject* self) +{ + TagListObject*taglist = (TagListObject*)self; + mylog("-%08x(%d) taglist_dealloc list=%08x(%d)\n", (int)self, self->ob_refcnt, taglist->taglist, taglist->taglist->ob_refcnt); + Py_DECREF(taglist->taglist); + taglist->taglist = 0; + PyObject_Del(self); +} +//---------------------------------------------------------------------------- static PySequenceMethods taglist_as_sequence = { sq_length: taglist_length, // len(obj) @@ -295,7 +314,7 @@ static PySequenceMethods taglist_as_sequence = sq_ass_slice: 0, // x[i:j] = v intintobjargproc sq_contains: taglist_contains, //??? }; -static PyTypeObject TagListClass = +PyTypeObject TagListClass = { PyObject_HEAD_INIT(NULL) 0,