1use serde::{Deserialize, Serialize};
2use std::fmt;
3
4#[derive(Eq, PartialEq, Debug, Clone, Hash, Serialize, Deserialize)]
5pub enum Intrinsic {
6 IsReferenceType,
7 SizeOfType,
8 SizeOfVal,
9 SizeOfStr,
10 IsStrArray,
11 AssertIsStrArray,
12 ToStrArray,
13 Eq,
14 Gt,
15 Lt,
16 Gtf,
17 AddrOf,
18 StateClear,
19 StateLoadWord,
20 StateStoreWord,
21 StateLoadQuad,
22 StateStoreQuad,
23 Log,
24 Add,
25 Sub,
26 Mul,
27 Div,
28 And,
29 Or,
30 Xor,
31 Lsh,
32 Rsh,
33 Mod,
34 Revert,
35 PtrAdd,
36 PtrSub,
37 Smo,
38 Not,
39 JmpMem,
40 ContractCall, ContractRet, EncodeBufferEmpty, EncodeBufferAppend, EncodeBufferAsRawSlice, Slice, ElemAt, Transmute, Dbg, }
50
51impl fmt::Display for Intrinsic {
52 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
53 let s = match self {
54 Intrinsic::IsReferenceType => "is_reference_type",
55 Intrinsic::IsStrArray => "is_str_type",
56 Intrinsic::SizeOfType => "size_of",
57 Intrinsic::SizeOfVal => "size_of_val",
58 Intrinsic::SizeOfStr => "size_of_str_array",
59 Intrinsic::AssertIsStrArray => "assert_is_str_array",
60 Intrinsic::ToStrArray => "to_str_array",
61 Intrinsic::Eq => "eq",
62 Intrinsic::Gt => "gt",
63 Intrinsic::Lt => "lt",
64 Intrinsic::Gtf => "gtf",
65 Intrinsic::AddrOf => "addr_of",
66 Intrinsic::StateClear => "state_clear",
67 Intrinsic::StateLoadWord => "state_load_word",
68 Intrinsic::StateStoreWord => "state_store_word",
69 Intrinsic::StateLoadQuad => "state_load_quad",
70 Intrinsic::StateStoreQuad => "state_store_quad",
71 Intrinsic::Log => "log",
72 Intrinsic::Add => "add",
73 Intrinsic::Sub => "sub",
74 Intrinsic::Mul => "mul",
75 Intrinsic::Div => "div",
76 Intrinsic::And => "and",
77 Intrinsic::Or => "or",
78 Intrinsic::Xor => "xor",
79 Intrinsic::Lsh => "lsh",
80 Intrinsic::Rsh => "rsh",
81 Intrinsic::Mod => "mod",
82 Intrinsic::Revert => "revert",
83 Intrinsic::PtrAdd => "ptr_add",
84 Intrinsic::PtrSub => "ptr_sub",
85 Intrinsic::Smo => "smo",
86 Intrinsic::Not => "not",
87 Intrinsic::JmpMem => "jmp_mem",
88 Intrinsic::ContractCall => "contract_call",
89 Intrinsic::ContractRet => "contract_ret",
90 Intrinsic::EncodeBufferEmpty => "encode_buffer_empty",
91 Intrinsic::EncodeBufferAppend => "encode_buffer_append",
92 Intrinsic::EncodeBufferAsRawSlice => "encode_buffer_as_raw_slice",
93 Intrinsic::Slice => "slice",
94 Intrinsic::ElemAt => "elem_at",
95 Intrinsic::Transmute => "transmute",
96 Intrinsic::Dbg => "dbg",
97 };
98 write!(f, "{s}")
99 }
100}
101
102impl Intrinsic {
103 pub fn try_from_str(raw: &str) -> Option<Intrinsic> {
104 use Intrinsic::*;
105 Some(match raw {
106 "__is_reference_type" => IsReferenceType,
107 "__is_str_array" => IsStrArray,
108 "__size_of" => SizeOfType,
109 "__size_of_val" => SizeOfVal,
110 "__size_of_str_array" => SizeOfStr,
111 "__assert_is_str_array" => AssertIsStrArray,
112 "__to_str_array" => ToStrArray,
113 "__eq" => Eq,
114 "__gt" => Gt,
115 "__lt" => Lt,
116 "__gtf" => Gtf,
117 "__addr_of" => AddrOf,
118 "__state_clear" => StateClear,
119 "__state_load_word" => StateLoadWord,
120 "__state_store_word" => StateStoreWord,
121 "__state_load_quad" => StateLoadQuad,
122 "__state_store_quad" => StateStoreQuad,
123 "__log" => Log,
124 "__add" => Add,
125 "__sub" => Sub,
126 "__mul" => Mul,
127 "__div" => Div,
128 "__and" => And,
129 "__or" => Or,
130 "__xor" => Xor,
131 "__lsh" => Lsh,
132 "__rsh" => Rsh,
133 "__mod" => Mod,
134 "__revert" => Revert,
135 "__ptr_add" => PtrAdd,
136 "__ptr_sub" => PtrSub,
137 "__smo" => Smo,
138 "__not" => Not,
139 "__jmp_mem" => JmpMem,
140 "__contract_call" => ContractCall,
141 "__contract_ret" => ContractRet,
142 "__encode_buffer_empty" => EncodeBufferEmpty,
143 "__encode_buffer_append" => EncodeBufferAppend,
144 "__encode_buffer_as_raw_slice" => EncodeBufferAsRawSlice,
145 "__slice" => Slice,
146 "__elem_at" => ElemAt,
147 "__transmute" => Transmute,
148 "__dbg" => Dbg,
149 _ => return None,
150 })
151 }
152}