ext/RMagick/rmagick.c in rmagick-3.0.0 vs ext/RMagick/rmagick.c in rmagick-3.1.0
- old
+ new
@@ -13,10 +13,24 @@
#include "rmagick.h"
+static VALUE
+rm_yield_body(VALUE object)
+{
+ return rb_yield(object);
+}
+
+static VALUE
+rm_yield_handle_exception(VALUE allocated_area, VALUE exc)
+{
+ magick_free((void *)allocated_area);
+ rb_exc_raise(exc);
+ return Qnil; /* not reachable */
+}
+
/**
* If called with the optional block, iterates over the colors, otherwise
* returns an array of Magick::Color objects.
*
* Ruby usage:
@@ -46,11 +60,11 @@
if (rb_block_given_p())
{
for (x = 0; x < number_colors; x++)
{
- (void) rb_yield(Import_ColorInfo(color_info_list[x]));
+ rb_rescue(rm_yield_body, Import_ColorInfo(color_info_list[x]), rm_yield_handle_exception, (VALUE)color_info_list);
}
magick_free((void *)color_info_list);
return class;
}
else
@@ -94,11 +108,11 @@
if (rb_block_given_p())
{
for (x = 0; x < number_types; x++)
{
- (void) rb_yield(Import_TypeInfo((const TypeInfo *)type_info[x]));
+ rb_rescue(rm_yield_body, Import_TypeInfo((const TypeInfo *)type_info[x]), rm_yield_handle_exception, (VALUE)type_info);
}
magick_free((void *)type_info);
return class;
}
else
@@ -133,14 +147,14 @@
static VALUE
MagickInfo_to_format(const MagickInfo *magick_info)
{
char mode[4];
- mode[0] = magick_info->blob_support ? '*': ' ';
- mode[1] = magick_info->decoder ? 'r' : '-';
- mode[2] = magick_info->encoder ? 'w' : '-';
- mode[3] = magick_info->encoder && magick_info->adjoin ? '+' : '-';
+ mode[0] = GetMagickBlobSupport(magick_info) ? '*': ' ';
+ mode[1] = GetImageDecoder(magick_info) ? 'r' : '-';
+ mode[2] = GetImageEncoder(magick_info) ? 'w' : '-';
+ mode[3] = GetMagickAdjoin(magick_info) ? '+' : '-';
return rb_str_new(mode, sizeof(mode));
}
@@ -243,10 +257,14 @@
}
else if (id == rb_intern("file"))
{
res = FileResource;
}
+ else if (id == rb_intern("time"))
+ {
+ res = TimeResource;
+ }
else
{
rb_raise(rb_eArgError, "unknown resource: `:%s'", rb_id2name(id));
}
break;
@@ -274,9 +292,13 @@
res = DiskResource;
}
else if (rm_strcasecmp("file", str) == 0)
{
res = FileResource;
+ }
+ else if (rm_strcasecmp("time", str) == 0)
+ {
+ res = TimeResource;
}
else
{
rb_raise(rb_eArgError, "unknown resource: `%s'", str);
}