@@ -1215,4 +1215,50 @@ def == x
1215
1215
end
1216
1216
RUBY
1217
1217
end
1218
+
1219
+ def test_opt_new
1220
+ pos_initialize = "
1221
+ def initialize a, b
1222
+ @a = a
1223
+ @b = b
1224
+ end
1225
+ "
1226
+ kw_initialize = "
1227
+ def initialize a:, b:
1228
+ @a = a
1229
+ @b = b
1230
+ end
1231
+ "
1232
+ kw_hash_initialize = "
1233
+ def initialize a, **kw
1234
+ @a = a
1235
+ @b = kw[:b]
1236
+ end
1237
+ "
1238
+ pos_prelude = "class OptNewFoo; #{ pos_initialize } ; end;"
1239
+ kw_prelude = "class OptNewFoo; #{ kw_initialize } ; end;"
1240
+ kw_hash_prelude = "class OptNewFoo; #{ kw_hash_initialize } ; end;"
1241
+ [
1242
+ "#{ pos_prelude } OptNewFoo.new 1, 2" ,
1243
+ "#{ pos_prelude } a = 1; b = 2; OptNewFoo.new a, b" ,
1244
+ "#{ pos_prelude } def optnew_foo(a, b) = OptNewFoo.new(a, b); optnew_foo 1, 2" ,
1245
+ "#{ pos_prelude } def optnew_foo(*a) = OptNewFoo.new(*a); optnew_foo 1, 2" ,
1246
+ "#{ pos_prelude } def optnew_foo(...) = OptNewFoo.new(...); optnew_foo 1, 2" ,
1247
+ "#{ kw_prelude } def optnew_foo(**a) = OptNewFoo.new(**a); optnew_foo a: 1, b: 2" ,
1248
+ "#{ kw_hash_prelude } def optnew_foo(*a, **b) = OptNewFoo.new(*a, **b); optnew_foo 1, b: 2" ,
1249
+ ] . each do |code |
1250
+ iseq = RubyVM ::InstructionSequence . compile ( code )
1251
+ insn = iseq . disasm
1252
+ assert_match ( /opt_new/ , insn )
1253
+ assert_match ( /OptNewFoo:.+@a=1, @b=2/ , iseq . eval . inspect )
1254
+ end
1255
+ [
1256
+ 'def optnew_foo(&) = OptNewFoo.new(&)' ,
1257
+ 'def optnew_foo(a, ...) = OptNewFoo.new(a, ...)' ,
1258
+ ] . each do |code |
1259
+ iseq = RubyVM ::InstructionSequence . compile ( code )
1260
+ insn = iseq . disasm
1261
+ assert_no_match ( /opt_new/ , insn )
1262
+ end
1263
+ end
1218
1264
end
0 commit comments