Exemplo n.º 1
0
int
main(int argc, char **argv)
{
  mrb_state *mrb = mrb_open();

  if (mrb == NULL) {
    fprintf(stderr, "Invalid mrb_state, exiting driver");
    return EXIT_FAILURE;
  }

  mrb_iv_set(mrb, mrb_obj_value(mrb->kernel_module),
    mrb_intern(mrb, "@loaded_compiled_mrb_handles"),
      mrb_ary_new(mrb));

  // define load method on kernel
  mrb_define_method(mrb, mrb->kernel_module, "load_compiled_mrb",
    rb_load_compiled_mrb, ARGS_REQ(1));

  mrbcc_load_so(mrb, mrb_top_self(mrb), "mrblib.so");

  if (argc <= 1) {
    printf("Usage: %s compiled.so\n", argv[0]);
  } else {
    mrbcc_load_so(mrb, mrb_top_self(mrb), argv[1]);
  }

  mrb_close(mrb);

  // TODO: unload .so
  //dlclose(handle); // gotta keep a global array of loaded sos and not close
  return EXIT_SUCCESS;
}
Exemplo n.º 2
0
void*
cfunc_rubyvm_open(void *args)
{
    struct cfunc_rubyvm_data *data = args;
    mrb_state *mrb = mrb_open();
    data->state = mrb;
    
#ifdef DISABLE_GEMS
    init_cfunc_module(mrb);
#endif

    int n = mrb_read_irep(mrb, data->mrb_data);

    mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));

    if (mrb->exc) {
        return NULL;
    }

    while(true) {
        pthread_mutex_lock(&data->queue_mutex);

        while(data->queue->length == 0) {
            pthread_cond_wait(&data->queue_cond, &data->queue_mutex);
        }
        
        struct queue_task *task = vector_dequeue(data->queue);
        task->status = queue_task_running;
        mrb_sym taskname = mrb_intern(mrb, task->name);

        int args_len = task->args_len;
        mrb_value *args = mrb_malloc(mrb, sizeof(struct task_arg) * task->args_len);
        int i;
        for(i=0; i<task->args_len; ++i) {
            args[i] = task_arg_to_mrb_value(data->state, task->args[i]);
        }

        pthread_mutex_unlock(&data->queue_mutex);

        mrb_value result = mrb_funcall_argv(mrb, mrb_top_self(data->state), taskname, args_len, args);
        task->result = mrb_value_to_task_arg(mrb, result);
        task->status = queue_task_finished;
        pthread_cond_signal(&task->sync_cond);

        mrb_free(mrb, args);
        free_queue_task(mrb, task);
    }

    return NULL;
}
Exemplo n.º 3
0
int main()
{

  mrb_state* mrb;
  int n;
  FILE* f;
  mrb_value ret;

  mrb = mrb_open();
  f = fopen("test.rb", "r");
  mrb_load_file(mrb, f);
  fclose(f);

  ret = mrb_funcall(mrb, mrb_top_self(mrb), "test", 1, mrb_fixnum_value(20) );
  
  //mrb_define_method(mrb, mrb->kernel_module, "cursor_move", cursor_move, MRB_ARGS_REQ(2));
//------------------------------------------

  int  x, y;
  int key=' ';
  char *str;
  initscr();
  keypad(stdscr, TRUE);

  setlocale(LC_ALL, "");

  x = 0;
  y = 0;

  while (1) {
    key = getch();
    ret = mrb_funcall(mrb, mrb_top_self(mrb), "evaluate", 1, mrb_fixnum_value(key) );
    str = mrb_string_value_ptr(mrb, ret);
    addstr(str);
    if (key == 'q') break;
    switch (key) {
      case KEY_UP: y--; break;
      case KEY_DOWN: y++; break;
      case KEY_LEFT: x--; break;
      case KEY_RIGHT: x++; break;
      default : mvprintw(y, x++, "%c", key); break;
    }
    move(y, x);
    //mrb_load_string(mrb,"cursor_move(x, y);");
  }
  endwin();
  mrb_close(mrb);
  return (0);
}
Exemplo n.º 4
0
// mruby_run for not request phase.
static int ap_mruby_run_nr(const char *mruby_code_file)
{

    int n;
    struct mrb_parser_state* p;
    FILE *mrb_file;
    mrb_state *mrb = mrb_open();
    ap_mruby_class_init(mrb);

    if ((mrb_file = fopen(mruby_code_file, "r")) == NULL) {
        ap_log_error(APLOG_MARK
            , APLOG_ERR
            , 0
            , ap_server_conf
            , "%s ERROR %s: mrb file oepn failed: %s"
            , MODULE_NAME
            , __func__
            , mruby_code_file
        );
        mrb_close(mrb);
        return -1;
    }

   ap_log_error(APLOG_MARK
       , APLOG_DEBUG
       , 0
       , ap_server_conf
       , "%s DEBUG %s: cache nothing on pid %d, compile code: %s"
       , MODULE_NAME
       , __func__
       , getpid()
       , mruby_code_file
   );

    p = mrb_parse_file(mrb, mrb_file, NULL);
    fclose(mrb_file);
    n = mrb_generate_code(mrb, p);

    mrb_pool_close(p->pool);

    ap_log_error(APLOG_MARK
        , APLOG_DEBUG
        , 0
        , ap_server_conf
        , "%s DEBUG %s: run mruby code: %s"
        , MODULE_NAME
        , __func__
        , mruby_code_file
    );

    ap_mrb_set_status_code(OK);
    mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));

    if (mrb->exc)
        ap_mrb_raise_file_error_nr(mrb, mrb_obj_value(mrb->exc), mruby_code_file);

    mrb_close(mrb);

    return APR_SUCCESS;
}
Exemplo n.º 5
0
// ssp_thread で登録されるtask本体
void
mrb_ssp_alarm_call(intptr_t exf)
{
	mrb_int alarm_id = (mrb_int)exf;		// alarmID
	mrb_value self  = alarm_self_tbl[alarm_id-1];
	char name_cstr[20];

#if MRB_DEBUG1
  	  printf("alarm_call &self = %08x self = %08x %08x\n",
  	  		  (int)&self,*((int*)&self),*(((int*)&self)+1));
#endif
	mrb_value name = mrb_iv_get(mrb_global, self, mrb_intern_lit(mrb_global, "@alarm_name"));
	mrb_value id   = mrb_iv_get(mrb_global, self, mrb_intern_lit(mrb_global, "@alarm_id"));
// 	char *name_cstr = mrb_str_to_cstr(mrb_global, name);	
    strncpy(name_cstr, RSTRING_PTR(name), RSTRING_LEN(name));
    name_cstr[RSTRING_LEN(name)]='\0';
	
#if MRB_DEBUG1
	printf("mrb_alarm_call exf = %d cstr=%s id = %d\n",
			exf,name_cstr,mrb_fixnum(id));
#endif

	t_lock_cpu();	

#if 0
	mrb_funcall(mrb_global, mrb_top_self(mrb_global), name_cstr,1, id);
#else
	mrb_funcall(mrb_global, self, name_cstr,1, id);
#endif
	t_unlock_cpu();

}
Exemplo n.º 6
0
ngx_int_t ngx_mrb_run_conf(ngx_conf_t *cf, ngx_mrb_state_t *state, ngx_mrb_code_t *code)
{
    ngx_log_error(NGX_LOG_INFO
        , cf->log
        , 0
        , "%s INFO %s:%d: mrb_run info: irep_n=%d"
        , MODULE_NAME
        , __func__
        , __LINE__
        , code->n
    );
    mrb_run(state->mrb, mrb_proc_new(state->mrb, state->mrb->irep[code->n]), mrb_top_self(state->mrb));
    if (state->mrb->exc) {
        if (code->code_type == NGX_MRB_CODE_TYPE_FILE) {
            ngx_mrb_raise_file_conf_error(state->mrb, mrb_obj_value(state->mrb->exc), cf, code->code.file);
        } else {
            ngx_mrb_raise_conf_error(state->mrb, mrb_obj_value(state->mrb->exc), cf);
        }
        mrb_gc_arena_restore(state->mrb, state->ai);
        return NGX_ERROR;
    }
    
    mrb_gc_arena_restore(state->mrb, state->ai);
    return NGX_OK;
}
Exemplo n.º 7
0
void
mrb_init_mrblib(mrb_state *mrb)
{
  int n = mrb_read_irep(mrb, mrblib_irep);

  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
}
// ssp_thread で登録されるtask本体
void
mrb_ssp_cyclic_call(intptr_t exf)
{
	mrb_int cyclic_id = (mrb_int)exf;		// cyclicID
	mrb_value self  = cyclic_self_tbl[cyclic_id-1];
	char name_cstr[20];

#if MRB_DEBUG1
  	  printf("cyclic_call &self = %08x self = %08x %08x\n",
  	  		  (int)&self,*((int*)&self),*(((int*)&self)+1));
#endif

	
	mrb_value name = mrb_iv_get(mrb_global, self, mrb_intern_lit(mrb_global, "@cyclic_name"));
	mrb_value id   = mrb_iv_get(mrb_global, self, mrb_intern_lit(mrb_global, "@cyclic_id"));
// 	char *name_cstr = mrb_str_to_cstr(mrb_global, name);	//メモリリーク? 開放しないため4回目で落ちる
    strncpy(name_cstr, RSTRING_PTR(name), RSTRING_LEN(name));
    name_cstr[RSTRING_LEN(name)]='\0';

#if MRB_DEBUG1
	printf("mrb_cyclic_call exf = %d cstr=%s id = %d\n",
			exf,name_cstr,mrb_fixnum(id));
#endif

#if 0
	mrb_funcall(mrb_global, mrb_top_self(mrb_global), "cyclic",1, id);
#else
	mrb_funcall(mrb_global, self, (const char*)name_cstr,1, id);
#endif
}
Exemplo n.º 9
0
int main(void)
{
  mrb_value response;
  mrb_state *mrb = mrb_open();
  mrbc_context *ctx = mrbc_context_new(mrb);

  // URL into instance variable "@url" of main on same ctx
  mrb_iv_set(mrb, mrb_top_self(mrb), mrb_intern_lit(mrb, "@url"),
      mrb_str_new_lit(mrb, "https://127.0.0.1:8080/index.html"));
  response = mrb_load_string_cxt(mrb, request, ctx);
  mrb_funcall(mrb, mrb_top_self(mrb), "pp", 1, response);

  mrbc_context_free(mrb, ctx);
  mrb_close(mrb);
  return 0;
}
Exemplo n.º 10
0
int main(int argc, char *argv[])
{
  mrb_state *mrb = mrb_open();
  mrb_value ARGV = mrb_ary_new_capa(mrb, argc);
  int i;
  int return_value;

  struct RClass *c = mrb_define_class(mrb, "Timeout", mrb->object_class);
  mrb_define_method(mrb, c, "alarm", mrb_alarm, MRB_ARGS_REQ(1));

  for (i = 0; i < argc; i++) {
    mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, argv[i]));
  }
  mrb_define_global_const(mrb, "ARGV", ARGV);

  // call __main__(ARGV)
  mrb_funcall(mrb, mrb_top_self(mrb), "__main__", 1, ARGV);

  return_value = EXIT_SUCCESS;

  if (mrb->exc) {
    mrb_print_error(mrb);
    return_value = EXIT_FAILURE;
  }
  mrb_close(mrb);

  return return_value;
}
Exemplo n.º 11
0
int main() {

  FILE *fp;
  if ((fp = fopen("./member.conf", "r")) == NULL)
    return 1;

  mrb_state* mrb = mrb_open();
  mrb_load_file(mrb, fp);

  mrb_value member;
  mrb_get_config_value(mrb, "member", "o", &member);
  mrb_value mnum = mrb_funcall(mrb, member, "size", 0);

  int i;
  int seki_num = mrb_fixnum(mnum);
  for (i = 0; i < seki_num; i++) {
    mnum = mrb_funcall(mrb, member, "size", 0);
    mrb_value seki = mrb_funcall(mrb, mrb_top_self(mrb), "rand", 1, mnum);
    mrb_p(mrb, mrb_funcall(mrb, member, "[]", 1, seki));
    mrb_funcall(mrb, member, "delete_at", 1, seki);
  }

  mrb_close(mrb);

  return 0;
}
Exemplo n.º 12
0
int MRuby::init() {
    const char *code =
        "def echo(x); x; end;"
        "def invert(x)\n"
        "  r = {}\n"
        "  x.each do |k, v|\n"
        "    r[v] = k\n"
        "  end\n"
        "  r\n"
        "end\n"
        ;
        
    struct mrb_parser_state *p = mrb_parse_string(mMrb, code, mContext);
    if (p->nerr > 0) {
        std::cerr << "parse error" << std::endl;
        mrb_parser_free(p);
        return 1;
    }
        
    struct RProc *proc = mrb_generate_code(mMrb, p);
    mrb_parser_free(p);
    if (proc == NULL) {
        std::cerr << "compile error" << std::endl;
        return 1;
    }

    mrb_run(mMrb, proc, mrb_top_self(mMrb));
    return 0;
}
Exemplo n.º 13
0
int main(int argc, char** argv)
{
  const char rite[] = "app.mrb";

  mrb_state* mrb = mrb_open();

  FILE* fp = fopen(rite, "r");
  if (fp == NULL) {
    fprintf(stderr, "%s not found.\n", rite);
    fprintf(stderr, "`mruby/bin/mrbc app.rb` to create app.mrb file.\n");
    exit(EXIT_FAILURE);
  }

  int n = mrb_read_irep_file(mrb, fp);
  fclose(fp);
  if (n < 0) {
    fprintf(stderr, "%s - irep load error.\n", rite);
    exit(EXIT_FAILURE);
  }
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));

  if (argc < 2) {
    printf("Usage %s <environment>\n", argv[0]);
    return 0;
  }

  // AppSetting
  struct RClass* clz = mrb_class_get(mrb, "AppSetting");
  mrb_value setting = mrb_obj_value(clz);
  // AppSetting.load(*targets) -> AppConfig
  mrb_value target = mrb_str_new(mrb, argv[1], strlen(argv[1]));
  mrb_value conf = mrb_funcall(mrb, setting, "load", 1, target);
  // AppConfig.#debug -> bool
  mrb_value debug = mrb_funcall(mrb, conf, "debug", 0);
  printf("debug: %d\n", mrb_type(debug) == MRB_TT_TRUE);
  // AppConfig.#timeout -> Integer
  mrb_value timeout = mrb_funcall(mrb, conf, "timeout", 0);
  printf("timeout: %d\n", timeout.value.i);
  // AppConfig.#title -> String
  mrb_value title = mrb_funcall(mrb, conf, "title", 0);
  printf("title: %s\n", mrb_string_value_ptr(mrb, title));
  // AppConfig.#messages -> Array
  mrb_value messages = mrb_funcall(mrb, conf, "messages", 0);
  {
    // Array.#size -> Integer
    mrb_value len = mrb_funcall(mrb, messages, "size", 0);
    int i;
    for (i = 0; i < len.value.i; i++) {
      // Array.#at(nth) -> object
      mrb_value message = mrb_funcall(mrb, messages, "at", 1, mrb_fixnum_value(i));
      printf("%s\n", mrb_string_value_ptr(mrb, message));
    }
  }

  mrb_close(mrb);

  return 0;
}
Exemplo n.º 14
0
int
main(void)
{
  mrb_state *mrb;
  mrb = mrb_open();
  int n = mrb_read_irep(mrb, fizzbuzz);
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
  mrb_close(mrb);
  return 0;
}
Exemplo n.º 15
0
int
main(int argc, char **argv)
{
  mrb_state *mrb;
  mrb = mrb_open();
  if (mrb == NULL) {
    fprintf(stderr, "Invalid mrb_state, exiting driver");
    return EXIT_FAILURE;
  }
  #if 0
  mrb_iv_set(mrb, mrb_obj_value(mrb->kernel_module),
	     mrb_intern(mrb, "@loaded_compiled_mrb_handles"),
	     mrb_ary_new(mrb));
  #endif
  mrbb_exec_entry_point_for_mrblib(mrb, mrb_top_self(mrb));
  MRBB_EXEC_ENTRY_POINT(mrb, mrb_top_self(mrb));
  mrb_close(mrb);
  return EXIT_SUCCESS;
}
Exemplo n.º 16
0
void
mrb_init_mrubybin(mrb_state *mrb)
{
  int n = mrb_read_irep(mrb, mrubybin);

  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
  if (mrb->exc) {
    mrb_p(mrb, mrb_obj_value(mrb->exc));
    exit(0);
  }
}
ngx_int_t ngx_http_mruby_run(ngx_http_request_t *r, ngx_http_mruby_state_t *state, ngx_http_mruby_code_t *code, ngx_flag_t cached)
{
    ngx_http_mruby_ctx_t       *ctx;
    ngx_http_mruby_rputs_chain_list_t *chain;

    ctx = ngx_http_get_module_ctx(r, ngx_http_mruby_module);

    ngx_http_mruby_push_request(r);

    state->ai = mrb_gc_arena_save(state->mrb);

    mrb_run(state->mrb, code->proc, mrb_top_self(state->mrb));

    if (state->mrb->exc) {
        ngx_http_mruby_raise_error(state, code, r);
    }

    mrb_gc_arena_restore(state->mrb, state->ai);
    //mrb_gc_protect(state->mrb, ctx->table);

    if (!cached) {
        ngx_http_mruby_irep_clean(state, code);
    }

    if (ctx->exited) {
        return ctx->exit_code;
    }

    chain = ctx->rputs_chain;

    if (chain == NULL) {
        if (state->mrb->exc) {
            return NGX_HTTP_INTERNAL_SERVER_ERROR;
        }
        
        if (r->headers_out.status >= NGX_HTTP_OK) {
            if (ctx->phase < NGX_HTTP_MRUBY_PHASE_LOG) {
                return r->headers_out.status;
            }
        }

        return NGX_DECLINED;
    }

    if (r->headers_out.status == NGX_HTTP_OK || !(*chain->last)->buf->last_buf) {
        r->headers_out.status = NGX_HTTP_OK;
        (*chain->last)->buf->last_buf = 1;
        ngx_http_send_header(r);
        ngx_http_output_filter(r, chain->out);
        return NGX_OK;
    }

    return r->headers_out.status;
}
Exemplo n.º 18
0
Arquivo: load.c Projeto: kano4/mruby
mrb_value
mrb_load_irep_file(mrb_state *mrb, FILE* fp)
{
  int n = mrb_read_irep_file(mrb, fp);

  if (n < 0) {
    irep_error(mrb, n);
    return mrb_nil_value();
  }
  return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
}
Exemplo n.º 19
0
Arquivo: load.c Projeto: DAddYE/mruby
mrb_value
mrb_load_irep(mrb_state *mrb, const char *bin)
{
  int n = mrb_read_irep(mrb, bin);

  if (n < 0) {
    irep_error(mrb, n);
    return mrb_nil_value();
  }
  return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
}
Exemplo n.º 20
0
Arquivo: load.c Projeto: plounze/mruby
mrb_value
mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
{
  int32_t n;

  n = mrb_read_irep(mrb, bin);
  if (n < 0) {
    irep_error(mrb, n);
    return mrb_nil_value();
  }
  return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb), 0);
}
Exemplo n.º 21
0
                       s.run                                  \n\
";

int main(void)
{
  mrb_state *mrb = mrb_open();
  mrbc_context *ctx = mrbc_context_new(mrb);

  // 8080 into instance variable "@port" of main on same ctx
  mrb_iv_set(mrb, mrb_top_self(mrb), mrb_intern_lit(mrb, "@port"),
      mrb_fixnum_value(8080));
  mrb_iv_set(mrb, mrb_top_self(mrb), mrb_intern_lit(mrb, "@echo_content"),
      mrb_str_new_lit(mrb, "world from cb."));
  mrb_load_string_cxt(mrb, config, ctx);
  mrb_load_string_cxt(mrb, response, ctx);
  mrb_load_string_cxt(mrb, run, ctx);

  mrbc_context_free(mrb, ctx);
  mrb_close(mrb);
  return 0;
}
Exemplo n.º 22
0
static void
load_mrb_file(mrb_state *mrb, mrb_value filepath)
{
  char *fpath = RSTRING_PTR(filepath);
  int arena_idx;
  FILE *fp;
  mrb_irep *irep;

  {
    FILE *fp = fopen(fpath, "rb");
    if (fp == NULL) {
      mrb_load_fail(
        mrb,
        mrb_str_new_cstr(mrb, fpath),
        "cannot load such file"
      );
      return;
    }
    fclose(fp);
  }

  arena_idx = mrb_gc_arena_save(mrb);

  fp = fopen(fpath, "rb");
  irep = mrb_read_irep_file(mrb, fp);
  fclose(fp);

  mrb_gc_arena_restore(mrb, arena_idx);

  if (irep) {
    struct RProc *proc;
    /*
    size_t i;
    for (i = sirep; i < mrb->irep_len; i++) {
      mrb->irep[i]->filename = mrb_string_value_ptr(mrb, filepath);
    }
    */

    replace_stop_with_return(mrb, irep);
    proc = mrb_proc_new(mrb, irep);
    proc->target_class = mrb->object_class;

    arena_idx = mrb_gc_arena_save(mrb);
    mrb_yield_with_class(mrb, mrb_obj_value(proc), 0, NULL, mrb_top_self(mrb), mrb->object_class);
    mrb_gc_arena_restore(mrb, arena_idx);
  } else if (mrb->exc) {
    // fail to load
    longjmp(*(jmp_buf*)mrb->jmp, 1);
  }
}
Exemplo n.º 23
0
static void
eval_load_irep(mrb_state *mrb, mrb_irep *irep)
{
  int ai;
  struct RProc *proc;

  replace_stop_with_return(mrb, irep);
  proc = mrb_proc_new(mrb, irep);
  proc->target_class = mrb->object_class;

  ai = mrb_gc_arena_save(mrb);
  mrb_yield_internal(mrb, mrb_obj_value(proc), 0, NULL, mrb_top_self(mrb), mrb->object_class);
  mrb_gc_arena_restore(mrb, ai);
}
Exemplo n.º 24
0
static int ap_mruby_run_inline(mrb_state *mrb, request_rec *r, mod_mruby_code_t *c)
{
    int ai;
    mrb_value ret;

    // mutex lock
    if (apr_thread_mutex_lock(mod_mruby_mutex) != APR_SUCCESS) {
        ap_log_rerror(APLOG_MARK
            , APLOG_ERR
            , 0
            , r
            , "%s ERROR %s: mod_mruby_mutex lock failed"
            , MODULE_NAME
            , __func__
        );
        return OK;
    }
    ap_mrb_push_request(r);
    ai = mrb_gc_arena_save(mrb);
    ap_log_rerror(APLOG_MARK
        , APLOG_DEBUG
        , 0
        , r
        , "%s DEBUG %s: irep[%d] inline core run: inline code = %s"
        , MODULE_NAME
        , __func__
        , c->irep_idx_start
        , c->code
    );
    ret = mrb_run(mrb
        , mrb_proc_new(mrb, mrb->irep[c->irep_idx_start])
        , mrb_top_self(mrb)
    );
    mrb_gc_arena_restore(mrb, ai);
    ap_mruby_state_clean(mrb);
    // mutex unlock
    if (apr_thread_mutex_unlock(mod_mruby_mutex) != APR_SUCCESS){
        ap_log_rerror(APLOG_MARK
            , APLOG_ERR
            , 0
            , r
            , "%s ERROR %s: mod_mruby_mutex unlock failed"
            , MODULE_NAME
            , __func__
        );
        return OK;
    }

    return OK;
}
static ngx_int_t ngx_stream_mrb_run_cycle(ngx_cycle_t *cycle, mrb_state *mrb, ngx_mrb_code_t *code)
{
  mrb_int ai = mrb_gc_arena_save(mrb);

  mrb_run(mrb, code->proc, mrb_top_self(mrb));
  if (mrb->exc) {
    ngx_stream_mrb_raise_cycle_error(mrb, mrb_obj_value(mrb->exc), cycle);
    mrb_gc_arena_restore(mrb, ai);
    return NGX_ERROR;
  }

  mrb_gc_arena_restore(mrb, ai);
  return NGX_OK;
}
Exemplo n.º 26
0
void h2o_mruby_send_chunked_init_context(h2o_mruby_shared_context_t *shared_ctx)
{
    mrb_state *mrb = shared_ctx->mrb;

    h2o_mruby_eval_expr_location(mrb, H2O_MRUBY_CODE_CHUNKED, "(h2o)lib/handler/mruby/embedded/chunked.rb", 1);
    h2o_mruby_assert(mrb);

    mrb_define_method(mrb, mrb->kernel_module, "_h2o_send_chunk", send_chunked_method, MRB_ARGS_ARG(1, 0));
    h2o_mruby_define_callback(mrb, "_h2o_send_chunk_eos", send_chunked_eos_callback);

    mrb_ary_set(mrb, shared_ctx->constants, H2O_MRUBY_CHUNKED_PROC_EACH_TO_FIBER,
                mrb_funcall(mrb, mrb_top_self(mrb), "_h2o_chunked_proc_each_to_fiber", 0));
    h2o_mruby_assert(mrb);
}
Exemplo n.º 27
0
static mrb_value
load_exec(mrb_state *mrb, mrb_parser_state *p, mrbc_context *c)
{
    RClass *target = mrb->object_class;
    RProc *proc;
    mrb_value v;

    if (!p) {
        return mrb_value::undef();
    }
    if (!p->m_tree || p->nerr) {
        if (p->m_capture_errors) {
            char buf[256];

            int n = snprintf(buf, sizeof(buf), "line %d: %s\n",
                             p->error_buffer[0].lineno, p->error_buffer[0].message);
            mrb->m_exc = mrb_exc_new(E_SYNTAX_ERROR, buf, n).object_ptr();
            mrb_parser_free(p);
            return mrb_value::undef();
        }
        else {
            static const char msg[] = "syntax error";
            mrb->m_exc = mrb_exc_new(E_SYNTAX_ERROR, msg, sizeof(msg) - 1).object_ptr();
            mrb_parser_free(p);
            return mrb_value::undef();
        }
    }
    proc = mrb_generate_code(mrb, p);
    mrb_parser_free(p);
    if (nullptr == proc) {
        static const char msg[] = "codegen error";
        mrb->m_exc = mrb_exc_new(E_SCRIPT_ERROR, msg, sizeof(msg) - 1).object_ptr();
        return mrb_value::undef();
    }
    if (c) {
        if (c->dump_result) mrb->codedump_all(proc);
        if (c->no_exec) return mrb_value::wrap(proc);
        if (c->target_class) {
            target = c->target_class;
        }
    }
    proc->m_target_class = target;
    if (mrb->m_ctx->m_ci) {
        mrb->m_ctx->m_ci->target_class = target;
    }
    v = mrb->mrb_context_run(proc, mrb_top_self(mrb),0);
    if (mrb->m_exc) return mrb_value::nil();
    return v;
}
ngx_int_t ngx_http_mruby_run_conf(ngx_conf_t *cf, ngx_http_mruby_state_t *state, ngx_http_mruby_code_t *code)
{
    state->ai = mrb_gc_arena_save(state->mrb);

    mrb_run(state->mrb, code->proc, mrb_top_self(state->mrb));
    
    mrb_gc_arena_restore(state->mrb, state->ai);

    if (state->mrb->exc) {
        ngx_http_mruby_raise_conf_error(state, code, cf);
        return NGX_ERROR;
    }

    return NGX_OK;
}
Exemplo n.º 29
0
MRB_API mrb_value
mrb_load_irep_cxt(mrb_state *mrb, const uint8_t *bin, mrbc_context *c)
{
  mrb_irep *irep = mrb_read_irep(mrb, bin);
  struct RProc *proc;

  if (!irep) {
    irep_error(mrb);
    return mrb_nil_value();
  }
  proc = mrb_proc_new(mrb, irep);
  mrb_irep_decref(mrb, irep);
  if (c && c->no_exec) return mrb_obj_value(proc);
  return mrb_top_run(mrb, proc, mrb_top_self(mrb), 0);
}
Exemplo n.º 30
0
bool TRI_ExecuteRubyString (mrb_state* mrb,
                            char const* script,
                            char const* name,
                            bool printResult,
                            mrb_value* result) {
  struct mrb_parser_state* parser;
  mrb_value r;
  int n;

  parser = mrb_parse_nstring(mrb, script, strlen(script), NULL);

  if (parser == 0 || parser->tree == 0 || 0 < parser->nerr) {
    LOG_DEBUG("failed to parse ruby script");

    if (parser != 0 && parser->pool != 0) {
      mrb_pool_close(parser->pool);
    }

    return false;
  }

  n = mrb_generate_code(mrb, parser);
  mrb_pool_close(parser->pool);

  if (n < 0) {
    LOG_DEBUG("failed to generate ruby code: %d", n);
    return false;
  }

  r = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));

  if (mrb->exc) {
    if (printResult) {
      mrb_p(mrb, mrb_obj_value(mrb->exc));
    }

    mrb->exc = 0;
  }
  else if (printResult && ! mrb_nil_p(r)) {
    mrb_p(mrb, r);
  }

  if (result != NULL) {
    *result = r;
  }

  return true;
}