pub struct ReadonlyParams {
pub readonly: HashMap<Symbol, HashSet<Symbol>>,
}Expand description
Readonly parameter analysis result.
Maps each function to the set of its Seq<T> parameters that are never
structurally mutated (no Push, Pop, Add, Remove, SetIndex, or reassignment)
either directly or transitively through callees.
Parameters in this set are eligible for &[T] borrow in codegen instead
of requiring ownership or cloning.
§Safety under Rc (reference) semantics
LogosSeq
Let mutable X be paramis caught bycollect_consumed_params, which removes the param from the readonly set. This prevents aliasing where a mutable local could mutate through the shared Rc.- Interior mutation via Rc clone requires the
mutablekeyword on the alias, which triggers the consumed-param check. - Fixed-point propagation through the callgraph catches transitive mutations: if a callee mutates a param position, all callers passing a readonly candidate to that position lose their readonly status.
Fields§
§readonly: HashMap<Symbol, HashSet<Symbol>>fn_sym → set of param symbols that are readonly within that function.
Implementations§
Source§impl ReadonlyParams
impl ReadonlyParams
Sourcepub fn analyze(
stmts: &[Stmt<'_>],
callgraph: &CallGraph,
type_env: &TypeEnv,
) -> ReadonlyParams
pub fn analyze( stmts: &[Stmt<'_>], callgraph: &CallGraph, type_env: &TypeEnv, ) -> ReadonlyParams
Analyze the program and compute readonly parameters.
Uses fixed-point iteration: starts optimistically with all Seq<T>
params as readonly candidates, then eliminates those that are directly
mutated or transitively mutated via callee propagation.
Native functions are trusted: their params remain readonly unless the LOGOS body explicitly mutates them (which is impossible since they have no body).
Sourcepub fn is_readonly(&self, fn_sym: Symbol, param_sym: Symbol) -> bool
pub fn is_readonly(&self, fn_sym: Symbol, param_sym: Symbol) -> bool
Returns true if param_sym is readonly within fn_sym.