[gxml] StreamBuilder: improve parsing stages
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gxml] StreamBuilder: improve parsing stages
- Date: Sun, 15 May 2022 23:49:24 +0000 (UTC)
commit 4246af336965e714fa869b119638cb0b19be833a
Author: Daniel Espinosa <esodan gmail com>
Date: Sun May 15 18:47:01 2022 -0500
StreamBuilder: improve parsing stages
gxml/Element.vala | 10 +++++-----
gxml/StreamReader.vala | 16 +++++++++-------
test/StreamReaderTest.vala | 5 ++++-
3 files changed, 18 insertions(+), 13 deletions(-)
---
diff --git a/gxml/Element.vala b/gxml/Element.vala
index eb8405f..43a7e48 100644
--- a/gxml/Element.vala
+++ b/gxml/Element.vala
@@ -895,16 +895,16 @@ public class GXml.Element : GXml.Node,
* Synchronically parse {@link read_buffer}
*/
public void parse_buffer () throws GLib.Error {
- if (read_buffer == null) {
- return;
- }
foreach (DomNode n in child_nodes) {
if (n is GXml.Element) {
((GXml.Element) n).parse_buffer ();
}
}
- read_from_string ((string) read_buffer.data);
- read_buffer = null;
+
+ if (read_buffer != null) {
+ read_from_string ((string) read_buffer.data);
+ read_buffer = null;
+ }
}
ThreadPool<Element> pool = null;
diff --git a/gxml/StreamReader.vala b/gxml/StreamReader.vala
index ba5d9a3..0e8dc18 100644
--- a/gxml/StreamReader.vala
+++ b/gxml/StreamReader.vala
@@ -163,12 +163,10 @@ public class GXml.StreamReader : GLib.Object {
parse_xml_dec ();
start = false;
read_text_node ();
- message ("Stoped at: %c", cur_char ());
continue;
} else {
parse_pi_dec ();
read_text_node ();
- message ("Stoped at: %c", cur_char ());
continue;
}
} else if (cur_char () == '!') {
@@ -191,8 +189,8 @@ public class GXml.StreamReader : GLib.Object {
}
}
GXml.Element e = null;
- var buf = new MemoryOutputStream.resizable ();
- var dbuf = new DataOutputStream (buf);
+ var buffer = new MemoryOutputStream.resizable ();
+ var dbuf = new DataOutputStream (buffer);
var oname_buf = new MemoryOutputStream (new uint8[1024]);
var name_buf = new DataOutputStream (oname_buf);
@@ -211,6 +209,7 @@ public class GXml.StreamReader : GLib.Object {
if (is_space (cur_char ())) {
break;
}
+
if (cur_char () == '/') {
dbuf.put_byte (cur_char ());
string rest = read_upto (">");
@@ -230,19 +229,23 @@ public class GXml.StreamReader : GLib.Object {
dbuf.put_byte (cur_byte ());
}
+
name_buf.put_byte ('\0', cancellable);
if (document.document_element == null) {
e = ((GXml.Document) document).search_root_element_property ();
}
+
if (e == null) {
e = (GXml.Element) document.create_element ((string) oname_buf.get_data ());
if (document.document_element == null) {
document.append_child (e);
}
}
+
if (document.document_element == e && parent == null) {
foreach (ParamSpec pspec in
- ((GXml.Object) e).get_property_element_list ()) {
+ ((GXml.Object) e).get_property_element_list ())
+ {
if (!(pspec.value_type.is_a (typeof (Collection)))) continue;
Collection col;
Value vc = Value (pspec.value_type);
@@ -274,12 +277,11 @@ public class GXml.StreamReader : GLib.Object {
root_collections.set (col.items_name.down (), col);
}
}
- e.read_buffer = buf;
+ e.read_buffer = buffer;
if (is_empty) {
return e;
}
while (true) {
-
if (!read_byte ()) {
break;
}
diff --git a/test/StreamReaderTest.vala b/test/StreamReaderTest.vala
index 7acff4f..ee0b419 100644
--- a/test/StreamReaderTest.vala
+++ b/test/StreamReaderTest.vala
@@ -88,7 +88,7 @@ class Authors : GXml.Element {
class Book : GXml.Element {
[Description(nick="::year")]
- public int year { get; set; }
+ public int year { get; set; default = 1999; }
[Description(nick="::ISBN")]
public string ISBN { get; set; }
public Authors authors { get; set; }
@@ -303,6 +303,7 @@ class GXmlTest {
assert (((GXml.Element) n).read_buffer != null);
}
}
+ message ("1st. Read: %s\n", bs.write_string ());
bs.parse_buffer ();
message (doc.write_string ());
assert (bs.read_buffer == null);
@@ -316,6 +317,8 @@ class GXmlTest {
assert (b2 != null);
assert (b2 is Book);
assert (b2.authors != null);
+ message ("Year: %d", b2.year);
+ assert (b2.year != 1999);
loop.quit ();
} catch (GLib.Error e) {
warning ("Error while reading stream: %s", e.message);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]