| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 7d0cfdb commit c36dbb6
1 file changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -148,6 +148,19 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi | |||
| 148 | 148 | return SubroutineCall(loc, basic_free_stack_sym, {x}); | |
| 149 | 149 | } | |
| 150 | 150 | ||
| 151 | + ASR::stmt_t *basic_free_stack_if_not_null(const Location &loc, ASR::expr_t *x) { | ||
| 152 | + Vec<ASR::stmt_t*> func_body; | ||
| 153 | + func_body.reserve(al, 1); | ||
| 154 | + func_body.push_back(al, basic_free_stack(loc, x)); | ||
| 155 | + ASR::ttype_t *CPtr_type = ASRUtils::TYPE(ASR::make_CPtr_t(al, loc)); | ||
| 156 | + ASR::ttype_t *Logical_type = ASRUtils::TYPE(ASR::make_Logical_t(al, loc, 4)); | ||
| 157 | + ASR::expr_t* null = ASRUtils::EXPR(ASR::make_PointerNullConstant_t(al, loc, CPtr_type)); | ||
| 158 | + ASR::expr_t* cond = ASRUtils::EXPR(ASR::make_CPtrCompare_t(al, loc, x, ASR::cmpopType::NotEq, | ||
| 159 | + null, Logical_type, nullptr)); | ||
| 160 | + return ASRUtils::STMT(ASR::make_If_t(al, loc, cond, | ||
| 161 | + func_body.p, func_body.size(), nullptr, 0)); | ||
| 162 | + } | ||
| 163 | + | ||
| 151 | 164 | ASR::expr_t *basic_new_heap(const Location& loc) { | |
| 152 | 165 | ASR::symbol_t* basic_new_heap_sym = create_bindc_function(loc, | |
| 153 | 166 | "basic_new_heap", {}, ASRUtils::TYPE((ASR::make_CPtr_t(al, loc)))); | |
@@ -324,7 +337,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi | |||
| 324 | 337 | func_body.from_pointer_n_copy(al, xx.m_body, xx.n_body); | |
| 325 | 338 | ||
| 326 | 339 | for (ASR::symbol_t* symbol : symbolic_vars_to_free) { | |
| 327 | - func_body.push_back(al, basic_free_stack(x.base.base.loc, | ||
| 340 | + func_body.push_back(al, basic_free_stack_if_not_null(x.base.base.loc, | ||
| 328 | 341 | ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, symbol)))); | |
| 329 | 342 | } | |
| 330 | 343 | ||
@@ -1027,7 +1040,7 @@ class ReplaceSymbolicVisitor : public PassUtils::PassVisitor<ReplaceSymbolicVisi | |||
| 1027 | 1040 | // freeing out variables | |
| 1028 | 1041 | if (!symbolic_vars_to_free.empty()){ | |
| 1029 | 1042 | for (ASR::symbol_t* symbol : symbolic_vars_to_free) { | |
| 1030 | - pass_result.push_back(al, basic_free_stack(x.base.base.loc, | ||
| 1043 | + pass_result.push_back(al, basic_free_stack_if_not_null(x.base.base.loc, | ||
| 1031 | 1044 | ASRUtils::EXPR(ASR::make_Var_t(al, x.base.base.loc, symbol)))); | |
| 1032 | 1045 | } | |
| 1033 | 1046 | pass_result.push_back(al, ASRUtils::STMT(ASR::make_Return_t(al, x.base.base.loc))); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments