nokogiri 1.12.5 → 1.13.9

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/README.md +9 -7
  4. data/bin/nokogiri +63 -50
  5. data/dependencies.yml +13 -64
  6. data/ext/nokogiri/extconf.rb +81 -46
  7. data/ext/nokogiri/gumbo.c +1 -1
  8. data/ext/nokogiri/html4_sax_parser_context.c +2 -3
  9. data/ext/nokogiri/nokogiri.h +9 -0
  10. data/ext/nokogiri/xml_attr.c +2 -2
  11. data/ext/nokogiri/xml_attribute_decl.c +3 -3
  12. data/ext/nokogiri/xml_cdata.c +1 -1
  13. data/ext/nokogiri/xml_document.c +41 -37
  14. data/ext/nokogiri/xml_document_fragment.c +0 -2
  15. data/ext/nokogiri/xml_dtd.c +10 -10
  16. data/ext/nokogiri/xml_element_decl.c +3 -3
  17. data/ext/nokogiri/xml_encoding_handler.c +25 -11
  18. data/ext/nokogiri/xml_entity_decl.c +5 -5
  19. data/ext/nokogiri/xml_namespace.c +41 -5
  20. data/ext/nokogiri/xml_node.c +708 -382
  21. data/ext/nokogiri/xml_node_set.c +4 -4
  22. data/ext/nokogiri/xml_reader.c +88 -11
  23. data/ext/nokogiri/xml_sax_parser_context.c +10 -3
  24. data/ext/nokogiri/xml_schema.c +3 -3
  25. data/ext/nokogiri/xml_text.c +1 -1
  26. data/ext/nokogiri/xml_xpath_context.c +76 -50
  27. data/ext/nokogiri/xslt_stylesheet.c +107 -9
  28. data/gumbo-parser/src/parser.c +0 -11
  29. data/lib/nokogiri/class_resolver.rb +67 -0
  30. data/lib/nokogiri/css/node.rb +9 -8
  31. data/lib/nokogiri/css/parser.rb +360 -341
  32. data/lib/nokogiri/css/parser.y +249 -244
  33. data/lib/nokogiri/css/parser_extras.rb +22 -20
  34. data/lib/nokogiri/css/syntax_error.rb +1 -0
  35. data/lib/nokogiri/css/tokenizer.rb +4 -3
  36. data/lib/nokogiri/css/tokenizer.rex +3 -2
  37. data/lib/nokogiri/css/xpath_visitor.rb +179 -82
  38. data/lib/nokogiri/css.rb +38 -6
  39. data/lib/nokogiri/decorators/slop.rb +8 -7
  40. data/lib/nokogiri/extension.rb +1 -1
  41. data/lib/nokogiri/gumbo.rb +1 -0
  42. data/lib/nokogiri/html.rb +16 -10
  43. data/lib/nokogiri/html4/builder.rb +1 -0
  44. data/lib/nokogiri/html4/document.rb +88 -77
  45. data/lib/nokogiri/html4/document_fragment.rb +11 -7
  46. data/lib/nokogiri/html4/element_description.rb +1 -0
  47. data/lib/nokogiri/html4/element_description_defaults.rb +426 -520
  48. data/lib/nokogiri/html4/entity_lookup.rb +2 -1
  49. data/lib/nokogiri/html4/sax/parser.rb +5 -2
  50. data/lib/nokogiri/html4/sax/parser_context.rb +1 -0
  51. data/lib/nokogiri/html4/sax/push_parser.rb +7 -7
  52. data/lib/nokogiri/html4.rb +11 -5
  53. data/lib/nokogiri/html5/document.rb +27 -10
  54. data/lib/nokogiri/html5/document_fragment.rb +5 -2
  55. data/lib/nokogiri/html5/node.rb +10 -3
  56. data/lib/nokogiri/html5.rb +69 -64
  57. data/lib/nokogiri/jruby/dependencies.rb +10 -9
  58. data/lib/nokogiri/syntax_error.rb +1 -0
  59. data/lib/nokogiri/version/constant.rb +2 -1
  60. data/lib/nokogiri/version/info.rb +20 -13
  61. data/lib/nokogiri/version.rb +1 -0
  62. data/lib/nokogiri/xml/attr.rb +5 -3
  63. data/lib/nokogiri/xml/attribute_decl.rb +2 -1
  64. data/lib/nokogiri/xml/builder.rb +34 -32
  65. data/lib/nokogiri/xml/cdata.rb +2 -1
  66. data/lib/nokogiri/xml/character_data.rb +1 -0
  67. data/lib/nokogiri/xml/document.rb +144 -103
  68. data/lib/nokogiri/xml/document_fragment.rb +41 -38
  69. data/lib/nokogiri/xml/dtd.rb +3 -2
  70. data/lib/nokogiri/xml/element_content.rb +1 -0
  71. data/lib/nokogiri/xml/element_decl.rb +2 -1
  72. data/lib/nokogiri/xml/entity_decl.rb +3 -2
  73. data/lib/nokogiri/xml/entity_reference.rb +1 -0
  74. data/lib/nokogiri/xml/namespace.rb +2 -0
  75. data/lib/nokogiri/xml/node/save_options.rb +8 -4
  76. data/lib/nokogiri/xml/node.rb +521 -351
  77. data/lib/nokogiri/xml/node_set.rb +50 -54
  78. data/lib/nokogiri/xml/notation.rb +12 -0
  79. data/lib/nokogiri/xml/parse_options.rb +12 -7
  80. data/lib/nokogiri/xml/pp/character_data.rb +8 -6
  81. data/lib/nokogiri/xml/pp/node.rb +24 -26
  82. data/lib/nokogiri/xml/pp.rb +1 -0
  83. data/lib/nokogiri/xml/processing_instruction.rb +2 -1
  84. data/lib/nokogiri/xml/reader.rb +20 -24
  85. data/lib/nokogiri/xml/relax_ng.rb +1 -0
  86. data/lib/nokogiri/xml/sax/document.rb +20 -19
  87. data/lib/nokogiri/xml/sax/parser.rb +37 -34
  88. data/lib/nokogiri/xml/sax/parser_context.rb +7 -3
  89. data/lib/nokogiri/xml/sax/push_parser.rb +5 -5
  90. data/lib/nokogiri/xml/sax.rb +1 -0
  91. data/lib/nokogiri/xml/schema.rb +7 -6
  92. data/lib/nokogiri/xml/searchable.rb +93 -62
  93. data/lib/nokogiri/xml/syntax_error.rb +5 -4
  94. data/lib/nokogiri/xml/text.rb +1 -0
  95. data/lib/nokogiri/xml/xpath/syntax_error.rb +2 -1
  96. data/lib/nokogiri/xml/xpath.rb +12 -0
  97. data/lib/nokogiri/xml/xpath_context.rb +2 -3
  98. data/lib/nokogiri/xml.rb +4 -3
  99. data/lib/nokogiri/xslt/stylesheet.rb +1 -0
  100. data/lib/nokogiri/xslt.rb +21 -13
  101. data/lib/nokogiri.rb +19 -16
  102. data/lib/xsd/xmlparser/nokogiri.rb +25 -24
  103. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  104. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +2445 -1919
  105. data/ports/archives/libxml2-2.10.3.tar.xz +0 -0
  106. data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
  107. metadata +103 -34
  108. data/patches/libxml2/0004-use-glibc-strlen.patch +0 -53
  109. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +0 -2511
  110. data/patches/libxml2/0007-Fix-XPath-recursion-limit.patch +0 -31
  111. data/patches/libxslt/0002-Fix-xml2-config-check-in-configure-script.patch +0 -19
  112. data/ports/archives/libxml2-2.9.12.tar.gz +0 -0
  113. data/ports/archives/libxslt-1.1.34.tar.gz +0 -0
@@ -170,6 +170,9 @@ int noko_io_read(void *ctx, char *buffer, int len);
170
170
  int noko_io_write(void *ctx, char *buffer, int len);
171
171
  int noko_io_close(void *ctx);
172
172
 
173
+ #define Noko_Node_Get_Struct(obj,type,sval) ((sval) = (type*)DATA_PTR(obj))
174
+ #define Noko_Namespace_Get_Struct(obj,type,sval) ((sval) = (type*)DATA_PTR(obj))
175
+
173
176
  VALUE noko_xml_node_wrap(VALUE klass, xmlNodePtr node) ;
174
177
  VALUE noko_xml_node_wrap_node_set_result(xmlNodePtr node, VALUE node_set) ;
175
178
  VALUE noko_xml_node_attrs(xmlNodePtr node) ;
@@ -200,6 +203,12 @@ NOKOPUBFUN VALUE Nokogiri_wrap_xml_document(VALUE klass,
200
203
  #define DISCARD_CONST_QUAL(t, v) ((t)(uintptr_t)(v))
201
204
  #define DISCARD_CONST_QUAL_XMLCHAR(v) DISCARD_CONST_QUAL(xmlChar *, v)
202
205
 
206
+ #if HAVE_RB_CATEGORY_WARNING
207
+ # define NOKO_WARN_DEPRECATION(message) rb_category_warning(RB_WARN_CATEGORY_DEPRECATED, message)
208
+ #else
209
+ # define NOKO_WARN_DEPRECATION(message) rb_warning(message)
210
+ #endif
211
+
203
212
  void Nokogiri_structured_error_func_save(libxmlStructuredErrorHandlerState *handler_state);
204
213
  void Nokogiri_structured_error_func_save_and_set(libxmlStructuredErrorHandlerState *handler_state, void *user_data,
205
214
  xmlStructuredErrorFunc handler);
@@ -16,7 +16,7 @@ set_value(VALUE self, VALUE content)
16
16
  xmlChar *value;
17
17
  xmlNode *cur;
18
18
 
19
- Data_Get_Struct(self, xmlAttr, attr);
19
+ Noko_Node_Get_Struct(self, xmlAttr, attr);
20
20
 
21
21
  if (attr->children) {
22
22
  xmlFreeNodeList(attr->children);
@@ -68,7 +68,7 @@ new (int argc, VALUE *argv, VALUE klass)
68
68
  rb_raise(rb_eArgError, "parameter must be a Nokogiri::XML::Document");
69
69
  }
70
70
 
71
- Data_Get_Struct(document, xmlDoc, xml_doc);
71
+ Noko_Node_Get_Struct(document, xmlDoc, xml_doc);
72
72
 
73
73
  node = xmlNewDocProp(
74
74
  xml_doc,
@@ -12,7 +12,7 @@ static VALUE
12
12
  attribute_type(VALUE self)
13
13
  {
14
14
  xmlAttributePtr node;
15
- Data_Get_Struct(self, xmlAttribute, node);
15
+ Noko_Node_Get_Struct(self, xmlAttribute, node);
16
16
  return INT2NUM((long)node->atype);
17
17
  }
18
18
 
@@ -26,7 +26,7 @@ static VALUE
26
26
  default_value(VALUE self)
27
27
  {
28
28
  xmlAttributePtr node;
29
- Data_Get_Struct(self, xmlAttribute, node);
29
+ Noko_Node_Get_Struct(self, xmlAttribute, node);
30
30
 
31
31
  if (node->defaultValue) { return NOKOGIRI_STR_NEW2(node->defaultValue); }
32
32
  return Qnil;
@@ -45,7 +45,7 @@ enumeration(VALUE self)
45
45
  xmlEnumerationPtr enm;
46
46
  VALUE list;
47
47
 
48
- Data_Get_Struct(self, xmlAttribute, node);
48
+ Noko_Node_Get_Struct(self, xmlAttribute, node);
49
49
 
50
50
  list = rb_ary_new();
51
51
  enm = node->tree;
@@ -25,7 +25,7 @@ new (int argc, VALUE *argv, VALUE klass)
25
25
 
26
26
  rb_scan_args(argc, argv, "2*", &doc, &content, &rest);
27
27
 
28
- Data_Get_Struct(doc, xmlDoc, xml_doc);
28
+ Noko_Node_Get_Struct(doc, xmlDoc, xml_doc);
29
29
 
30
30
  if (!NIL_P(content)) {
31
31
  content_str = (xmlChar *)StringValuePtr(content);
@@ -104,7 +104,11 @@ recursively_remove_namespaces_from_node(xmlNodePtr node)
104
104
  (node->type == XML_XINCLUDE_START) ||
105
105
  (node->type == XML_XINCLUDE_END)) &&
106
106
  node->nsDef) {
107
- xmlFreeNsList(node->nsDef);
107
+ xmlNsPtr curr = node->nsDef;
108
+ while (curr) {
109
+ noko_xml_document_pin_namespace(curr, node->doc);
110
+ curr = curr->next;
111
+ }
108
112
  node->nsDef = NULL;
109
113
  }
110
114
 
@@ -161,7 +165,7 @@ rb_xml_document_root_set(VALUE self, VALUE rb_new_root)
161
165
  rb_obj_class(rb_new_root));
162
166
  }
163
167
 
164
- Data_Get_Struct(rb_new_root, xmlNode, c_new_root);
168
+ Noko_Node_Get_Struct(rb_new_root, xmlNode, c_new_root);
165
169
 
166
170
  /* If the new root's document is not the same as the current document,
167
171
  * then we need to dup the node in to this document. */
@@ -533,59 +537,59 @@ block_caller(void *ctx, xmlNodePtr c_node, xmlNodePtr c_parent_node)
533
537
  static VALUE
534
538
  rb_xml_document_canonicalize(int argc, VALUE *argv, VALUE self)
535
539
  {
536
- VALUE mode;
537
- VALUE incl_ns;
538
- VALUE with_comments;
539
- xmlChar **ns;
540
- long ns_len, i;
540
+ VALUE rb_mode;
541
+ VALUE rb_namespaces;
542
+ VALUE rb_comments_p;
543
+ xmlChar **c_namespaces;
541
544
 
542
- xmlDocPtr doc;
543
- xmlOutputBufferPtr buf;
544
- xmlC14NIsVisibleCallback cb = NULL;
545
- void *ctx = NULL;
545
+ xmlDocPtr c_doc;
546
+ xmlOutputBufferPtr c_obuf;
547
+ xmlC14NIsVisibleCallback c_callback_wrapper = NULL;
548
+ void *rb_callback = NULL;
546
549
 
547
550
  VALUE rb_cStringIO;
548
- VALUE io;
551
+ VALUE rb_io;
549
552
 
550
- rb_scan_args(argc, argv, "03", &mode, &incl_ns, &with_comments);
553
+ rb_scan_args(argc, argv, "03", &rb_mode, &rb_namespaces, &rb_comments_p);
554
+ if (!NIL_P(rb_mode)) { Check_Type(rb_mode, T_FIXNUM); }
555
+ if (!NIL_P(rb_namespaces)) { Check_Type(rb_namespaces, T_ARRAY); }
551
556
 
552
- Data_Get_Struct(self, xmlDoc, doc);
557
+ Data_Get_Struct(self, xmlDoc, c_doc);
553
558
 
554
559
  rb_cStringIO = rb_const_get_at(rb_cObject, rb_intern("StringIO"));
555
- io = rb_class_new_instance(0, 0, rb_cStringIO);
556
- buf = xmlAllocOutputBuffer(NULL);
560
+ rb_io = rb_class_new_instance(0, 0, rb_cStringIO);
561
+ c_obuf = xmlAllocOutputBuffer(NULL);
557
562
 
558
- buf->writecallback = (xmlOutputWriteCallback)noko_io_write;
559
- buf->closecallback = (xmlOutputCloseCallback)noko_io_close;
560
- buf->context = (void *)io;
563
+ c_obuf->writecallback = (xmlOutputWriteCallback)noko_io_write;
564
+ c_obuf->closecallback = (xmlOutputCloseCallback)noko_io_close;
565
+ c_obuf->context = (void *)rb_io;
561
566
 
562
567
  if (rb_block_given_p()) {
563
- cb = block_caller;
564
- ctx = (void *)rb_block_proc();
568
+ c_callback_wrapper = block_caller;
569
+ rb_callback = (void *)rb_block_proc();
565
570
  }
566
571
 
567
- if (NIL_P(incl_ns)) {
568
- ns = NULL;
572
+ if (NIL_P(rb_namespaces)) {
573
+ c_namespaces = NULL;
569
574
  } else {
570
- Check_Type(incl_ns, T_ARRAY);
571
- ns_len = RARRAY_LEN(incl_ns);
572
- ns = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
573
- for (i = 0 ; i < ns_len ; i++) {
574
- VALUE entry = rb_ary_entry(incl_ns, i);
575
- ns[i] = (xmlChar *)StringValueCStr(entry);
575
+ long ns_len = RARRAY_LEN(rb_namespaces);
576
+ c_namespaces = calloc((size_t)ns_len + 1, sizeof(xmlChar *));
577
+ for (int j = 0 ; j < ns_len ; j++) {
578
+ VALUE entry = rb_ary_entry(rb_namespaces, j);
579
+ c_namespaces[j] = (xmlChar *)StringValueCStr(entry);
576
580
  }
577
581
  }
578
582
 
583
+ xmlC14NExecute(c_doc, c_callback_wrapper, rb_callback,
584
+ (int)(NIL_P(rb_mode) ? 0 : NUM2INT(rb_mode)),
585
+ c_namespaces,
586
+ (int)RTEST(rb_comments_p),
587
+ c_obuf);
579
588
 
580
- xmlC14NExecute(doc, cb, ctx,
581
- (int)(NIL_P(mode) ? 0 : NUM2INT(mode)),
582
- ns,
583
- (int) RTEST(with_comments),
584
- buf);
585
-
586
- xmlOutputBufferClose(buf);
589
+ free(c_namespaces);
590
+ xmlOutputBufferClose(c_obuf);
587
591
 
588
- return rb_funcall(io, rb_intern("string"), 0);
592
+ return rb_funcall(rb_io, rb_intern("string"), 0);
589
593
  }
590
594
 
591
595
  VALUE
@@ -28,8 +28,6 @@ new (int argc, VALUE *argv, VALUE klass)
28
28
  rb_node = noko_xml_node_wrap(klass, node);
29
29
  rb_obj_call_init(rb_node, argc, argv);
30
30
 
31
- if (rb_block_given_p()) { rb_yield(rb_node); }
32
-
33
31
  return rb_node;
34
32
  }
35
33
 
@@ -44,7 +44,7 @@ entities(VALUE self)
44
44
  xmlDtdPtr dtd;
45
45
  VALUE hash;
46
46
 
47
- Data_Get_Struct(self, xmlDtd, dtd);
47
+ Noko_Node_Get_Struct(self, xmlDtd, dtd);
48
48
 
49
49
  if (!dtd->entities) { return Qnil; }
50
50
 
@@ -57,9 +57,9 @@ entities(VALUE self)
57
57
 
58
58
  /*
59
59
  * call-seq:
60
- * notations
60
+ * notations() → Hash<name(String)⇒Notation>
61
61
  *
62
- * Get a hash of the notations for this DTD.
62
+ * [Returns] All the notations for this DTD in a Hash of Notation +name+ to Notation.
63
63
  */
64
64
  static VALUE
65
65
  notations(VALUE self)
@@ -67,7 +67,7 @@ notations(VALUE self)
67
67
  xmlDtdPtr dtd;
68
68
  VALUE hash;
69
69
 
70
- Data_Get_Struct(self, xmlDtd, dtd);
70
+ Noko_Node_Get_Struct(self, xmlDtd, dtd);
71
71
 
72
72
  if (!dtd->notations) { return Qnil; }
73
73
 
@@ -90,7 +90,7 @@ attributes(VALUE self)
90
90
  xmlDtdPtr dtd;
91
91
  VALUE hash;
92
92
 
93
- Data_Get_Struct(self, xmlDtd, dtd);
93
+ Noko_Node_Get_Struct(self, xmlDtd, dtd);
94
94
 
95
95
  hash = rb_hash_new();
96
96
 
@@ -113,7 +113,7 @@ elements(VALUE self)
113
113
  xmlDtdPtr dtd;
114
114
  VALUE hash;
115
115
 
116
- Data_Get_Struct(self, xmlDtd, dtd);
116
+ Noko_Node_Get_Struct(self, xmlDtd, dtd);
117
117
 
118
118
  if (!dtd->elements) { return Qnil; }
119
119
 
@@ -138,8 +138,8 @@ validate(VALUE self, VALUE document)
138
138
  xmlValidCtxtPtr ctxt;
139
139
  VALUE error_list;
140
140
 
141
- Data_Get_Struct(self, xmlDtd, dtd);
142
- Data_Get_Struct(document, xmlDoc, doc);
141
+ Noko_Node_Get_Struct(self, xmlDtd, dtd);
142
+ Noko_Node_Get_Struct(document, xmlDoc, doc);
143
143
  error_list = rb_ary_new();
144
144
 
145
145
  ctxt = xmlNewValidCtxt();
@@ -165,7 +165,7 @@ static VALUE
165
165
  system_id(VALUE self)
166
166
  {
167
167
  xmlDtdPtr dtd;
168
- Data_Get_Struct(self, xmlDtd, dtd);
168
+ Noko_Node_Get_Struct(self, xmlDtd, dtd);
169
169
 
170
170
  if (!dtd->SystemID) { return Qnil; }
171
171
 
@@ -182,7 +182,7 @@ static VALUE
182
182
  external_id(VALUE self)
183
183
  {
184
184
  xmlDtdPtr dtd;
185
- Data_Get_Struct(self, xmlDtd, dtd);
185
+ Noko_Node_Get_Struct(self, xmlDtd, dtd);
186
186
 
187
187
  if (!dtd->ExternalID) { return Qnil; }
188
188
 
@@ -14,7 +14,7 @@ static VALUE
14
14
  element_type(VALUE self)
15
15
  {
16
16
  xmlElementPtr node;
17
- Data_Get_Struct(self, xmlElement, node);
17
+ Noko_Node_Get_Struct(self, xmlElement, node);
18
18
  return INT2NUM((long)node->etype);
19
19
  }
20
20
 
@@ -28,7 +28,7 @@ static VALUE
28
28
  content(VALUE self)
29
29
  {
30
30
  xmlElementPtr node;
31
- Data_Get_Struct(self, xmlElement, node);
31
+ Noko_Node_Get_Struct(self, xmlElement, node);
32
32
 
33
33
  if (!node->content) { return Qnil; }
34
34
 
@@ -48,7 +48,7 @@ static VALUE
48
48
  prefix(VALUE self)
49
49
  {
50
50
  xmlElementPtr node;
51
- Data_Get_Struct(self, xmlElement, node);
51
+ Noko_Node_Get_Struct(self, xmlElement, node);
52
52
 
53
53
  if (!node->prefix) { return Qnil; }
54
54
 
@@ -3,70 +3,82 @@
3
3
  VALUE cNokogiriEncodingHandler;
4
4
 
5
5
 
6
+ static void
7
+ _xml_encoding_handler_dealloc(xmlCharEncodingHandlerPtr c_handler)
8
+ {
9
+ /* make sure iconv handlers are cleaned up and freed */
10
+ xmlCharEncCloseFunc(c_handler);
11
+ }
12
+
13
+
6
14
  /*
7
15
  * call-seq: Nokogiri::EncodingHandler.[](name)
8
16
  *
9
17
  * Get the encoding handler for +name+
10
18
  */
11
19
  static VALUE
12
- get(VALUE klass, VALUE key)
20
+ rb_xml_encoding_handler_s_get(VALUE klass, VALUE key)
13
21
  {
14
22
  xmlCharEncodingHandlerPtr handler;
15
23
 
16
24
  handler = xmlFindCharEncodingHandler(StringValueCStr(key));
17
25
  if (handler) {
18
- return Data_Wrap_Struct(klass, NULL, NULL, handler);
26
+ return Data_Wrap_Struct(klass, NULL, _xml_encoding_handler_dealloc, handler);
19
27
  }
20
28
 
21
29
  return Qnil;
22
30
  }
23
31
 
32
+
24
33
  /*
25
34
  * call-seq: Nokogiri::EncodingHandler.delete(name)
26
35
  *
27
36
  * Delete the encoding alias named +name+
28
37
  */
29
38
  static VALUE
30
- delete (VALUE klass, VALUE name)
39
+ rb_xml_encoding_handler_s_delete(VALUE klass, VALUE name)
31
40
  {
32
41
  if (xmlDelEncodingAlias(StringValueCStr(name))) { return Qnil; }
33
42
 
34
43
  return Qtrue;
35
44
  }
36
45
 
46
+
37
47
  /*
38
48
  * call-seq: Nokogiri::EncodingHandler.alias(from, to)
39
49
  *
40
50
  * Alias encoding handler with name +from+ to name +to+
41
51
  */
42
52
  static VALUE
43
- alias(VALUE klass, VALUE from, VALUE to)
53
+ rb_xml_encoding_handler_s_alias(VALUE klass, VALUE from, VALUE to)
44
54
  {
45
55
  xmlAddEncodingAlias(StringValueCStr(from), StringValueCStr(to));
46
56
 
47
57
  return to;
48
58
  }
49
59
 
60
+
50
61
  /*
51
62
  * call-seq: Nokogiri::EncodingHandler.clear_aliases!
52
63
  *
53
64
  * Remove all encoding aliases.
54
65
  */
55
66
  static VALUE
56
- clear_aliases(VALUE klass)
67
+ rb_xml_encoding_handler_s_clear_aliases(VALUE klass)
57
68
  {
58
69
  xmlCleanupEncodingAliases();
59
70
 
60
71
  return klass;
61
72
  }
62
73
 
74
+
63
75
  /*
64
76
  * call-seq: name
65
77
  *
66
78
  * Get the name of this EncodingHandler
67
79
  */
68
80
  static VALUE
69
- name(VALUE self)
81
+ rb_xml_encoding_handler_name(VALUE self)
70
82
  {
71
83
  xmlCharEncodingHandlerPtr handler;
72
84
 
@@ -75,6 +87,7 @@ name(VALUE self)
75
87
  return NOKOGIRI_STR_NEW2(handler->name);
76
88
  }
77
89
 
90
+
78
91
  void
79
92
  noko_init_xml_encoding_handler()
80
93
  {
@@ -82,9 +95,10 @@ noko_init_xml_encoding_handler()
82
95
 
83
96
  rb_undef_alloc_func(cNokogiriEncodingHandler);
84
97
 
85
- rb_define_singleton_method(cNokogiriEncodingHandler, "[]", get, 1);
86
- rb_define_singleton_method(cNokogiriEncodingHandler, "delete", delete, 1);
87
- rb_define_singleton_method(cNokogiriEncodingHandler, "alias", alias, 2);
88
- rb_define_singleton_method(cNokogiriEncodingHandler, "clear_aliases!", clear_aliases, 0);
89
- rb_define_method(cNokogiriEncodingHandler, "name", name, 0);
98
+ rb_define_singleton_method(cNokogiriEncodingHandler, "[]", rb_xml_encoding_handler_s_get, 1);
99
+ rb_define_singleton_method(cNokogiriEncodingHandler, "delete", rb_xml_encoding_handler_s_delete, 1);
100
+ rb_define_singleton_method(cNokogiriEncodingHandler, "alias", rb_xml_encoding_handler_s_alias, 2);
101
+ rb_define_singleton_method(cNokogiriEncodingHandler, "clear_aliases!", rb_xml_encoding_handler_s_clear_aliases, 0);
102
+
103
+ rb_define_method(cNokogiriEncodingHandler, "name", rb_xml_encoding_handler_name, 0);
90
104
  }
@@ -12,7 +12,7 @@ static VALUE
12
12
  original_content(VALUE self)
13
13
  {
14
14
  xmlEntityPtr node;
15
- Data_Get_Struct(self, xmlEntity, node);
15
+ Noko_Node_Get_Struct(self, xmlEntity, node);
16
16
 
17
17
  if (!node->orig) { return Qnil; }
18
18
 
@@ -29,7 +29,7 @@ static VALUE
29
29
  get_content(VALUE self)
30
30
  {
31
31
  xmlEntityPtr node;
32
- Data_Get_Struct(self, xmlEntity, node);
32
+ Noko_Node_Get_Struct(self, xmlEntity, node);
33
33
 
34
34
  if (!node->content) { return Qnil; }
35
35
 
@@ -46,7 +46,7 @@ static VALUE
46
46
  entity_type(VALUE self)
47
47
  {
48
48
  xmlEntityPtr node;
49
- Data_Get_Struct(self, xmlEntity, node);
49
+ Noko_Node_Get_Struct(self, xmlEntity, node);
50
50
 
51
51
  return INT2NUM((int)node->etype);
52
52
  }
@@ -61,7 +61,7 @@ static VALUE
61
61
  external_id(VALUE self)
62
62
  {
63
63
  xmlEntityPtr node;
64
- Data_Get_Struct(self, xmlEntity, node);
64
+ Noko_Node_Get_Struct(self, xmlEntity, node);
65
65
 
66
66
  if (!node->ExternalID) { return Qnil; }
67
67
 
@@ -78,7 +78,7 @@ static VALUE
78
78
  system_id(VALUE self)
79
79
  {
80
80
  xmlEntityPtr node;
81
- Data_Get_Struct(self, xmlEntity, node);
81
+ Noko_Node_Get_Struct(self, xmlEntity, node);
82
82
 
83
83
  if (!node->SystemID) { return Qnil; }
84
84
 
@@ -25,13 +25,15 @@
25
25
  VALUE cNokogiriXmlNamespace ;
26
26
 
27
27
  static void
28
- dealloc_namespace(xmlNsPtr ns)
28
+ _xml_namespace_dealloc(void *ptr)
29
29
  {
30
30
  /*
31
31
  * this deallocator is only used for namespace nodes that are part of an xpath
32
32
  * node set. see noko_xml_namespace_wrap().
33
33
  */
34
+ xmlNsPtr ns = ptr;
34
35
  NOKOGIRI_DEBUG_START(ns) ;
36
+
35
37
  if (ns->href) {
36
38
  xmlFree(DISCARD_CONST_QUAL_XMLCHAR(ns->href));
37
39
  }
@@ -42,6 +44,36 @@ dealloc_namespace(xmlNsPtr ns)
42
44
  NOKOGIRI_DEBUG_END(ns) ;
43
45
  }
44
46
 
47
+ #ifdef HAVE_RB_GC_LOCATION
48
+ static void
49
+ _xml_namespace_update_references(void *ptr)
50
+ {
51
+ xmlNsPtr ns = ptr;
52
+ if (ns->_private) {
53
+ ns->_private = (void *)rb_gc_location((VALUE)ns->_private);
54
+ }
55
+ }
56
+ #else
57
+ # define _xml_namespace_update_references 0
58
+ #endif
59
+
60
+ static const rb_data_type_t nokogiri_xml_namespace_type_with_dealloc = {
61
+ "Nokogiri/XMLNamespace/WithDealloc",
62
+ {0, _xml_namespace_dealloc, 0, _xml_namespace_update_references},
63
+ 0, 0,
64
+ #ifdef RUBY_TYPED_FREE_IMMEDIATELY
65
+ RUBY_TYPED_FREE_IMMEDIATELY,
66
+ #endif
67
+ };
68
+
69
+ static const rb_data_type_t nokogiri_xml_namespace_type_without_dealloc = {
70
+ "Nokogiri/XMLNamespace/WithoutDealloc",
71
+ {0, 0, 0, _xml_namespace_update_references},
72
+ 0, 0,
73
+ #ifdef RUBY_TYPED_FREE_IMMEDIATELY
74
+ RUBY_TYPED_FREE_IMMEDIATELY,
75
+ #endif
76
+ };
45
77
 
46
78
  /*
47
79
  * call-seq:
@@ -54,7 +86,7 @@ prefix(VALUE self)
54
86
  {
55
87
  xmlNsPtr ns;
56
88
 
57
- Data_Get_Struct(self, xmlNs, ns);
89
+ Noko_Namespace_Get_Struct(self, xmlNs, ns);
58
90
  if (!ns->prefix) { return Qnil; }
59
91
 
60
92
  return NOKOGIRI_STR_NEW2(ns->prefix);
@@ -71,7 +103,7 @@ href(VALUE self)
71
103
  {
72
104
  xmlNsPtr ns;
73
105
 
74
- Data_Get_Struct(self, xmlNs, ns);
106
+ Noko_Namespace_Get_Struct(self, xmlNs, ns);
75
107
  if (!ns->href) { return Qnil; }
76
108
 
77
109
  return NOKOGIRI_STR_NEW2(ns->href);
@@ -87,14 +119,18 @@ noko_xml_namespace_wrap(xmlNsPtr c_namespace, xmlDocPtr c_document)
87
119
  }
88
120
 
89
121
  if (c_document) {
90
- rb_namespace = Data_Wrap_Struct(cNokogiriXmlNamespace, 0, 0, c_namespace);
122
+ rb_namespace = TypedData_Wrap_Struct(cNokogiriXmlNamespace,
123
+ &nokogiri_xml_namespace_type_without_dealloc,
124
+ c_namespace);
91
125
 
92
126
  if (DOC_RUBY_OBJECT_TEST(c_document)) {
93
127
  rb_iv_set(rb_namespace, "@document", DOC_RUBY_OBJECT(c_document));
94
128
  rb_ary_push(DOC_NODE_CACHE(c_document), rb_namespace);
95
129
  }
96
130
  } else {
97
- rb_namespace = Data_Wrap_Struct(cNokogiriXmlNamespace, 0, dealloc_namespace, c_namespace);
131
+ rb_namespace = TypedData_Wrap_Struct(cNokogiriXmlNamespace,
132
+ &nokogiri_xml_namespace_type_with_dealloc,
133
+ c_namespace);
98
134
  }
99
135
 
100
136
  c_namespace->_private = (void *)rb_namespace;