// // Consider a function that takes a formal of type Record by const ref // and that returns that value from the function. The compiler inserts // a PRIM_MOVE operation. // // This work-around inserts an autoCopy to compensate // void ReturnByRef::updateAssignmentsFromRefArgToValue(FnSymbol* fn) { std::vector<CallExpr*> callExprs; collectCallExprs(fn, callExprs); for (size_t i = 0; i < callExprs.size(); i++) { CallExpr* move = callExprs[i]; if (move->isPrimitive(PRIM_MOVE) == true) { SymExpr* lhs = toSymExpr(move->get(1)); SymExpr* rhs = toSymExpr(move->get(2)); if (lhs != NULL && rhs != NULL) { VarSymbol* symLhs = toVarSymbol(lhs->symbol()); ArgSymbol* symRhs = toArgSymbol(rhs->symbol()); if (symLhs != NULL && symRhs != NULL) { if (isUserDefinedRecord(symLhs->type) == true && symRhs->type == symLhs->type) { if (symLhs->hasFlag(FLAG_ARG_THIS) == false && (symRhs->intent == INTENT_REF || symRhs->intent == INTENT_CONST_REF)) { SET_LINENO(move); CallExpr* autoCopy = NULL; rhs->remove(); autoCopy = new CallExpr(autoCopyMap.get(symRhs->type), rhs); move->insertAtTail(autoCopy); } } } } } } }
void IpeEnv::describe(const char* pad, int index, LcnSymbol* var) const { const char* symName = var->name; const char* typeName = ""; ArgSymbol* argSym = toArgSymbol(var); VarSymbol* varSym = toVarSymbol(var); if (var->type) typeName = var->type->symbol->name; printf("%s %5d: %-30s", pad, index, symName); if (argSym != NULL) { if (argSym->intent & INTENT_REF) printf("ref %-12s", typeName); else printf("arg %-12s", typeName); } else if (varSym->immediate != NULL) printf("const %-12s", typeName); else if (varSym->hasFlag(FLAG_CONST) == true) printf("const %-12s", typeName); else if (varSym->hasFlag(FLAG_PARAM) == true) printf("param %-12s", typeName); else printf("var %-12s", typeName); if (var->depth() >= 0 && var->offset() >= 0) printf("%4d %4d ", var->depth(), var->offset()); else printf(" "); if (argSym != NULL && (argSym->intent & INTENT_REF) != 0) { if (mFrameData != NULL) { int offset = argSym->offset(); IpeValue* ref = *((IpeValue**) (((char*) mFrameData) + offset)); printf("0x%012lX", (long) ref); } } else if (var->offset() < 0) ; else if (var->type == NULL) ; else if (var->type == gIpeTypeType) printf("%s", symName); else if (var->type == dtBool) { if (mDepth == 0 || mFrameData != NULL) printf("%s", (fetchBool(var) == true) ? "true" : "false"); } else if (var->type == dtInt[INT_SIZE_64]) { if (mDepth == 0 || mFrameData != NULL) printf("%8ld", fetchInteger(var)); } else if (var->type == dtReal[FLOAT_SIZE_64]) { if (mDepth == 0 || mFrameData != NULL) printf(" %8.2f", fetchReal(var)); } else if (var->type == gIpeTypeModule) { if (mDepth == 0 || mFrameData != NULL) { IpeModule* value = (IpeModule*) fetchPtr(var); printf("#<IpeModule %-20s 0x%012lX>", value->name(), (long) value); } } else if (var->type == gIpeTypeProcedure) { if (mDepth == 0 || mFrameData != NULL) { IpeProcedure* value = (IpeProcedure*) fetchPtr(var); if (value->methodCount() == 1) printf("#<IpeProcedure %-20s with %3d method 0x%012lX>", value->name(), value->methodCount(), (long) value); else printf("#<IpeProcedure %-20s with %3d methods 0x%012lX>", value->name(), value->methodCount(), (long) value); } } else printf("Really?? Really??"); printf("\n"); }