Commit 6b8582c9 authored by dearblue's avatar dearblue

Add `bin/mrbc --no-ext-ops` switch

Print an error if `OP_EXT[123]` is needed when generating mruby binary.
This may be useful for mruby/c.

Inspired by #5590.
parent 9b65d0dc
...@@ -31,6 +31,7 @@ typedef struct mrbc_context { ...@@ -31,6 +31,7 @@ typedef struct mrbc_context {
mrb_bool no_exec:1; mrb_bool no_exec:1;
mrb_bool keep_lv:1; mrb_bool keep_lv:1;
mrb_bool no_optimize:1; mrb_bool no_optimize:1;
mrb_bool no_ext_ops:1;
const struct RProc *upper; const struct RProc *upper;
size_t parser_nerr; size_t parser_nerr;
...@@ -155,6 +156,7 @@ struct mrb_parser_state { ...@@ -155,6 +156,7 @@ struct mrb_parser_state {
mrb_bool no_optimize:1; mrb_bool no_optimize:1;
mrb_bool capture_errors:1; mrb_bool capture_errors:1;
mrb_bool no_ext_ops:1;
const struct RProc *upper; const struct RProc *upper;
struct mrb_parser_message error_buffer[10]; struct mrb_parser_message error_buffer[10];
struct mrb_parser_message warn_buffer[10]; struct mrb_parser_message warn_buffer[10];
......
...@@ -24,6 +24,7 @@ struct mrbc_args { ...@@ -24,6 +24,7 @@ struct mrbc_args {
mrb_bool check_syntax : 1; mrb_bool check_syntax : 1;
mrb_bool verbose : 1; mrb_bool verbose : 1;
mrb_bool remove_lv : 1; mrb_bool remove_lv : 1;
mrb_bool no_ext_ops : 1;
uint8_t flags : 4; uint8_t flags : 4;
}; };
...@@ -40,6 +41,7 @@ usage(const char *name) ...@@ -40,6 +41,7 @@ usage(const char *name)
"-S dump C struct (requires -B)", "-S dump C struct (requires -B)",
"-s define <symbol> as static variable", "-s define <symbol> as static variable",
"--remove-lv remove local variables", "--remove-lv remove local variables",
"--no-ext-ops prohibit using OP_EXTs",
"--verbose run at verbose mode", "--verbose run at verbose mode",
"--version print the version", "--version print the version",
"--copyright print the copyright", "--copyright print the copyright",
...@@ -163,6 +165,10 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args) ...@@ -163,6 +165,10 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
args->remove_lv = TRUE; args->remove_lv = TRUE;
break; break;
} }
else if (strcmp(argv[i] + 2, "no-ext-ops") == 0) {
args->no_ext_ops = TRUE;
break;
}
return -1; return -1;
default: default:
return i; return i;
...@@ -217,6 +223,7 @@ load_file(mrb_state *mrb, struct mrbc_args *args) ...@@ -217,6 +223,7 @@ load_file(mrb_state *mrb, struct mrbc_args *args)
if (args->verbose) if (args->verbose)
c->dump_result = TRUE; c->dump_result = TRUE;
c->no_exec = TRUE; c->no_exec = TRUE;
c->no_ext_ops = args->no_ext_ops;
if (input[0] == '-' && input[1] == '\0') { if (input[0] == '-' && input[1] == '\0') {
infile = stdin; infile = stdin;
} }
......
...@@ -167,6 +167,14 @@ codegen_realloc(codegen_scope *s, void *p, size_t len) ...@@ -167,6 +167,14 @@ codegen_realloc(codegen_scope *s, void *p, size_t len)
return p; return p;
} }
static void
check_no_ext_ops(codegen_scope *s, uint16_t a, uint16_t b)
{
if (s->parser->no_ext_ops && (a | b) > 0xff) {
codegen_error(s, "need OP_EXTs instruction (currently OP_EXTs are prohibited)");
}
}
static int static int
new_label(codegen_scope *s) new_label(codegen_scope *s)
{ {
...@@ -235,6 +243,7 @@ static void ...@@ -235,6 +243,7 @@ static void
genop_1(codegen_scope *s, mrb_code i, uint16_t a) genop_1(codegen_scope *s, mrb_code i, uint16_t a)
{ {
s->lastpc = s->pc; s->lastpc = s->pc;
check_no_ext_ops(s, a, 0);
if (a > 0xff) { if (a > 0xff) {
gen_B(s, OP_EXT1); gen_B(s, OP_EXT1);
gen_B(s, i); gen_B(s, i);
...@@ -250,6 +259,7 @@ static void ...@@ -250,6 +259,7 @@ static void
genop_2(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b) genop_2(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b)
{ {
s->lastpc = s->pc; s->lastpc = s->pc;
check_no_ext_ops(s, a, b);
if (a > 0xff && b > 0xff) { if (a > 0xff && b > 0xff) {
gen_B(s, OP_EXT3); gen_B(s, OP_EXT3);
gen_B(s, i); gen_B(s, i);
...@@ -555,6 +565,7 @@ genjmp2(codegen_scope *s, mrb_code i, uint16_t a, uint32_t pc, int val) ...@@ -555,6 +565,7 @@ genjmp2(codegen_scope *s, mrb_code i, uint16_t a, uint32_t pc, int val)
} }
if (a > 0xff) { if (a > 0xff) {
check_no_ext_ops(s, a, 0);
gen_B(s, OP_EXT1); gen_B(s, OP_EXT1);
genop_0(s, i); genop_0(s, i);
gen_S(s, a); gen_S(s, a);
......
...@@ -6569,6 +6569,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt) ...@@ -6569,6 +6569,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt)
} }
p->capture_errors = cxt->capture_errors; p->capture_errors = cxt->capture_errors;
p->no_optimize = cxt->no_optimize; p->no_optimize = cxt->no_optimize;
p->no_ext_ops = cxt->no_ext_ops;
p->upper = cxt->upper; p->upper = cxt->upper;
if (cxt->partial_hook) { if (cxt->partial_hook) {
p->cxt = cxt; p->cxt = cxt;
......
...@@ -12796,6 +12796,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt) ...@@ -12796,6 +12796,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt)
} }
p->capture_errors = cxt->capture_errors; p->capture_errors = cxt->capture_errors;
p->no_optimize = cxt->no_optimize; p->no_optimize = cxt->no_optimize;
p->no_ext_ops = cxt->no_ext_ops;
p->upper = cxt->upper; p->upper = cxt->upper;
if (cxt->partial_hook) { if (cxt->partial_hook) {
p->cxt = cxt; p->cxt = cxt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment