@@ -266,16 +266,39 @@ rb_version_sort_r_bang(VALUE rb_self, VALUE rb_versions)
266266 return rb_version_sort_1 (rb_self , rb_versions , version_compare_cb_r );
267267}
268268
269+ struct compare_context {
270+ VALUE rb_version_a , rb_version_b ;
271+ struct version_number * version_a , * version_b ;
272+ };
273+
274+ static VALUE
275+ rb_version_compare_cb (VALUE arg )
276+ {
277+ struct compare_context * context = (struct compare_context * )arg ;
278+
279+ context -> version_a = parse_version_number (StringValueCStr (context -> rb_version_a ));
280+ context -> version_b = parse_version_number (StringValueCStr (context -> rb_version_b ));
281+
282+ return INT2NUM (version_compare_cb (& context -> version_a , & context -> version_b ));
283+ }
284+
269285static VALUE
270286rb_version_compare (VALUE rb_self , VALUE rb_version_a , VALUE rb_version_b )
271287{
272- struct version_number * version_a = parse_version_number (StringValueCStr (rb_version_a ));
273- struct version_number * version_b = parse_version_number (StringValueCStr (rb_version_b ));
288+ int exception ;
289+ struct compare_context context = {
290+ rb_version_a , rb_version_b ,
291+ NULL , NULL ,
292+ };
293+
294+ VALUE result = rb_protect (rb_version_compare_cb , (VALUE )& context , & exception );
274295
275- VALUE result = INT2NUM (version_compare_cb (& version_a , & version_b ));
296+ xfree (context .version_a );
297+ xfree (context .version_b );
276298
277- xfree (version_a );
278- xfree (version_b );
299+ if (exception ) {
300+ rb_jump_tag (exception );
301+ }
279302
280303 return result ;
281304}
0 commit comments