get the value of the Right Hand Expression
(&mut self, stmt: &ast::Node)
| 226 | |
| 227 | /// get the value of the Right Hand Expression |
| 228 | fn get_rvalue(&mut self, stmt: &ast::Node) -> Result<Symbol<T>> { |
| 229 | let stmt = stmt.ignore_cast().ignore_parent().ignore_cast(); |
| 230 | let sym = match &stmt.kind { |
| 231 | ast::Clang::CallExpr(_) => { |
| 232 | (self.callback.precall)(&mut self.store_mgr, &mut self.env_mgr, stmt); |
| 233 | let mut sym = self.env_mgr.create_object_for_call(stmt)?; |
| 234 | (self.callback.postcall)(&mut self.store_mgr, stmt, &mut sym); |
| 235 | sym |
| 236 | } |
| 237 | ast::Clang::CharacterLiteral(_) |
| 238 | | ast::Clang::StringLiteral(_) |
| 239 | | ast::Clang::IntegerLiteral(_) |
| 240 | | ast::Clang::FloatingLiteral(_) => self.env_mgr.create_object_from_literal(stmt)?, |
| 241 | ast::Clang::ParenExpr(_) => { |
| 242 | assert!(!stmt.inner.is_empty()); |
| 243 | if stmt.inner.len() == 1 { |
| 244 | let child = stmt.inner.first().unwrap(); |
| 245 | self.get_rvalue(child)? |
| 246 | } else { |
| 247 | self.env_mgr.create_dummy_object() |
| 248 | } |
| 249 | } |
| 250 | ast::Clang::DeclRefExpr(_) => { |
| 251 | let var = stmt.get_var_name(); |
| 252 | if let Ok(sym) = self.store_mgr.get_bind(&var) { |
| 253 | sym |
| 254 | } else { |
| 255 | self.env_mgr.create_dummy_object() |
| 256 | } |
| 257 | } |
| 258 | ast::Clang::InitListExpr(il) => { |
| 259 | let ty = il.get_type(); |
| 260 | self.env_mgr.create_list_object(ty) |
| 261 | } |
| 262 | ast::Clang::BinaryOperator(bo) => { |
| 263 | if bo.is_assignment() { |
| 264 | let left = bo.get_lhs(stmt); |
| 265 | let right = bo.get_rhs(stmt); |
| 266 | let var = left.get_var_name(); |
| 267 | let sym = self.get_rvalue(right)?; |
| 268 | self.store_mgr.ssa_bind_value(var, sym.clone())?; |
| 269 | sym |
| 270 | } else { |
| 271 | self.env_mgr.create_dummy_object() |
| 272 | } |
| 273 | } |
| 274 | ast::Clang::ArraySubscriptExpr(ase) => { |
| 275 | let lhs = ase.get_lhs(stmt).ignore_cast().ignore_parent(); |
| 276 | if let ast::Clang::DeclRefExpr(_) = &lhs.kind { |
| 277 | self.get_rvalue(lhs)? |
| 278 | } else if let ast::Clang::CallExpr(_) = &lhs.kind { |
| 279 | self.get_rvalue(lhs)? |
| 280 | } else { |
| 281 | //log::warn!("getRValue is unimplemented for : {stmt:#?}"); |
| 282 | self.env_mgr.create_dummy_object() |
| 283 | } |
| 284 | } |
| 285 | ast::Clang::MemberExpr(me) => { |
no test coverage detected