nokogiri 1.8.5 → 1.15.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (358) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +40 -18
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -61
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +867 -417
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +165 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +108 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +251 -105
  18. data/ext/nokogiri/nokogiri.h +215 -90
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +42 -37
  21. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  22. data/ext/nokogiri/xml_cdata.c +40 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +401 -237
  25. data/ext/nokogiri/xml_document_fragment.c +13 -17
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +63 -55
  28. data/ext/nokogiri/xml_element_decl.c +31 -31
  29. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +17 -19
  32. data/ext/nokogiri/xml_namespace.c +136 -62
  33. data/ext/nokogiri/xml_node.c +1387 -678
  34. data/ext/nokogiri/xml_node_set.c +246 -216
  35. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  36. data/ext/nokogiri/xml_reader.c +347 -212
  37. data/ext/nokogiri/xml_relax_ng.c +86 -77
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +145 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +64 -36
  41. data/ext/nokogiri/xml_schema.c +138 -81
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +36 -26
  44. data/ext/nokogiri/xml_xpath_context.c +366 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +111 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +630 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +103 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  65. data/gumbo-parser/src/parser.c +4891 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +223 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +66 -0
  88. data/gumbo-parser/src/util.h +34 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +224 -95
  100. data/lib/nokogiri/css.rb +56 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/encoding_handler.rb +57 -0
  103. data/lib/nokogiri/extension.rb +32 -0
  104. data/lib/nokogiri/gumbo.rb +15 -0
  105. data/lib/nokogiri/html.rb +38 -27
  106. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  107. data/lib/nokogiri/html4/document.rb +214 -0
  108. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  109. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  110. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  111. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  112. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  113. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  114. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  115. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  116. data/lib/nokogiri/html4.rb +47 -0
  117. data/lib/nokogiri/html5/document.rb +168 -0
  118. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  119. data/lib/nokogiri/html5/node.rb +103 -0
  120. data/lib/nokogiri/html5.rb +392 -0
  121. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  122. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  123. data/lib/nokogiri/syntax_error.rb +2 -0
  124. data/lib/nokogiri/version/constant.rb +6 -0
  125. data/lib/nokogiri/version/info.rb +223 -0
  126. data/lib/nokogiri/version.rb +3 -108
  127. data/lib/nokogiri/xml/attr.rb +55 -3
  128. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  129. data/lib/nokogiri/xml/builder.rb +98 -54
  130. data/lib/nokogiri/xml/cdata.rb +3 -1
  131. data/lib/nokogiri/xml/character_data.rb +2 -0
  132. data/lib/nokogiri/xml/document.rb +312 -126
  133. data/lib/nokogiri/xml/document_fragment.rb +104 -48
  134. data/lib/nokogiri/xml/dtd.rb +4 -2
  135. data/lib/nokogiri/xml/element_content.rb +12 -2
  136. data/lib/nokogiri/xml/element_decl.rb +6 -2
  137. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  138. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  139. data/lib/nokogiri/xml/namespace.rb +45 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1093 -411
  142. data/lib/nokogiri/xml/node_set.rb +173 -67
  143. data/lib/nokogiri/xml/notation.rb +13 -0
  144. data/lib/nokogiri/xml/parse_options.rb +145 -52
  145. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  146. data/lib/nokogiri/xml/pp/node.rb +42 -30
  147. data/lib/nokogiri/xml/pp.rb +4 -2
  148. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  149. data/lib/nokogiri/xml/reader.rb +21 -28
  150. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  151. data/lib/nokogiri/xml/sax/document.rb +45 -49
  152. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  153. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  154. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  155. data/lib/nokogiri/xml/sax.rb +6 -4
  156. data/lib/nokogiri/xml/schema.rb +19 -9
  157. data/lib/nokogiri/xml/searchable.rb +120 -72
  158. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  159. data/lib/nokogiri/xml/text.rb +2 -0
  160. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  161. data/lib/nokogiri/xml/xpath.rb +15 -4
  162. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  163. data/lib/nokogiri/xml.rb +38 -37
  164. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  165. data/lib/nokogiri/xslt.rb +101 -22
  166. data/lib/nokogiri.rb +59 -75
  167. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  168. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  169. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  170. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  171. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  172. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  173. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  174. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  175. data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
  177. metadata +126 -399
  178. data/.autotest +0 -22
  179. data/.cross_rubies +0 -8
  180. data/.editorconfig +0 -17
  181. data/.gemtest +0 -0
  182. data/.travis.yml +0 -63
  183. data/CHANGELOG.md +0 -1368
  184. data/CONTRIBUTING.md +0 -42
  185. data/C_CODING_STYLE.rdoc +0 -33
  186. data/Gemfile-libxml-ruby +0 -3
  187. data/Manifest.txt +0 -370
  188. data/ROADMAP.md +0 -111
  189. data/Rakefile +0 -348
  190. data/SECURITY.md +0 -19
  191. data/STANDARD_RESPONSES.md +0 -47
  192. data/Y_U_NO_GEMSPEC.md +0 -155
  193. data/appveyor.yml +0 -29
  194. data/build_all +0 -44
  195. data/ext/nokogiri/html_document.c +0 -170
  196. data/ext/nokogiri/html_document.h +0 -10
  197. data/ext/nokogiri/html_element_description.c +0 -279
  198. data/ext/nokogiri/html_element_description.h +0 -10
  199. data/ext/nokogiri/html_entity_lookup.c +0 -32
  200. data/ext/nokogiri/html_entity_lookup.h +0 -8
  201. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  202. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  203. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  204. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  205. data/ext/nokogiri/xml_attr.h +0 -9
  206. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  207. data/ext/nokogiri/xml_cdata.h +0 -9
  208. data/ext/nokogiri/xml_comment.h +0 -9
  209. data/ext/nokogiri/xml_document.h +0 -23
  210. data/ext/nokogiri/xml_document_fragment.h +0 -10
  211. data/ext/nokogiri/xml_dtd.h +0 -10
  212. data/ext/nokogiri/xml_element_content.h +0 -10
  213. data/ext/nokogiri/xml_element_decl.h +0 -9
  214. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  215. data/ext/nokogiri/xml_entity_decl.h +0 -10
  216. data/ext/nokogiri/xml_entity_reference.h +0 -9
  217. data/ext/nokogiri/xml_io.c +0 -61
  218. data/ext/nokogiri/xml_io.h +0 -11
  219. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  220. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  221. data/ext/nokogiri/xml_namespace.h +0 -15
  222. data/ext/nokogiri/xml_node.h +0 -13
  223. data/ext/nokogiri/xml_node_set.h +0 -12
  224. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  225. data/ext/nokogiri/xml_reader.h +0 -10
  226. data/ext/nokogiri/xml_relax_ng.h +0 -9
  227. data/ext/nokogiri/xml_sax_parser.h +0 -39
  228. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  229. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  230. data/ext/nokogiri/xml_schema.h +0 -9
  231. data/ext/nokogiri/xml_syntax_error.h +0 -13
  232. data/ext/nokogiri/xml_text.h +0 -9
  233. data/ext/nokogiri/xml_xpath_context.h +0 -10
  234. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  235. data/lib/nokogiri/html/document.rb +0 -335
  236. data/lib/nokogiri/html/document_fragment.rb +0 -49
  237. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  238. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  239. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  240. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  241. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  242. data/patches/sort-patches-by-date +0 -25
  243. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  244. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  245. data/suppressions/README.txt +0 -1
  246. data/suppressions/nokogiri_ruby-2.supp +0 -10
  247. data/tasks/test.rb +0 -100
  248. data/test/css/test_nthiness.rb +0 -226
  249. data/test/css/test_parser.rb +0 -386
  250. data/test/css/test_tokenizer.rb +0 -215
  251. data/test/css/test_xpath_visitor.rb +0 -96
  252. data/test/decorators/test_slop.rb +0 -23
  253. data/test/files/2ch.html +0 -108
  254. data/test/files/GH_1042.html +0 -18
  255. data/test/files/address_book.rlx +0 -12
  256. data/test/files/address_book.xml +0 -10
  257. data/test/files/atom.xml +0 -344
  258. data/test/files/bar/bar.xsd +0 -4
  259. data/test/files/bogus.xml +0 -0
  260. data/test/files/dont_hurt_em_why.xml +0 -422
  261. data/test/files/encoding.html +0 -82
  262. data/test/files/encoding.xhtml +0 -84
  263. data/test/files/exslt.xml +0 -8
  264. data/test/files/exslt.xslt +0 -35
  265. data/test/files/foo/foo.xsd +0 -4
  266. data/test/files/metacharset.html +0 -10
  267. data/test/files/namespace_pressure_test.xml +0 -1684
  268. data/test/files/noencoding.html +0 -47
  269. data/test/files/po.xml +0 -32
  270. data/test/files/po.xsd +0 -66
  271. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  272. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  273. data/test/files/saml/xenc_schema.xsd +0 -146
  274. data/test/files/saml/xmldsig_schema.xsd +0 -318
  275. data/test/files/shift_jis.html +0 -10
  276. data/test/files/shift_jis.xml +0 -5
  277. data/test/files/shift_jis_no_charset.html +0 -9
  278. data/test/files/slow-xpath.xml +0 -25509
  279. data/test/files/snuggles.xml +0 -3
  280. data/test/files/staff.dtd +0 -10
  281. data/test/files/staff.xml +0 -59
  282. data/test/files/staff.xslt +0 -32
  283. data/test/files/test_document_url/bar.xml +0 -2
  284. data/test/files/test_document_url/document.dtd +0 -4
  285. data/test/files/test_document_url/document.xml +0 -6
  286. data/test/files/tlm.html +0 -851
  287. data/test/files/to_be_xincluded.xml +0 -2
  288. data/test/files/valid_bar.xml +0 -2
  289. data/test/files/xinclude.xml +0 -4
  290. data/test/helper.rb +0 -271
  291. data/test/html/sax/test_parser.rb +0 -168
  292. data/test/html/sax/test_parser_context.rb +0 -46
  293. data/test/html/sax/test_parser_text.rb +0 -163
  294. data/test/html/sax/test_push_parser.rb +0 -87
  295. data/test/html/test_attributes.rb +0 -85
  296. data/test/html/test_builder.rb +0 -164
  297. data/test/html/test_document.rb +0 -712
  298. data/test/html/test_document_encoding.rb +0 -143
  299. data/test/html/test_document_fragment.rb +0 -310
  300. data/test/html/test_element_description.rb +0 -105
  301. data/test/html/test_named_characters.rb +0 -14
  302. data/test/html/test_node.rb +0 -212
  303. data/test/html/test_node_encoding.rb +0 -91
  304. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  305. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  306. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  308. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  309. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  310. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  311. data/test/test_convert_xpath.rb +0 -135
  312. data/test/test_css_cache.rb +0 -47
  313. data/test/test_encoding_handler.rb +0 -48
  314. data/test/test_memory_leak.rb +0 -156
  315. data/test/test_nokogiri.rb +0 -138
  316. data/test/test_soap4r_sax.rb +0 -52
  317. data/test/test_xslt_transforms.rb +0 -314
  318. data/test/xml/node/test_save_options.rb +0 -28
  319. data/test/xml/node/test_subclass.rb +0 -44
  320. data/test/xml/sax/test_parser.rb +0 -402
  321. data/test/xml/sax/test_parser_context.rb +0 -115
  322. data/test/xml/sax/test_parser_text.rb +0 -202
  323. data/test/xml/sax/test_push_parser.rb +0 -265
  324. data/test/xml/test_attr.rb +0 -74
  325. data/test/xml/test_attribute_decl.rb +0 -86
  326. data/test/xml/test_builder.rb +0 -341
  327. data/test/xml/test_c14n.rb +0 -180
  328. data/test/xml/test_cdata.rb +0 -54
  329. data/test/xml/test_comment.rb +0 -40
  330. data/test/xml/test_document.rb +0 -982
  331. data/test/xml/test_document_encoding.rb +0 -31
  332. data/test/xml/test_document_fragment.rb +0 -298
  333. data/test/xml/test_dtd.rb +0 -187
  334. data/test/xml/test_dtd_encoding.rb +0 -31
  335. data/test/xml/test_element_content.rb +0 -56
  336. data/test/xml/test_element_decl.rb +0 -73
  337. data/test/xml/test_entity_decl.rb +0 -122
  338. data/test/xml/test_entity_reference.rb +0 -262
  339. data/test/xml/test_namespace.rb +0 -96
  340. data/test/xml/test_node.rb +0 -1325
  341. data/test/xml/test_node_attributes.rb +0 -115
  342. data/test/xml/test_node_encoding.rb +0 -75
  343. data/test/xml/test_node_inheritance.rb +0 -32
  344. data/test/xml/test_node_reparenting.rb +0 -592
  345. data/test/xml/test_node_set.rb +0 -809
  346. data/test/xml/test_parse_options.rb +0 -64
  347. data/test/xml/test_processing_instruction.rb +0 -30
  348. data/test/xml/test_reader.rb +0 -620
  349. data/test/xml/test_reader_encoding.rb +0 -134
  350. data/test/xml/test_relax_ng.rb +0 -60
  351. data/test/xml/test_schema.rb +0 -142
  352. data/test/xml/test_syntax_error.rb +0 -36
  353. data/test/xml/test_text.rb +0 -60
  354. data/test/xml/test_unparented_node.rb +0 -483
  355. data/test/xml/test_xinclude.rb +0 -83
  356. data/test/xml/test_xpath.rb +0 -470
  357. data/test/xslt/test_custom_functions.rb +0 -133
  358. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,12 +1,11 @@
1
- #include <xml_node_set.h>
2
- #include <xml_namespace.h>
3
- #include <libxml/xpathInternals.h>
1
+ #include <nokogiri.h>
4
2
 
5
- static ID decorate ;
6
- static void xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val);
3
+ VALUE cNokogiriXmlNodeSet ;
7
4
 
5
+ static ID decorate ;
8
6
 
9
- static void Check_Node_Set_Node_Type(VALUE node)
7
+ static void
8
+ Check_Node_Set_Node_Type(VALUE node)
10
9
  {
11
10
  if (!(rb_obj_is_kind_of(node, cNokogiriXmlNode) ||
12
11
  rb_obj_is_kind_of(node, cNokogiriXmlNamespace))) {
@@ -15,34 +14,102 @@ static void Check_Node_Set_Node_Type(VALUE node)
15
14
  }
16
15
 
17
16
 
18
- static void deallocate(xmlNodeSetPtr node_set)
17
+ static
18
+ VALUE
19
+ ruby_object_get(xmlNodePtr c_node)
19
20
  {
21
+ /* see xmlElementType in libxml2 tree.h */
22
+ switch (c_node->type) {
23
+ case XML_NAMESPACE_DECL:
24
+ /* _private is later in the namespace struct */
25
+ return (VALUE)(((xmlNsPtr)c_node)->_private);
26
+
27
+ case XML_DOCUMENT_NODE:
28
+ case XML_HTML_DOCUMENT_NODE:
29
+ /* in documents we use _private to store a tuple */
30
+ if (DOC_RUBY_OBJECT_TEST(((xmlDocPtr)c_node))) {
31
+ return DOC_RUBY_OBJECT((xmlDocPtr)c_node);
32
+ }
33
+ return (VALUE)NULL;
34
+
35
+ default:
36
+ return (VALUE)(c_node->_private);
37
+ }
38
+ }
39
+
40
+
41
+ static void
42
+ xml_node_set_mark(void *data)
43
+ {
44
+ xmlNodeSetPtr node_set = data;
45
+ VALUE rb_node;
46
+ int jnode;
47
+
48
+ for (jnode = 0; jnode < node_set->nodeNr; jnode++) {
49
+ rb_node = ruby_object_get(node_set->nodeTab[jnode]);
50
+ if (rb_node) {
51
+ rb_gc_mark(rb_node);
52
+ }
53
+ }
54
+ }
55
+
56
+ static void
57
+ xml_node_set_deallocate(void *data)
58
+ {
59
+ xmlNodeSetPtr node_set = data;
20
60
  /*
21
- *
22
- * since xpath queries return copies of the xmlNs structs,
23
- * xmlXPathFreeNodeSet() frees those xmlNs structs that are in the
24
- * NodeSet.
25
- *
26
- * this is bad if someone is still trying to use the Namespace object wrapped
27
- * around the xmlNs, so we need to avoid that.
28
- *
29
- * here we reproduce xmlXPathFreeNodeSet() without the xmlNs logic.
30
- *
31
- * this doesn't cause a leak because Namespace objects that are in an XPath
32
- * query NodeSet are given their own lifecycle in
33
- * Nokogiri_wrap_xml_namespace().
61
+ * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathFreeNodeSet() except for the
62
+ * offending call to xmlXPathNodeSetFreeNs().
34
63
  */
35
- NOKOGIRI_DEBUG_START(node_set) ;
36
- if (node_set->nodeTab != NULL)
64
+ if (node_set->nodeTab != NULL) {
37
65
  xmlFree(node_set->nodeTab);
66
+ }
38
67
 
39
68
  xmlFree(node_set);
40
- NOKOGIRI_DEBUG_END(node_set) ;
41
69
  }
42
70
 
43
- static VALUE allocate(VALUE klass)
71
+
72
+ static VALUE
73
+ xml_node_set_allocate(VALUE klass)
74
+ {
75
+ return noko_xml_node_set_wrap(xmlXPathNodeSetCreate(NULL), Qnil);
76
+ }
77
+
78
+ static const rb_data_type_t xml_node_set_type = {
79
+ .wrap_struct_name = "Nokogiri::XML::NodeSet",
80
+ .function = {
81
+ .dmark = xml_node_set_mark,
82
+ .dfree = xml_node_set_deallocate,
83
+ },
84
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
85
+ };
86
+
87
+ static void
88
+ xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
44
89
  {
45
- return Nokogiri_wrap_xml_node_set(xmlXPathNodeSetCreate(NULL), Qnil);
90
+ /*
91
+ * For reasons outlined in xml_namespace.c, here we reproduce xmlXPathNodeSetDel() except for the
92
+ * offending call to xmlXPathNodeSetFreeNs().
93
+ */
94
+ int i;
95
+
96
+ if (cur == NULL) { return; }
97
+ if (val == NULL) { return; }
98
+
99
+ /*
100
+ * find node in nodeTab
101
+ */
102
+ for (i = 0; i < cur->nodeNr; i++)
103
+ if (cur->nodeTab[i] == val) { break; }
104
+
105
+ if (i >= cur->nodeNr) { /* not found */
106
+ return;
107
+ }
108
+ cur->nodeNr--;
109
+ for (; i < cur->nodeNr; i++) {
110
+ cur->nodeTab[i] = cur->nodeTab[i + 1];
111
+ }
112
+ cur->nodeTab[cur->nodeNr] = NULL;
46
113
  }
47
114
 
48
115
 
@@ -53,16 +120,17 @@ static VALUE allocate(VALUE klass)
53
120
  * Duplicate this NodeSet. Note that the Nodes contained in the NodeSet are not
54
121
  * duplicated (similar to how Array and other Enumerable classes work).
55
122
  */
56
- static VALUE duplicate(VALUE self)
123
+ static VALUE
124
+ duplicate(VALUE rb_self)
57
125
  {
58
- xmlNodeSetPtr node_set;
126
+ xmlNodeSetPtr c_self;
59
127
  xmlNodeSetPtr dupl;
60
128
 
61
- Data_Get_Struct(self, xmlNodeSet, node_set);
129
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
62
130
 
63
- dupl = xmlXPathNodeSetMerge(NULL, node_set);
131
+ dupl = xmlXPathNodeSetMerge(NULL, c_self);
64
132
 
65
- return Nokogiri_wrap_xml_node_set(dupl, rb_iv_get(self, "@document"));
133
+ return noko_xml_node_set_wrap(dupl, rb_iv_get(rb_self, "@document"));
66
134
  }
67
135
 
68
136
  /*
@@ -71,13 +139,14 @@ static VALUE duplicate(VALUE self)
71
139
  *
72
140
  * Get the length of the node set
73
141
  */
74
- static VALUE length(VALUE self)
142
+ static VALUE
143
+ length(VALUE rb_self)
75
144
  {
76
- xmlNodeSetPtr node_set;
145
+ xmlNodeSetPtr c_self;
77
146
 
78
- Data_Get_Struct(self, xmlNodeSet, node_set);
147
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
79
148
 
80
- return node_set ? INT2NUM(node_set->nodeNr) : INT2NUM(0);
149
+ return c_self ? INT2NUM(c_self->nodeNr) : INT2NUM(0);
81
150
  }
82
151
 
83
152
  /*
@@ -86,19 +155,20 @@ static VALUE length(VALUE self)
86
155
  *
87
156
  * Append +node+ to the NodeSet.
88
157
  */
89
- static VALUE push(VALUE self, VALUE rb_node)
158
+ static VALUE
159
+ push(VALUE rb_self, VALUE rb_node)
90
160
  {
91
- xmlNodeSetPtr node_set;
161
+ xmlNodeSetPtr c_self;
92
162
  xmlNodePtr node;
93
163
 
94
164
  Check_Node_Set_Node_Type(rb_node);
95
165
 
96
- Data_Get_Struct(self, xmlNodeSet, node_set);
97
- Data_Get_Struct(rb_node, xmlNode, node);
166
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
167
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
98
168
 
99
- xmlXPathNodeSetAdd(node_set, node);
169
+ xmlXPathNodeSetAdd(c_self, node);
100
170
 
101
- return self;
171
+ return rb_self;
102
172
  }
103
173
 
104
174
  /*
@@ -109,18 +179,18 @@ static VALUE push(VALUE self, VALUE rb_node)
109
179
  * if found, otherwise returns nil.
110
180
  */
111
181
  static VALUE
112
- delete(VALUE self, VALUE rb_node)
182
+ delete (VALUE rb_self, VALUE rb_node)
113
183
  {
114
- xmlNodeSetPtr node_set;
184
+ xmlNodeSetPtr c_self;
115
185
  xmlNodePtr node;
116
186
 
117
187
  Check_Node_Set_Node_Type(rb_node);
118
188
 
119
- Data_Get_Struct(self, xmlNodeSet, node_set);
120
- Data_Get_Struct(rb_node, xmlNode, node);
189
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
190
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
121
191
 
122
- if (xmlXPathNodeSetContains(node_set, node)) {
123
- xpath_node_set_del(node_set, node);
192
+ if (xmlXPathNodeSetContains(c_self, node)) {
193
+ xpath_node_set_del(c_self, node);
124
194
  return rb_node;
125
195
  }
126
196
  return Qnil ;
@@ -133,19 +203,21 @@ delete(VALUE self, VALUE rb_node)
133
203
  *
134
204
  * Set Intersection — Returns a new NodeSet containing nodes common to the two NodeSets.
135
205
  */
136
- static VALUE intersection(VALUE self, VALUE rb_other)
206
+ static VALUE
207
+ intersection(VALUE rb_self, VALUE rb_other)
137
208
  {
138
- xmlNodeSetPtr node_set, other ;
209
+ xmlNodeSetPtr c_self, c_other ;
139
210
  xmlNodeSetPtr intersection;
140
211
 
141
- if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
212
+ if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
142
213
  rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
214
+ }
143
215
 
144
- Data_Get_Struct(self, xmlNodeSet, node_set);
145
- Data_Get_Struct(rb_other, xmlNodeSet, other);
216
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
217
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
146
218
 
147
- intersection = xmlXPathIntersection(node_set, other);
148
- return Nokogiri_wrap_xml_node_set(intersection, rb_iv_get(self, "@document"));
219
+ intersection = xmlXPathIntersection(c_self, c_other);
220
+ return noko_xml_node_set_wrap(intersection, rb_iv_get(rb_self, "@document"));
149
221
  }
150
222
 
151
223
 
@@ -155,17 +227,18 @@ static VALUE intersection(VALUE self, VALUE rb_other)
155
227
  *
156
228
  * Returns true if any member of node set equals +node+.
157
229
  */
158
- static VALUE include_eh(VALUE self, VALUE rb_node)
230
+ static VALUE
231
+ include_eh(VALUE rb_self, VALUE rb_node)
159
232
  {
160
- xmlNodeSetPtr node_set;
233
+ xmlNodeSetPtr c_self;
161
234
  xmlNodePtr node;
162
235
 
163
236
  Check_Node_Set_Node_Type(rb_node);
164
237
 
165
- Data_Get_Struct(self, xmlNodeSet, node_set);
166
- Data_Get_Struct(rb_node, xmlNode, node);
238
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
239
+ Noko_Node_Get_Struct(rb_node, xmlNode, node);
167
240
 
168
- return (xmlXPathNodeSetContains(node_set, node) ? Qtrue : Qfalse);
241
+ return (xmlXPathNodeSetContains(c_self, node) ? Qtrue : Qfalse);
169
242
  }
170
243
 
171
244
 
@@ -176,21 +249,23 @@ static VALUE include_eh(VALUE self, VALUE rb_node)
176
249
  * Returns a new set built by merging the set and the elements of the given
177
250
  * set.
178
251
  */
179
- static VALUE set_union(VALUE self, VALUE rb_other)
252
+ static VALUE
253
+ rb_xml_node_set_union(VALUE rb_self, VALUE rb_other)
180
254
  {
181
- xmlNodeSetPtr node_set, other;
182
- xmlNodeSetPtr new;
255
+ xmlNodeSetPtr c_self, c_other;
256
+ xmlNodeSetPtr c_new_node_set;
183
257
 
184
- if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
258
+ if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
185
259
  rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
260
+ }
186
261
 
187
- Data_Get_Struct(self, xmlNodeSet, node_set);
188
- Data_Get_Struct(rb_other, xmlNodeSet, other);
262
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
263
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
189
264
 
190
- new = xmlXPathNodeSetMerge(NULL, node_set);
191
- new = xmlXPathNodeSetMerge(new, other);
265
+ c_new_node_set = xmlXPathNodeSetMerge(NULL, c_self);
266
+ c_new_node_set = xmlXPathNodeSetMerge(c_new_node_set, c_other);
192
267
 
193
- return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document"));
268
+ return noko_xml_node_set_wrap(c_new_node_set, rb_iv_get(rb_self, "@document"));
194
269
  }
195
270
 
196
271
  /*
@@ -200,62 +275,66 @@ static VALUE set_union(VALUE self, VALUE rb_other)
200
275
  * Difference - returns a new NodeSet that is a copy of this NodeSet, removing
201
276
  * each item that also appears in +node_set+
202
277
  */
203
- static VALUE minus(VALUE self, VALUE rb_other)
278
+ static VALUE
279
+ minus(VALUE rb_self, VALUE rb_other)
204
280
  {
205
- xmlNodeSetPtr node_set, other;
281
+ xmlNodeSetPtr c_self, c_other;
206
282
  xmlNodeSetPtr new;
207
283
  int j ;
208
284
 
209
- if(!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet))
285
+ if (!rb_obj_is_kind_of(rb_other, cNokogiriXmlNodeSet)) {
210
286
  rb_raise(rb_eArgError, "node_set must be a Nokogiri::XML::NodeSet");
287
+ }
211
288
 
212
- Data_Get_Struct(self, xmlNodeSet, node_set);
213
- Data_Get_Struct(rb_other, xmlNodeSet, other);
289
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
290
+ TypedData_Get_Struct(rb_other, xmlNodeSet, &xml_node_set_type, c_other);
214
291
 
215
- new = xmlXPathNodeSetMerge(NULL, node_set);
216
- for (j = 0 ; j < other->nodeNr ; ++j) {
217
- xpath_node_set_del(new, other->nodeTab[j]);
292
+ new = xmlXPathNodeSetMerge(NULL, c_self);
293
+ for (j = 0 ; j < c_other->nodeNr ; ++j) {
294
+ xpath_node_set_del(new, c_other->nodeTab[j]);
218
295
  }
219
296
 
220
- return Nokogiri_wrap_xml_node_set(new, rb_iv_get(self, "@document"));
297
+ return noko_xml_node_set_wrap(new, rb_iv_get(rb_self, "@document"));
221
298
  }
222
299
 
223
300
 
224
- static VALUE index_at(VALUE self, long offset)
301
+ static VALUE
302
+ index_at(VALUE rb_self, long offset)
225
303
  {
226
- xmlNodeSetPtr node_set;
304
+ xmlNodeSetPtr c_self;
227
305
 
228
- Data_Get_Struct(self, xmlNodeSet, node_set);
306
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
229
307
 
230
- if (offset >= node_set->nodeNr || abs((int)offset) > node_set->nodeNr) {
308
+ if (offset >= c_self->nodeNr || abs((int)offset) > c_self->nodeNr) {
231
309
  return Qnil;
232
310
  }
233
311
 
234
- if (offset < 0) { offset += node_set->nodeNr ; }
312
+ if (offset < 0) { offset += c_self->nodeNr ; }
235
313
 
236
- return Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[offset], self);
314
+ return noko_xml_node_wrap_node_set_result(c_self->nodeTab[offset], rb_self);
237
315
  }
238
316
 
239
- static VALUE subseq(VALUE self, long beg, long len)
317
+ static VALUE
318
+ subseq(VALUE rb_self, long beg, long len)
240
319
  {
241
320
  long j;
242
- xmlNodeSetPtr node_set;
321
+ xmlNodeSetPtr c_self;
243
322
  xmlNodeSetPtr new_set ;
244
323
 
245
- Data_Get_Struct(self, xmlNodeSet, node_set);
324
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
246
325
 
247
- if (beg > node_set->nodeNr) return Qnil ;
248
- if (beg < 0 || len < 0) return Qnil ;
326
+ if (beg > c_self->nodeNr) { return Qnil ; }
327
+ if (beg < 0 || len < 0) { return Qnil ; }
249
328
 
250
- if ((beg + len) > node_set->nodeNr) {
251
- len = node_set->nodeNr - beg ;
329
+ if ((beg + len) > c_self->nodeNr) {
330
+ len = c_self->nodeNr - beg ;
252
331
  }
253
332
 
254
333
  new_set = xmlXPathNodeSetCreate(NULL);
255
- for (j = beg ; j < beg+len ; ++j) {
256
- xmlXPathNodeSetAddUnique(new_set, node_set->nodeTab[j]);
334
+ for (j = beg ; j < beg + len ; ++j) {
335
+ xmlXPathNodeSetAddUnique(new_set, c_self->nodeTab[j]);
257
336
  }
258
- return Nokogiri_wrap_xml_node_set(new_set, rb_iv_get(self, "@document"));
337
+ return noko_xml_node_set_wrap(new_set, rb_iv_get(rb_self, "@document"));
259
338
  }
260
339
 
261
340
  /*
@@ -273,21 +352,22 @@ static VALUE subseq(VALUE self, long beg, long len)
273
352
  * count backward from the end of the +node_set+ (-1 is the last node). Returns
274
353
  * nil if the +index+ (or +start+) are out of range.
275
354
  */
276
- static VALUE slice(int argc, VALUE *argv, VALUE self)
355
+ static VALUE
356
+ slice(int argc, VALUE *argv, VALUE rb_self)
277
357
  {
278
358
  VALUE arg ;
279
359
  long beg, len ;
280
- xmlNodeSetPtr node_set;
360
+ xmlNodeSetPtr c_self;
281
361
 
282
- Data_Get_Struct(self, xmlNodeSet, node_set);
362
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
283
363
 
284
364
  if (argc == 2) {
285
365
  beg = NUM2LONG(argv[0]);
286
366
  len = NUM2LONG(argv[1]);
287
367
  if (beg < 0) {
288
- beg += node_set->nodeNr ;
368
+ beg += c_self->nodeNr ;
289
369
  }
290
- return subseq(self, beg, len);
370
+ return subseq(rb_self, beg, len);
291
371
  }
292
372
 
293
373
  if (argc != 1) {
@@ -296,20 +376,20 @@ static VALUE slice(int argc, VALUE *argv, VALUE self)
296
376
  arg = argv[0];
297
377
 
298
378
  if (FIXNUM_P(arg)) {
299
- return index_at(self, FIX2LONG(arg));
379
+ return index_at(rb_self, FIX2LONG(arg));
300
380
  }
301
381
 
302
382
  /* if arg is Range */
303
- switch (rb_range_beg_len(arg, &beg, &len, (long)node_set->nodeNr, 0)) {
304
- case Qfalse:
305
- break;
306
- case Qnil:
307
- return Qnil;
308
- default:
309
- return subseq(self, beg, len);
383
+ switch (rb_range_beg_len(arg, &beg, &len, (long)c_self->nodeNr, 0)) {
384
+ case Qfalse:
385
+ break;
386
+ case Qnil:
387
+ return Qnil;
388
+ default:
389
+ return subseq(rb_self, beg, len);
310
390
  }
311
391
 
312
- return index_at(self, NUM2LONG(arg));
392
+ return index_at(rb_self, NUM2LONG(arg));
313
393
  }
314
394
 
315
395
 
@@ -319,18 +399,19 @@ static VALUE slice(int argc, VALUE *argv, VALUE self)
319
399
  *
320
400
  * Return this list as an Array
321
401
  */
322
- static VALUE to_array(VALUE self, VALUE rb_node)
402
+ static VALUE
403
+ to_array(VALUE rb_self)
323
404
  {
324
- xmlNodeSetPtr node_set ;
405
+ xmlNodeSetPtr c_self ;
325
406
  VALUE list;
326
407
  int i;
327
408
 
328
- Data_Get_Struct(self, xmlNodeSet, node_set);
409
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
329
410
 
330
- list = rb_ary_new2(node_set->nodeNr);
331
- for(i = 0; i < node_set->nodeNr; i++) {
332
- VALUE elt = Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[i], self);
333
- rb_ary_push( list, elt );
411
+ list = rb_ary_new2(c_self->nodeNr);
412
+ for (i = 0; i < c_self->nodeNr; i++) {
413
+ VALUE elt = noko_xml_node_wrap_node_set_result(c_self->nodeTab[i], rb_self);
414
+ rb_ary_push(list, elt);
334
415
  }
335
416
 
336
417
  return list;
@@ -342,145 +423,94 @@ static VALUE to_array(VALUE self, VALUE rb_node)
342
423
  *
343
424
  * Unlink this NodeSet and all Node objects it contains from their current context.
344
425
  */
345
- static VALUE unlink_nodeset(VALUE self)
426
+ static VALUE
427
+ unlink_nodeset(VALUE rb_self)
346
428
  {
347
- xmlNodeSetPtr node_set;
429
+ xmlNodeSetPtr c_self;
348
430
  int j, nodeNr ;
349
431
 
350
- Data_Get_Struct(self, xmlNodeSet, node_set);
432
+ TypedData_Get_Struct(rb_self, xmlNodeSet, &xml_node_set_type, c_self);
351
433
 
352
- nodeNr = node_set->nodeNr ;
434
+ nodeNr = c_self->nodeNr ;
353
435
  for (j = 0 ; j < nodeNr ; j++) {
354
- if (! NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) {
436
+ if (! NOKOGIRI_NAMESPACE_EH(c_self->nodeTab[j])) {
355
437
  VALUE node ;
356
438
  xmlNodePtr node_ptr;
357
- node = Nokogiri_wrap_xml_node(Qnil, node_set->nodeTab[j]);
439
+ node = noko_xml_node_wrap(Qnil, c_self->nodeTab[j]);
358
440
  rb_funcall(node, rb_intern("unlink"), 0); /* modifies the C struct out from under the object */
359
- Data_Get_Struct(node, xmlNode, node_ptr);
360
- node_set->nodeTab[j] = node_ptr ;
441
+ Noko_Node_Get_Struct(node, xmlNode, node_ptr);
442
+ c_self->nodeTab[j] = node_ptr ;
361
443
  }
362
444
  }
363
- return self ;
445
+ return rb_self ;
364
446
  }
365
447
 
366
448
 
367
- static void reify_node_set_namespaces(VALUE self)
449
+ VALUE
450
+ noko_xml_node_set_wrap(xmlNodeSetPtr c_node_set, VALUE document)
368
451
  {
369
- /*
370
- * as mentioned in deallocate() above, xmlNs structs returned in an XPath
371
- * NodeSet are duplicates, and we don't clean them up at deallocate() time.
372
- *
373
- * as a result, we need to make sure the Ruby manages this memory. we do this
374
- * by forcing the creation of a Ruby object wrapped around the xmlNs.
375
- *
376
- * we also have to make sure that the NodeSet has a reference to the
377
- * Namespace object, otherwise GC will kick in and the Namespace won't be
378
- * marked.
379
- *
380
- * we *could* do this safely with *all* the nodes in the NodeSet, but we only
381
- * *need* to do it for xmlNs structs, and so you get the code we have here.
382
- */
383
- int j ;
384
- xmlNodeSetPtr node_set ;
385
- VALUE namespace_cache ;
386
-
387
- Data_Get_Struct(self, xmlNodeSet, node_set);
452
+ int j;
453
+ VALUE rb_node_set ;
388
454
 
389
- namespace_cache = rb_iv_get(self, "@namespace_cache");
390
-
391
- for (j = 0 ; j < node_set->nodeNr ; j++) {
392
- if (NOKOGIRI_NAMESPACE_EH(node_set->nodeTab[j])) {
393
- rb_ary_push(namespace_cache, Nokogiri_wrap_xml_node_set_node(node_set->nodeTab[j], self));
394
- }
455
+ if (c_node_set == NULL) {
456
+ c_node_set = xmlXPathNodeSetCreate(NULL);
395
457
  }
396
- }
397
-
398
458
 
399
- VALUE Nokogiri_wrap_xml_node_set(xmlNodeSetPtr node_set, VALUE document)
400
- {
401
- VALUE new_set ;
402
-
403
- if (node_set == NULL) {
404
- node_set = xmlXPathNodeSetCreate(NULL);
405
- }
406
-
407
- new_set = Data_Wrap_Struct(cNokogiriXmlNodeSet, 0, deallocate, node_set);
459
+ rb_node_set = TypedData_Wrap_Struct(cNokogiriXmlNodeSet, &xml_node_set_type, c_node_set);
408
460
 
409
461
  if (!NIL_P(document)) {
410
- rb_iv_set(new_set, "@document", document);
411
- rb_funcall(document, decorate, 1, new_set);
462
+ rb_iv_set(rb_node_set, "@document", document);
463
+ rb_funcall(document, decorate, 1, rb_node_set);
412
464
  }
413
465
 
414
- rb_iv_set(new_set, "@namespace_cache", rb_ary_new());
415
- reify_node_set_namespaces(new_set);
466
+ /* make sure we create ruby objects for all the results, so they'll be marked during the GC mark phase */
467
+ for (j = 0 ; j < c_node_set->nodeNr ; j++) {
468
+ noko_xml_node_wrap_node_set_result(c_node_set->nodeTab[j], rb_node_set);
469
+ }
416
470
 
417
- return new_set ;
471
+ return rb_node_set ;
418
472
  }
419
473
 
420
- VALUE Nokogiri_wrap_xml_node_set_node(xmlNodePtr node, VALUE node_set)
421
- {
422
- xmlDocPtr document ;
423
474
 
475
+ VALUE
476
+ noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set)
477
+ {
424
478
  if (NOKOGIRI_NAMESPACE_EH(node)) {
425
- Data_Get_Struct(rb_iv_get(node_set, "@document"), xmlDoc, document);
426
- return Nokogiri_wrap_xml_namespace(document, (xmlNsPtr)node);
479
+ return noko_xml_namespace_wrap_xpath_copy((xmlNsPtr)node);
427
480
  } else {
428
- return Nokogiri_wrap_xml_node(Qnil, node);
481
+ return noko_xml_node_wrap(Qnil, node);
429
482
  }
430
483
  }
431
484
 
432
485
 
433
- static void xpath_node_set_del(xmlNodeSetPtr cur, xmlNodePtr val)
486
+ xmlNodeSetPtr
487
+ noko_xml_node_set_unwrap(VALUE rb_node_set)
434
488
  {
435
- /*
436
- * as mentioned a few times above, we do not want to free xmlNs structs
437
- * outside of the Namespace lifecycle.
438
- *
439
- * xmlXPathNodeSetDel() frees xmlNs structs, and so here we reproduce that
440
- * function with the xmlNs logic.
441
- */
442
- int i;
443
-
444
- if (cur == NULL) return;
445
- if (val == NULL) return;
446
-
447
- /*
448
- * find node in nodeTab
449
- */
450
- for (i = 0;i < cur->nodeNr;i++)
451
- if (cur->nodeTab[i] == val) break;
452
-
453
- if (i >= cur->nodeNr) { /* not found */
454
- return;
455
- }
456
- cur->nodeNr--;
457
- for (;i < cur->nodeNr;i++)
458
- cur->nodeTab[i] = cur->nodeTab[i + 1];
459
- cur->nodeTab[cur->nodeNr] = NULL;
489
+ xmlNodeSetPtr c_node_set;
490
+ TypedData_Get_Struct(rb_node_set, xmlNodeSet, &xml_node_set_type, c_node_set);
491
+ return c_node_set;
460
492
  }
461
493
 
462
494
 
463
- VALUE cNokogiriXmlNodeSet ;
464
- void init_xml_node_set(void)
495
+ void
496
+ noko_init_xml_node_set(void)
465
497
  {
466
- VALUE nokogiri = rb_define_module("Nokogiri");
467
- VALUE xml = rb_define_module_under(nokogiri, "XML");
468
- VALUE klass = rb_define_class_under(xml, "NodeSet", rb_cObject);
469
- cNokogiriXmlNodeSet = klass;
470
-
471
- rb_define_alloc_func(klass, allocate);
472
- rb_define_method(klass, "length", length, 0);
473
- rb_define_method(klass, "[]", slice, -1);
474
- rb_define_method(klass, "slice", slice, -1);
475
- rb_define_method(klass, "push", push, 1);
476
- rb_define_method(klass, "|", set_union, 1);
477
- rb_define_method(klass, "-", minus, 1);
478
- rb_define_method(klass, "unlink", unlink_nodeset, 0);
479
- rb_define_method(klass, "to_a", to_array, 0);
480
- rb_define_method(klass, "dup", duplicate, 0);
481
- rb_define_method(klass, "delete", delete, 1);
482
- rb_define_method(klass, "&", intersection, 1);
483
- rb_define_method(klass, "include?", include_eh, 1);
498
+ cNokogiriXmlNodeSet = rb_define_class_under(mNokogiriXml, "NodeSet", rb_cObject);
499
+
500
+ rb_define_alloc_func(cNokogiriXmlNodeSet, xml_node_set_allocate);
501
+
502
+ rb_define_method(cNokogiriXmlNodeSet, "length", length, 0);
503
+ rb_define_method(cNokogiriXmlNodeSet, "[]", slice, -1);
504
+ rb_define_method(cNokogiriXmlNodeSet, "slice", slice, -1);
505
+ rb_define_method(cNokogiriXmlNodeSet, "push", push, 1);
506
+ rb_define_method(cNokogiriXmlNodeSet, "|", rb_xml_node_set_union, 1);
507
+ rb_define_method(cNokogiriXmlNodeSet, "-", minus, 1);
508
+ rb_define_method(cNokogiriXmlNodeSet, "unlink", unlink_nodeset, 0);
509
+ rb_define_method(cNokogiriXmlNodeSet, "to_a", to_array, 0);
510
+ rb_define_method(cNokogiriXmlNodeSet, "dup", duplicate, 0);
511
+ rb_define_method(cNokogiriXmlNodeSet, "delete", delete, 1);
512
+ rb_define_method(cNokogiriXmlNodeSet, "&", intersection, 1);
513
+ rb_define_method(cNokogiriXmlNodeSet, "include?", include_eh, 1);
484
514
 
485
515
  decorate = rb_intern("decorate");
486
516
  }