cairo_lang_sierra/extensions/modules/
trace.rs

1use super::consts::SignatureAndConstConcreteLibfunc;
2use crate::extensions::lib_func::{
3    LibfuncSignature, SierraApChange, SignatureSpecializationContext,
4};
5use crate::extensions::{NamedLibfunc, SpecializationError, args_as_single_value};
6use crate::program::GenericArg;
7
8/// Libfunc for causing a trace hint in the hint processor.
9#[derive(Default)]
10pub struct TraceLibfunc {}
11impl NamedLibfunc for TraceLibfunc {
12    const STR_ID: &'static str = "trace";
13
14    type Concrete = SignatureAndConstConcreteLibfunc;
15
16    fn specialize_signature(
17        &self,
18        _context: &dyn SignatureSpecializationContext,
19        generic_args: &[GenericArg],
20    ) -> Result<LibfuncSignature, SpecializationError> {
21        let _flag = args_as_single_value(generic_args)?;
22        Ok(LibfuncSignature::new_non_branch_ex(
23            vec![],
24            vec![],
25            SierraApChange::Known { new_vars_only: false },
26        ))
27    }
28
29    fn specialize(
30        &self,
31        context: &dyn crate::extensions::lib_func::SpecializationContext,
32        args: &[GenericArg],
33    ) -> Result<Self::Concrete, SpecializationError> {
34        let flag = args_as_single_value(args)?;
35        Ok(Self::Concrete {
36            signature: self.specialize_signature(context.upcast(), args)?,
37            c: flag,
38        })
39    }
40}