Skip to content

Commit 3bdc5d5

Browse files
committed
Refactor string methods for fast Stringvalue versions.
1 parent 8c92f89 commit 3bdc5d5

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

lib/cext/include/ruby/ruby.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,9 +608,15 @@ char *rb_string_value_ptr(volatile VALUE*);
608608
char *rb_string_value_cstr(volatile VALUE*);
609609
#endif
610610

611+
#ifdef TRUFFLERUBY
612+
#define StringValue(v) rb_tr_string_value(&(v))
613+
#define StringValuePtr(v) rb_tr_string_value_ptr(&(v))
614+
#define StringValueCStr(v) rb_tr_string_value_cstr(&(v))
615+
#else
611616
#define StringValue(v) rb_string_value(&(v))
612617
#define StringValuePtr(v) rb_string_value_ptr(&(v))
613618
#define StringValueCStr(v) rb_string_value_cstr(&(v))
619+
#endif
614620

615621
void rb_check_safe_obj(VALUE);
616622
#define SafeStringValue(v) do {\

lib/cext/include/truffleruby/truffleruby.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,29 @@ VALUE rb_ivar_lookup(VALUE object, const char *name, VALUE default_value);
162162

163163
// Inline implementations
164164

165+
ALWAYS_INLINE(static VALUE rb_tr_string_value(VALUE *value_pointer));
166+
static inline VALUE rb_tr_string_value(VALUE *value_pointer) {
167+
VALUE value = *value_pointer;
168+
if (!RB_TYPE_P(value, T_STRING)) {
169+
value = rb_str_to_str(value);
170+
*value_pointer = value;
171+
}
172+
return value;
173+
}
174+
175+
ALWAYS_INLINE(static char *rb_tr_string_value_ptr(VALUE *value_pointer));
176+
static inline char *rb_tr_string_value_ptr(VALUE *value_pointer) {
177+
VALUE string = rb_string_value(value_pointer);
178+
return RSTRING_PTR(string);
179+
}
180+
181+
ALWAYS_INLINE(static char *rb_tr_string_value_cstr(VALUE *value_pointer));
182+
static inline char *rb_tr_string_value_cstr(VALUE *value_pointer) {
183+
VALUE string = rb_string_value(value_pointer);
184+
RUBY_CEXT_INVOKE("rb_string_value_cstr_check", string);
185+
return RSTRING_PTR(string);
186+
}
187+
165188
ALWAYS_INLINE(static int rb_tr_scan_args(int argc, VALUE *argv, const char *format, VALUE *v1, VALUE *v2, VALUE *v3, VALUE *v4, VALUE *v5, VALUE *v6, VALUE *v7, VALUE *v8, VALUE *v9, VALUE *v10));
166189
static inline int rb_tr_scan_args(int argc, VALUE *argv, const char *format, VALUE *v1, VALUE *v2, VALUE *v3, VALUE *v4, VALUE *v5, VALUE *v6, VALUE *v7, VALUE *v8, VALUE *v9, VALUE *v10) {
167190
// Parse the format string

src/main/c/cext/ruby.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -800,23 +800,15 @@ double rb_float_value(VALUE value) {
800800
// String
801801

802802
VALUE rb_string_value(VALUE *value_pointer) {
803-
VALUE value = *value_pointer;
804-
if (!RB_TYPE_P(value, T_STRING)) {
805-
value = rb_str_to_str(value);
806-
*value_pointer = value;
807-
}
808-
return value;
803+
return rb_tr_string_value(value_pointer);
809804
}
810805

811806
char *rb_string_value_ptr(VALUE *value_pointer) {
812-
VALUE string = rb_string_value(value_pointer);
813-
return RSTRING_PTR(string);
807+
return rb_tr_string_value_ptr(value_pointer);
814808
}
815809

816810
char *rb_string_value_cstr(VALUE *value_pointer) {
817-
VALUE string = rb_string_value(value_pointer);
818-
RUBY_CEXT_INVOKE("rb_string_value_cstr_check", string);
819-
return RSTRING_PTR(string);
811+
return rb_tr_string_value_cstr(value_pointer);
820812
}
821813

822814
char *RSTRING_PTR_IMPL(VALUE string) {

0 commit comments

Comments
 (0)