From 68ff16f20e148653ed79d78cb19e3166cc54898d Mon Sep 17 00:00:00 2001 From: ser1zw Date: Sun, 10 Jul 2011 23:46:20 +0900 Subject: [PATCH] modified CvError to handle errors --- ext/opencv/cverror.cpp | 131 ++++++++++++++++++++++++----------------- ext/opencv/cverror.h | 57 +----------------- ext/opencv/opencv.cpp | 34 ++++------- test/test_cverror.rb | 50 ++++++++++++++++ 4 files changed, 140 insertions(+), 132 deletions(-) create mode 100755 test/test_cverror.rb diff --git a/ext/opencv/cverror.cpp b/ext/opencv/cverror.cpp index 7220a72..6b9ba6e 100644 --- a/ext/opencv/cverror.cpp +++ b/ext/opencv/cverror.cpp @@ -9,7 +9,7 @@ ************************************************************/ #include "cverror.h" /* - * Document-module: OpenCV::CvError + * Document-class: OpenCV::CvError * * =Internal OpenCV errors * @@ -57,75 +57,90 @@ * * CvStatusNotImplemented * * CvStsBadMemoryBlock */ -#define RESIST_CVERROR(object_name, error_code, parent) st_insert(cv_error, (st_data_t)error_code, (st_data_t)rb_define_class_under(rb_module_opencv(), object_name, parent)) __NAMESPACE_BEGIN_OPENCV __NAMESPACE_BEGIN_CVERROR st_table *cv_error = st_init_numtable(); -VALUE module; +VALUE rb_klass; void -define_ruby_module() +REGISTER_CVERROR(const char* object_name, int error_code) { + st_insert(cv_error, (st_data_t)error_code, + (st_data_t)rb_define_class_under(rb_module_opencv(), object_name, rb_klass)); +} + +VALUE +rb_class() +{ + return rb_klass; +} + +void define_ruby_class() +{ + if (rb_klass) + return; + /* * opencv = rb_define_module("OpenCV"); * * note: this comment is used by rdoc. */ VALUE opencv = rb_module_opencv(); - - module = rb_define_module_under(opencv, "CvError"); - RESIST_CVERROR("CvStatusBackTrace", CV_StsBackTrace, rb_eStandardError); - RESIST_CVERROR("CvStatusError", CV_StsError, rb_eStandardError); - RESIST_CVERROR("CvStatusInternal", CV_StsInternal, rb_eStandardError); - RESIST_CVERROR("CvStatusNoMemory", CV_StsNoMem, rb_eNoMemError); - RESIST_CVERROR("CvStatusBadArgument", CV_StsBadArg, rb_eArgError); - RESIST_CVERROR("CvStatusBadFunction", CV_StsBadFunc, rb_eStandardError); - RESIST_CVERROR("CvStatusNoConverge", CV_StsNoConv, rb_eStandardError); - RESIST_CVERROR("CvStatusAutoTrace", CV_StsAutoTrace, rb_eStandardError); - - RESIST_CVERROR("CvHeaderIsNull", CV_HeaderIsNull, rb_eStandardError); - RESIST_CVERROR("CvBadImageSize", CV_BadImageSize, rb_eRangeError); - RESIST_CVERROR("CvBadOffset", CV_BadOffset, rb_eStandardError); - RESIST_CVERROR("CvBadDataPointer", CV_BadDataPtr, rb_eStandardError); - RESIST_CVERROR("CvBadStep", CV_BadStep, rb_eStandardError); - RESIST_CVERROR("CvBadModelOrChannelSequence", CV_BadModelOrChSeq, rb_eStandardError); - RESIST_CVERROR("CvBadNumChannels", CV_BadNumChannels, rb_eStandardError); - RESIST_CVERROR("CvBadNumChannel1U", CV_BadNumChannel1U, rb_eStandardError); - RESIST_CVERROR("CvNBadDepth", CV_BadDepth, rb_eStandardError); - RESIST_CVERROR("CvBadAlphaChannel", CV_BadAlphaChannel, rb_eStandardError); - RESIST_CVERROR("CvBadOrder", CV_BadOrder, rb_eStandardError); - RESIST_CVERROR("CvBadOrigin", CV_BadOrigin, rb_eStandardError); - RESIST_CVERROR("CvBadAlign", CV_BadAlign, rb_eStandardError); - RESIST_CVERROR("CvBadCallBack", CV_BadCallBack, rb_eStandardError); - RESIST_CVERROR("CvBadTileSize", CV_BadTileSize, rb_eStandardError); - RESIST_CVERROR("CvBadCOI", CV_BadCOI, rb_eStandardError); - RESIST_CVERROR("CvBadROISize", CV_BadROISize, rb_eStandardError); - - RESIST_CVERROR("CvMaskIsTiled", CV_MaskIsTiled, rb_eStandardError); - - RESIST_CVERROR("CvStatusNullPointer", CV_StsNullPtr, rb_eStandardError); - RESIST_CVERROR("CvStatusVectorLengthError", CV_StsVecLengthErr, rb_eStandardError); - RESIST_CVERROR("CvStatusFilterStructContentError", CV_StsFilterStructContentErr, rb_eStandardError); - RESIST_CVERROR("CvStatusKernelStructContentError", CV_StsKernelStructContentErr, rb_eStandardError); - RESIST_CVERROR("CvStatusFilterOffsetError", CV_StsFilterOffsetErr, rb_eStandardError); - - RESIST_CVERROR("CvStatusBadSize", CV_StsBadSize, rb_eStandardError); - RESIST_CVERROR("CvStatusDivByZero", CV_StsDivByZero, rb_eStandardError); - RESIST_CVERROR("CvStatusInplaceNotSupported", CV_StsInplaceNotSupported, rb_eStandardError); - RESIST_CVERROR("CvStatusObjectNotFound", CV_StsObjectNotFound, rb_eStandardError); - RESIST_CVERROR("CvStatusUnmatchedFormats", CV_StsUnmatchedFormats, rb_eStandardError); - RESIST_CVERROR("CvStatusBadFlag", CV_StsBadFlag, rb_eStandardError); - RESIST_CVERROR("CvStatusBadPoint", CV_StsBadPoint, rb_eStandardError); - RESIST_CVERROR("CvStatusBadMask", CV_StsBadMask, rb_eStandardError); - RESIST_CVERROR("CvStatusUnmatchedSizes", CV_StsUnmatchedSizes, rb_eStandardError); - RESIST_CVERROR("CvStatusUnsupportedFormat", CV_StsUnsupportedFormat, rb_eStandardError); - RESIST_CVERROR("CvStatusOutOfRange", CV_StsOutOfRange, rb_eStandardError); - RESIST_CVERROR("CvStatusParseError", CV_StsParseError, rb_eStandardError); - RESIST_CVERROR("CvStatusNotImplemented", CV_StsNotImplemented, rb_eNotImpError); - RESIST_CVERROR("CvStsBadMemoryBlock", CV_StsBadMemBlock,rb_eStandardError); + + rb_klass = rb_define_class_under(opencv, "CvError", rb_eStandardError); + REGISTER_CVERROR("CvStsBackTrace", CV_StsBackTrace); + REGISTER_CVERROR("CvStsError", CV_StsError); + REGISTER_CVERROR("CvStsInternal", CV_StsInternal); + REGISTER_CVERROR("CvStsNoMem", CV_StsNoMem); + REGISTER_CVERROR("CvStsBadArg", CV_StsBadArg); + REGISTER_CVERROR("CvStsBadFunc", CV_StsBadFunc); + REGISTER_CVERROR("CvStsNoConv", CV_StsNoConv); + REGISTER_CVERROR("CvStsAutoTrace", CV_StsAutoTrace); + REGISTER_CVERROR("CvHeaderIsNull", CV_HeaderIsNull); + REGISTER_CVERROR("CvBadImageSize", CV_BadImageSize); + REGISTER_CVERROR("CvBadOffset", CV_BadOffset); + REGISTER_CVERROR("CvBadDataPtr", CV_BadDataPtr); + REGISTER_CVERROR("CvBadStep", CV_BadStep); + REGISTER_CVERROR("CvBadModelOrChSeq", CV_BadModelOrChSeq); + REGISTER_CVERROR("CvBadNumChannels", CV_BadNumChannels); + REGISTER_CVERROR("CvBadNumChannel1U", CV_BadNumChannel1U); + REGISTER_CVERROR("CvBadDepth", CV_BadDepth); + REGISTER_CVERROR("CvBadAlphaChannel", CV_BadAlphaChannel); + REGISTER_CVERROR("CvBadOrder", CV_BadOrder); + REGISTER_CVERROR("CvBadOrigin", CV_BadOrigin); + REGISTER_CVERROR("CvBadAlign", CV_BadAlign); + REGISTER_CVERROR("CvBadCallBack", CV_BadCallBack); + REGISTER_CVERROR("CvBadTileSize", CV_BadTileSize); + REGISTER_CVERROR("CvBadCOI", CV_BadCOI); + REGISTER_CVERROR("CvBadROISize", CV_BadROISize); + REGISTER_CVERROR("CvMaskIsTiled", CV_MaskIsTiled); + REGISTER_CVERROR("CvStsNullPtr", CV_StsNullPtr); + REGISTER_CVERROR("CvStsVecLengthErr", CV_StsVecLengthErr); + REGISTER_CVERROR("CvStsFilterStructContentErr", CV_StsFilterStructContentErr); + REGISTER_CVERROR("CvStsKernelStructContentErr", CV_StsKernelStructContentErr); + REGISTER_CVERROR("CvStsFilterOffsetErr", CV_StsFilterOffsetErr); + REGISTER_CVERROR("CvStsBadSize", CV_StsBadSize); + REGISTER_CVERROR("CvStsDivByZero", CV_StsDivByZero); + REGISTER_CVERROR("CvStsInplaceNotSupported", CV_StsInplaceNotSupported); + REGISTER_CVERROR("CvStsObjectNotFound", CV_StsObjectNotFound); + REGISTER_CVERROR("CvStsUnmatchedFormats", CV_StsUnmatchedFormats); + REGISTER_CVERROR("CvStsBadFlag", CV_StsBadFlag); + REGISTER_CVERROR("CvStsBadPoint", CV_StsBadPoint); + REGISTER_CVERROR("CvStsBadMask", CV_StsBadMask); + REGISTER_CVERROR("CvStsUnmatchedSizes", CV_StsUnmatchedSizes); + REGISTER_CVERROR("CvStsUnsupportedFormat", CV_StsUnsupportedFormat); + REGISTER_CVERROR("CvStsOutOfRange", CV_StsOutOfRange); + REGISTER_CVERROR("CvStsParseError", CV_StsParseError); + REGISTER_CVERROR("CvStsNotImplemented", CV_StsNotImplemented); + REGISTER_CVERROR("CvStsBadMemBlock", CV_StsBadMemBlock); + REGISTER_CVERROR("CvStsAssert", CV_StsAssert); + REGISTER_CVERROR("CvGpuNotSupported", CV_GpuNotSupported); + REGISTER_CVERROR("CvGpuApiCallError", CV_GpuApiCallError); + REGISTER_CVERROR("CvGpuNppCallError", CV_GpuNppCallError); + REGISTER_CVERROR("CvGpuCufftCallError", CV_GpuCufftCallError); } VALUE @@ -136,5 +151,11 @@ by_code(int error_code) return klass ? klass : rb_eStandardError; } +void +raise_cverror(cv::Exception e) +{ + rb_raise(by_code(e.code), e.what()); +} + __NAMESPACE_END_CVERROR __NAMESPACE_END_OPENCV diff --git a/ext/opencv/cverror.h b/ext/opencv/cverror.h index 455f3e6..0c0d35b 100644 --- a/ext/opencv/cverror.h +++ b/ext/opencv/cverror.h @@ -12,66 +12,15 @@ #include "opencv.h" -#define __NAMESPACE_BEGIN_CVERROR namespace mCvError{ +#define __NAMESPACE_BEGIN_CVERROR namespace cCvError { #define __NAMESPACE_END_CVERROR } __NAMESPACE_BEGIN_OPENCV __NAMESPACE_BEGIN_CVERROR -/* - VALUE - status_back_trace, - status_error, - status_internal, - status_no_memory, - status_bad_argument, - status_bad_function, - status_no_converge, - status_auto_trace, - - header_is_null, - bad_image_size, - bad_offset, - bad_data_pointer, - bad_step, - bad_model_or_channel_seqence, - bad_num_channels, - bad_num_channel1U, - bad_depth, - bad_alpha_channel, - bad_order, - bad_origin, - bad_align, - bad_callback, - bad_tile_size, - bad_COI, - bad_ROI_size, - - mask_is_tiled, - - status_null_pointer, - status_vector_length_error, - status_filter_struct_content_error, - status_kernel_struct_content_error, - status_filter_offset_error, - - status_bad_size, - status_div_by_zero, - status_inplace_not_supported, - status_object_not_found, - status_unmatched_formats, - status_bad_flags, - status_bad_point, - status_bad_mask, - status_unmatched_sizes, - status_unsupported_format, - status_out_of_range, - status_parse_error, - status_not_implemented, - status_bad_memory_block; -*/ -void define_ruby_module(); +void define_ruby_class(); VALUE by_code(int error_code); +void raise_cverror(cv::Exception e); __NAMESPACE_END_CVERROR __NAMESPACE_END_OPENCV diff --git a/ext/opencv/opencv.cpp b/ext/opencv/opencv.cpp index 933a9f0..f4b453b 100644 --- a/ext/opencv/opencv.cpp +++ b/ext/opencv/opencv.cpp @@ -138,26 +138,6 @@ rb_module_opencv() return rb_module; } -/* - * convert OpenCV internal error to Ruby exception. - */ -int -error_callback(int status, - const char *function_name, - const char *error_message, - const char *file_name, - int line, - void *user_data) -{ - int error_code = (CvStatus)cvGetErrStatus(); - if (error_code) { - OPENCV_RSTERR(); // = CV_StsOk - rb_warn("OpenCV error code (%d) : %s (%d in %s)", error_code, function_name, line, file_name); - rb_raise(mCvError::by_code(error_code), "%s", error_message); - } - return 0; -} - void define_ruby_module() { @@ -578,17 +558,25 @@ CREATE_CVTCOLOR_FUNC(rb_Luv2RGB, CV_Luv2RGB, 3, 3); CREATE_CVTCOLOR_FUNC(rb_HLS2BGR, CV_HLS2BGR, 3, 3); CREATE_CVTCOLOR_FUNC(rb_HLS2RGB, CV_HLS2RGB, 3, 3); +int +error_callback(int status, const char *function_name, const char *error_message, + const char *file_name, int line, void *user_data) +{ + // dummy + return 0; +} + __NAMESPACE_END_OPENCV -extern "C"{ +extern "C" { void Init_opencv() { cvRedirectError((CvErrorCallback)mOpenCV::error_callback); - + mOpenCV::define_ruby_module(); - mOpenCV::mCvError::define_ruby_module(); + mOpenCV::cCvError::define_ruby_class(); mOpenCV::cCvPoint::define_ruby_class(); mOpenCV::cCvPoint2D32f::define_ruby_class(); mOpenCV::cCvPoint3D32f::define_ruby_class(); diff --git a/test/test_cverror.rb b/test/test_cverror.rb new file mode 100755 index 0000000..7cff222 --- /dev/null +++ b/test/test_cverror.rb @@ -0,0 +1,50 @@ +#!/usr/bin/env ruby +# -*- mode: ruby; coding: utf-8-unix -*- +require 'test/unit' +require 'opencv' +require File.expand_path(File.dirname(__FILE__)) + '/helper' + +include OpenCV + +# Tests for OpenCV::CvError +class TestCvError < OpenCVTestCase + def test_cverror + assert_equal(StandardError, CvError.superclass) + begin + raise CvError + rescue + assert_equal(CvError, $!.class) + end + end + + def test_subclass + errors = [CvStsOk, CvStsBackTrace, CvStsError, CvStsInternal, CvStsNoMem, CvStsBadArg, CvStsBadFunc, CvStsNoConv, CvStsAutoTrace, CvHeaderIsNull, CvBadImageSize, CvBadOffset, CvBadDataPtr, CvBadStep, CvBadModelOrChSeq, CvBadNumChannels, CvBadNumChannel1U, CvBadDepth, CvBadAlphaChannel, CvBadOrder, CvBadOrigin, CvBadAlign, CvBadCallBack, CvBadTileSize, CvBadCOI, CvBadROISize, CvMaskIsTiled, CvStsNullPtr, CvStsVecLengthErr, CvStsFilterStructContentErr, CvStsKernelStructContentErr, CvStsFilterOffsetErr, CvStsBadSize, CvStsDivByZero, CvStsInplaceNotSupported, CvStsObjectNotFound, CvStsUnmatchedFormats, CvStsBadFlag, CvStsBadPoint, CvStsBadMask, CvStsUnmatchedSizes, CvStsUnsupportedFormat, CvStsOutOfRange, CvStsParseError, CvStsNotImplemented, CvStsBadMemBlock, CvStsAssert, CvGpuNotSupported, CvGpuApiCallError, CvGpuNppCallError, CvGpuCufftCallError] + + errors.each { |err| + assert_equal(CvError, err.superclass) + + begin + raise err + rescue err + assert_equal(err, $!.class) + rescue + flunk("Failed to catch #{err}") + end + + begin + raise err + rescue CvError + assert_equal(err, $!.class) + rescue + flunk("Failed to catch #{err}") + end + + begin + raise err + rescue + assert_equal(err, $!.class) + end + } + end +end +