From a33d34583b49c939716982a091c79e8e5a738109 Mon Sep 17 00:00:00 2001 From: Hannes Braun Date: Mon, 25 Nov 2024 14:56:24 +0100 Subject: [PATCH] Visualize types and functions on stack --- pytrace-generator/main.py | 23 ++- .../test/test-cases/divideByZero.py.json | 132 ++++--------- .../test/test-cases/factorial.py.json | 120 +++--------- .../test/test-cases/wyppSimple.py.json | 180 +++++------------- .../frontend/HTMLGenerator.ts | 10 - src/programflow-visualization/types.ts | 3 +- 6 files changed, 132 insertions(+), 336 deletions(-) diff --git a/pytrace-generator/main.py b/pytrace-generator/main.py index e7ab213f..15ec11f8 100644 --- a/pytrace-generator/main.py +++ b/pytrace-generator/main.py @@ -16,6 +16,7 @@ def eprint(*args, **kwargs): print(*args, file=sys.stderr, **kwargs) type_name_regex = re.compile("") +function_str_regex = re.compile(r"^(") import_regex = re.compile(r"^(?:[^'\"]+\s)?import[\s*]") # Frame objects: @@ -26,10 +27,11 @@ def eprint(*args, **kwargs): float: "float", bool: "bool", str: "str", - type(None): "none" + type(None): "none", + type: "type", + types.FunctionType: "function" } HEAP_TYPES = { - type: "type", list: "list", tuple: "tuple", dict: "dict", @@ -112,6 +114,18 @@ def format(self): "type": self.type_str, "value": self.value } + if type(d["value"]) == type: + type_name = str(d["value"]) + search_result = type_name_regex.search(type_name) + if search_result is not None: + type_name = f"" + d["value"] = type_name + elif inspect.isfunction(d["value"]): + function_desc = str(d["value"]) + search_result = function_str_regex.search(function_desc) + if search_result is not None: + function_desc = f"{search_result.group(1)}>" + d["value"] = function_desc if self.variable_name is not None: d["name"] = self.variable_name return d @@ -200,11 +214,6 @@ def store(self, address, value): stored_value[key_id] = prim_value if prim_value.is_ref(): inner_values.append(v) - elif value_type == type: - stored_value = str(value) - search_result = type_name_regex.search(stored_value) - if search_result is not None: - stored_value = f"" elif inspect.isgenerator(value): stored_value = {} else: diff --git a/pytrace-generator/test/test-cases/divideByZero.py.json b/pytrace-generator/test/test-cases/divideByZero.py.json index b75b94ff..28eff15f 100644 --- a/pytrace-generator/test/test-cases/divideByZero.py.json +++ b/pytrace-generator/test/test-cases/divideByZero.py.json @@ -19,20 +19,14 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -43,20 +37,14 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -67,8 +55,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] @@ -84,13 +72,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -101,8 +83,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] @@ -118,13 +100,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -135,8 +111,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] @@ -162,13 +138,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -179,8 +149,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] @@ -206,13 +176,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -223,8 +187,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] @@ -260,13 +224,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -277,8 +235,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] @@ -314,13 +272,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -331,20 +283,14 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -355,20 +301,14 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -379,20 +319,14 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "bar" } ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" } ] \ No newline at end of file diff --git a/pytrace-generator/test/test-cases/factorial.py.json b/pytrace-generator/test/test-cases/factorial.py.json index 7b1c40fd..abee7ab3 100644 --- a/pytrace-generator/test/test-cases/factorial.py.json +++ b/pytrace-generator/test/test-cases/factorial.py.json @@ -19,20 +19,14 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -43,8 +37,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -60,13 +54,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -77,8 +65,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -94,13 +82,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -111,8 +93,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -138,13 +120,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -155,8 +131,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -182,13 +158,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -199,8 +169,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -231,13 +201,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -248,8 +212,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -270,13 +234,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -287,8 +245,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -314,13 +272,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -331,8 +283,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" } ] @@ -363,13 +315,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -380,8 +326,8 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "function", + "value": "", "name": "factorical" }, { @@ -392,13 +338,7 @@ ] } ], - "heap": { - "0": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" } ] \ No newline at end of file diff --git a/pytrace-generator/test/test-cases/wyppSimple.py.json b/pytrace-generator/test/test-cases/wyppSimple.py.json index fdafe8c1..b7969268 100644 --- a/pytrace-generator/test/test-cases/wyppSimple.py.json +++ b/pytrace-generator/test/test-cases/wyppSimple.py.json @@ -43,19 +43,14 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" } ] } ], - "heap": { - "0": { - "type": "type", - "value": "" - } - }, + "heap": {}, "stdout": "" }, { @@ -66,29 +61,19 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" } ] } ], - "heap": { - "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - } - }, + "heap": {}, "stdout": "" }, { @@ -99,18 +84,18 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" }, { "type": "ref", - "value": 2, + "value": 0, "name": "obj1" } ] @@ -118,15 +103,6 @@ ], "heap": { "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - }, - "2": { "type": "instance", "value": { "baz": { @@ -147,18 +123,18 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" }, { "type": "ref", - "value": 2, + "value": 0, "name": "obj1" } ] @@ -166,15 +142,6 @@ ], "heap": { "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - }, - "2": { "type": "instance", "value": { "baz": { @@ -195,18 +162,18 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" }, { "type": "ref", - "value": 2, + "value": 0, "name": "obj1" } ] @@ -218,15 +185,6 @@ ], "heap": { "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - }, - "2": { "type": "instance", "value": { "baz": { @@ -247,18 +205,18 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" }, { "type": "ref", - "value": 2, + "value": 0, "name": "obj1" } ] @@ -268,7 +226,7 @@ "locals": [ { "type": "ref", - "value": 3, + "value": 1, "name": "return" } ] @@ -276,15 +234,6 @@ ], "heap": { "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - }, - "2": { "type": "instance", "value": { "baz": { @@ -294,7 +243,7 @@ }, "name": "Bar" }, - "3": { + "1": { "type": "instance", "value": { "baz": { @@ -315,23 +264,23 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" }, { "type": "ref", - "value": 2, + "value": 0, "name": "obj1" }, { "type": "ref", - "value": 3, + "value": 1, "name": "obj2" } ] @@ -339,15 +288,6 @@ ], "heap": { "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - }, - "2": { "type": "instance", "value": { "baz": { @@ -357,7 +297,7 @@ }, "name": "Bar" }, - "3": { + "1": { "type": "instance", "value": { "baz": { @@ -378,23 +318,23 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" }, { "type": "ref", - "value": 2, + "value": 0, "name": "obj1" }, { "type": "ref", - "value": 3, + "value": 1, "name": "obj2" } ] @@ -402,15 +342,6 @@ ], "heap": { "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - }, - "2": { "type": "instance", "value": { "baz": { @@ -420,7 +351,7 @@ }, "name": "Bar" }, - "3": { + "1": { "type": "instance", "value": { "baz": { @@ -441,23 +372,23 @@ "frameName": "", "locals": [ { - "type": "ref", - "value": 0, + "type": "type", + "value": "", "name": "Bar" }, { - "type": "ref", - "value": 1, + "type": "function", + "value": "", "name": "generate_bar" }, { "type": "ref", - "value": 2, + "value": 0, "name": "obj1" }, { "type": "ref", - "value": 3, + "value": 1, "name": "obj2" } ] @@ -465,15 +396,6 @@ ], "heap": { "0": { - "type": "type", - "value": "" - }, - "1": { - "type": "instance", - "value": {}, - "name": "function" - }, - "2": { "type": "instance", "value": { "baz": { @@ -483,7 +405,7 @@ }, "name": "Bar" }, - "3": { + "1": { "type": "instance", "value": { "baz": { diff --git a/src/programflow-visualization/frontend/HTMLGenerator.ts b/src/programflow-visualization/frontend/HTMLGenerator.ts index 28c4c1f7..aa6cfc1b 100644 --- a/src/programflow-visualization/frontend/HTMLGenerator.ts +++ b/src/programflow-visualization/frontend/HTMLGenerator.ts @@ -55,11 +55,6 @@ export class HTMLGenerator { case 'instance': headline = value.name; break; - case 'type': - // Types are displayed in the same way as function objects. - // This is simply done for consistency, even if it's not quite correct. - headline = value.value; - break; default: headline = value.type; } @@ -113,11 +108,6 @@ export class HTMLGenerator { `; break; - case 'type': - result = ` -
-
- `; break; /* tuple, list, int[], int[][], ...*/ default: diff --git a/src/programflow-visualization/types.ts b/src/programflow-visualization/types.ts index c1d503f1..128b0bf3 100644 --- a/src/programflow-visualization/types.ts +++ b/src/programflow-visualization/types.ts @@ -31,6 +31,8 @@ type Value = | { type: 'str'; value: string } | { type: 'none'; value: string } | { type: 'bool'; value: string } + | { type: 'type'; value: string } + | { type: 'function'; value: string } | { type: 'ref'; value: Address }; type NamedValue = Value & { @@ -48,7 +50,6 @@ type HeapValue = | { type: 'tuple'; value: Array } | { type: 'set'; value: Array } | { type: 'dict'; keys: Map, value: Map } - | { type: 'type', value: string } | { type: 'instance'; name: string, value: Map }; // wrapper type -> frontend list elements dodge