forked from M-Labs/artiq
compiler: do not permit mutation of bytes values (#714).
This commit is contained in:
parent
284382b1f5
commit
5d841d08e9
|
@ -4,7 +4,7 @@ as constant is ever set.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from pythonparser import algorithm, diagnostic
|
from pythonparser import algorithm, diagnostic
|
||||||
from .. import types
|
from .. import types, builtins
|
||||||
|
|
||||||
class Constness(algorithm.Visitor):
|
class Constness(algorithm.Visitor):
|
||||||
def __init__(self, engine):
|
def __init__(self, engine):
|
||||||
|
@ -23,6 +23,13 @@ class Constness(algorithm.Visitor):
|
||||||
self.visit(node.slice)
|
self.visit(node.slice)
|
||||||
self.in_assign = old_in_assign
|
self.in_assign = old_in_assign
|
||||||
|
|
||||||
|
if self.in_assign and builtins.is_bytes(node.value.type):
|
||||||
|
diag = diagnostic.Diagnostic("error",
|
||||||
|
"type {typ} is not mutable",
|
||||||
|
{"typ": "bytes"},
|
||||||
|
node.loc)
|
||||||
|
self.engine.process(diag)
|
||||||
|
|
||||||
def visit_AttributeT(self, node):
|
def visit_AttributeT(self, node):
|
||||||
old_in_assign, self.in_assign = self.in_assign, False
|
old_in_assign, self.in_assign = self.in_assign, False
|
||||||
self.visit(node.value)
|
self.visit(node.value)
|
||||||
|
|
|
@ -3,6 +3,7 @@ from pythonparser import source, diagnostic, algorithm, parse_buffer
|
||||||
from .. import prelude, types
|
from .. import prelude, types
|
||||||
from ..transforms import ASTTypedRewriter, Inferencer, IntMonomorphizer, CastMonomorphizer
|
from ..transforms import ASTTypedRewriter, Inferencer, IntMonomorphizer, CastMonomorphizer
|
||||||
from ..transforms import IODelayEstimator
|
from ..transforms import IODelayEstimator
|
||||||
|
from ..analyses import Constness
|
||||||
|
|
||||||
class Printer(algorithm.Visitor):
|
class Printer(algorithm.Visitor):
|
||||||
"""
|
"""
|
||||||
|
@ -83,6 +84,7 @@ def main():
|
||||||
parsed, comments = parse_buffer(buf, engine=engine)
|
parsed, comments = parse_buffer(buf, engine=engine)
|
||||||
typed = ASTTypedRewriter(engine=engine, prelude=prelude.globals()).visit(parsed)
|
typed = ASTTypedRewriter(engine=engine, prelude=prelude.globals()).visit(parsed)
|
||||||
Inferencer(engine=engine).visit(typed)
|
Inferencer(engine=engine).visit(typed)
|
||||||
|
Constness(engine=engine).visit(typed)
|
||||||
if monomorphize:
|
if monomorphize:
|
||||||
CastMonomorphizer(engine=engine).visit(typed)
|
CastMonomorphizer(engine=engine).visit(typed)
|
||||||
IntMonomorphizer(engine=engine).visit(typed)
|
IntMonomorphizer(engine=engine).visit(typed)
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
# RUN: %python -m artiq.compiler.testbench.inferencer +diag %s >%t
|
||||||
|
# RUN: OutputCheck %s --file-to-check=%t
|
||||||
|
|
||||||
|
# CHECK-L: ${LINE:+1}: error: type bytes is not mutable
|
||||||
|
(b"a")[0] = 1
|
Loading…
Reference in New Issue