diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-08-10 14:55:48 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-08-10 14:55:48 +0900 |
| commit | b34ee9a4b4cf75135ab8c6887068687bbd9f5b06 (patch) | |
| tree | 06e9868289ac22a26d1d5c15fe417b0e9adf0d86 | |
| parent | 5af770cd59f6edb6f111f497fef4df3fe956cc62 (diff) | |
| download | mruby-b34ee9a4b4cf75135ab8c6887068687bbd9f5b06.tar.gz mruby-b34ee9a4b4cf75135ab8c6887068687bbd9f5b06.zip | |
codegen: reserve stack region for OP_APOST; fix #2824
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 13 |
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 */ |
