Struct ReadonlyParams
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§
§impl ReadonlyParams
impl ReadonlyParams
pub 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).
pub 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.
Auto Trait Implementations§
impl Freeze for ReadonlyParams
impl RefUnwindSafe for ReadonlyParams
impl Send for ReadonlyParams
impl Sync for ReadonlyParams
impl Unpin for ReadonlyParams
impl UnsafeUnpin for ReadonlyParams
impl UnwindSafe for ReadonlyParams
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.