summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-12-19 19:11:51 +0900
committerGitHub <[email protected]>2021-12-19 19:11:51 +0900
commita17955259ebc1bf49e6d5361fe08205e526c4ac3 (patch)
treed6f8fac17387822518de87dcbdbda942e72fd88c /mrbgems/mruby-compiler/core/codegen.c
parentd7812bd3d6b059966f693ac406034e4ceb22f7d5 (diff)
parent6b8582c95d64b75837e6778c712d705e07edad17 (diff)
downloadmruby-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/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c11
1 files changed, 11 insertions, 0 deletions
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);