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); }