]> git.wincent.com - wikitext.git/commitdiff
Add GC_WRAP_ARY macro
authorWincent Colaiuta <win@wincent.com>
Sat, 23 Feb 2008 15:12:56 +0000 (16:12 +0100)
committerWincent Colaiuta <win@wincent.com>
Sat, 23 Feb 2008 15:12:56 +0000 (16:12 +0100)
Clean up Data_Wrap_Struct usage a little by encapsulating the pattern
of "call Data_Wrap_Struct() and store return value on stack in a
variable marked as volatile" in a macro.

Signed-off-by: Wincent Colaiuta <win@wincent.com>
ext/ary.h
ext/parser.c

index 8350465f3cb6245bdefc321101a0799f87c06815..11278d50246420406cdeb26768c37c4edecb21aa 100644 (file)
--- a/ext/ary.h
+++ b/ext/ary.h
@@ -26,6 +26,10 @@ typedef struct
 
 #define NO_ITEM(item) (item == INT_MAX)
 
+// Mark the ary struct designated by ptr as a participant in Ruby's mark-and-sweep garbage collection scheme.
+// A variable named name is placed on the C stack to prevent the structure from being prematurely collected.
+#define GC_WRAP_ARY(ptr, name) volatile VALUE name = Data_Wrap_Struct(rb_cObject, 0, ary_free, ptr)
+
 inline ary_t *ary_new(void)
 {
     ary_t *ary      = ALLOC_N(ary_t, 1);
index 3220fc81ff3b7bcb6543b51582867c57766b9153..dcb96a795fe60be2a2c1cef71b1b7b04d4b69f2d 100644 (file)
@@ -930,11 +930,11 @@ VALUE Wikitext_parser_parse(int argc, VALUE *argv, VALUE self)
     parser->external_link_class     = link_class;
     parser->img_prefix              = rb_iv_get(self, "@img_prefix");
     parser->scope                   = ary_new();
-    volatile VALUE scope_gc         = Data_Wrap_Struct(rb_cObject, 0, ary_free, parser->scope);
+    GC_WRAP_ARY(parser->scope, scope_gc);
     parser->line                    = ary_new();
-    volatile VALUE line_gc          = Data_Wrap_Struct(rb_cObject, 0, ary_free, parser->line);
+    GC_WRAP_ARY(parser->line, line_gc);
     parser->line_buffer             = ary_new();
-    volatile VALUE line_buffer_gc   = Data_Wrap_Struct(rb_cObject, 0, ary_free, parser->line_buffer);
+    GC_WRAP_ARY(parser->line_buffer, line_buffer_gc);
     parser->pending_crlf            = Qfalse;
     parser->autolink                = rb_iv_get(self, "@autolink");
     parser->treat_slash_as_special  = rb_iv_get(self, "@treat_slash_as_special");