7
7
8
8
root = lambda a , b : pow (a , 1.0 / b )
9
9
10
+ # https://stackoverflow.com/a/14246007
11
+ def correct (value , bits , signed ):
12
+ base = 1 << bits
13
+ value %= base
14
+ return value - base if signed and value .bit_length () == bits else value
15
+
16
+ byte , sbyte , word , sword , dword , sdword , qword , sqword = (
17
+ lambda v : correct (v , 8 , False ), lambda v : correct (v , 8 , True ),
18
+ lambda v : correct (v , 16 , False ), lambda v : correct (v , 16 , True ),
19
+ lambda v : correct (v , 32 , False ), lambda v : correct (v , 32 , True ),
20
+ lambda v : correct (v , 64 , False ), lambda v : correct (v , 64 , True )
21
+ )
22
+
23
+ def emulate_datatype_overflow (value ):
24
+ # int?
25
+ if int (value ) == value :
26
+ # Emulate a signed int
27
+ return sdword (value )
28
+
29
+ # TODO: Handle float overflow
30
+ return value
31
+
10
32
_math_operators = {
11
33
'+' : add , 'add' : add ,
12
34
'-' : sub , 'subract' : sub ,
@@ -24,16 +46,17 @@ def math(argv):
24
46
val = sv [var ]
25
47
if val .isstring ():
26
48
raise ValueError ('math function called on a non-numeric value: %s, %s' % (var , val .strval ))
27
- val = NUM (val )
49
+ val = emulate_datatype_overflow ( NUM (val ) )
28
50
if op in _math_operators :
29
51
if len (argv ) < 3 :
30
52
raise SyntaxError
31
53
val2 = argv [2 ]
32
54
if val2 .isstring ():
33
55
raise ValueError ('math function called on a non-numeric value: %s' % val2 .strval )
34
- sv [argv [0 ]] = _math_operators [op ](val , NUM (val2 ))
56
+ sv [argv [0 ]] = emulate_datatype_overflow (
57
+ _math_operators [op ](val , emulate_datatype_overflow (NUM (val2 ))))
35
58
elif op in _math_functions :
36
- sv [argv [0 ]] = eval (op )(val )
59
+ sv [argv [0 ]] = emulate_datatype_overflow ( eval (op )(val ) )
37
60
else :
38
61
raise SyntaxError ('bad operation "%s"' % op )
39
62
0 commit comments