Skip to content
This repository has been archived by the owner on Aug 26, 2023. It is now read-only.

Commit

Permalink
Register all global VALUES as mark objects
Browse files Browse the repository at this point in the history
Previously it was possible for these objects to be garbage collected
(the constants could be unassigned in Ruby) or moved as part of GC
compaction (reproducible with GC.verify_compaction_references).

This commit marks all the global variables in nokogumbo.c using
rb_gc_register_mark_object to ensure that they can't be moved.
  • Loading branch information
jhawthorn authored and stevecheckoway committed Nov 20, 2020
1 parent 28c5940 commit 9b5a886
Showing 1 changed file with 6 additions and 0 deletions.
6 changes: 6 additions & 0 deletions ext/nokogumbo/nokogumbo.c
Expand Up @@ -724,10 +724,15 @@ void Init_nokogumbo() {
VALUE mNokogiri = rb_const_get(rb_cObject, rb_intern_const("Nokogiri"));
VALUE mNokogiriXml = rb_const_get(mNokogiri, rb_intern_const("XML"));
cNokogiriXmlSyntaxError = rb_const_get(mNokogiriXml, rb_intern_const("SyntaxError"));
rb_gc_register_mark_object(cNokogiriXmlSyntaxError);
cNokogiriXmlElement = rb_const_get(mNokogiriXml, rb_intern_const("Element"));
rb_gc_register_mark_object(cNokogiriXmlElement);
cNokogiriXmlText = rb_const_get(mNokogiriXml, rb_intern_const("Text"));
rb_gc_register_mark_object(cNokogiriXmlText);
cNokogiriXmlCData = rb_const_get(mNokogiriXml, rb_intern_const("CDATA"));
rb_gc_register_mark_object(cNokogiriXmlCData);
cNokogiriXmlComment = rb_const_get(mNokogiriXml, rb_intern_const("Comment"));
rb_gc_register_mark_object(cNokogiriXmlComment);

// Interned symbols.
new = rb_intern_const("new");
Expand All @@ -740,6 +745,7 @@ void Init_nokogumbo() {
// Class constants.
VALUE HTML5 = rb_const_get(mNokogiri, rb_intern_const("HTML5"));
Document = rb_const_get(HTML5, rb_intern_const("Document"));
rb_gc_register_mark_object(Document);

// Interned symbols.
internal_subset = rb_intern_const("internal_subset");
Expand Down

0 comments on commit 9b5a886

Please sign in to comment.