summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-compiler/core/codegen.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-06-01 09:38:42 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-06-01 09:38:42 +0900
commita893877b0dc62d29dc4b220a95a6d9ee36b3a263 (patch)
treeba5e73450860f862d44ade6cb63acf7d4052febf /mrbgems/mruby-compiler/core/codegen.c
parentb0f2bc39db0bef62f87129db604e16608818e24f (diff)
downloadmruby-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.
Diffstat (limited to 'mrbgems/mruby-compiler/core/codegen.c')
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c10
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) {