mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
change return value from mrb_generate_code()
This commit is contained in:
@@ -164,7 +164,7 @@ struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,mrbc_context*);
|
||||
#endif
|
||||
struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*,mrbc_context*);
|
||||
struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,int,mrbc_context*);
|
||||
int mrb_generate_code(mrb_state*, struct mrb_parser_state*);
|
||||
struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*);
|
||||
|
||||
/* program load functions */
|
||||
#ifdef ENABLE_STDIO
|
||||
|
||||
@@ -361,13 +361,12 @@ main(int argc, char **argv)
|
||||
}
|
||||
else {
|
||||
/* generate bytecode */
|
||||
n = mrb_generate_code(mrb, parser);
|
||||
struct RProc *proc = mrb_generate_code(mrb, parser);
|
||||
|
||||
/* evaluate the bytecode */
|
||||
result = mrb_run(mrb,
|
||||
/* pass a proc for evaulation */
|
||||
mrb_proc_new(mrb, mrb->irep[n]),
|
||||
mrb_top_self(mrb));
|
||||
proc, mrb_top_self(mrb));
|
||||
/* did an exception occur? */
|
||||
if (mrb->exc) {
|
||||
p(mrb, mrb_obj_value(mrb->exc), 0);
|
||||
|
||||
+8
-7
@@ -9,7 +9,7 @@
|
||||
#include <string.h>
|
||||
#include "mruby.h"
|
||||
#include "mruby/compile.h"
|
||||
#include "mruby/irep.h"
|
||||
#include "mruby/proc.h"
|
||||
#include "mruby/numeric.h"
|
||||
#include "mruby/string.h"
|
||||
#include "mruby/debug.h"
|
||||
@@ -2829,14 +2829,16 @@ codedump(mrb_state *mrb, int n)
|
||||
}
|
||||
|
||||
void
|
||||
codedump_all(mrb_state *mrb, int start)
|
||||
codedump_all(mrb_state *mrb, struct RProc *proc)
|
||||
{
|
||||
size_t i;
|
||||
mrb_irep *irep = proc->body.irep;
|
||||
|
||||
for (i=start; i<mrb->irep_len; i++) {
|
||||
for (i=irep->idx; i<mrb->irep_len; i++) {
|
||||
codedump(mrb, i);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
codegen_start(mrb_state *mrb, parser_state *p)
|
||||
{
|
||||
@@ -2860,14 +2862,13 @@ codegen_start(mrb_state *mrb, parser_state *p)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
struct RProc*
|
||||
mrb_generate_code(mrb_state *mrb, parser_state *p)
|
||||
{
|
||||
int start = mrb->irep_len;
|
||||
int n;
|
||||
|
||||
n = codegen_start(mrb, p);
|
||||
if (n < 0) return n;
|
||||
|
||||
return start;
|
||||
if (n < 0) return NULL;
|
||||
return mrb_proc_new(mrb, mrb->irep[start]);
|
||||
}
|
||||
|
||||
+6
-7
@@ -5155,7 +5155,7 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt)
|
||||
}
|
||||
}
|
||||
|
||||
void codedump_all(mrb_state*, int);
|
||||
void codedump_all(mrb_state*, struct RProc*);
|
||||
void parser_dump(mrb_state *mrb, node *tree, int offset);
|
||||
|
||||
void
|
||||
@@ -5346,7 +5346,6 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
|
||||
{
|
||||
struct RClass *target = mrb->object_class;
|
||||
struct RProc *proc;
|
||||
int n;
|
||||
mrb_value v;
|
||||
|
||||
if (!p) {
|
||||
@@ -5355,6 +5354,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
|
||||
if (!p->tree || p->nerr) {
|
||||
if (p->capture_errors) {
|
||||
char buf[256];
|
||||
int n;
|
||||
|
||||
n = snprintf(buf, sizeof(buf), "line %d: %s\n",
|
||||
p->error_buffer[0].lineno, p->error_buffer[0].message);
|
||||
@@ -5369,21 +5369,20 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
|
||||
return mrb_undef_value();
|
||||
}
|
||||
}
|
||||
n = mrb_generate_code(mrb, p);
|
||||
proc = mrb_generate_code(mrb, p);
|
||||
mrb_parser_free(p);
|
||||
if (n < 0) {
|
||||
if (proc == NULL) {
|
||||
static const char msg[] = "codegen error";
|
||||
mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1));
|
||||
return mrb_nil_value();
|
||||
}
|
||||
if (c) {
|
||||
if (c->dump_result) codedump_all(mrb, n);
|
||||
if (c->no_exec) return mrb_fixnum_value(n);
|
||||
if (c->dump_result) codedump_all(mrb, proc);
|
||||
if (c->no_exec) return mrb_fixnum_value(0);
|
||||
if (c->target_class) {
|
||||
target = c->target_class;
|
||||
}
|
||||
}
|
||||
proc = mrb_proc_new(mrb, mrb->irep[n]);
|
||||
proc->target_class = target;
|
||||
if (mrb->c->ci) {
|
||||
mrb->c->ci->target_class = target;
|
||||
|
||||
Reference in New Issue
Block a user