mirror of https://github.com/evilhero/mylar
151 lines
3.7 KiB
Python
151 lines
3.7 KiB
Python
from ..base import *
|
|
import math
|
|
import random
|
|
|
|
Math = PyJsObject(prototype=ObjectPrototype)
|
|
Math.Class = 'Math'
|
|
|
|
CONSTANTS = {'E': 2.7182818284590452354,
|
|
'LN10': 2.302585092994046,
|
|
'LN2': 0.6931471805599453,
|
|
'LOG2E': 1.4426950408889634,
|
|
'LOG10E': 0.4342944819032518,
|
|
'PI': 3.1415926535897932,
|
|
'SQRT1_2': 0.7071067811865476,
|
|
'SQRT2': 1.4142135623730951}
|
|
|
|
for constant, value in CONSTANTS.items():
|
|
Math.define_own_property(constant, {'value': Js(value),
|
|
'writable': False,
|
|
'enumerable': False,
|
|
'configurable': False})
|
|
|
|
class MathFunctions:
|
|
def abs(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return abs(a)
|
|
|
|
def acos(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
try:
|
|
return math.acos(a)
|
|
except:
|
|
return NaN
|
|
|
|
def asin(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
try:
|
|
return math.asin(a)
|
|
except:
|
|
return NaN
|
|
|
|
def atan(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return math.atan(a)
|
|
|
|
def atan2(y, x):
|
|
a = x.to_number().value
|
|
b = y.to_number().value
|
|
if a!=a or b!=b: # it must be a nan
|
|
return NaN
|
|
return math.atan2(b, a)
|
|
|
|
def ceil(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return math.ceil(a)
|
|
|
|
def floor(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return math.floor(a)
|
|
|
|
def round(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return round(a)
|
|
|
|
def sin(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return math.sin(a)
|
|
|
|
def cos(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return math.cos(a)
|
|
|
|
def tan(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return math.tan(a)
|
|
|
|
def log(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
try:
|
|
return math.log(a)
|
|
except:
|
|
return NaN
|
|
|
|
def exp(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
return math.exp(a)
|
|
|
|
def pow(x, y):
|
|
a = x.to_number().value
|
|
b = y.to_number().value
|
|
if a!=a or b!=b: # it must be a nan
|
|
return NaN
|
|
try:
|
|
return a**b
|
|
except:
|
|
return NaN
|
|
|
|
def sqrt(x):
|
|
a = x.to_number().value
|
|
if a!=a: # it must be a nan
|
|
return NaN
|
|
try:
|
|
return a**0.5
|
|
except:
|
|
return NaN
|
|
|
|
def min():
|
|
if not len(arguments):
|
|
return -Infinity
|
|
lis = tuple(e.to_number().value for e in arguments.to_list())
|
|
if any(e!=e for e in lis): # we dont want NaNs
|
|
return NaN
|
|
return min(*lis)
|
|
|
|
def max():
|
|
if not len(arguments):
|
|
return -Infinity
|
|
lis = tuple(e.to_number().value for e in arguments.to_list())
|
|
if any(e!=e for e in lis): # we dont want NaNs
|
|
return NaN
|
|
return max(*lis)
|
|
|
|
def random():
|
|
return random.random()
|
|
|
|
|
|
fill_prototype(Math, MathFunctions, default_attrs) |