From be04c895a6366c2c87efe3967cbd0eec3ec90b48 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Sat, 11 Sep 2010 12:13:44 +0200 Subject: [PATCH] ad rb_intern spec --- optional/capi/ext/rubyspec.h | 1 + optional/capi/ext/symbol_spec.c | 16 ++++++++++++++++ optional/capi/symbol_spec.rb | 7 +++++++ 3 files changed, 24 insertions(+) diff --git a/optional/capi/ext/rubyspec.h b/optional/capi/ext/rubyspec.h index 8bfe58eee5..dca4c6bae5 100644 --- a/optional/capi/ext/rubyspec.h +++ b/optional/capi/ext/rubyspec.h @@ -269,6 +269,7 @@ #define HAVE_RB_STRUCT_DEFINE 1 /* Symbol */ +#define HAVE_RB_INTERN 1 #define HAVE_RB_IS_CLASS_ID 1 #define HAVE_RB_IS_CONST_ID 1 #define HAVE_RB_IS_INSTANCE_ID 1 diff --git a/optional/capi/ext/symbol_spec.c b/optional/capi/ext/symbol_spec.c index 9c505a509b..c4ed7663a3 100644 --- a/optional/capi/ext/symbol_spec.c +++ b/optional/capi/ext/symbol_spec.c @@ -5,6 +5,17 @@ extern "C" { #endif +#ifdef HAVE_RB_INTERN +VALUE symbol_spec_rb_intern(VALUE self, VALUE string) { + return ID2SYM(rb_intern(RSTRING_PTR(string))); +} + +VALUE symbol_spec_rb_intern_c_compare(VALUE self, VALUE string, VALUE sym) { + ID symbol = rb_intern(RSTRING_PTR(string)); + return (SYM2ID(sym) == symbol) ? Qtrue : Qfalse; +} +#endif + #ifdef HAVE_RB_IS_CLASS_ID VALUE symbol_spec_rb_is_class_id(VALUE self, VALUE sym) { return rb_is_class_id(SYM2ID(sym)) ? Qtrue : Qfalse; @@ -27,6 +38,11 @@ void Init_symbol_spec() { VALUE cls; cls = rb_define_class("CApiSymbolSpecs", rb_cObject); +#ifdef HAVE_RB_INTERN + rb_define_method(cls, "rb_intern", symbol_spec_rb_intern, 1); + rb_define_method(cls, "rb_intern_c_compare", symbol_spec_rb_intern_c_compare, 2); +#endif + #ifdef HAVE_RB_IS_CLASS_ID rb_define_method(cls, "rb_is_class_id", symbol_spec_rb_is_class_id, 1); #endif diff --git a/optional/capi/symbol_spec.rb b/optional/capi/symbol_spec.rb index 5d6c98c533..8e99ec6b45 100644 --- a/optional/capi/symbol_spec.rb +++ b/optional/capi/symbol_spec.rb @@ -7,6 +7,13 @@ @s = CApiSymbolSpecs.new end + describe "rb_intern" do + it "converts a string to a symbol, uniquely" do + @s.rb_intern("test_symbol").should === :test_symbol + @s.rb_intern_c_compare("test_symbol", :test_symbol).should == true + end + end + describe "rb_is_const_id" do it "returns true given a const-like symbol" do @s.rb_is_const_id(:Foo).should == true