On Mon, Nov 12, 2018 at 12:36:16AM +0100, Philippe Mathieu-Daudé wrote:
> Python internal representation is signed, so unsigned values
> bigger than 31-bit are interpreted as signed (and printed with
> a '-' signed).
> Mask out to force unsigned values.

I don't understand this commit description. Python surely
supports integers larger than 2^31, and its internal
representation shouldn't matter at all:

  >>> 
'0x{0:08x}'.format(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
  
'0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'

Can you explain how the code ends up with a negative value in the
`self.thismask` or `b` variables?  If `self.subs` contains
negative values, this is likely to break other parts of the code.

> 
> Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org>
> ---
> TODO: display error encountered:
> 
>    case 0x-1:
>        ....

How can I reproduce it?

> ---
>  scripts/decodetree.py | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/scripts/decodetree.py b/scripts/decodetree.py
> index 5dea15e7a5..08aa52d544 100755
> --- a/scripts/decodetree.py
> +++ b/scripts/decodetree.py
> @@ -900,12 +900,12 @@ class Tree:
>              def str_case(b):
>                  return '0x{0:08x}'.format(b)
>  
> -        output(ind, 'switch (', str_switch(self.thismask), ') {\n')
> +        output(ind, 'switch (', str_switch(self.thismask & insnmask), ') 
> {\n')
>          for b, s in sorted(self.subs):
>              assert (self.thismask & ~s.fixedmask) == 0
>              innermask = outermask | self.thismask
>              innerbits = outerbits | b
> -            output(ind, 'case ', str_case(b), ':\n')
> +            output(ind, 'case ', str_case(b & insnmask), ':\n')
>              output(ind, '    /* ',
>                     str_match_bits(innerbits, innermask), ' */\n')
>              s.output_code(i + 4, extracted, innerbits, innermask)
> -- 
> 2.17.2
> 

-- 
Eduardo

Reply via email to