in ext/mmap/mmap.c [315:345]
static VALUE mm_str(VALUE obj, int modify) {
mm_ipc *i_mm;
VALUE ret = Qnil;
GetMmap(obj, i_mm, modify & ~MM_ORIGIN);
if (modify & MM_MODIFY) {
if (i_mm->t->flag & MM_FROZEN) rb_error_frozen("mmap");
if (!OBJ_TAINTED(ret) && rb_safe_level() >= 4)
rb_raise(rb_eSecurityError, "Insecure: can't modify mmap");
}
ret = rb_obj_alloc(rb_cString);
if (rb_obj_tainted(obj)) {
OBJ_TAINT(ret);
}
RSTRING(ret)->as.heap.ptr = i_mm->t->addr;
RSTRING(ret)->as.heap.aux.capa = i_mm->t->len;
RSTRING(ret)->as.heap.len = i_mm->t->real;
if (modify & MM_ORIGIN) {
#if HAVE_RB_DEFINE_ALLOC_FUNC
RSTRING(ret)->as.heap.aux.shared = obj;
FL_SET(ret, RSTRING_NOEMBED);
FL_SET(ret, FL_USER18);
#else
RSTRING(ret)->orig = ret;
#endif
}
if (i_mm->t->flag & MM_FROZEN) {
ret = rb_obj_freeze(ret);
}
return ret;
}