Skip to content

Commit 14ae5c0

Browse files
committed
Merge branch 'fix/issue-78-invalid_sequence_error'
2 parents fb7e35e + 4684a20 commit 14ae5c0

File tree

1 file changed

+39
-24
lines changed

1 file changed

+39
-24
lines changed

ext/opencv/cvseq.cpp

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,48 @@ rb_class()
2727
return rb_klass;
2828
}
2929

30+
int
31+
eltype2class(int eltype, VALUE* ret) {
32+
int found = 1;
33+
34+
switch (eltype) {
35+
case CV_SEQ_ELTYPE_POINT:
36+
*ret = cCvPoint::rb_class();
37+
break;
38+
case CV_32FC2:
39+
*ret = cCvPoint2D32f::rb_class();
40+
break;
41+
case CV_SEQ_ELTYPE_POINT3D:
42+
*ret = cCvPoint3D32f::rb_class();
43+
break;
44+
case CV_SEQ_ELTYPE_CODE:
45+
case CV_SEQ_ELTYPE_INDEX:
46+
*ret = rb_cFixnum;
47+
break;
48+
case CV_SEQ_ELTYPE_PPOINT: // or CV_SEQ_ELTYPE_PTR:
49+
// Not supported
50+
rb_raise(rb_eArgError, "seq_flags %d is not supported.", eltype);
51+
break;
52+
default:
53+
found = 0;
54+
*ret = cCvPoint::rb_class();
55+
break;
56+
}
57+
58+
return found;
59+
}
60+
3061
VALUE
3162
seqblock_class(void *ptr)
3263
{
33-
VALUE klass;
34-
if (!st_lookup(seqblock_klass_table, (st_data_t)ptr, (st_data_t*)&klass)) {
35-
rb_raise(rb_eTypeError, "Invalid sequence error.");
64+
VALUE klass = Qnil;
65+
if (st_lookup(seqblock_klass_table, (st_data_t)ptr, (st_data_t*)&klass)) {
66+
return klass;
3667
}
68+
69+
int eltype = CV_SEQ_ELTYPE((CvSeq*)ptr);
70+
eltype2class(eltype, &klass);
71+
3772
return klass;
3873
}
3974

@@ -66,28 +101,8 @@ create_seq(int seq_flags, size_t header_size, VALUE storage_value)
66101
int eltype = seq_flags & CV_SEQ_ELTYPE_MASK;
67102
storage_value = CHECK_CVMEMSTORAGE(storage_value);
68103

69-
switch (eltype) {
70-
case CV_SEQ_ELTYPE_POINT:
71-
klass = cCvPoint::rb_class();
72-
break;
73-
case CV_32FC2:
74-
klass = cCvPoint2D32f::rb_class();
75-
break;
76-
case CV_SEQ_ELTYPE_POINT3D:
77-
klass = cCvPoint3D32f::rb_class();
78-
break;
79-
case CV_SEQ_ELTYPE_CODE:
80-
case CV_SEQ_ELTYPE_INDEX:
81-
klass = rb_cFixnum;
82-
break;
83-
case CV_SEQ_ELTYPE_PPOINT: // or CV_SEQ_ELTYPE_PTR:
84-
// Not supported
85-
rb_raise(rb_eArgError, "seq_flags %d is not supported.", eltype);
86-
break;
87-
default:
104+
if (!eltype2class(eltype, &klass)) {
88105
seq_flags = CV_SEQ_ELTYPE_POINT | CV_SEQ_KIND_GENERIC;
89-
klass = cCvPoint::rb_class();
90-
break;
91106
}
92107

93108
int mat_type = CV_MAT_TYPE(seq_flags);

0 commit comments

Comments
 (0)