[zopeorg-checkins] CVS: Products/PythonMethod/zbytecodehacks/code_gen - Makefile:1.1 __init__.py:1.1 op_execute_methods:1.1 opexfuncread.py:1.1 regen:1.1 write_ops.py:1.1

Sidnei da Silva sidnei at x3ng.com.br
Fri May 30 11:17:49 EDT 2003


Update of /cvs-zopeorg/Products/PythonMethod/zbytecodehacks/code_gen
In directory cvs.zope.org:/tmp/cvs-serv19195/PythonMethod/zbytecodehacks/code_gen

Added Files:
	Makefile __init__.py op_execute_methods opexfuncread.py regen 
	write_ops.py 
Log Message:
Adding products needed for migration of NZO

=== Added File Products/PythonMethod/zbytecodehacks/code_gen/Makefile ===
clean:
	$(RM) *~ *.pyc *.pyo
	


=== Added File Products/PythonMethod/zbytecodehacks/code_gen/__init__.py ===
__all__=[
    'write_ops',
    'opexecfuncread']


=== Added File Products/PythonMethod/zbytecodehacks/code_gen/op_execute_methods ===
# -*- python -*-
STOP_CODE:
    pass
POP_TOP:
    stack.pop()
ROT_TWO:
    stack[-2:]=[stack[-1],stack[-2]]
ROT_THREE:
    stack[-3:]=[
        stack[-1],
        stack[-3],
        stack[-2]]
DUP_TOP:
    stack.append(stack[-1])
UNARY_POSITIVE:
UNARY_NEGATIVE:
UNARY_NOT:
UNARY_CONVERT:
UNARY_INVERT:
    stack[-1:]=[self]
BINARY_POWER:
BINARY_MULTIPLY:
BINARY_DIVIDE:
BINARY_MODULO:
BINARY_ADD:
BINARY_SUBTRACT:
BINARY_SUBSCR:
BINARY_LSHIFT:
BINARY_RSHIFT:
BINARY_AND:
BINARY_XOR:
BINARY_OR:
    stack[-2:]=[self]
SLICE_0:
    stack[-1:]=[self]
SLICE_1:
SLICE_2:
    stack[-2:]=[self]
SLICE_3:
    stack[-3:]=[self]
STORE_SLICE_0:
    del stack[-2:]
STORE_SLICE_1:
STORE_SLICE_2:
    del stack[-3:]
STORE_SLICE_3:
    del stack[-4:]
DELETE_SLICE_0:
    del stack[-1:]
DELETE_SLICE_1:
DELETE_SLICE_2:
    del stack[-2:]
DELETE_SLICE_3:
    del stack[-3:]
STORE_SUBSCR:
    del stack[-3:]
DELETE_SUBSCR:
    del stack[-2:]    
PRINT_EXPR:
PRINT_ITEM:
    stack.pop()    
PRINT_NEWLINE:
    pass
BREAK_LOOP:
    raise "No jumps here!"
LOAD_LOCALS:
    stack.append(self)
RETURN_VALUE:
    stack[:] = []
EXEC_STMT:
    pass
POP_BLOCK:
    pass
END_FINALLY:
    pass
BUILD_CLASS:
    stack[-3:] = [self]
STORE_NAME:
DELETE_NAME:
    stack.pop()
UNPACK_TUPLE:
UNPACK_LIST:
    stack.append([self] * self.arg)    
STORE_ATTR:
DELETE_ATTR:
STORE_GLOBAL:
DELETE_GLOBAL:
    stack.pop()
LOAD_CONST:
LOAD_NAME:
    stack.append(self)
BUILD_TUPLE:
BUILD_LIST:
    if self.arg>0:
        stack[-self.arg:]=[self]
    else:
        stack.append(self)
BUILD_MAP:
    stack.append(self)
LOAD_ATTR:
    stack[-1] = self
COMPARE_OP:
    stack[-2:]=[self] # ????
IMPORT_NAME:
    stack.append(self)
IMPORT_FROM:
    pass
JUMP_FORWARD:
JUMP_IF_TRUE:
JUMP_IF_FALSE:
JUMP_ABSOLUTE:
    raise "jumps not handled here!"
FOR_LOOP:
    raise "loop alert"
LOAD_GLOBAL:
    stack.append(self)
SETUP_LOOP:
    raise "loop alert!"
SETUP_EXCEPT:
SETUP_FINALLY:
    pass # ??
LOAD_FAST:
    stack.append(self)
STORE_FAST:
DELETE_FAST:
    stack.pop()
SET_LINENO:
    pass
RAISE_VARARGS:
    raise "Exception!"
CALL_FUNCTION:
    num_keyword_args=self.arg>>8
    num_regular_args=self.arg&0xFF
    stack[-2*num_keyword_args-num_regular_args-1:]=[self]
MAKE_FUNCTION:
    stack[-self.arg-1:]=[self]
BUILD_SLICE:
    stack[-self.arg:]=[self]


=== Added File Products/PythonMethod/zbytecodehacks/code_gen/opexfuncread.py ===
import os,string

file=open(os.path.join(os.path.dirname(__file__ ),'op_execute_methods'),'r')

lines=string.split(file.read(),'\n')[1:]

exec_funcs={}

n=len(lines)

for i in range(n):
    if (not lines[i]) or lines[i][0]==' ':
        continue
    j=i
    body=[]
    while j<n:
        if lines[j][0]==' ':
            while lines[j] and lines[j][0]==' ':
                body.append(lines[j])
                j=j+1
            break
        j=j+1
    body='    '+string.join(body,'\n    ')
    exec_funcs[lines[i][:-1]]=body
    


=== Added File Products/PythonMethod/zbytecodehacks/code_gen/regen ===
#!/usr/local/bin/python

from bytecodehacks.code_gen import write_ops
write_ops.Main()


=== Added File Products/PythonMethod/zbytecodehacks/code_gen/write_ops.py ===
import dis,re,sys,os,string

from bytecodehacks.code_gen import opexfuncread

temphead="""\
# this file is autogenerated by running
# from bytecodehacks.code_gen import write_ops
# write_ops.Main()

from bytecodehacks import opbases
from bytecodehacks.label import Label

_opbases = opbases
_Label = Label

del Label
del opbases

_bytecodes={}

"""

noargtemplate="""\
class %(name)s(_opbases.%(base)s):
    op = %(index)d
    opc = '\\%(index)03o'

    def __init__(self,cs=None,code=None):
        if cs is not None:
            _opbases.%(base)s.__init__(self,cs,code)
    def execute(self,stack):
%(exec_body)s

_bytecodes[%(name)s.opc]=%(name)s

"""

argtemplate="""\
class %(name)s(_opbases.%(base)s):
    op = %(index)d
    opc = '\\%(index)03o'

    def __init__(self,csorarg,code=None):
        if code is not None:
            _opbases.%(base)s.__init__(self,csorarg,code)
        else:
            self.user_init(csorarg)
    def execute(self,stack):
%(exec_body)s

_bytecodes[%(name)s.opc]=%(name)s

"""
jumptemplate="""\
class %(name)s(_opbases.%(base)s):
    op = %(index)d
    opc = '\\%(index)03o'

    def __init__(self,csorarg=None,code=None):
        if csorarg is not None:
            if code is not None:
                _opbases.%(base)s.__init__(self,csorarg,code)
            else:
                self.label = _Label()
                self.user_init(csorarg)
        else:
            self.label = _Label()
    def execute(self,stack):
%(exec_body)s

_bytecodes[%(name)s.opc]=%(name)s

"""

idprog=re.compile('^[_a-zA-Z][_a-zA-Z0-9]*$')
notopprog=re.compile('^<[0-9]+>$')

def main(file=sys.stdout):
    file.write(temphead)
    trans=string.maketrans('+','_')
    for index in range(len(dis.opname)):
        name=string.translate(dis.opname[index],trans)
        
        if notopprog.match(name):
            continue
        if not idprog.match(name):
            name="Opcode_%d"%index

        s = "generating %s ..."%name
        pad = " " * (30-len(s))
        print s,pad,

        base="GenericOneByteCode"

        if index < dis.HAVE_ARGUMENT:
            template = noargtemplate
            base="GenericOneByteCode"
        elif index in dis.hasjrel:
            template = jumptemplate
            base="JRel"
        elif index in dis.hasjabs:
            template = jumptemplate
            base="JAbs"
        elif index in dis.hasname:
            template = argtemplate
            base="NameOpcode"
        elif index in dis.haslocal:
            template = argtemplate
            base="LocalOpcode"
        else:
            template = argtemplate
            base="GenericThreeByteCode"

        exec_body=opexfuncread.exec_funcs[name]

        file.write(template%locals())

        print "done"

def Main():
    from bytecodehacks import __init__
    main(open(os.path.join(os.path.dirname(__init__.__file__),'ops.py'),'w'))





More information about the zopeorg-checkins mailing list