JRuby accepts wrong method arguments when mixing positional with defaults and keywords #4186

ivoanjo opened this Issue Sep 28, 2016 · 4 comments


None yet

2 participants

ivoanjo commented Sep 28, 2016


Running jruby (2.3.1) 2016-09-07 036ce39 OpenJDK 64-Bit Server VM 25.91-b14 on 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14 [linux-x86_64] on Linux maruchan 4.8.0-16-generic #17-Ubuntu SMP Thu Sep 22 22:48:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux.

Expected Behavior

Example code:

def foo(a = 'default a', b:)
  [a, b]

def bar
  foo(a: 'some value', b: 'some value')


Output in MRI 2.3.1:

ArgumentError: unknown keyword: a

Actual Behavior

Output in JRuby (return from function)

["default a", "some value"]
enebo commented Sep 28, 2016

ok I know the problem and I will describe it as the actual fix might take a little thought. We allocate lvars and kwargs using the same StaticScope storage. We depend on strings which represent the variable name. So we do not complain about 'a:' since opt arg 'a=' exists. This seemed safe since you cannot actually have a method like:

def foo(a=1, a:)

The parser realizes that you are trying to use the same name in two different ways which is ambiguous. What the current solution did not consider is that we need to know if a particular name is a kwarg or an ordinary arg. So there are many ways to skin this cat but it means some extra state somewhere. Most obvious thought would be a kwargs start at offset x field. Then if we find 'a' exists before that we know it is not a kwarg?

@enebo enebo added this to the JRuby milestone Sep 28, 2016
@enebo enebo added a commit that closed this issue Sep 28, 2016
@enebo enebo Fixes #4186. JRuby accepts wrong method arguments when mixing positional
with defaults and keywords.

StaticScopes now keep track of where keyword arguments start by index.
This is missing a regression test which I will add in next commit.
@enebo enebo closed this in 7b93e08 Sep 28, 2016
ivoanjo commented Sep 28, 2016

Wow, blazing fast fix! Thanks! 😄

@enebo enebo added a commit that referenced this issue Sep 28, 2016
@enebo enebo Fallout from #4186. JRuby AOT and IR persistence needs to persist the…
… new

fistKeywordIndex field in StaticScope.
enebo commented Sep 29, 2016

@ivoanjo I thought I had fixed all keyword argument bugs relating to methods (we have some other issues still with blocks) in our last point release so I was determined!

ivoanjo commented Sep 30, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment