about summary refs log tree commit homepage
path: root/ext/kcar/kcar.rl
diff options
context:
space:
mode:
Diffstat (limited to 'ext/kcar/kcar.rl')
-rw-r--r--ext/kcar/kcar.rl36
1 files changed, 24 insertions, 12 deletions
diff --git a/ext/kcar/kcar.rl b/ext/kcar/kcar.rl
index 1130b75..4c66fb5 100644
--- a/ext/kcar/kcar.rl
+++ b/ext/kcar/kcar.rl
@@ -409,29 +409,41 @@ post_exec: /* "_out:" also goes here */
   assert(hp->offset <= len && "offset longer than length");
 }
 
-static struct http_parser *data_get(VALUE self)
+static void kcar_mark(void *ptr)
 {
-  struct http_parser *hp;
+  struct http_parser *hp = ptr;
 
-  Data_Get_Struct(self, struct http_parser, hp);
-  assert(hp && "failed to extract http_parser struct");
-  return hp;
+  rb_gc_mark(hp->cont);
+  rb_gc_mark(hp->status);
 }
 
-static void mark(void *ptr)
+static size_t kcar_memsize(const void *ptr)
 {
-  struct http_parser *hp = ptr;
+  return sizeof(struct http_parser);
+}
 
-  rb_gc_mark(hp->cont);
-  rb_gc_mark(hp->status);
+static const rb_data_type_t kcar_type = {
+  "kcar_parser",
+  { kcar_mark, RUBY_TYPED_DEFAULT_FREE, kcar_memsize, /* reserved */ },
+  /* parent, data, [ flags ] */
+};
+
+static VALUE kcar_alloc(VALUE klass)
+{
+  struct http_parser *hp;
+  return TypedData_Make_Struct(klass, struct http_parser, &kcar_type, hp);
 }
 
-static VALUE alloc(VALUE klass)
+static struct http_parser *data_get(VALUE self)
 {
   struct http_parser *hp;
-  return Data_Make_Struct(klass, struct http_parser, mark, -1, hp);
+
+  TypedData_Get_Struct(self, struct http_parser, &kcar_type, hp);
+  assert(hp && "failed to extract http_parser struct");
+  return hp;
 }
 
+
 /**
  * call-seq:
  *    Kcar::Parser.new => parser
@@ -678,7 +690,7 @@ void Init_kcar_ext(void)
 
   eParserError = rb_define_class_under(mKcar, "ParserError", rb_eIOError);
 
-  rb_define_alloc_func(cParser, alloc);
+  rb_define_alloc_func(cParser, kcar_alloc);
   rb_define_method(cParser, "initialize", initialize, 0);
   rb_define_method(cParser, "reset", initialize, 0);
   rb_define_method(cParser, "headers", headers, 2);