Example #1
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));
}
Example #2
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;
}
Example #3
0
int main()
{
  mrb_state *mrb;
  int n;
  FILE* f;
  struct RClass* cObject;
  mrbc_context *mrbc_ctx;
  struct mrb_parser_state *p;

  mrb = mrb_open();
  mrbc_ctx = mrbc_context_new(mrb);
  cObject = mrb_class_obj_get(mrb, "Object");
  mrb_define_method(mrb, cObject, "plus", plus, ARGS_ANY());
  //mrb_define_singleton_method(mrb, mrb_top_self(mrb), "plus", plus, ARGS_REQ(2));
  f = fopen("step4.rb", "r");
  if(f==NULL){ _error("file not found."); }
  p = mrb_parse_file(mrb,f,mrbc_ctx);
  fclose(f);
  n = mrb_generate_code(mrb, p);
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
  mrb_parser_free(p);
  mrbc_context_free(mrb,mrbc_ctx);
  mrb_close(mrb);
  return 0;
}
static int cpurate_from_mruby(request_rec *r)
{
    FILE *mrb_file;
    mrm_config_t *conf = ap_get_module_config(r->server->module_config, &resource_manager_module);

    mrb_state *mrb = mrb_open();
    ap_mruby_class_init(mrb);
        if ((mrb_file = fopen(conf->mruby_code, "r")) == NULL) {
            ap_log_error(APLOG_MARK
                , APLOG_ERR
                , 0
                , NULL
                , "%s ERROR %s: mrb file oepn failed: %s"
                , MODULE_NAME
                , __func__
                , conf->mruby_code
            );
        }
    struct mrb_parser_state* p = mrb_parse_file(mrb, mrb_file, NULL);
    int n = mrb_generate_code(mrb, p->tree);
    mrb_pool_close(p->pool);
    ap_mrb_push_request(r);
    mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());

    return OK;
}
Example #5
0
static ERL_NIF_TERM eval1(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
  ErlNifBinary script_binary;

  if (!enif_inspect_binary(env, argv[0], &script_binary)){
    return enif_make_badarg(env);
  }

  mrb_state *mrb;
  mrbc_context *cxt;

  mrb = mrb_open();

  if (mrb == NULL) {
    return enif_make_atom(env, "error");
  }

  char *script = malloc(script_binary.size+1);
  script[script_binary.size] = '\0';
  strncpy(script, (const char *)script_binary.data, (int)script_binary.size);

  ERL_NIF_TERM erl_result;
  cxt = mrbc_context_new(mrb);
  struct mrb_parser_state* st = mrb_parse_string(mrb, (const char *)script, cxt);
  int n = mrb_generate_code(mrb, st);
  mrb_pool_close(st->pool);
  mrb_value result = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
  erl_result = mruby2erl(env, mrb, result);

  free(script);
  mrbc_context_free(mrb, cxt);
  mrb_close(mrb);
  enif_release_binary(&script_binary);

  return erl_result;
}
Example #6
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;
}
Example #7
0
	virtual void PerformIteration() 
	{
		mrb_run(mrb, script, mrb_nil_value());
		if (mrb->exc) {
			mrb_p(mrb, mrb_obj_value(mrb->exc));
		}
	}
Example #8
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;
}
Example #9
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;
}
Example #10
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;
}
Example #11
0
int main()
{
  mrb_state *mrb;
  int n;

  mrb = mrb_open();
  n = mrb_load_string(mrb, "puts 'hello'; puts 1+2; p({:a=>[1,2,3], :b=>{'c'=>{'d'=>['e', {'f'=>nil}]}}})");
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
  mrb_close(mrb);
}
Example #12
0
File: vm.c Project: kstephens/mruby
mrb_value
mrb_funcall_with_block(mrb_state *mrb, mrb_value self, const char *name, int argc, mrb_value *argv, struct RProc *blk)
{
  struct RProc *p;
  struct RClass *c;
  mrb_sym mid = mrb_intern(mrb, name);
  mrb_sym undef = 0;
  mrb_callinfo *ci;
  int n = mrb->ci->nregs;
  mrb_value val;

  c = mrb_class(mrb, self);
  p = mrb_method_search_vm(mrb, &c, mid);
  if (!p) {
    undef = mid;
    mid = mrb_intern(mrb, "method_missing");
    p = mrb_method_search_vm(mrb, &c, mid);
    n++; argc++;
  }
  ci = cipush(mrb);
  ci->mid = mid;
  ci->proc = p;
  ci->stackidx = mrb->stack - mrb->stbase;
  ci->argc = argc;
  ci->target_class = p->target_class;
  ci->nregs = argc + 2;
  ci->acc = -1;
  mrb->stack = mrb->stack + n;

  stack_extend(mrb, ci->nregs, 0);
  mrb->stack[0] = self;
  if (undef) {
    mrb->stack[1] = mrb_symbol_value(undef);
    memcpy(mrb->stack+2, argv, sizeof(mrb_value)*(argc-1));
  }
  else if (argc > 0) {
    memcpy(mrb->stack+1, argv, sizeof(mrb_value)*argc);
  }
  if (!blk) {
    mrb->stack[argc+1] = mrb_nil_value();
  }
  else {
    mrb->stack[argc+1] = mrb_obj_value(blk);
  }

  if (MRB_PROC_CFUNC_P(p)) {
    val = p->body.func(mrb, self);
    mrb->stack = mrb->stbase + ci->stackidx;
    cipop(mrb);
  }
  else {
    val = mrb_run(mrb, p, self);
  }
  return val;
}
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;
}
Example #14
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);
  }
}
Example #15
0
File: load.c Project: 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));
}
Example #16
0
File: load.c Project: 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));
}
Example #17
0
mrb_value mrbb_proc_call(mrb_state *mrb, mrb_value self)
{
  mrb_callinfo *ci;
  mrb_value recv = mrb->stack[0];
  struct RProc *m = mrb_proc_ptr(recv);
  int ai = mrb->arena_idx;

  /* replace callinfo */
  ci = mrb->ci;
  ci->target_class = m->target_class;
  ci->proc = m;
  if (m->env) {
if (m->env->mid) {
ci->mid = m->env->mid;
}
    if (!m->env->stack) {
      m->env->stack = mrb->stack;
    }
  }

  /* prepare stack */
  if (MRB_PROC_CFUNC_P(m)) {
    recv = m->body.func(mrb, m->env->stack[0]);
    mrb->arena_idx = ai;
    if (mrb->exc) mrbb_raise(mrb, 0);
    /* pop stackpos */
    // already done by funcall
//ci = mrb->ci;
    //mrb->stack = mrb->stbase + ci->stackidx;
//regs[ci->acc] = recv;
//pc = ci->pc;
    //cipop(mrb);
  } else {
    mrb_irep *irep = m->body.irep;
    if (!irep) {
      mrb->stack[0] = mrb_nil_value();
      return mrb_nil_value();
    }
    ci->nregs = irep->nregs;
    if (ci->argc < 0) {
      stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
    }
    else {
      stack_extend(mrb, irep->nregs,  ci->argc+2);
    }
    mrb->stack[0] = m->env->stack[0];
    recv = mrb_run(mrb, m, recv);
  }
  // TODO: only overwrite this method for Cfunc procs
  // so we let OP_CALL handle interpreted funcs
  return recv;
}
Example #18
0
static ERL_NIF_TERM eval2(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
  ErlNifBinary script_binary;

  if (!enif_inspect_binary(env, argv[0], &script_binary)){
    return enif_make_badarg(env);
  }

  if (!enif_is_list(env, argv[1])) {
    enif_release_binary(&script_binary);
    return enif_make_badarg(env);
  }

  mrb_state *mrb;
  mrbc_context *cxt;

  mrb = mrb_open();

  if (mrb == NULL) {
    return enif_make_atom(env, "error");
  }

  unsigned int mrb_argv_len;
  enif_get_list_length(env, argv[1], &mrb_argv_len);
  mrb_value mrb_argv = mrb_ary_new(mrb);
  ERL_NIF_TERM cur;
  for(cur = argv[1]; !enif_is_empty_list(env, cur); ) {
    ERL_NIF_TERM head, tail;
    enif_get_list_cell(env, cur, &head, &tail);
    mrb_ary_push(mrb, mrb_argv, erl2mruby(env, mrb, head));
    cur = tail;
  }
  mrb_define_global_const(mrb, "ARGV", mrb_argv);

  char *script = malloc(script_binary.size+1);
  strncpy(script, (const char *)script_binary.data, (int)script_binary.size);
  script[script_binary.size] = '\0';

  cxt = mrbc_context_new(mrb);
  struct mrb_parser_state* st = mrb_parse_string(mrb, (const char *)script, cxt);
  int n = mrb_generate_code(mrb, st);
  mrb_pool_close(st->pool);
  mrb_value result = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
  ERL_NIF_TERM erl_result = mruby2erl(env, mrb, result);

  free(script);
  mrbc_context_free(mrb, cxt);
  mrb_close(mrb);
  enif_release_binary(&script_binary);

  return erl_result;
}
Example #19
0
int main(int argc, char **argv)
{
  if(argc != 2)
  {
    print_usage();
    exit(1);
  }

  char *input_file = argv[1];

  FILE *fp = fopen(input_file, "r");
  if(fp == NULL)
  {
    fprintf(stderr, "Error opening file: '%s' - %s\n", input_file, strerror(errno));
    exit(2);
  }

  char *code = NULL;
  char buffer[1024];
  int code_size = 0;
  do
  {
    int read_bytes = fread(buffer, sizeof(char), 1024, fp);
    code = realloc(code, code_size + read_bytes);
    memcpy(code+code_size, buffer, read_bytes);
    code_size += read_bytes;
  } while(!feof(fp));

  code = realloc(code, code_size + 1);
  code[code_size] = 0;

  if(fclose(fp) != 0)
  {
    fprintf(stderr, "Error closing file: '%s' - %s\n", input_file, strerror(errno));
    exit(3);
  }

  mrb_state* mrb = mrb_open();
  mrb_uv_init(mrb);

  struct mrb_parser_state* st = mrb_parse_string(mrb, code);
  free(code);

  int n = mrb_generate_code(mrb, st->tree);

  mrb_pool_close(st->pool);
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());

  return 0;
}
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;
}
Example #21
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;
}
Example #22
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;
}
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;
}
Example #24
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;
}
Example #25
0
VALUE mruby_eval(VALUE self, VALUE prog) {
  int n = -1;
  mrb_state *mrb = mrb_open();
  struct mrb_parser_state *p;
  mrbc_context *c = mrbc_context_new(mrb);
  mrb_value rc;

  p = mrb_parse_string(mrb, StringValueCStr(prog), c);
  n = mrb_generate_code(mrb, p);
  mrbc_context_free(mrb, c);
  mrb_pool_close(p->pool);
  if (n >= 0) {
    rc = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
  }

  return mruby_cvt_mr2cr(rc);
}
ngx_int_t ngx_http_mruby_run_body_filter(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;
    mrb_value ARGV, mrb_result;
    size_t body_length;

    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);

    ARGV = mrb_ary_new_capa(state->mrb, 1);

    mrb_ary_push(state->mrb, ARGV, mrb_str_new(state->mrb, (char *)ctx->filter_ctx.body, ctx->filter_ctx.body_length));
    mrb_define_global_const(state->mrb, "ARGV", ARGV);

    mrb_result = 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);
        }
        return NGX_ERROR;
    }
    
    mrb_result = mrb_obj_as_string(state->mrb, mrb_result);

    body_length = RSTRING_LEN(mrb_result);

    if (body_length != 0) {
        ctx->filter_ctx.body        = (u_char *)RSTRING_PTR(mrb_result);
        ctx->filter_ctx.body_length = body_length;
    }

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

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

    return NGX_OK;
}
Example #27
0
ngx_int_t ngx_mrb_run(ngx_http_request_t *r, ngx_mrb_state_t *state, ngx_flag_t cached)
{
    ngx_mruby_ctx_t *ctx;
    rputs_chain_list_t *chain;
    if (state == NGX_CONF_UNSET_PTR) {
        return NGX_DECLINED;
    }
    if ((ctx = ngx_pcalloc(r->pool, sizeof(*ctx))) == NULL) {
        ngx_log_error(NGX_LOG_ERR
            , r->connection->log
            , 0
            , "failed to allocate memory from r->pool %s:%d"
            , __FUNCTION__
            , __LINE__
        );
        return NGX_ERROR;
    }
    ngx_http_set_ctx(r, ctx, ngx_http_mruby_module);
    ngx_mrb_push_request(r);
    mrb_run(state->mrb, mrb_proc_new(state->mrb, state->mrb->irep[state->n]), mrb_nil_value());
    if (state->mrb->exc) {
        if (state->code_type == NGX_MRB_CODE_TYPE_FILE) {
            ngx_mrb_raise_file_error(state->mrb, mrb_obj_value(state->mrb->exc), r, state->code.file);
        } else {
            ngx_mrb_raise_error(state->mrb, mrb_obj_value(state->mrb->exc), r);
        }
    }
    mrb_gc_arena_restore(state->mrb, state->ai);
    if (!cached) {
        ngx_mrb_irep_clean(state);
    }
    if (ngx_http_get_module_ctx(r, ngx_http_mruby_module) != NULL) {
        chain = ctx->rputs_chain;
        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);
            ngx_http_set_ctx(r, NULL, ngx_http_mruby_module);
            return NGX_OK;
        } else {
            return r->headers_out.status;
        }
    }
    return NGX_OK;
}
Example #28
0
std::string Epoch::Script::run_line(char* source){
    struct mrb_parser_state *parser = this->get_parser();
    parser->s = source;
    parser->send = source + strlen(source);
    mrb_parser_parse(parser, this->current_context);

    int compilation_result = mrb_generate_code(this->main_state, parser);

    if (0 < parser->nerr) {
        printf("line %d: %s\n", parser->error_buffer[0].lineno, parser->error_buffer[0].message);
    }

    mrb_value result = mrb_run(this->main_state,
                               mrb_proc_new(this->main_state, this->main_state->irep[compilation_result]),
                               mrb_top_self(this->main_state));

    return return_inspect(this->main_state, result);
}
Example #29
0
int main()
{
  mrb_state *mrb;
  int n;
  FILE* f;
  struct RClass* cObject;

  mrb = mrb_open();
  cObject = mrb_class_obj_get(mrb, "Object");
  mrb_define_method(mrb, cObject, "plus", plus, ARGS_ANY());
  //mrb_define_singleton_method(mrb, mrb_top_self(mrb), "plus", plus, ARGS_REQ(2));
  f = fopen("step4.rb", "r");
  if(f==NULL){ _error("file not found."); }
  n = mrb_load_file(mrb, f);
  fclose(f);
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
  mrb_close(mrb);
}
Example #30
0
int exec(int argc, char* argv[])
{
    mrb_state* mrb = mrb_open();

    if(mrb == 0)
    {
        printf("cannot open mruby\n");
        return -2;
    }

    // クラスを定義する
    RClass* my_class = mrb_define_class(mrb, "MyClass", mrb->object_class);

    // メソッドを定義する
    mrb_define_method(mrb, my_class, "print_name", my_class_print_name, ARGS_NONE());

    for(int i = 0; i < argc; ++i)
    {
        FILE* fp = std::fopen(argv[i], "r");
        if(fp == 0)
        {
            printf("cannot open file \"%s\"\n", argv[i]);
            continue;
        }

        mrb_parser_state* parser       = mrb_parse_file(mrb, fp);
        int               byte_code    = mrb_generate_code(mrb, parser->tree);
        mrb_value         return_value = mrb_run( mrb,
                                                  mrb_proc_new(mrb, mrb->irep[byte_code]),
                                                  mrb_top_self(mrb)
                                                );
        if(mrb->exc) // if exception occurred ...
        {
            mrb_p(mrb, return_value);
            mrb->exc = 0;
        }

        std::fclose(fp);
    }

    mrb_close(mrb);

    return 0;
}