src/RStuff/Exceptions.h (56 lines of code) (raw):
// Rkernel is an execution kernel for R interpreter
// Copyright (C) 2019 JetBrains s.r.o.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#ifndef RWRAPPER_R_STUFF_EXCEPTIONS_H
#define RWRAPPER_R_STUFF_EXCEPTIONS_H
#include "../util/ScopedAssign.h"
#include "MySEXP.h"
#include <exception>
#include <string>
extern "C" {
LibExtern Rboolean R_interrupts_suspended;
}
class RExceptionBase : public std::exception {};
class RError : public RExceptionBase {
PrSEXP e;
std::string message;
public:
RError(SEXP e) : e(e), message((std::string)"Error: " + getErrorMessage(e)) {}
const char* what() const throw() override {
return message.c_str();
}
SEXP getRError() const {
return e;
}
private:
static const char* getErrorMessage(SEXP e) {
ShieldSEXP expr = Rf_lang2(Rf_install("conditionMessage"), e);
ScopedAssign<Rboolean> with(R_interrupts_suspended, (Rboolean)TRUE);
return asStringUTF8(Rf_eval(expr, R_GlobalEnv));
}
};
class RInterruptedException : public RExceptionBase {
public:
const char* what() const throw() override { return "Interrupted"; }
};
class RJumpToToplevelException : public RExceptionBase {
public:
const char* what() const throw() override { return "Jump to toplevel occurred"; }
};
class RInvalidArgument : public RExceptionBase {
std::string message;
public:
RInvalidArgument(const char* msg = "Invalid argument") : message(msg) {}
const char* what() const throw() override { return message.c_str(); }
};
struct RUnwindException {
PrSEXP token;
RUnwindException(SEXP x) : token(x) {
#ifdef RWRAPPER_DEBUG
unprotectCheckDisabled++;
#endif
}
~RUnwindException() {
#ifdef RWRAPPER_DEBUG
unprotectCheckDisabled--;
#endif
}
};
#endif //RWRAPPER_R_STUFF_EXCEPTIONS_H