Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

Location:
EcnlProtoTool/trunk/mruby-2.1.1
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-2.1.1/src/state.c

    r331 r439  
    1212#include <mruby/debug.h>
    1313#include <mruby/string.h>
     14#include <mruby/class.h>
    1415
    1516void mrb_init_core(mrb_state*);
     
    1819void mrb_gc_init(mrb_state*, mrb_gc *gc);
    1920void mrb_gc_destroy(mrb_state*, mrb_gc *gc);
    20 
    21 static mrb_value
    22 inspect_main(mrb_state *mrb, mrb_value mod)
    23 {
    24   return mrb_str_new_lit(mrb, "main");
    25 }
    2621
    2722MRB_API mrb_state*
     
    3227  mrb_state *mrb;
    3328
     29  if (f == NULL) f = mrb_default_allocf;
    3430  mrb = (mrb_state *)(f)(NULL, NULL, sizeof(mrb_state), ud);
    3531  if (mrb == NULL) return NULL;
     
    6258}
    6359
    64 struct alloca_header {
    65   struct alloca_header *next;
    66   char buf[];
    67 };
    68 
    69 MRB_API void*
    70 mrb_alloca(mrb_state *mrb, size_t size)
    71 {
    72   struct alloca_header *p;
    73 
    74   p = (struct alloca_header*) mrb_malloc(mrb, sizeof(struct alloca_header)+size);
    75   p->next = mrb->mems;
    76   mrb->mems = p;
    77   return (void*)p->buf;
    78 }
    79 
    80 static void
    81 mrb_alloca_free(mrb_state *mrb)
    82 {
    83   struct alloca_header *p;
    84   struct alloca_header *tmp;
    85 
    86   if (mrb == NULL) return;
    87   p = mrb->mems;
    88 
    89   while (p) {
    90     tmp = p;
    91     p = p->next;
    92     mrb_free(mrb, tmp);
    93   }
    94 }
    95 
    9660MRB_API mrb_state*
    9761mrb_open(void)
     
    11276
    11377  if (!disable_gems) {
     78#ifndef DISABLE_GEMS
    11479    mrb_init_mrbgems(mrb);
    11580    mrb_gc_arena_restore(mrb, 0);
     81#endif
    11682  }
    11783  return mrb;
     
    136102
    137103void
     104mrb_irep_cutref(mrb_state *mrb, mrb_irep *irep)
     105{
     106  mrb_irep *tmp;
     107  int i;
     108
     109  for (i=0; i<irep->rlen; i++) {
     110    tmp = irep->reps[i];
     111    irep->reps[i] = NULL;
     112    if (tmp) mrb_irep_decref(mrb, tmp);
     113  }
     114}
     115
     116void
    138117mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
    139118{
    140   size_t i;
     119  int i;
    141120
    142121  if (!(irep->flags & MRB_ISEQ_NO_FREE))
    143     mrb_free(mrb, irep->iseq);
     122    mrb_free(mrb, (void*)irep->iseq);
    144123  if (irep->pool) for (i=0; i<irep->plen; i++) {
    145     if (mrb_type(irep->pool[i]) == MRB_TT_STRING) {
     124    if (mrb_string_p(irep->pool[i])) {
    146125      mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
    147126      mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
    148127    }
    149 #ifdef MRB_WORD_BOXING
    150     else if (mrb_type(irep->pool[i]) == MRB_TT_FLOAT) {
     128#if defined(MRB_WORD_BOXING) && !defined(MRB_WITHOUT_FLOAT)
     129    else if (mrb_float_p(irep->pool[i])) {
    151130      mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
    152131    }
     
    156135  mrb_free(mrb, irep->syms);
    157136  for (i=0; i<irep->rlen; i++) {
    158     mrb_irep_decref(mrb, irep->reps[i]);
     137    if (irep->reps[i])
     138      mrb_irep_decref(mrb, irep->reps[i]);
    159139  }
    160140  mrb_free(mrb, irep->reps);
    161141  mrb_free(mrb, irep->lv);
    162   if (irep->own_filename) {
    163     mrb_free(mrb, (void *)irep->filename);
    164   }
    165   mrb_free(mrb, irep->lines);
    166142  mrb_debug_info_free(mrb, irep->debug_info);
    167143  mrb_free(mrb, irep);
    168 }
    169 
    170 mrb_value
    171 mrb_str_pool(mrb_state *mrb, mrb_value str)
    172 {
    173   struct RString *s = mrb_str_ptr(str);
    174   struct RString *ns;
    175   char *ptr;
    176   mrb_int len;
    177 
    178   ns = (struct RString *)mrb_malloc(mrb, sizeof(struct RString));
    179   ns->tt = MRB_TT_STRING;
    180   ns->c = mrb->string_class;
    181 
    182   if (RSTR_NOFREE_P(s)) {
    183     ns->flags = MRB_STR_NOFREE;
    184     ns->as.heap.ptr = s->as.heap.ptr;
    185     ns->as.heap.len = s->as.heap.len;
    186     ns->as.heap.aux.capa = 0;
    187   }
    188   else {
    189     ns->flags = 0;
    190     if (RSTR_EMBED_P(s)) {
    191       ptr = s->as.ary;
    192       len = RSTR_EMBED_LEN(s);
    193     }
    194     else {
    195       ptr = s->as.heap.ptr;
    196       len = s->as.heap.len;
    197     }
    198 
    199     if (len < RSTRING_EMBED_LEN_MAX) {
    200       RSTR_SET_EMBED_FLAG(ns);
    201       RSTR_SET_EMBED_LEN(ns, len);
    202       if (ptr) {
    203         memcpy(ns->as.ary, ptr, len);
    204       }
    205       ns->as.ary[len] = '\0';
    206     }
    207     else {
    208       ns->as.heap.ptr = (char *)mrb_malloc(mrb, (size_t)len+1);
    209       ns->as.heap.len = len;
    210       ns->as.heap.aux.capa = len;
    211       if (ptr) {
    212         memcpy(ns->as.heap.ptr, ptr, len);
    213       }
    214       ns->as.heap.ptr[len] = '\0';
    215     }
    216   }
    217   return mrb_obj_value(ns);
    218144}
    219145
     
    246172
    247173  /* free */
     174  mrb_gc_destroy(mrb, &mrb->gc);
     175  mrb_free_context(mrb, mrb->root_c);
    248176  mrb_gc_free_gv(mrb);
    249   mrb_free_context(mrb, mrb->root_c);
    250177  mrb_free_symtbl(mrb);
    251   mrb_alloca_free(mrb);
    252   mrb_gc_destroy(mrb, &mrb->gc);
    253178  mrb_free(mrb, mrb);
    254179}
     
    263188  *irep = mrb_irep_zero;
    264189  irep->refcnt = 1;
    265   irep->own_filename = FALSE;
    266190
    267191  return irep;
     
    271195mrb_top_self(mrb_state *mrb)
    272196{
    273   if (!mrb->top_self) {
    274     mrb->top_self = (struct RObject*)mrb_obj_alloc(mrb, MRB_TT_OBJECT, mrb->object_class);
    275     mrb_define_singleton_method(mrb, mrb->top_self, "inspect", inspect_main, MRB_ARGS_NONE());
    276     mrb_define_singleton_method(mrb, mrb->top_self, "to_s", inspect_main, MRB_ARGS_NONE());
    277   }
    278197  return mrb_obj_value(mrb->top_self);
    279198}
Note: See TracChangeset for help on using the changeset viewer.