From c6596cf26a125e9759e01425bea8782ff58dbf4f Mon Sep 17 00:00:00 2001 From: Christopher Aue Date: Tue, 22 Aug 2017 14:42:59 +0200 Subject: Fixed register windows of OP_SENDs generated by NODE_{SCALL,CASE,YIELD,UNDEF}; ref #3783 --- test/t/codegen.rb | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'test') diff --git a/test/t/codegen.rb b/test/t/codegen.rb index 29f5ad525..e3f44de38 100644 --- a/test/t/codegen.rb +++ b/test/t/codegen.rb @@ -73,3 +73,39 @@ assert('negate literal register alignment') do assert_equal [2], a end + +assert('register window of calls (#3783)') do + # NODE_SCALL + assert_nothing_raised do + Object.new&.__id__ + end + + # NODE_CASE + assert_nothing_raised do + case 1 + when nil + end + end + + # NODE_CASE with splat + assert_nothing_raised do + case 1 + when *nil + end + end + + # NODE_YIELD + def check_node_yield + yield + end + assert_nothing_raised do + check_node_yield{} + end + + # NODE_UNDEF + assert_nothing_raised do + class << Object.new + undef send + end + end +end \ No newline at end of file -- cgit v1.2.3 From c040c8d92bc940cd6f7b451c9f8968df5d21c945 Mon Sep 17 00:00:00 2001 From: Christopher Aue Date: Tue, 22 Aug 2017 14:50:40 +0200 Subject: Tested register windows of OP_SENDs generated by NODE_{RESCUE,HASH,ALIAS}; ref #3783 --- mrbgems/mruby-compiler/core/codegen.c | 5 +++-- test/t/codegen.rb | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 167ceb3cb..9586ade52 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -1320,7 +1320,8 @@ codegen(codegen_scope *s, node *tree, int val) if (n4 && n4->car && nint(n4->car->car) == NODE_SPLAT) { codegen(s, n4->car, VAL); genop(s, MKOP_AB(OP_MOVE, cursp(), exc)); - push_n(2); pop_n(3); + push_n(2); pop_n(2); /* space for one arg and a block */ + pop(); genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "__case_eqq")), 1)); } else { @@ -2607,7 +2608,7 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_ABx(OP_LOADSYM, cursp(), b)); push(); genop(s, MKOP_A(OP_LOADNIL, cursp())); - push(); + push(); /* space for a block */ pop_n(4); genop(s, MKOP_ABC(OP_SEND, cursp(), c, 2)); if (val) { diff --git a/test/t/codegen.rb b/test/t/codegen.rb index e3f44de38..106790507 100644 --- a/test/t/codegen.rb +++ b/test/t/codegen.rb @@ -80,6 +80,14 @@ assert('register window of calls (#3783)') do Object.new&.__id__ end + # NODE_RESCUE with splat + assert_nothing_raised do + begin + raise + rescue *[Exception] + end + end + # NODE_CASE assert_nothing_raised do case 1 @@ -94,6 +102,24 @@ assert('register window of calls (#3783)') do end end + # NODE_HASH + assert_nothing_raised do + {}.merge( + 0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, + 10=>10, 11=>11, 12=>12, 13=>13, 14=>14, 15=>15, 16=>16, 17=>17, 18=>18, 19=>19, + 20=>20, 21=>21, 22=>22, 23=>23, 24=>24, 25=>25, 26=>26, 27=>27, 28=>28, 29=>29, + 30=>30, 31=>31, 32=>32, 33=>33, 34=>34, 35=>35, 36=>36, 37=>37, 38=>38, 39=>39, + 40=>40, 41=>41, 42=>42, 43=>43, 44=>44, 45=>45, 46=>46, 47=>47, 48=>48, 49=>49, + 50=>50, 51=>51, 52=>52, 53=>53, 54=>54, 55=>55, 56=>56, 57=>57, 58=>58, 59=>59, + 60=>60, 61=>61, 62=>62, 63=>63, 64=>64, 65=>65, 66=>66, 67=>67, 68=>68, 69=>69, + 70=>70, 71=>71, 72=>72, 73=>73, 74=>74, 75=>75, 76=>76, 77=>77, 78=>78, 79=>79, + 80=>80, 81=>81, 82=>82, 83=>83, 84=>84, 85=>85, 86=>86, 87=>87, 88=>88, 89=>89, + 90=>90, 91=>91, 92=>92, 93=>93, 94=>94, 95=>95, 96=>96, 97=>97, 98=>98, 99=>99, + 100=>100, 101=>101, 102=>102, 103=>103, 104=>104, 105=>105, 106=>106, 107=>107, 108=>108, 109=>109, + 110=>110, 111=>111, 112=>112, 113=>113, 114=>114, 115=>115, 116=>116, 117=>117, 118=>118, 119=>119, + 120=>120, 121=>121, 122=>122, 123=>123, 124=>124, 125=>125, 126=>126) + end + # NODE_YIELD def check_node_yield yield @@ -108,4 +134,11 @@ assert('register window of calls (#3783)') do undef send end end + + # NODE_ALIAS + assert_nothing_raised do + class << Object.new + alias send2 send + end + end end \ No newline at end of file -- cgit v1.2.3 From 1221f7676eda4e656f120a21fd0f354d242df457 Mon Sep 17 00:00:00 2001 From: Christopher Aue Date: Tue, 22 Aug 2017 15:17:12 +0200 Subject: Fixed register windows of OP_SENDs generated by NODE_{FOR,SYMBOLS}; ref #3783 --- mrbgems/mruby-compiler/core/codegen.c | 2 ++ test/t/codegen.rb | 10 ++++++++++ 2 files changed, 12 insertions(+) (limited to 'test') diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 9586ade52..1e92fbd19 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -631,6 +631,7 @@ for_body(codegen_scope *s, node *tree) scope_finish(s); s = prev; genop(s, MKOP_Abc(OP_LAMBDA, cursp(), s->irep->rlen-1, OP_L_BLOCK)); + push();pop(); /* space for a block */ pop(); idx = new_msym(s, mrb_intern_lit(s->mrb, "each")); genop(s, MKOP_ABC(OP_SENDB, cursp(), idx, 0)); @@ -1095,6 +1096,7 @@ gen_vmassignment(codegen_scope *s, node *tree, int rhs, int val) static void gen_send_intern(codegen_scope *s) { + push();pop(); /* space for a block */ pop(); genop(s, MKOP_ABC(OP_SEND, cursp(), new_msym(s, mrb_intern_lit(s->mrb, "intern")), 0)); push(); diff --git a/test/t/codegen.rb b/test/t/codegen.rb index 106790507..afec94a69 100644 --- a/test/t/codegen.rb +++ b/test/t/codegen.rb @@ -75,6 +75,16 @@ assert('negate literal register alignment') do end assert('register window of calls (#3783)') do + # NODE_FOR + assert_nothing_raised do + for i in []; end + end + + # NODE_SYMBOLS + assert_nothing_raised do + %i(sym) + end + # NODE_SCALL assert_nothing_raised do Object.new&.__id__ -- cgit v1.2.3 From 84d8ecc1d75f0af4703e9d5fca3d740fa66d2ca1 Mon Sep 17 00:00:00 2001 From: Christopher Aue Date: Wed, 23 Aug 2017 15:17:20 +0200 Subject: Fixed register windows of OP_SENDs generated by NODE_OP_ASGN; ref #3783 --- mrbgems/mruby-compiler/core/codegen.c | 2 +- test/t/codegen.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) (limited to 'test') diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index 9d7392c2d..a457705fb 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -1841,7 +1841,7 @@ codegen(codegen_scope *s, node *tree, int val) for (i=0; i120, 121=>121, 122=>122, 123=>123, 124=>124, 125=>125, 126=>126) end + # NODE_OP_ASGN + o = Object.new + class << o + attr_accessor :a + end + + o.a = 1 + assert_nothing_raised{ o.a += 1 } + o.a = 1 + assert_nothing_raised{ o.a <<= 1 } + o.a = 1 + assert_nothing_raised{ o.a &&= 1 } + + o = { k: 1 } + assert_nothing_raised{ o[:k] += 1 } + o = { k: 1 } + assert_nothing_raised{ o[:k] <<= 1 } + o = { k: 1 } + assert_nothing_raised{ o[:k] &&= 1 } + + o = { k: 1 } + assert_nothing_raised{ o[*[:k]] += 1 } + o = { k: 1 } + assert_nothing_raised{ o[*[:k]] <<= 1 } + o = { k: 1 } + assert_nothing_raised{ o[*[:k]] &&= 1 } + # NODE_YIELD def check_node_yield yield -- cgit v1.2.3 From 499498a6a73a37dbc41fbac7af52e1f0a2dbafc9 Mon Sep 17 00:00:00 2001 From: Christopher Aue Date: Wed, 23 Aug 2017 15:34:02 +0200 Subject: Tested register windows of OP_SENDs generated by NODE_{DXSTR,XSTR}; ref #3783 --- test/t/codegen.rb | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'test') diff --git a/test/t/codegen.rb b/test/t/codegen.rb index 12c35f2b3..881e2de20 100644 --- a/test/t/codegen.rb +++ b/test/t/codegen.rb @@ -165,6 +165,12 @@ assert('register window of calls (#3783)') do check_node_yield{} end + # NODE_DXSTR + assert_raise(NotImplementedError){ `#{:dynamic}` } + + # NODE_XSTR + assert_raise(NotImplementedError){ `static` } + # NODE_UNDEF assert_nothing_raised do class << Object.new -- cgit v1.2.3 From 3366894a4084c9f44a38410daf6abad9e2da5b33 Mon Sep 17 00:00:00 2001 From: Christopher Aue Date: Wed, 23 Aug 2017 18:07:37 +0200 Subject: Fixed register windows of OP_SENDs generated by NODE_{DREGX,REGX}; ref #3783 --- mrbgems/mruby-compiler/core/codegen.c | 30 +++++++++++++++--------------- test/t/codegen.rb | 10 ++++++++++ 2 files changed, 25 insertions(+), 15 deletions(-) (limited to 'test') diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index a457705fb..8f15a9b18 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2450,26 +2450,26 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_ABx(OP_GETMCNST, cursp(), sym)); push(); genop(s, MKOP_ABx(OP_STRING, cursp(), off)); + push(); if (p2 || p3) { - push(); - if (p2) { + if (p2) { /* opt */ off = new_lit(s, mrb_str_new_cstr(s->mrb, p2)); genop(s, MKOP_ABx(OP_STRING, cursp(), off)); } else { genop(s, MKOP_A(OP_LOADNIL, cursp())); } + push(); argc++; - if (p3) { - push(); + if (p3) { /* enc */ off = new_lit(s, mrb_str_new(s->mrb, p3, 1)); genop(s, MKOP_ABx(OP_STRING, cursp(), off)); + push(); argc++; - pop(); } - pop(); } - pop(); + push(); /* space for a block */ + pop_n(argc+2); sym = new_sym(s, mrb_intern_lit(s->mrb, "compile")); genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc)); mrb_gc_arena_restore(s->mrb, ai); @@ -2499,31 +2499,31 @@ codegen(codegen_scope *s, node *tree, int val) n = n->cdr; } n = tree->cdr->cdr; - if (n->car) { + if (n->car) { /* tail */ p = (char*)n->car; off = new_lit(s, mrb_str_new_cstr(s->mrb, p)); codegen(s, tree->car, VAL); genop(s, MKOP_ABx(OP_STRING, cursp(), off)); pop(); genop_peep(s, MKOP_AB(OP_STRCAT, cursp(), cursp()+1), VAL); + push(); } - if (n->cdr->car) { + if (n->cdr->car) { /* opt */ char *p2 = (char*)n->cdr->car; - - push(); off = new_lit(s, mrb_str_new_cstr(s->mrb, p2)); genop(s, MKOP_ABx(OP_STRING, cursp(), off)); + push(); argc++; } - if (n->cdr->cdr) { + if (n->cdr->cdr) { /* enc */ char *p2 = (char*)n->cdr->cdr; - - push(); off = new_lit(s, mrb_str_new_cstr(s->mrb, p2)); genop(s, MKOP_ABx(OP_STRING, cursp(), off)); + push(); argc++; } - pop_n(argc); + push(); /* space for a block */ + pop_n(argc+2); sym = new_sym(s, mrb_intern_lit(s->mrb, "compile")); genop(s, MKOP_ABC(OP_SEND, cursp(), sym, argc)); mrb_gc_arena_restore(s->mrb, ai); diff --git a/test/t/codegen.rb b/test/t/codegen.rb index 881e2de20..4c9e2c594 100644 --- a/test/t/codegen.rb +++ b/test/t/codegen.rb @@ -171,6 +171,16 @@ assert('register window of calls (#3783)') do # NODE_XSTR assert_raise(NotImplementedError){ `static` } + # NODE_DREGX + class Regexp; end + assert_raise(NoMethodError){ /#{'dynamic'}tail/ } + assert_raise(NoMethodError){ /#{'dynamic'}tail/iu } + + # NODE_REGX + assert_raise(NoMethodError){ /static/ } + assert_raise(NoMethodError){ /static/iu } + Object.remove_const :Regexp + # NODE_UNDEF assert_nothing_raised do class << Object.new -- cgit v1.2.3