cairo_lang_sierra/extensions/modules/
drop.rs

1use crate::extensions::lib_func::{
2    LibfuncSignature, ParamSignature, SierraApChange, SignatureOnlyGenericLibfunc,
3    SignatureSpecializationContext,
4};
5use crate::extensions::{SpecializationError, args_as_single_type};
6use crate::program::GenericArg;
7
8/// Libfunc for ignoring a plain old data object.
9#[derive(Default)]
10pub struct DropLibfunc {}
11impl SignatureOnlyGenericLibfunc for DropLibfunc {
12    const STR_ID: &'static str = "drop";
13
14    fn specialize_signature(
15        &self,
16        context: &dyn SignatureSpecializationContext,
17        generic_args: &[GenericArg],
18    ) -> Result<LibfuncSignature, SpecializationError> {
19        let ty = args_as_single_type(generic_args)?;
20        let info = context.get_type_info(ty.clone())?;
21        if info.droppable {
22            Ok(LibfuncSignature::new_non_branch_ex(
23                vec![ParamSignature {
24                    ty,
25                    allow_deferred: true,
26                    allow_add_const: true,
27                    allow_const: true,
28                }],
29                vec![],
30                SierraApChange::Known { new_vars_only: true },
31            ))
32        } else {
33            Err(SpecializationError::UnsupportedGenericArg)
34        }
35    }
36}