void lowerErrorHandling() { if (!fMinimalModules) INT_ASSERT(dtError->inTree()); forv_Vec(FnSymbol, fn, gFnSymbols) { // Determine if compiler-generated fns should be marked 'throws' if (fn->hasFlag(FLAG_ON)) { if (canBlockThrow(fn->body)) fn->throwsErrorInit(); } else { // Otherwise, just check for error-handling errors. checkErrorHandling(fn); } } // Quit if fatal errors were encountered by checkErrorHandling above. USR_STOP(); forv_Vec(FnSymbol, fn, gFnSymbols) { ArgSymbol* outError = NULL; LabelSymbol* epilogue = NULL; if (fn->throwsError()) { SET_LINENO(fn); outError = new ArgSymbol(INTENT_REF, "error_out", dtError); fn->insertFormalAtTail(outError); epilogue = fn->getOrCreateEpilogueLabel(); INT_ASSERT(epilogue); // throws requires an epilogue } ErrorHandlingVisitor visitor = ErrorHandlingVisitor(outError, epilogue); fn->accept(&visitor); }
static void lowerErrorHandling(FnSymbol* fn) { ArgSymbol* outError = NULL; LabelSymbol* epilogue = NULL; if (fn->throwsError()) { SET_LINENO(fn); outError = addOutErrorArg(fn); epilogue = fn->getOrCreateEpilogueLabel(); INT_ASSERT(epilogue); // throws requires an epilogue } ErrorHandlingVisitor visitor = ErrorHandlingVisitor(outError, epilogue); fn->accept(&visitor); }