内部の実装
- str_new
- mrb_obj_value
内部的に
- str_new(mrb, p, len)
- mrb_obj_value
を使っていた
static struct RString*
str_new(mrb_state *mrb, const char *p, size_t len)
{
struct RString *s;
if (p && mrb_ro_data_p(p)) {
return str_new_static(mrb, p, len);
}
s = mrb_obj_alloc_string(mrb);
if (len < RSTRING_EMBED_LEN_MAX) {
RSTR_SET_EMBED_FLAG(s);
RSTR_SET_EMBED_LEN(s, len);
if (p) {
memcpy(s->as.ary, p, len);
}
} else {
if (len >= MRB_INT_MAX) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
}
s->as.heap.len = len;
s->as.heap.aux.capa = len;
s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1);
if (p) {
memcpy(s->as.heap.ptr, p, len);
}
}
RSTR_PTR(s)[len] = '\0';
return s;
}
mrb_load_string_cxt
実際やってみると、難しい。
結局マルマルコードをコピーするはめになりがちな気がしてきた。
一部をrubyのコードで書いて、必要な個所をCで書くことも出来るっぽい。
- mruby-glsl
- mruby-julia
- mruby-webcam
- mruby-uuid
- mruby-aobench-native
- mruby-getprocpath
- mruby-mrmagick
- mruby-sixel
- mruby-imgtype