Checking for 'Stack size mismatch'
Øystein Myhre Andersen
o.myhre at gmail.com
Sun Mar 10 14:54:57 UTC 2024
Sorry: This does not handle backward jumps.
But a 'come-from' list might be useful for the StackMapGenerator.
And, maybe speed it up.
P.S. In the byte code of Simula, we had the rule that a label only had one
and only one associated goto.
On Sun, Mar 10, 2024 at 3:21 PM Øystein Myhre Andersen <o.myhre at gmail.com>
wrote:
>
> Yes, I know which method builder is called.
> I have a class file builder like:
>
> byte[] bytes = ClassFile.of().build(currentClassDesc(),
> classBuilder -> {
> classBuilder
> ....
> .withMethodBody("_STM", MTD_STM, ClassFile.ACC_PUBLIC,
> codeBuilder -> buildMethod_STM(codeBuilder));
> }
> );
>
> Within 'buildMethod_STM' I traverse a syntax tree building code from each
> node.
> Somewhere there a mistake is made that leads to 'stack size mismatch'.
>
> When I return from 'buildMethod_STM', the method builder will finalize its
> work.
> It generates the bytecode and builds the stack map table.
> I assume that it checks the stack size at all labels, it must do so to
> build a correct stack map table.
>
> Along with the error message comes a complete dump of the entire method.
>
> Checking for 'Stack size mismatch' is currently done in
> 'java.base/jdk.internal.classfile.impl.StackMapGenerator'.
> It would have been nice if this was tested earlier by Codebuilder when the
> labelBinding pseudo instruction was created.
>
> One way it might be done is to build a 'come-from' list within
> labelBinding pseudo instruction.
>
> On Sat, Mar 9, 2024 at 10:10 PM - <liangchenblue at gmail.com> wrote:
>
>> What are you trying to do? So you are writing a class and there's a stack
>> size error, but you don't know which method builder this stack size error
>> is from?
>>
>> On Sat, Mar 9, 2024 at 2:04 PM Øystein Myhre Andersen <o.myhre at gmail.com>
>> wrote:
>>
>>> You said: as this error can only be detected at run time.
>>> That is wrong. It occurs when building stack-map.
>>>
>>> On Sat, Mar 9, 2024 at 7:38 PM - <liangchenblue at gmail.com> wrote:
>>>
>>>> Hi Øystein,
>>>> ClassFile API does not always ensure the created bytecode is valid, and
>>>> allowing creation of code with invalid stack size is a feature instead of a
>>>> bug. A stack size mismatch problem, in essence, is closer to the error
>>>> which a user forgot to call a builder method. And putting this check
>>>> earlier doesn't really help, as this error can only be detected at run
>>>> time. You can always use ClassFile.verify to verify your generated class
>>>> files.
>>>>
>>>> In addition, CodeBuilder supports chaining; if we add the size checking
>>>> in each item of the chain, it will introduce a performance penalty.
>>>>
>>>> Chen
>>>>
>>>> On Sat, Mar 9, 2024 at 8:42 AM Øystein Myhre Andersen <
>>>> o.myhre at gmail.com> wrote:
>>>>
>>>>> Checking for 'Stack size mismatch' is currently done in 'java.base/jdk.internal.classfile.impl.StackMapGenerator'.
>>>>> It would have been nice if this was tested earlier by Codebuilder when the instructions was created.
>>>>>
>>>>> For example, by keeping track of the stack size curing code building.
>>>>>
>>>>> It is good programming practice to catch errors as early as possible.
>>>>>
>>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/classfile-api-dev/attachments/20240310/cc8057ee/attachment-0001.htm>
More information about the classfile-api-dev
mailing list