Hello Samuel,

In XMLObject there is two levels of reference,
 - one on MList (managed by reference counter)
 - one on internal XMLObject (internally manager like handle, an integer that link to a C++ object)

xmlDelete destroy internal XMLObject
clear destroy (unreference and destroy if ref <= 1 ) MList object.

So in your case, after a xmlDelete, the internal XMLObject was destroyed but not the MList. And after a clear doc, the MList was destroyed but the internal XMLObject not.

Current XMLObject is based on simple MList with the id of the doc ( store as double ). If we want to correctly destroy the internal XMLObject with the clear command. We must change the implementation to use types::UserType instead of types::Double and uses destructor of UserType to free XMLObject.

> Deleting an object should clear all its pointers. For instance, with the XML example
> hereabove, deleting the document should clear doc and doc2.
I am not agree with that, I cannot delete an user variable indirectly. ( xmlDelete(doc) that will delete doc )
Only clear command can do that. For me it will be a bad practice.

Antoine
Le 28/07/2018 à 16:20, Samuel Gougeon a écrit :
Hello,

I am doing some tests about the save() function, in order to document its behavior when saving pointers to some objects.

There is the case of XML objects:
Contrarily to graphic handles, that are pointers whose reloading restores the pointed graphics, saving XML pointers is possible, but then their reloading does NOT restore the XML document. Then, when digging in Bugzilla in order to search for features about this and the clear() function applied to XML pointers, i've found back the following comment from Calixte <http://bugzilla.scilab.org/show_bug.cgi?id=13398#c2>, referring to an expected change of Scilab 6 with respect to Scilab 5:

/With Scilab 6, things will be easier since each data will have a reference counter [of pointers to it] which will allow to call a kind of destructor when the reference count will be zero.//
/
In practical, this new feature looks still not to be implemented. Here is an illustration:

// Let's create an XML document and a pointer "doc" to it:
--> doc = xmlReadStr("<root><a att=""foo"" rib=""bar""><b>Hello</b></a></root>")
 doc  =
XML Document
url: Undefined
root: XML Element

// Now, let's make a copy of the pointer:
-->doc2=doc
 doc2  =
XML Document
url: Undefined
root: XML Element

--> doc2==doc
 ans  =
  T T    <<< this double True is strange, but it's not the matter here

// Then let's clear both pointers: If a counter actually exists,
// it shall be set to 0 afterwards.
// And if the automatic destructor is implemented, then this should
// automatically delete the XML document. What's the reality?:
--> clear doc doc2   // OK
-->  xmlGetOpenDocs()
 ans  =
       ans(1)
XML Document
url: Undefined
root: XML Element

The document still exists. So, the automatic destructor is not yet implemented,
at least for XML objects.

Is it a pity? To me, the reverse approach would be more relevant:
Deleting an object should clear all its pointers. For instance, with the XML example
hereabove, deleting the document should clear doc and doc2.
It's unfortunately not the case:
--> xmlDelete(xmlGetOpenDocs()(:))  // cleaning the area
--> doc = xmlReadStr("<root><a att=""foo"" rib=""bar""><b>Hello</b></a></root>");
--> doc2 = doc;
--> xmlDelete(doc)
--> isdef(["doc" "doc2"],"l")
 ans  =
  T T
--> doc
 doc  =
-->

This is the same issue with graphic handles when the figure they point to has been closed: We then get some still existing /but invalid/ handles, instead of properly clearing them.

Regards
Samuel




_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

Reply via email to