diff options
Diffstat (limited to 'spec/ruby/optional/capi')
-rw-r--r-- | spec/ruby/optional/capi/ext/numeric_spec.c | 10 | ||||
-rw-r--r-- | spec/ruby/optional/capi/ext/object_spec.c | 40 | ||||
-rw-r--r-- | spec/ruby/optional/capi/ext/rubyspec.h | 3 | ||||
-rw-r--r-- | spec/ruby/optional/capi/numeric_spec.rb | 15 | ||||
-rw-r--r-- | spec/ruby/optional/capi/object_spec.rb | 25 | ||||
-rw-r--r-- | spec/ruby/optional/capi/util_spec.rb | 10 |
6 files changed, 102 insertions, 1 deletions
diff --git a/spec/ruby/optional/capi/ext/numeric_spec.c b/spec/ruby/optional/capi/ext/numeric_spec.c index cd643cc66f..2f0f504549 100644 --- a/spec/ruby/optional/capi/ext/numeric_spec.c +++ b/spec/ruby/optional/capi/ext/numeric_spec.c @@ -96,6 +96,12 @@ static VALUE numeric_spec_rb_num_coerce_relop(VALUE self, VALUE x, VALUE y, VALU } #endif +#ifdef HAVE_RB_ABSINT_SINGLEBIT_P +static VALUE numeric_spec_rb_absint_singlebit_p(VALUE self, VALUE num) { + return INT2FIX(rb_absint_singlebit_p(num)); +} +#endif + void Init_numeric_spec(void) { VALUE cls; cls = rb_define_class("CApiNumericSpecs", rb_cObject); @@ -159,6 +165,10 @@ void Init_numeric_spec(void) { #ifdef HAVE_RB_NUM_COERCE_RELOP rb_define_method(cls, "rb_num_coerce_relop", numeric_spec_rb_num_coerce_relop, 3); #endif + +#ifdef HAVE_RB_ABSINT_SINGLEBIT_P +rb_define_method(cls, "rb_absint_singlebit_p", numeric_spec_rb_absint_singlebit_p, 1); +#endif } #ifdef __cplusplus diff --git a/spec/ruby/optional/capi/ext/object_spec.c b/spec/ruby/optional/capi/ext/object_spec.c index ad1ebecc78..45a28169ef 100644 --- a/spec/ruby/optional/capi/ext/object_spec.c +++ b/spec/ruby/optional/capi/ext/object_spec.c @@ -5,6 +5,32 @@ extern "C" { #endif +#ifdef HAVE_FL_ABLE +static VALUE object_spec_FL_ABLE(VALUE self, VALUE obj) { + if (FL_ABLE(obj)) { + return Qtrue; + } else { + return Qfalse; + } +} +#endif + +#ifdef HAVE_FL_TEST +static int object_spec_FL_TEST_flag(VALUE flag_string) { + char *flag_cstr = StringValueCStr(flag_string); + if (strcmp(flag_cstr, "FL_TAINT") == 0) { + return FL_TAINT; + } else if (strcmp(flag_cstr, "FL_FREEZE") == 0) { + return FL_FREEZE; + } + return 0; +} + +static VALUE object_spec_FL_TEST(VALUE self, VALUE obj, VALUE flag) { + return INT2FIX(FL_TEST(obj, object_spec_FL_TEST_flag(flag))); +} +#endif + #ifdef HAVE_OBJ_TAINT static VALUE object_spec_OBJ_TAINT(VALUE self, VALUE obj) { OBJ_TAINT(obj); @@ -204,7 +230,11 @@ static VALUE object_spec_rb_method_boundp(VALUE self, VALUE obj, VALUE method, V #ifdef HAVE_RB_SPECIAL_CONST_P static VALUE object_spec_rb_special_const_p(VALUE self, VALUE value) { - return rb_special_const_p(value); + if (rb_special_const_p(value)) { + return Qtrue; + } else { + return Qfalse; + } } #endif @@ -404,6 +434,14 @@ void Init_object_spec(void) { VALUE cls; cls = rb_define_class("CApiObjectSpecs", rb_cObject); +#ifdef HAVE_FL_ABLE + rb_define_method(cls, "FL_ABLE", object_spec_FL_ABLE, 1); +#endif + +#ifdef HAVE_FL_TEST + rb_define_method(cls, "FL_TEST", object_spec_FL_TEST, 2); +#endif + #ifdef HAVE_OBJ_TAINT rb_define_method(cls, "OBJ_TAINT", object_spec_OBJ_TAINT, 1); #endif diff --git a/spec/ruby/optional/capi/ext/rubyspec.h b/spec/ruby/optional/capi/ext/rubyspec.h index aab74b88ae..341cff0428 100644 --- a/spec/ruby/optional/capi/ext/rubyspec.h +++ b/spec/ruby/optional/capi/ext/rubyspec.h @@ -422,6 +422,7 @@ #define HAVE_RB_NUM_COERCE_BIN 1 #define HAVE_RB_NUM_COERCE_CMP 1 #define HAVE_RB_NUM_COERCE_RELOP 1 +#define HAVE_RB_ABSINT_SINGLEBIT_P 1 #define HAVE_RB_NUM_ZERODIV 1 /* Fixnum */ @@ -431,6 +432,8 @@ #endif /* Object */ +#define HAVE_FL_ABLE 1 +#define HAVE_FL_TEST 1 #define HAVE_OBJ_TAINT 1 #define HAVE_OBJ_TAINTED 1 #define HAVE_OBJ_INFECT 1 diff --git a/spec/ruby/optional/capi/numeric_spec.rb b/spec/ruby/optional/capi/numeric_spec.rb index fdf794247d..1d4a44d7a2 100644 --- a/spec/ruby/optional/capi/numeric_spec.rb +++ b/spec/ruby/optional/capi/numeric_spec.rb @@ -429,4 +429,19 @@ describe "CApiNumericSpecs" do lambda { @s.rb_num_coerce_relop(2, obj, :<) }.should raise_error(ArgumentError) end end + + describe "rb_absint_singlebit_p" do + it "returns 1 if absolute value fits into a bit" do + @s.rb_absint_singlebit_p(1).should == 1 + @s.rb_absint_singlebit_p(2).should == 1 + @s.rb_absint_singlebit_p(3).should == 0 + @s.rb_absint_singlebit_p(-1).should == 1 + @s.rb_absint_singlebit_p(-2).should == 1 + @s.rb_absint_singlebit_p(-3).should == 0 + @s.rb_absint_singlebit_p(bignum_value).should == 1 + @s.rb_absint_singlebit_p(bignum_value(1)).should == 0 + @s.rb_absint_singlebit_p(-bignum_value).should == 1 + @s.rb_absint_singlebit_p(-bignum_value(1)).should == 0 + end + end end diff --git a/spec/ruby/optional/capi/object_spec.rb b/spec/ruby/optional/capi/object_spec.rb index cf7ea2e8cf..97bff38ec0 100644 --- a/spec/ruby/optional/capi/object_spec.rb +++ b/spec/ruby/optional/capi/object_spec.rb @@ -404,6 +404,31 @@ describe "CApiObject" do end end + describe "FL_ABLE" do + it "returns correct boolean for type" do + @o.FL_ABLE(Object.new).should be_true + @o.FL_ABLE(true).should be_false + @o.FL_ABLE(nil).should be_false + @o.FL_ABLE(1).should be_false + end + end + + describe "FL_TEST" do + it "returns correct status for FL_TAINT" do + obj = Object.new + @o.FL_TEST(obj, "FL_TAINT").should == 0 + obj.taint + @o.FL_TEST(obj, "FL_TAINT").should_not == 0 + end + + it "returns correct status for FL_FREEZE" do + obj = Object.new + @o.FL_TEST(obj, "FL_FREEZE").should == 0 + obj.freeze + @o.FL_TEST(obj, "FL_FREEZE").should_not == 0 + end + end + describe "rb_inspect" do it "returns a string with the inspect representation" do @o.rb_inspect(nil).should == "nil" diff --git a/spec/ruby/optional/capi/util_spec.rb b/spec/ruby/optional/capi/util_spec.rb index c8d0401cbc..b2ef2ba92e 100644 --- a/spec/ruby/optional/capi/util_spec.rb +++ b/spec/ruby/optional/capi/util_spec.rb @@ -105,6 +105,16 @@ describe "C-API Util function" do ScratchPad.recorded.should == [1, h] end + it "assigns required and Hash arguments with optional Hash" do + @o.rb_scan_args([1], "1:", 2, @acc).should == 1 + ScratchPad.recorded.should == [1, nil] + end + + it "assigns required and Hash arguments with nil Hash" do + @o.rb_scan_args([1, nil], "1:", 2, @acc).should == 1 + ScratchPad.recorded.should == [1, nil] + end + it "assigns required, optional, splat, post-splat, Hash and block arguments" do h = {a: 1, b: 2} @o.rb_scan_args([1, 2, 3, 4, 5, h], "11*1:&", 6, @acc, &@prc).should == 5 |