codemach

Small module that executes python code objects.

This module was created to solve the security issues associated with execution of arbitrary code strings. The Machine class can execute python code objects and allow the user to intervene.

Small module that executes python code objects.

Install

pip3 install codemach

Development

git clone git@github.com:chuck1/codemach
cd codemach
pipenv --python /usr/bin/python3.6
pipenv install
pipenv run pip3 install -e .
pipenv run pytest

Example

from codemach import Machine

m = Machine(verbose=True)

s = """
def func(a, b):
    return a + b
func(2, 3)"""

c = compile(s, '<string>', 'exec')

m.exec(c)

Below is the output. Each line shows the opname and the stack after the operation.

------------- begin exec
LOAD_CONST           [<class 'code'>]
LOAD_CONST           [<class 'code'>, "'func'"]
MAKE_FUNCTION        ['<codemach.FunctionType object, function=func>']
STORE_NAME           []
LOAD_NAME            ['<codemach.FunctionType object, function=func>']
LOAD_CONST           ['<codemach.FunctionType object, function=func>', '2']
LOAD_CONST           ['<codemach.FunctionType object, function=func>', '2', '3']
------------- begin exec
LOAD_FAST            ['2']
LOAD_FAST            ['2', '3']
BINARY_ADD           ['5']
RETURN_VALUE         []
------------- return
CALL_FUNCTION        ['5']
POP_TOP              []
LOAD_CONST           ['None']
RETURN_VALUE         []
------------- return

Operations

140 CALL_FUNCTION_VAR

need more testing, but in one test, was used to call a function defined as

def foo(*args):
    pass

where TOS1 is the function object and TOS is a tuple of arguments

Indices and tables