Tweaking the stack analyzer
This commit is contained in:
parent
a6b20ed7c3
commit
983635eb4f
4 changed files with 19 additions and 21 deletions
|
@ -1,5 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import logging
|
||||||
from random import choices
|
from random import choices
|
||||||
from string import ascii_lowercase, digits
|
from string import ascii_lowercase, digits
|
||||||
from typing import List, Optional, Sequence, Union
|
from typing import List, Optional, Sequence, Union
|
||||||
|
@ -7,6 +8,9 @@ from typing import List, Optional, Sequence, Union
|
||||||
from ichor import isa
|
from ichor import isa
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def gensym(prefix = None) -> isa.Label:
|
def gensym(prefix = None) -> isa.Label:
|
||||||
frag = "".join(choices(ascii_lowercase + digits, k=8))
|
frag = "".join(choices(ascii_lowercase + digits, k=8))
|
||||||
return isa.Label(f"{prefix or 'gensym'}_{frag}")
|
return isa.Label(f"{prefix or 'gensym'}_{frag}")
|
||||||
|
@ -26,22 +30,14 @@ class FuncBuilder(object):
|
||||||
if not self._straightline:
|
if not self._straightline:
|
||||||
return
|
return
|
||||||
|
|
||||||
start_stack = self._stack
|
|
||||||
match op:
|
match op:
|
||||||
case isa.Label(_):
|
case isa.Label(_) | isa.GOTO(_) | isa.ATEST(_):
|
||||||
# Labels abort
|
# Labels and control ops abort
|
||||||
self._straightline = False
|
|
||||||
|
|
||||||
case isa.GOTO(_) | isa.ATEST(_):
|
|
||||||
# Control ops abort
|
|
||||||
self._straightline = False
|
self._straightline = False
|
||||||
|
|
||||||
case isa.CLOSUREC(n) | isa.CLOSUREF(n):
|
case isa.CLOSUREC(n) | isa.CLOSUREF(n):
|
||||||
self._stack -= n
|
self._stack -= n
|
||||||
|
|
||||||
case isa.TYPEREF():
|
|
||||||
pass
|
|
||||||
|
|
||||||
case isa.ARMREF():
|
case isa.ARMREF():
|
||||||
self._stack -= 1
|
self._stack -= 1
|
||||||
|
|
||||||
|
@ -51,14 +47,15 @@ class FuncBuilder(object):
|
||||||
case isa.DUP(n):
|
case isa.DUP(n):
|
||||||
self._stack += n
|
self._stack += n
|
||||||
|
|
||||||
case isa.ROT(_):
|
case isa.IDENTIFIERC(_) | isa.SLOT(_) | isa.CALLF(_) | isa.CALLC(_) | isa.ARM(_):
|
||||||
pass
|
|
||||||
|
|
||||||
case _:
|
|
||||||
self._stack -= getattr(op, "nargs", 0)
|
self._stack -= getattr(op, "nargs", 0)
|
||||||
self._stack += 1
|
self._stack += 1
|
||||||
|
|
||||||
print(op, "pre", start_stack, "post", self._stack)
|
case isa.ROT(_) | isa.FUNREF(_) | isa.TYPEREF() | isa.ALOAD():
|
||||||
|
pass
|
||||||
|
|
||||||
|
case _:
|
||||||
|
log.debug("No stack manipulation known for %s, assuming no change", op)
|
||||||
|
|
||||||
def write(self, op: Union[isa.Opcode, isa.Label, Sequence[isa.Opcode]]):
|
def write(self, op: Union[isa.Opcode, isa.Label, Sequence[isa.Opcode]]):
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
@ -26,7 +27,7 @@ class GOTO(Opcode):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
target: int
|
target: Union[int, Label]
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Stack manipulation
|
# Stack manipulation
|
||||||
|
@ -77,7 +78,7 @@ class SLOT(Opcode):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
target: int
|
target: Union[int, Label]
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# Functional abstraction
|
# Functional abstraction
|
||||||
|
@ -227,7 +228,7 @@ class ATEST(Opcode):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
target: int
|
target: Union[int, Label]
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|
|
@ -49,7 +49,7 @@ def test_self_label(builder: FuncBuilder):
|
||||||
|
|
||||||
|
|
||||||
def test_local_label(builder: FuncBuilder):
|
def test_local_label(builder: FuncBuilder):
|
||||||
s0 = builder.mark_slot()
|
s0 = builder.mark_slot(target=0)
|
||||||
builder.write(isa.SLOT(s0))
|
builder.write(isa.SLOT(s0))
|
||||||
|
|
||||||
s999 = builder.mark_slot(target=999)
|
s999 = builder.mark_slot(target=999)
|
||||||
|
|
|
@ -4,13 +4,13 @@ from .fixtures import * # noqa
|
||||||
|
|
||||||
from ichor import isa
|
from ichor import isa
|
||||||
from ichor.bootstrap import (
|
from ichor.bootstrap import (
|
||||||
|
AND2,
|
||||||
|
AND3,
|
||||||
FALSE,
|
FALSE,
|
||||||
NOT1,
|
NOT1,
|
||||||
OR2,
|
OR2,
|
||||||
OR3,
|
OR3,
|
||||||
TRUE,
|
TRUE,
|
||||||
AND2,
|
|
||||||
AND3
|
|
||||||
)
|
)
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue