Add test for source map functionality.
This commit is contained in:
parent
08e6793743
commit
5b243dde30
|
@ -100,50 +100,6 @@ if __name__ == '__main__':
|
|||
|
||||
abi = compiler.mk_full_signature(code)
|
||||
|
||||
def serialise_var_rec(var_rec):
|
||||
return {
|
||||
'type': var_rec.typ.typ,
|
||||
'size': var_rec.size * 32,
|
||||
'position': var_rec.pos
|
||||
}
|
||||
|
||||
_contracts, _events, _defs, _globals, _custom_units = parser.get_contracts_and_defs_and_globals(parser.parse(code))
|
||||
source_map = {
|
||||
'globals': {},
|
||||
'locals': {}
|
||||
}
|
||||
source_map['globals'] = {
|
||||
name: serialise_var_rec(var_record)
|
||||
for name, var_record in _globals.items()
|
||||
}
|
||||
# Fetch context for each function.
|
||||
lll = parser.parse_tree_to_lll(parser.parse(code), code, runtime_only=True)
|
||||
contexts = {
|
||||
f.func_name: f.context
|
||||
for f in lll.args[1:] if hasattr(f, 'context')
|
||||
}
|
||||
|
||||
prev_func_name = None
|
||||
for _def in _defs:
|
||||
func_info = {
|
||||
'from_lineno': _def.lineno,
|
||||
'variables': {}
|
||||
}
|
||||
# set local variables for specific function.
|
||||
context = contexts[_def.name]
|
||||
func_info['variables'] = {
|
||||
var_name: serialise_var_rec(var_rec)
|
||||
for var_name, var_rec in context.vars.items()
|
||||
}
|
||||
|
||||
source_map['locals'][_def.name] = func_info
|
||||
# set to_lineno
|
||||
if prev_func_name:
|
||||
source_map['locals'][prev_func_name]['to_lineno'] = _def.lineno
|
||||
prev_func_name = _def.name
|
||||
|
||||
source_map['locals'][_def.name]['to_lineno'] = len(code.splitlines())
|
||||
|
||||
# Format init args.
|
||||
if init_args:
|
||||
init_abi = next(filter(lambda func: func["name"] == '__init__', abi))
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
from vdb.source_map import produce_source_map
|
||||
|
||||
|
||||
def test_source_map_output():
|
||||
code = """
|
||||
a_map: bytes32[bytes32]
|
||||
|
||||
@public
|
||||
def func1(a: int128) -> int128:
|
||||
b: int128 = 2
|
||||
c: int128 = 3
|
||||
g: bytes[10]
|
||||
return a + b + c + 1
|
||||
|
||||
@public
|
||||
def func2(a: int128):
|
||||
x: uint256
|
||||
"""
|
||||
|
||||
sm = produce_source_map(code)
|
||||
|
||||
# globals
|
||||
assert sm['globals']['a_map'] == {
|
||||
'type': 'mapping(bytes32[bytes32])',
|
||||
'size': 0,
|
||||
'position': 0
|
||||
}
|
||||
|
||||
# locals
|
||||
assert sm['locals']['func1'] == {
|
||||
'from_lineno': 4,
|
||||
'to_lineno': 11,
|
||||
'variables': {
|
||||
'a': {'type': 'int128', 'size': 32, 'position': 320},
|
||||
'b': {'type': 'int128', 'size': 32, 'position': 352},
|
||||
'c': {'type': 'int128', 'size': 32, 'position': 384},
|
||||
'g': {'type': 'bytes[10]', 'size': 96, 'position': 416}},
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
from vyper.parser import (
|
||||
parser,
|
||||
)
|
||||
from vyper.types import (
|
||||
get_size_of_type,
|
||||
ByteArrayType,
|
||||
MappingType
|
||||
)
|
||||
|
||||
def serialise_var_rec(var_rec):
|
||||
if isinstance(var_rec.typ, ByteArrayType):
|
||||
type_str = 'bytes[%s]' % var_rec.typ.maxlen
|
||||
_size = get_size_of_type(var_rec.typ) * 32
|
||||
elif isinstance(var_rec.typ, MappingType):
|
||||
type_str = 'mapping(%s)' % var_rec.typ
|
||||
_size = 0
|
||||
else:
|
||||
type_str = var_rec.typ.typ
|
||||
_size = get_size_of_type(var_rec.typ) * 32
|
||||
|
||||
out = {
|
||||
'type': type_str,
|
||||
'size': _size,
|
||||
'position': var_rec.pos
|
||||
}
|
||||
return out
|
||||
|
||||
|
||||
def produce_source_map(code):
|
||||
_contracts, _events, _defs, _globals, _custom_units = parser.get_contracts_and_defs_and_globals(parser.parse(code))
|
||||
source_map = {
|
||||
'globals': {},
|
||||
'locals': {}
|
||||
}
|
||||
source_map['globals'] = {
|
||||
name: serialise_var_rec(var_record)
|
||||
for name, var_record in _globals.items()
|
||||
}
|
||||
# Fetch context for each function.
|
||||
lll = parser.parse_tree_to_lll(parser.parse(code), code, runtime_only=True)
|
||||
contexts = {
|
||||
f.func_name: f.context
|
||||
for f in lll.args[1:] if hasattr(f, 'context')
|
||||
}
|
||||
|
||||
prev_func_name = None
|
||||
for _def in _defs:
|
||||
func_info = {
|
||||
'from_lineno': _def.lineno,
|
||||
'variables': {}
|
||||
}
|
||||
# set local variables for specific function.
|
||||
context = contexts[_def.name]
|
||||
func_info['variables'] = {
|
||||
var_name: serialise_var_rec(var_rec)
|
||||
for var_name, var_rec in context.vars.items()
|
||||
}
|
||||
|
||||
source_map['locals'][_def.name] = func_info
|
||||
# set to_lineno
|
||||
if prev_func_name:
|
||||
source_map['locals'][prev_func_name]['to_lineno'] = _def.lineno
|
||||
prev_func_name = _def.name
|
||||
|
||||
source_map['locals'][_def.name]['to_lineno'] = len(code.splitlines())
|
||||
|
||||
return source_map
|
Loading…
Reference in New Issue