summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-08-10 14:55:48 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-08-10 14:55:48 +0900
commitb34ee9a4b4cf75135ab8c6887068687bbd9f5b06 (patch)
tree06e9868289ac22a26d1d5c15fe417b0e9adf0d86
parent5af770cd59f6edb6f111f497fef4df3fe956cc62 (diff)
downloadmruby-b34ee9a4b4cf75135ab8c6887068687bbd9f5b06.tar.gz
mruby-b34ee9a4b4cf75135ab8c6887068687bbd9f5b06.zip
codegen: reserve stack region for OP_APOST; fix #2824
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c
index cefde8b7b..b128231cf 100644
--- a/mrbgems/mruby-compiler/core/codegen.c
+++ b/mrbgems/mruby-compiler/core/codegen.c
@@ -406,7 +406,18 @@ push_(codegen_scope *s)
nregs_update;
}
+static void
+push_n_(codegen_scope *s, size_t n)
+{
+ if (s->sp+n > 511) {
+ codegen_error(s, "too complex expression");
+ }
+ s->sp+=n;
+ nregs_update;
+}
+
#define push() push_(s)
+#define push_n(n) push_n_(s,n)
#define pop_(s) ((s)->sp--)
#define pop() pop_(s)
#define pop_n(n) (s->sp-=(n))
@@ -1001,6 +1012,8 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val)
else {
pop();
}
+ push_n(post);
+ pop_n(post);
genop(s, MKOP_ABC(OP_APOST, cursp(), n, post));
n = 1;
if (t->car) { /* rest */