void cb_strip_key_prefix(struct cb_bucket_st *bucket, VALUE key) { if (RTEST(bucket->key_prefix_val)) { rb_str_update(key, 0, RSTRING_LEN(bucket->key_prefix_val), cb_vStrEmpty); } }
VALUE rb_str_cut_bang( VALUE str, VALUE len) { int l; #ifdef HAVE_HEADER_RUBY_H #else int n; #endif rb_str_modify( str); l = NUM2INT( len); if (l < 0) l = 0; #ifdef HAVE_HEADER_RUBY_H if (l < RSTRING_LEN( str)) { RSTRING_LEN( str) = l; return str; } #else n = rb_str_strlen( str); if (l < n) { rb_str_update( str, l, n - l, rb_str_new( NULL, 0)); return str; } #endif return Qnil; }
VALUE rb_str_eat( int argc, VALUE *argv, VALUE str) { VALUE val; int n; int l; int r; #ifdef HAVE_HEADER_RUBY_H n = l = RSTRING_LEN( str); #else n = l = rb_str_strlen( str); #endif if (rb_scan_args( argc, argv, "01", &val) == 1) { if (!NIL_P( val)) { int v = NUM2INT( val); if (v >= 0) { if (n >= v) n = v; } else { n = -n; if (n <= v) n = v; } } } rb_str_modify( str); #ifdef HAVE_HEADER_RUBY_H if (n > 0) { r = l - n; val = rb_str_new5( str, RSTRING_PTR( str), n); memmove( RSTRING_PTR( str), RSTRING_PTR( str) + n, r); } else { r = l + n; val = rb_str_new5( str, RSTRING_PTR( str) + r, -n); } RSTRING_LEN( str) = r; OBJ_INFECT( val, str); #else if (n > 0) { r = 0; } else if (n < 0) { r = l + n; n = -n; } else return Qnil; val = rb_str_substr( str, r, n); if (!NIL_P(val)) rb_str_update( str, r, n, rb_str_new( NULL, 0)); #endif return val; }
/*RHO static*/ VALUE eval_string_with_cref(VALUE self, VALUE src, VALUE scope, NODE *cref, const char *file, int line) { int state; VALUE result = Qundef; VALUE envval; rb_binding_t *bind = 0; rb_thread_t *th = GET_THREAD(); rb_env_t *env = NULL; rb_block_t block; volatile int parse_in_eval; volatile int mild_compile_error; if (file == 0) { file = rb_sourcefile(); line = rb_sourceline(); } parse_in_eval = th->parse_in_eval; mild_compile_error = th->mild_compile_error; PUSH_TAG(); if ((state = EXEC_TAG()) == 0) { rb_iseq_t *iseq; volatile VALUE iseqval; if (scope != Qnil) { if (rb_obj_is_kind_of(scope, rb_cBinding)) { GetBindingPtr(scope, bind); envval = bind->env; } else { rb_raise(rb_eTypeError, "wrong argument type %s (expected Binding)", rb_obj_classname(scope)); } GetEnvPtr(envval, env); th->base_block = &env->block; } else { rb_control_frame_t *cfp = rb_vm_get_ruby_level_next_cfp(th, th->cfp); if (cfp != 0) { block = *RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp); th->base_block = █ th->base_block->self = self; th->base_block->iseq = cfp->iseq; /* TODO */ } else { rb_raise(rb_eRuntimeError, "Can't eval on top of Fiber or Thread"); } } //RHO if ( TYPE(src) != T_STRING ){ iseqval = src; }else //RHO { /* make eval iseq */ th->parse_in_eval++; th->mild_compile_error++; iseqval = rb_iseq_compile(src, rb_str_new2(file), INT2FIX(line)); th->mild_compile_error--; th->parse_in_eval--; } vm_set_eval_stack(th, iseqval, cref); th->base_block = 0; if (0) { /* for debug */ printf("%s\n", RSTRING_PTR(rb_iseq_disasm(iseqval))); } /* save new env */ GetISeqPtr(iseqval, iseq); if (bind && iseq->local_size > 0) { bind->env = rb_vm_make_env_object(th, th->cfp); } /* kick */ CHECK_STACK_OVERFLOW(th->cfp, iseq->stack_max); result = vm_exec(th); } POP_TAG(); th->mild_compile_error = mild_compile_error; th->parse_in_eval = parse_in_eval; if (state) { if (state == TAG_RAISE) { VALUE errinfo = th->errinfo; if (strcmp(file, "(eval)") == 0) { VALUE mesg, errat, bt2; extern VALUE rb_get_backtrace(VALUE info); ID id_mesg; CONST_ID(id_mesg, "mesg"); errat = rb_get_backtrace(errinfo); mesg = rb_attr_get(errinfo, id_mesg); if (!NIL_P(errat) && TYPE(errat) == T_ARRAY && (bt2 = vm_backtrace(th, -2), RARRAY_LEN(bt2) > 0)) { if (!NIL_P(mesg) && TYPE(mesg) == T_STRING && !RSTRING_LEN(mesg)) { if (OBJ_FROZEN(mesg)) { VALUE m = rb_str_cat(rb_str_dup(RARRAY_PTR(errat)[0]), ": ", 2); rb_ivar_set(errinfo, id_mesg, rb_str_append(m, mesg)); } else { rb_str_update(mesg, 0, 0, rb_str_new2(": ")); rb_str_update(mesg, 0, 0, RARRAY_PTR(errat)[0]); } } RARRAY_PTR(errat)[0] = RARRAY_PTR(bt2)[0]; } } rb_exc_raise(errinfo); } JUMP_TAG(state); } return result; }
static VALUE string_spec_rb_str_update(VALUE self, VALUE str, VALUE beg, VALUE end, VALUE replacement) { rb_str_update(str, FIX2LONG(beg), FIX2LONG(end), replacement); return str; }