@@ -221,8 +221,8 @@ mutable struct Node
221
221
if autofinalize
222
222
# determine the owner of this node
223
223
owner_ptr = ptr
224
- while unsafe_load (owner_ptr). parent != C_NULL
225
- owner_ptr = unsafe_load (owner_ptr) . parent
224
+ while (p = unsafe_load (owner_ptr). parent) != C_NULL
225
+ owner_ptr = p
226
226
end
227
227
228
228
if ptr == owner_ptr
@@ -235,7 +235,7 @@ mutable struct Node
235
235
node = new (ptr, owner)
236
236
end
237
237
238
- if VERSION > v " 0.7-"
238
+ @static if VERSION > v " 0.7-"
239
239
finalizer (finalize_node, node)
240
240
else
241
241
finalizer (node, finalize_node)
@@ -250,6 +250,10 @@ mutable struct Node
250
250
end
251
251
end
252
252
253
+ function ismanaged (node:: Node )
254
+ return isdefined (node, :owner )
255
+ end
256
+
253
257
function Base. show (io:: IO , node:: Node )
254
258
@printf (io, " EzXML.Node(<%s@%p>)" , repr (nodetype (node)), node. ptr)
255
259
end
@@ -580,7 +584,7 @@ function firstnode(node::Node)
580
584
if ! hasnode (node)
581
585
throw (ArgumentError (" no child nodes" ))
582
586
end
583
- return Node (first_node_ptr (node. ptr))
587
+ return Node (first_node_ptr (node. ptr), ismanaged (node) )
584
588
end
585
589
586
590
"""
@@ -592,7 +596,7 @@ function lastnode(node::Node)
592
596
if ! hasnode (node)
593
597
throw (ArgumentError (" no child nodes" ))
594
598
end
595
- return Node (last_node_ptr (node. ptr))
599
+ return Node (last_node_ptr (node. ptr), ismanaged (node) )
596
600
end
597
601
598
602
"""
@@ -613,7 +617,7 @@ function firstelement(node::Node)
613
617
if ! haselement (node)
614
618
throw (ArgumentError (" no child elements" ))
615
619
end
616
- return Node (first_element_ptr (node. ptr))
620
+ return Node (first_element_ptr (node. ptr), ismanaged (node) )
617
621
end
618
622
619
623
"""
@@ -625,7 +629,7 @@ function lastelement(node::Node)
625
629
if ! haselement (node)
626
630
throw (ArgumentError (" no child elements" ))
627
631
end
628
- return Node (last_element_ptr (node. ptr))
632
+ return Node (last_element_ptr (node. ptr), ismanaged (node) )
629
633
end
630
634
631
635
"""
@@ -1250,7 +1254,7 @@ end
1250
1254
Create an iterator of child nodes.
1251
1255
"""
1252
1256
function eachnode (node:: Node , backward:: Bool = false )
1253
- return ChildNodeIterator (node. ptr , backward)
1257
+ return ChildNodeIterator (node, backward)
1254
1258
end
1255
1259
1256
1260
"""
@@ -1263,20 +1267,22 @@ function nodes(node::Node, backward::Bool=false)
1263
1267
end
1264
1268
1265
1269
struct ChildNodeIterator <: AbstractNodeIterator
1266
- node:: Ptr{_Node}
1270
+ node:: Node
1267
1271
backward:: Bool
1268
1272
end
1269
1273
1270
1274
function Base. start (iter:: ChildNodeIterator )
1271
- return iter. backward ? last_node_ptr (iter. node) : first_node_ptr (iter. node)
1275
+ return iter. backward ? last_node_ptr (iter. node. ptr ) : first_node_ptr (iter. node. ptr )
1272
1276
end
1273
1277
1274
1278
function Base. done (:: ChildNodeIterator , cur_ptr)
1275
1279
return cur_ptr == C_NULL
1276
1280
end
1277
1281
1278
1282
function Base. next (iter:: ChildNodeIterator , cur_ptr)
1279
- return Node (cur_ptr), iter. backward ? prev_node_ptr (cur_ptr) : next_node_ptr (cur_ptr)
1283
+ return (
1284
+ Node (cur_ptr, ismanaged (iter. node)),
1285
+ iter. backward ? prev_node_ptr (cur_ptr) : next_node_ptr (cur_ptr))
1280
1286
end
1281
1287
1282
1288
"""
@@ -1285,7 +1291,7 @@ end
1285
1291
Create an iterator of child elements.
1286
1292
"""
1287
1293
function eachelement (node:: Node , backward:: Bool = false )
1288
- return ChildElementIterator (node. ptr , backward)
1294
+ return ChildElementIterator (node, backward)
1289
1295
end
1290
1296
1291
1297
"""
@@ -1298,20 +1304,22 @@ function elements(node::Node, backward::Bool=false)
1298
1304
end
1299
1305
1300
1306
struct ChildElementIterator <: AbstractNodeIterator
1301
- ptr :: Ptr{_Node}
1307
+ node :: Node
1302
1308
backward:: Bool
1303
1309
end
1304
1310
1305
1311
function Base. start (iter:: ChildElementIterator )
1306
- return iter. backward ? last_element_ptr (iter. ptr) : first_element_ptr (iter. ptr)
1312
+ return iter. backward ? last_element_ptr (iter. node . ptr) : first_element_ptr (iter. node . ptr)
1307
1313
end
1308
1314
1309
1315
function Base. done (:: ChildElementIterator , cur_ptr)
1310
1316
return cur_ptr == C_NULL
1311
1317
end
1312
1318
1313
1319
function Base. next (iter:: ChildElementIterator , cur_ptr)
1314
- return Node (cur_ptr), iter. backward ? prev_element_ptr (cur_ptr) : next_element_ptr (cur_ptr)
1320
+ return (
1321
+ Node (cur_ptr, ismanaged (iter. node)),
1322
+ iter. backward ? prev_element_ptr (cur_ptr) : next_element_ptr (cur_ptr))
1315
1323
end
1316
1324
1317
1325
"""
@@ -1323,7 +1331,7 @@ function eachattribute(node::Node)
1323
1331
if unsafe_load (node. ptr). typ != ELEMENT_NODE
1324
1332
throw (ArgumentError (" not an element node" ))
1325
1333
end
1326
- return AttributeIterator (node. ptr )
1334
+ return AttributeIterator (node)
1327
1335
end
1328
1336
1329
1337
"""
@@ -1336,21 +1344,21 @@ function attributes(node::Node)
1336
1344
end
1337
1345
1338
1346
struct AttributeIterator <: AbstractNodeIterator
1339
- ptr :: Ptr{_Node}
1347
+ node :: Node
1340
1348
end
1341
1349
1342
1350
function Base. start (iter:: AttributeIterator )
1343
- @assert iter. ptr != C_NULL
1344
- @assert unsafe_load (iter. ptr). typ == ELEMENT_NODE
1345
- return property_ptr (iter. ptr)
1351
+ @assert iter. node . ptr != C_NULL
1352
+ @assert unsafe_load (iter. node . ptr). typ == ELEMENT_NODE
1353
+ return property_ptr (iter. node . ptr)
1346
1354
end
1347
1355
1348
1356
function Base. done (:: AttributeIterator , cur_ptr)
1349
1357
return cur_ptr == C_NULL
1350
1358
end
1351
1359
1352
- function Base. next (:: AttributeIterator , cur_ptr)
1353
- return Node (cur_ptr), next_node_ptr (cur_ptr)
1360
+ function Base. next (iter :: AttributeIterator , cur_ptr)
1361
+ return Node (cur_ptr, ismanaged (iter . node) ), next_node_ptr (cur_ptr)
1354
1362
end
1355
1363
1356
1364
function parent_ptr (node_ptr)
0 commit comments