@requires semantics for VM flags
jonathan.gibbons at oracle.com
Fri Nov 9 01:40:45 UTC 2018
On 11/08/2018 05:18 PM, David Holmes wrote:
> Hi Jon,
> On 9/11/2018 10:56 AM, Jonathan Gibbons wrote:
>> Regrettably, your naive intuition is incorrect.
>> The current semantics are that if a name is undefined or if the name
>> is set to a value that is not "true" or "false", then it is not a
>> boolean value, and so you will get an error.
> Hmmm that's not what has been reported . Boris was seeing the error
> when the test was using "@requires foo" but it worked okay when
> changed to "@requires foo == true":
I suspect that turns into string comparison, in which case if foo is
undefined it will be null, and the result of the comparison will be
false. The same would be true for "@requires foo = false".
>> Although I'm not an expert on VM flags, as I understand it, there is
>> no easy way to tell if a flag should be a boolean value, which makes
>> it problematic to default unset values to false.
> Isn't everything on @requires a boolean expression???
The overall expression is a boolean expression, sure, but the terms
within the expression need not be. Fore example,
@requires os.maxMemory > 4G
Also, see these lines from the tag spec:
|vm.opt./switch/| A boolean VM option, derived from option
|-XX:+/switch/| or |-XX:-/switch/| |true| |false|
|vm.opt./name/| A VM option, derived from option |-XX:/name/=/value/|
Generally, handling the vm options is difficult, not least because of
the way the VM interprets the options, meaning that sometimes it will
ignore them altogether: so testing for the presence of an option on the
command line is a weak almost-useless check. Although I defer to folk
like Igor who helped design a lot of this stuff, my recommendation is to
stay clear of vm.opt.* and to use the "extraPropDefns" mechanism that
allows you to test the configuration values *after* they have been
analyzed by the VM.
>> -- Jon
>> On 11/8/18 2:41 PM, David Holmes wrote:
>>> On 7/11/2018 7:01 PM, David Holmes wrote:
>>>> Can you clarify the intended semantics for @requires when
>>>> referencing a VM flag. It seems the current behaviour is:
>>>> @requires foo -> foo must exist and == true
>>>> @requires !foo -> foo must exist and == false
>>>> @requires foo == true -> IF foo exists then it == true
>>>> @requires foo == false -> IF foo exists then it == false
>>>> I would have naively expected:
>>>> @requires foo
>>>> @requires foo == true
>>>> to be semantically identical?
>>>> Follow up question: if there are multiple @requires are they
>>>> evaluated using short-circuit logic ie:
>>>> @requires vm.bits == 64
>>>> @requires VMFlagOnlyFor64Bits
>>>> will not look for the flag if running on a 32-bit system?
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the jtreg-use