summaryrefslogtreecommitdiff
path: root/spec/ruby/optional/capi
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/optional/capi')
-rw-r--r--spec/ruby/optional/capi/ext/numeric_spec.c10
-rw-r--r--spec/ruby/optional/capi/ext/object_spec.c40
-rw-r--r--spec/ruby/optional/capi/ext/rubyspec.h3
-rw-r--r--spec/ruby/optional/capi/numeric_spec.rb15
-rw-r--r--spec/ruby/optional/capi/object_spec.rb25
-rw-r--r--spec/ruby/optional/capi/util_spec.rb10
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