bool destruct_(Context *ctx, ParseResult *pr, ParseResult *ret_pr, llvm::IRBuilder<> *builder, bool value_is_ptr) { pr->copyTo(ret_pr); if (pr->do_not_destruct) { return true; } if (pr->type->is_array && pr->type->array_size) { return destructArray(ctx, pr, ret_pr, builder, value_is_ptr); } Function *fn = getDestructor(ctx, pr->type); if (!fn) { if (pr->type->struct_name.size()) { destructStruct(ctx, pr, ret_pr, builder, value_is_ptr); } return true; } std::vector<llvm::Value *> call_args; llvm::Value *value_ptr; if (value_is_ptr) { value_ptr = pr->value; } else { value_ptr = llvm::cast<llvm::Value>( builder->CreateAlloca(ctx->toLLVMType(pr->type, NULL, false)) ); builder->CreateStore(pr->value, value_ptr); } call_args.push_back(value_ptr); builder->CreateCall( fn->llvm_function, llvm::ArrayRef<llvm::Value*>(call_args) ); return true; }
void ArrayValueType::generateDestructor(Builder *builder, const Value &value) { if (value.isReference() || value.isConstant()) return; destructArray(builder, value.value()); }