[Types-sig] Viper Type specification
skaller
skaller@maxtal.com.au
Sat, 18 Dec 1999 14:05:21 +1100
FYI: here is the Viper file py_types.vy which defines
many Viper types. [But there is no reason ALL the types
need be here: you can't see the regexp object here,
nor sockets -- these are defined elsewhere]
# This module is exclusive to Viper
# It is a builtin module, defining classes for all
# the Python types.
#
# Methods and attributes for objects can be found in the
# class dictionary of the typing class, even when the object
# is not a PyInstance of the class.
import string
import sys
# datum types
class PyNoneType: pass
class PyIntType :
def succ(x): return x + 1
def pred(x): return x - 1
class PyFloatType : pass
class PyComplexType : pass
class PyLongType : pass
class PyRationalType : pass
class PyStringType: pass
# Sequence types
class PyTupleType : pass
class PyListType :
append = list_append
extend = list_extend
count= list_count
index = list_index
insert = list_insert
sort = list_sort
class PyXrangeType: pass
# Others
class PyClassType: pass
PyTypeType = PyClassType # an alias in Viper
class PyInstanceType: pass
# Viper doesn't currently support execution frames, so tb_frame is set
to None
class PyTracebackType:
tb_frame = None
class PyFunctionType: pass # Python function type
class PyModuleType: pass # python module type
class PyNativeFunctionType: pass # builtin function type
class PyNativeMacroType: pass # a macro is an environment sensitive
function (eg globals())
class PyBoundMethodType: pass # a bound method
class PyDictionaryType: # dictionary
items = dictionary_items
clear = dictionary_clear
copy = dictionary_copy
has_key = dictionary_has_key
keys = dictionary_keys
update = dictionary_update
values = dictionary_values
get = dictionary_get
class PyExpressionType: pass # partially evaluated expression (general
expression type)
class PyStatementType: pass # type of a code object
class PyEnvironmentType: pass # an environment for unqualified name
lookup
class PyClosureType: pass # a pair consisting of an expression and an
environment
class PyThreadType: pass # type of a thread
class PyInterpreterType: pass # type of a Viper interpreter object
class PyLockType: # type of a mutual exclusion lock for threads
def __init__(self):
self.mutex = lock_create()
def acquire(self, waitflag=None):
return lock_acquire(self.mutex, waitflag)
def release(self):
lock_release(self.mutex)
def locked(self):
return lock_test(self.mutex)
# ---------- GUI -----------------------------------------------------
class PyWidgetType: pass # widget
class PyColorType: pass # color
class PyFontType: pass # font
class PyGraphicsContextType: pass # a graphics context
class PyDrawableType: pass # something that can be drawn
class PyCanvasType: pass # something we can draw on
class PyImageType: pass # an external representation of a picture
# ---------- FILES -----------------------------------------------------
# this is type of _native_ files
class PyFileType:
def close(f): file_close(f)
def write(f,s): file_write(f,s)
def flush(f): file_flush(f)
# note: never raises an exception, does nothing at EOF
def read(f,amt=None):
try:
if amt is None:
s = ""
while 1:
b = file_read(f,8096)
s = s + b
if len(b) < 8096: break
return s
else:
s= file_read(f,amt)
return s
except: print "EXCEPTION: IOERROR"
# this is the class used for _client_ files
# we use a class, to support easy subtyping
class PyFileClass:
def __init__(self):
self.buffer = ""
def read(self,amt=None):
return self.native_file.read(amt)
def write(self,s):
return self.native_file.write(s)
def close(self):
self.closed = 1
self.native_file.close()
# note: returns '' on end of file (no exception raised)
def readline(self):
eolpos = string.find(self.buffer, "\n")
while eolpos == -1:
n = len(self.buffer)
data = self.read(1024)
self.buffer = self.buffer + data
eolpos = string.find(self.buffer, "\n", n)
if len(data) == 0: break
if eolpos == -1: eolpos = len(self.buffer)-1
line = self.buffer[0:eolpos+1] # include the eol
self.buffer = self.buffer[eolpos+1:]
return line
def readlines(self, hint=None):
data = self.native_file.read()
return string.split(data,'\n')
# this function opens a file
def open(filename, mode="r"):
try:
native_file = file_open(filename, mode)
python_file = PyFileClass()
python_file.native_file = native_file
python_file.name = filename
python_file.mode = mode
python_file.closed = 0
return python_file
except OSError, object:
exc = IOError(object.errno, object.strerror, filename)
raise exc
def make_file_object(native_file, filename, mode):
python_file = PyFileClass()
python_file.native_file = native_file
python_file.filename = filename
python_file.mode = mode
python_file.closed = 0
return python_file
# these functions return _native_ files, not client ones!
def get_native_stdin(): return file_get_std_files()[0]
def get_native_stdout(): return file_get_std_files()[1]
def get_native_stderr(): return file_get_std_files()[2]
# these functions return _client_ files!
def get_client_stdin(): return
make_file_object(get_native_stdin(),"stdin","r")
def get_client_stdout(): return
make_file_object(get_native_stdout(),"stdout","w")
def get_client_stderr(): return
make_file_object(get_native_stderr(),"stderr","w")
# this is a hack!
def set_std_files():
sys.stdin = sys.__stdin__ = get_client_stdin()
sys.stdout = sys.__stdout__ = get_client_stdout()
sys.stderr = sys.__stderr__ = get_client_stderr()
# this is a sucky hack!
def type(x):
typename = getattr(x,"__typename__")
return eval (typename)
--
John Skaller, mailto:skaller@maxtal.com.au
10/1 Toxteth Rd Glebe NSW 2037 Australia
homepage: http://www.maxtal.com.au/~skaller
voice: 61-2-9660-0850