diff --git a/ext/nokogiri/nokogiri.c b/ext/nokogiri/nokogiri.c index 4db653981c..1fe83031d0 100644 --- a/ext/nokogiri/nokogiri.c +++ b/ext/nokogiri/nokogiri.c @@ -196,7 +196,26 @@ Init_nokogiri() rb_const_set(mNokogiri, rb_intern("OTHER_LIBRARY_VERSIONS"), NOKOGIRI_STR_NEW2(NOKOGIRI_OTHER_LIBRARY_VERSIONS)); #endif +#if defined(_WIN32) && !defined(NOKOGIRI_PACKAGED_LIBRARIES) + /* + * We choose *not* to do use Ruby's memory management functions with windows DLLs because of this + * issue in libxml 2.9.12: + * + * https://github.com/sparklemotion/nokogiri/issues/2241 + * + * If the atexit() issue gets fixed in a future version of libxml2, then we may be able to skip + * this config only for the specific libxml2 versions 2.9.12. + * + * Alternatively, now that Ruby has a generational GC, it might be OK to let libxml2 use its + * default memory management functions (recall that this config was introduced to reduce memory + * bloat and allow Ruby to GC more often); but we should *really* test with production workloads + * before making that kind of a potentially-invasive change. + */ + rb_const_set(mNokogiri, rb_intern("LIBXML_MEMORY_MANAGEMENT"), NOKOGIRI_STR_NEW2("default")); +#else + rb_const_set(mNokogiri, rb_intern("LIBXML_MEMORY_MANAGEMENT"), NOKOGIRI_STR_NEW2("ruby")); xmlMemSetup((xmlFreeFunc)ruby_xfree, (xmlMallocFunc)ruby_xmalloc, (xmlReallocFunc)ruby_xrealloc, ruby_strdup); +#endif xmlInitParser(); diff --git a/lib/nokogiri/version/info.rb b/lib/nokogiri/version/info.rb index 8011525667..f6a9092b91 100644 --- a/lib/nokogiri/version/info.rb +++ b/lib/nokogiri/version/info.rb @@ -137,6 +137,7 @@ def to_hash else libxml["source"] = "system" end + libxml["memory_management"] = Nokogiri::LIBXML_MEMORY_MANAGEMENT libxml["iconv_enabled"] = libxml2_has_iconv? libxml["compiled"] = compiled_libxml_version.to_s libxml["loaded"] = loaded_libxml_version.to_s diff --git a/test/html/test_comments.rb b/test/html/test_comments.rb index 476fc4b473..7d207815f5 100644 --- a/test/html/test_comments.rb +++ b/test/html/test_comments.rb @@ -113,8 +113,7 @@ class TestComment < Nokogiri::TestCase let(:subject) { doc.at_css("div#under-test") } let(:inner_div) { doc.at_css("div#do-i-exist") } - if Nokogiri.uses_libxml? && Nokogiri::VersionInfo.instance.libxml2_using_packaged? - # see patches/libxml2/0006-htmlParseComment-treat-as-if-it-closed-the-comment.patch + if Nokogiri::VersionInfo.instance.libxml2_using_packaged? || (Nokogiri::VersionInfo.instance.libxml2_using_system? && Nokogiri.uses_libxml?(">=2.9.11")) it "behaves as if the comment is normally closed" do # COMPLIANT assert_equal 3, subject.children.length assert subject.children[0].comment? @@ -128,9 +127,7 @@ class TestComment < Nokogiri::TestCase end end - if Nokogiri.jruby? || Nokogiri::VersionInfo.instance.libxml2_using_system? - # this behavior may change to the above in libxml v2.9.11 depending on whether - # https://gitlab.gnome.org/GNOME/libxml2/-/merge_requests/82 is merged + if Nokogiri.jruby? || (Nokogiri::VersionInfo.instance.libxml2_using_system? && Nokogiri.uses_libxml?("<2.9.11")) it "behaves as if the comment encompasses the inner div" do # NON-COMPLIANT assert_equal 1, subject.children.length assert subject.children.first.comment?