mRuby
view release on metacpan or search on metacpan
vendor/mruby/src/state.c view on Meta::CPAN
tmp = irep->reps[i];
irep->reps[i] = NULL;
if (tmp) mrb_irep_decref(mrb, tmp);
}
}
void
mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
{
int i;
if (!(irep->flags & MRB_ISEQ_NO_FREE))
mrb_free(mrb, irep->iseq);
if (irep->pool) for (i=0; i<irep->plen; i++) {
if (mrb_type(irep->pool[i]) == MRB_TT_STRING) {
mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
}
#if defined(MRB_WORD_BOXING) && !defined(MRB_WITHOUT_FLOAT)
else if (mrb_type(irep->pool[i]) == MRB_TT_FLOAT) {
mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
}
#endif
}
mrb_free(mrb, irep->pool);
mrb_free(mrb, irep->syms);
for (i=0; i<irep->rlen; i++) {
if (irep->reps[i])
mrb_irep_decref(mrb, irep->reps[i]);
}
mrb_free(mrb, irep->reps);
mrb_free(mrb, irep->lv);
if (irep->own_filename) {
mrb_free(mrb, (void *)irep->filename);
}
mrb_free(mrb, irep->lines);
mrb_debug_info_free(mrb, irep->debug_info);
mrb_free(mrb, irep);
}
mrb_value
mrb_str_pool(mrb_state *mrb, mrb_value str)
{
struct RString *s = mrb_str_ptr(str);
struct RString *ns;
char *ptr;
mrb_int len;
ns = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));
ns->tt = MRB_TT_STRING;
ns->c = mrb->string_class;
if (RSTR_NOFREE_P(s)) {
ns->flags = MRB_STR_NOFREE;
ns->as.heap.ptr = s->as.heap.ptr;
ns->as.heap.len = s->as.heap.len;
ns->as.heap.aux.capa = 0;
}
else {
ns->flags = 0;
if (RSTR_EMBED_P(s)) {
ptr = s->as.ary;
len = RSTR_EMBED_LEN(s);
}
else {
ptr = s->as.heap.ptr;
len = s->as.heap.len;
}
if (len < RSTRING_EMBED_LEN_MAX) {
RSTR_SET_EMBED_FLAG(ns);
RSTR_SET_EMBED_LEN(ns, len);
if (ptr) {
memcpy(ns->as.ary, ptr, len);
}
ns->as.ary[len] = '\0';
}
else {
ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
ns->as.heap.len = len;
ns->as.heap.aux.capa = len;
if (ptr) {
memcpy(ns->as.heap.ptr, ptr, len);
}
ns->as.heap.ptr[len] = '\0';
}
}
RSTR_SET_POOL_FLAG(ns);
MRB_SET_FROZEN_FLAG(ns);
return mrb_obj_value(ns);
}
void mrb_free_backtrace(mrb_state *mrb);
MRB_API void
mrb_free_context(mrb_state *mrb, struct mrb_context *c)
{
if (!c) return;
mrb_free(mrb, c->stbase);
mrb_free(mrb, c->cibase);
mrb_free(mrb, c->rescue);
mrb_free(mrb, c->ensure);
mrb_free(mrb, c);
}
MRB_API void
mrb_close(mrb_state *mrb)
{
if (!mrb) return;
if (mrb->atexit_stack_len > 0) {
mrb_int i;
for (i = mrb->atexit_stack_len; i > 0; --i) {
mrb->atexit_stack[i - 1](mrb);
}
#ifndef MRB_FIXED_STATE_ATEXIT_STACK
mrb_free(mrb, mrb->atexit_stack);
#endif
}
/* free */
mrb_gc_free_gv(mrb);
mrb_free_context(mrb, mrb->root_c);
mrb_free_symtbl(mrb);
mrb_alloca_free(mrb);
mrb_gc_destroy(mrb, &mrb->gc);
mrb_free(mrb, mrb);
}
MRB_API mrb_irep*
mrb_add_irep(mrb_state *mrb)
{
static const mrb_irep mrb_irep_zero = { 0 };
( run in 1.761 second using v1.01-cache-2.11-cpan-71847e10f99 )