diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-06-01 09:38:42 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-06-01 09:38:42 +0900 |
| commit | a893877b0dc62d29dc4b220a95a6d9ee36b3a263 (patch) | |
| tree | ba5e73450860f862d44ade6cb63acf7d4052febf | |
| parent | b0f2bc39db0bef62f87129db604e16608818e24f (diff) | |
| download | mruby-a893877b0dc62d29dc4b220a95a6d9ee36b3a263.tar.gz mruby-a893877b0dc62d29dc4b220a95a6d9ee36b3a263.zip | |
Check for super using OP_ARGARY; fix #3678
It generates a wasted empty array for each `super` call though.
It should be fixed in the future, if possible.
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 5593dc669..3c13d23a6 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -1939,9 +1939,19 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_SUPER: { + codegen_scope *s2 = s; + int lv = 0; int n = 0, noop = 0, sendv = 0; push(); /* room for receiver */ + while (!s2->mscope) { + lv++; + s2 = s2->prev; + if (!s2) break; + } + genop(s, MKOP_ABx(OP_ARGARY, cursp(), (lv & 0xf))); + push(); push(); /* ARGARY pushes two values */ + pop(); pop(); if (tree) { node *args = tree->car; if (args) { |
