void raiseExcHelper(BoxedClass* cls, const char* msg, ...) { auto entries = getTracebackEntries(); last_tb = std::move(entries); if (msg != NULL) { va_list ap; va_start(ap, msg); // printf("Raising: "); // vprintf(msg, ap); // printf("\n"); // va_start(ap, msg); char buf[1024]; vsnprintf(buf, sizeof(buf), msg, ap); va_end(ap); BoxedString* message = boxStrConstant(buf); Box* exc_obj = exceptionNew2(cls, message); raiseExc(exc_obj); } else { Box* exc_obj = exceptionNew1(cls); raiseExc(exc_obj); } }
void raise3(Box* arg0, Box* arg1, Box* arg2) { RELEASE_ASSERT(arg2 == None, "unsupported"); if (isSubclass(arg0->cls, type_cls)) { BoxedClass* c = static_cast<BoxedClass*>(arg0); if (isSubclass(c, Exception)) { Box* exc_obj; if (arg1 != None) exc_obj = exceptionNew2(c, arg1); else exc_obj = exceptionNew1(c); raiseExc(exc_obj); } else { raiseExcHelper(TypeError, "exceptions must be old-style classes or derived from BaseException, not %s", getTypeName(arg0)->c_str()); } } if (arg1 != None) raiseExcHelper(TypeError, "instance exception may not have a separate value"); // TODO: should only allow throwing of old-style classes or things derived // from BaseException: raiseExc(arg0); }
void raise3(Box* arg0, Box* arg1, Box* arg2) { // TODO switch this to PyErr_Normalize if (isSubclass(arg0->cls, type_cls)) { BoxedClass* c = static_cast<BoxedClass*>(arg0); if (isSubclass(c, BaseException)) { Box* exc_obj; if (arg1 != None) exc_obj = exceptionNew2(c, arg1); else exc_obj = exceptionNew1(c); raiseRaw(ExcInfo(c, exc_obj, arg2)); } } if (isSubclass(arg0->cls, BaseException)) { if (arg1 != None) raiseExcHelper(TypeError, "instance exception may not have a separate value"); raiseRaw(ExcInfo(arg0->cls, arg0, arg2)); } raiseExcHelper(TypeError, "exceptions must be old-style classes or derived from BaseException, not %s", getTypeName(arg0)->c_str()); }