54 lines
No EOL
1.3 KiB
Python
Executable file
54 lines
No EOL
1.3 KiB
Python
Executable file
|
|
|
|
class VMType(object):
|
|
pass
|
|
|
|
class VMInteger(VMType):
|
|
def __init__(self, value):
|
|
self.value = int(value)
|
|
class VMFloat(VMType):
|
|
def __init__(self, value):
|
|
self.value = float(value)
|
|
class VMTable(VMType):
|
|
def __init__(self, value):
|
|
self.value = dict(value)
|
|
|
|
class VMString(VMType):
|
|
def __init__(self, value):
|
|
if isinstance(value, unicode):
|
|
self.value = value
|
|
else:
|
|
self.value = unicode(str(value), 'ascii', 'ignore')
|
|
|
|
class VMObjRef(VMType):
|
|
def __init__(self, value):
|
|
if isinstance(value, ObjRef):
|
|
self.value = value
|
|
elif isinstance(value, (float, int)):
|
|
self.value = ObjRef(int(value))
|
|
else:
|
|
raise TypeError, "Attempted to create VMObjRef with invalid object reference: %r" % (value,)
|
|
|
|
|
|
def coerce(value):
|
|
if isinstance(value, int):
|
|
return VMInteger(value)
|
|
elif isinstance(value, (tuple, list)):
|
|
return VMList(list(value))
|
|
elif isinstance(value, unicode):
|
|
return VMString(value)
|
|
elif isinstance(value, dict):
|
|
return VMTable(value)
|
|
elif isinstance(value, ObjRef):
|
|
return VMObjRef(value)
|
|
elif isinstance(value, float):
|
|
return VMFloat(value)
|
|
elif value == None:
|
|
return VMInteger(0)
|
|
else:
|
|
raise TypeError("Unknown type %s cannot be coerced to VMType" % (type(value),))
|
|
|
|
|
|
def uncoerce(value):
|
|
assert isinstance(value, VMType)
|
|
return value.value |