diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-12-19 19:11:51 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-12-19 19:11:51 +0900 |
| commit | a17955259ebc1bf49e6d5361fe08205e526c4ac3 (patch) | |
| tree | d6f8fac17387822518de87dcbdbda942e72fd88c /mrbgems | |
| parent | d7812bd3d6b059966f693ac406034e4ceb22f7d5 (diff) | |
| parent | 6b8582c95d64b75837e6778c712d705e07edad17 (diff) | |
| download | mruby-a17955259ebc1bf49e6d5361fe08205e526c4ac3.tar.gz mruby-a17955259ebc1bf49e6d5361fe08205e526c4ac3.zip | |
Merge pull request #5602 from dearblue/no-ext-ops
Add `bin/mrbc --no-ext-ops` switch
Diffstat (limited to 'mrbgems')
| -rw-r--r-- | mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c | 7 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 11 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/y.tab.c | 1 |
4 files changed, 20 insertions, 0 deletions
diff --git a/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c b/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c index e17f32a2e..8b0b6dc57 100644 --- a/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c +++ b/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c @@ -24,6 +24,7 @@ struct mrbc_args { mrb_bool check_syntax : 1; mrb_bool verbose : 1; mrb_bool remove_lv : 1; + mrb_bool no_ext_ops : 1; uint8_t flags : 4; }; @@ -40,6 +41,7 @@ usage(const char *name) "-S dump C struct (requires -B)", "-s define <symbol> as static variable", "--remove-lv remove local variables", + "--no-ext-ops prohibit using OP_EXTs", "--verbose run at verbose mode", "--version print the version", "--copyright print the copyright", @@ -163,6 +165,10 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args) args->remove_lv = TRUE; break; } + else if (strcmp(argv[i] + 2, "no-ext-ops") == 0) { + args->no_ext_ops = TRUE; + break; + } return -1; default: return i; @@ -217,6 +223,7 @@ load_file(mrb_state *mrb, struct mrbc_args *args) if (args->verbose) c->dump_result = TRUE; c->no_exec = TRUE; + c->no_ext_ops = args->no_ext_ops; if (input[0] == '-' && input[1] == '\0') { infile = stdin; } diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 722c0b480..751d0d19a 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -167,6 +167,14 @@ codegen_realloc(codegen_scope *s, void *p, size_t len) 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 new_label(codegen_scope *s) { @@ -235,6 +243,7 @@ static void genop_1(codegen_scope *s, mrb_code i, uint16_t a) { s->lastpc = s->pc; + check_no_ext_ops(s, a, 0); if (a > 0xff) { gen_B(s, OP_EXT1); gen_B(s, i); @@ -250,6 +259,7 @@ static void genop_2(codegen_scope *s, mrb_code i, uint16_t a, uint16_t b) { s->lastpc = s->pc; + check_no_ext_ops(s, a, b); if (a > 0xff && b > 0xff) { gen_B(s, OP_EXT3); gen_B(s, i); @@ -555,6 +565,7 @@ genjmp2(codegen_scope *s, mrb_code i, uint16_t a, uint32_t pc, int val) } if (a > 0xff) { + check_no_ext_ops(s, a, 0); gen_B(s, OP_EXT1); genop_0(s, i); gen_S(s, a); diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index 76fcffa70..97e6e868c 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -6569,6 +6569,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt) } p->capture_errors = cxt->capture_errors; p->no_optimize = cxt->no_optimize; + p->no_ext_ops = cxt->no_ext_ops; p->upper = cxt->upper; if (cxt->partial_hook) { p->cxt = cxt; diff --git a/mrbgems/mruby-compiler/core/y.tab.c b/mrbgems/mruby-compiler/core/y.tab.c index 1d67b63ff..27f50cd11 100644 --- a/mrbgems/mruby-compiler/core/y.tab.c +++ b/mrbgems/mruby-compiler/core/y.tab.c @@ -12796,6 +12796,7 @@ parser_init_cxt(parser_state *p, mrbc_context *cxt) } p->capture_errors = cxt->capture_errors; p->no_optimize = cxt->no_optimize; + p->no_ext_ops = cxt->no_ext_ops; p->upper = cxt->upper; if (cxt->partial_hook) { p->cxt = cxt; |
