Hi Clément > On 30 Dec 2014, at 12:36, Clément Bera <bera.clem...@gmail.com> wrote: > > Hello, > > As some of you may know, Pharo is being enhanced with support for multiple > bytecode sets. This will allow to run at the same time compiled methods with > 2 different bytecode sets for experimentation and to add easily the new > bytecode set described in this ESUG paper > <http://esug.org/data/ESUG2014/IWST/Papers/iwst2014_A%20bytecode%20set%20for%20adaptive%20optimizations.pdf>. > > > The virtual machine knows which bytecode set the compiled method uses for its > encoding based on the sign of its header. This means that on the contrary to > right now, a compiled method *can* have a negative header. > > The issue is that typically operations such as #bitAnd: or #+ to access bits > of the smallinteger does not work the same way on negative integers (2 > complement's implementation of integers), resulting in incorrect values. I am > fixing the problematic cases in Pharo. > > One case is in Fuel and I can't fix it myself. It's in: > > FLCompiledMethodCluster>>#serializeInstance: aCompiledMethodToSerialize with: > anEncoder > > "some code" > header := aCompiledMethod header. > "some code" > anEncoder encodeUint32: header > "some code" > > This looks problematic because now header is not a uint anymore but a sint. > In addition, #encodeUint32: uses #bitAnd: which may work differently on > negative integers. > > What do you fuel experts think ? Is there anything to fix there ?
Replacing the header serialization with #encodeInt32: should fix the problem. Every header will from now on be an sint, is that correct? I’ll make the change and integrate. Cheers, Max > > Best, > > Clement