Better handling of userdata exceptions in other languages.
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
This commit is contained in:
parent
e7e5e64bbb
commit
f8cbe502c9
|
@ -369,7 +369,10 @@ namespace Porygon::Evaluation {
|
||||||
arr[i] = parameters[i].Get();
|
arr[i] = parameters[i].Get();
|
||||||
}
|
}
|
||||||
delete function;
|
delete function;
|
||||||
return scriptOption -> Call(this -> _scriptOptions, arr, parameters.size());
|
auto ret = scriptOption -> Call(this -> _scriptOptions, arr, parameters.size());
|
||||||
|
auto v = ret->Evaluate();
|
||||||
|
delete ret;
|
||||||
|
return v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,9 @@ namespace Porygon::StandardLibraries{
|
||||||
class BasicLibrary{
|
class BasicLibrary{
|
||||||
//region Assert
|
//region Assert
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _assert(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
typedef UserData::UserDataReturnValue Return;
|
||||||
|
|
||||||
|
static const UserData::UserDataReturnValue* _assert(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto assertion = parameters[0]->EvaluateBool();
|
auto assertion = parameters[0]->EvaluateBool();
|
||||||
if (!assertion){
|
if (!assertion){
|
||||||
if (parameterCount >= 2){
|
if (parameterCount >= 2){
|
||||||
|
@ -29,7 +31,7 @@ namespace Porygon::StandardLibraries{
|
||||||
}
|
}
|
||||||
throw Evaluation::EvaluationException("assertion failed!");
|
throw Evaluation::EvaluationException("assertion failed!");
|
||||||
}
|
}
|
||||||
return new Evaluation::BooleanEvalValue(true);
|
return new Return(new Evaluation::BooleanEvalValue(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
static shared_ptr<GenericFunctionScriptType> GetAssertFuncType(){
|
static shared_ptr<GenericFunctionScriptType> GetAssertFuncType(){
|
||||||
|
@ -40,7 +42,7 @@ namespace Porygon::StandardLibraries{
|
||||||
//endregion
|
//endregion
|
||||||
//region Error
|
//region Error
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _error(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const UserData::UserDataReturnValue* _error(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto message = parameters[0]->EvaluateString();
|
auto message = parameters[0]->EvaluateString();
|
||||||
auto conv = Utilities::StringUtils::FromUTF8(message);
|
auto conv = Utilities::StringUtils::FromUTF8(message);
|
||||||
throw Evaluation::EvaluationException(conv);
|
throw Evaluation::EvaluationException(conv);
|
||||||
|
@ -51,10 +53,10 @@ namespace Porygon::StandardLibraries{
|
||||||
//endregion
|
//endregion
|
||||||
//region Print
|
//region Print
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _print(void*, const ScriptOptions* options, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const UserData::UserDataReturnValue* _print(void*, const ScriptOptions* options, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto message = parameters[0]->EvaluateString();
|
auto message = parameters[0]->EvaluateString();
|
||||||
options->Print(message.c_str());
|
options->Print(message.c_str());
|
||||||
return new Evaluation::NilEvalValue();
|
return new Return(new Evaluation::NilEvalValue());
|
||||||
}
|
}
|
||||||
static shared_ptr<GenericFunctionScriptType> GetPrintFuncType(){
|
static shared_ptr<GenericFunctionScriptType> GetPrintFuncType(){
|
||||||
return GetFuncType(ScriptType::NilType, {{StringScriptType::Dynamic}});
|
return GetFuncType(ScriptType::NilType, {{StringScriptType::Dynamic}});
|
||||||
|
@ -62,10 +64,10 @@ namespace Porygon::StandardLibraries{
|
||||||
//endregion
|
//endregion
|
||||||
//region ToInt
|
//region ToInt
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _toInt(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const UserData::UserDataReturnValue* _toInt(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto parameter = parameters[0]->EvaluateString();
|
auto parameter = parameters[0]->EvaluateString();
|
||||||
auto parsed = Utilities::StringUtils::ParseInteger(parameter);
|
auto parsed = Utilities::StringUtils::ParseInteger(parameter);
|
||||||
return new Evaluation::NumericEvalValue(parsed);
|
return new Return(new Evaluation::NumericEvalValue(parsed));
|
||||||
}
|
}
|
||||||
static shared_ptr<GenericFunctionScriptType> GetToIntFuncType(){
|
static shared_ptr<GenericFunctionScriptType> GetToIntFuncType(){
|
||||||
return GetFuncType(NumericScriptType::AwareInt,
|
return GetFuncType(NumericScriptType::AwareInt,
|
||||||
|
@ -74,10 +76,10 @@ namespace Porygon::StandardLibraries{
|
||||||
//endregion
|
//endregion
|
||||||
//region ToFloat
|
//region ToFloat
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _toFloat(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const UserData::UserDataReturnValue* _toFloat(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto parameter = parameters[0]->EvaluateString();
|
auto parameter = parameters[0]->EvaluateString();
|
||||||
auto parsed = Utilities::StringUtils::ParseFloat(parameter);
|
auto parsed = Utilities::StringUtils::ParseFloat(parameter);
|
||||||
return new Evaluation::NumericEvalValue(parsed);
|
return new Return(new Evaluation::NumericEvalValue(parsed));
|
||||||
}
|
}
|
||||||
static shared_ptr<GenericFunctionScriptType> GetToFloatFuncType(){
|
static shared_ptr<GenericFunctionScriptType> GetToFloatFuncType(){
|
||||||
return GetFuncType(NumericScriptType::AwareFloat,
|
return GetFuncType(NumericScriptType::AwareFloat,
|
||||||
|
@ -86,9 +88,9 @@ namespace Porygon::StandardLibraries{
|
||||||
//endregion
|
//endregion
|
||||||
//region ToString
|
//region ToString
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _toString(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const UserData::UserDataReturnValue* _toString(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto parameter = parameters[0]->EvaluateString();
|
auto parameter = parameters[0]->EvaluateString();
|
||||||
return new Evaluation::StringEvalValue(parameter);
|
return new Return(new Evaluation::StringEvalValue(parameter));
|
||||||
}
|
}
|
||||||
static shared_ptr<GenericFunctionScriptType> GetToStringFuncType(){
|
static shared_ptr<GenericFunctionScriptType> GetToStringFuncType(){
|
||||||
return GetFuncType(StringScriptType::Dynamic, {{make_shared<ScriptType>(TypeClass::Any)}});
|
return GetFuncType(StringScriptType::Dynamic, {{make_shared<ScriptType>(TypeClass::Any)}});
|
||||||
|
@ -96,20 +98,20 @@ namespace Porygon::StandardLibraries{
|
||||||
//endregion
|
//endregion
|
||||||
//region Type
|
//region Type
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _type(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const UserData::UserDataReturnValue* _type(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto parameter = parameters[0]->GetTypeClass();
|
auto parameter = parameters[0]->GetTypeClass();
|
||||||
switch (parameter){
|
switch (parameter){
|
||||||
|
|
||||||
case TypeClass::Error: return new Evaluation::StringEvalValue(u"error");
|
case TypeClass::Error: return new Return(new Evaluation::StringEvalValue(u"error"));
|
||||||
case TypeClass::Nil: return new Evaluation::StringEvalValue(u"nil");
|
case TypeClass::Nil: return new Return(new Evaluation::StringEvalValue(u"nil"));
|
||||||
case TypeClass::Number: return new Evaluation::StringEvalValue(u"number");
|
case TypeClass::Number: return new Return(new Evaluation::StringEvalValue(u"number"));
|
||||||
case TypeClass::Bool: return new Evaluation::StringEvalValue(u"bool");
|
case TypeClass::Bool: return new Return(new Evaluation::StringEvalValue(u"bool"));
|
||||||
case TypeClass::String: return new Evaluation::StringEvalValue(u"string");
|
case TypeClass::String: return new Return(new Evaluation::StringEvalValue(u"string"));
|
||||||
case TypeClass::Function: return new Evaluation::StringEvalValue(u"function");
|
case TypeClass::Function: return new Return(new Evaluation::StringEvalValue(u"function"));
|
||||||
case TypeClass::UserData: return new Evaluation::StringEvalValue(u"userdata");
|
case TypeClass::UserData: return new Return(new Evaluation::StringEvalValue(u"userdata"));
|
||||||
case TypeClass::UserDataCollection: return new Evaluation::StringEvalValue(u"userdata-collection");
|
case TypeClass::UserDataCollection: return new Return(new Evaluation::StringEvalValue(u"userdata-collection"));
|
||||||
case TypeClass::Table: return new Evaluation::StringEvalValue(u"table");
|
case TypeClass::Table: return new Return(new Evaluation::StringEvalValue(u"table"));
|
||||||
case TypeClass::Any: return new Evaluation::StringEvalValue(u"all");
|
case TypeClass::Any: return new Return(new Evaluation::StringEvalValue(u"all"));
|
||||||
}
|
}
|
||||||
throw exception();
|
throw exception();
|
||||||
}
|
}
|
||||||
|
@ -119,9 +121,9 @@ namespace Porygon::StandardLibraries{
|
||||||
//endregion
|
//endregion
|
||||||
//region IsFloat
|
//region IsFloat
|
||||||
|
|
||||||
static const Evaluation::EvalValue* _isFloat(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const UserData::UserDataReturnValue* _isFloat(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto parameter = dynamic_cast<const Evaluation::NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const Evaluation::NumericEvalValue*>(parameters[0]);
|
||||||
return new Evaluation::BooleanEvalValue(parameter->IsFloat());
|
return new Return(new Evaluation::BooleanEvalValue(parameter->IsFloat()));
|
||||||
}
|
}
|
||||||
static shared_ptr<GenericFunctionScriptType> GetIsFloatFuncType(){
|
static shared_ptr<GenericFunctionScriptType> GetIsFloatFuncType(){
|
||||||
return GetFuncType(ScriptType::BoolType, {{NumericScriptType::Unaware}});
|
return GetFuncType(ScriptType::BoolType, {{NumericScriptType::Unaware}});
|
||||||
|
@ -140,10 +142,10 @@ namespace Porygon::StandardLibraries{
|
||||||
return funcType;
|
return funcType;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Evaluation::EvalValue* GetFuncEvalValue(
|
static Evaluation::EvalValue* GetFuncEvalValue(const UserData::UserDataReturnValue* (*func)(void* obj, const ScriptOptions*,
|
||||||
const Evaluation::EvalValue* (*func)(void* obj, const ScriptOptions*,
|
const Evaluation::EvalValue* parameters[], int parameterCount),
|
||||||
const Evaluation::EvalValue* parameters[], int parameterCount),
|
const shared_ptr<GenericFunctionScriptType>& type, size_t optionLength)
|
||||||
const shared_ptr<GenericFunctionScriptType>& type, size_t optionLength){
|
{
|
||||||
auto f = new Evaluation::GenericFunctionEvalValue(type, Utilities::Random::Get());
|
auto f = new Evaluation::GenericFunctionEvalValue(type, Utilities::Random::Get());
|
||||||
for (size_t i = 0; i < optionLength; i++){
|
for (size_t i = 0; i < optionLength; i++){
|
||||||
auto funcOption = new UserData::UserDataFunction(func, nullptr);
|
auto funcOption = new UserData::UserDataFunction(func, nullptr);
|
||||||
|
|
|
@ -24,6 +24,7 @@ namespace Porygon::StandardLibraries {
|
||||||
using namespace Porygon::Evaluation;
|
using namespace Porygon::Evaluation;
|
||||||
using namespace Porygon::Utilities;
|
using namespace Porygon::Utilities;
|
||||||
class MathLibrary {
|
class MathLibrary {
|
||||||
|
typedef UserData::UserDataReturnValue Return;
|
||||||
|
|
||||||
//region templates
|
//region templates
|
||||||
|
|
||||||
|
@ -31,7 +32,7 @@ namespace Porygon::StandardLibraries {
|
||||||
#define INTEGER_TYPE NumericScriptType::AwareInt
|
#define INTEGER_TYPE NumericScriptType::AwareInt
|
||||||
#define BOOL_TYPE ScriptType::BoolType
|
#define BOOL_TYPE ScriptType::BoolType
|
||||||
#define FUNCTION(fieldName) \
|
#define FUNCTION(fieldName) \
|
||||||
[](void* obj) -> const Porygon::Evaluation::EvalValue* { \
|
[](void* obj) -> const EvalValue* { \
|
||||||
auto t = new Porygon::Evaluation::GenericFunctionEvalValue(make_shared<GenericFunctionScriptType>(), \
|
auto t = new Porygon::Evaluation::GenericFunctionEvalValue(make_shared<GenericFunctionScriptType>(), \
|
||||||
Porygon::Utilities::Random::Get()); \
|
Porygon::Utilities::Random::Get()); \
|
||||||
t->RegisterOption(new Porygon::UserData::UserDataFunction(fieldName, nullptr)); \
|
t->RegisterOption(new Porygon::UserData::UserDataFunction(fieldName, nullptr)); \
|
||||||
|
@ -39,83 +40,91 @@ namespace Porygon::StandardLibraries {
|
||||||
nullptr
|
nullptr
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
static const EvalValue* _abs(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
inline static const Return* RETURN(double d){
|
||||||
|
return new Return(new NumericEvalValue(d));
|
||||||
|
}
|
||||||
|
inline static const Return* RETURN(int64_t i){
|
||||||
|
return new Return(new NumericEvalValue(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const Return* _abs(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
if (parameter->IsFloat()){
|
if (parameter->IsFloat()){
|
||||||
return new NumericEvalValue(std::abs(parameter->EvaluateFloat()));
|
return RETURN(std::abs(parameter->EvaluateFloat()));
|
||||||
} else{
|
} else{
|
||||||
return new NumericEvalValue(std::abs(parameter->EvaluateInteger()));
|
return RETURN(std::abs(parameter->EvaluateInteger()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _acos(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _acos(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
return new NumericEvalValue(std::acos(parameter->EvaluateFloat()));
|
return RETURN(std::acos(parameter->EvaluateFloat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _asin(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _asin(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
return new NumericEvalValue(std::asin(parameter->EvaluateFloat()));
|
return RETURN(std::asin(parameter->EvaluateFloat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _atan(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _atan(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
if (parameterCount == 1){
|
if (parameterCount == 1){
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
return new NumericEvalValue(std::atan(parameter->EvaluateFloat()));
|
return RETURN(std::atan(parameter->EvaluateFloat()));
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
auto parameter1 = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter1 = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
auto parameter2 = dynamic_cast<const NumericEvalValue*>(parameters[1]);
|
auto parameter2 = dynamic_cast<const NumericEvalValue*>(parameters[1]);
|
||||||
return new NumericEvalValue(std::atan2(parameter1->EvaluateFloat(), parameter2->EvaluateFloat()));
|
return RETURN(std::atan2(parameter1->EvaluateFloat(), parameter2->EvaluateFloat()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static const EvalValue* _ceil(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _ceil(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
auto f = parameter->EvaluateFloat();
|
auto f = parameter->EvaluateFloat();
|
||||||
return new NumericEvalValue(static_cast<int64_t>(std::ceil(f)));
|
return RETURN(static_cast<int64_t>(std::ceil(f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _cos(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _cos(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
auto f = parameter->EvaluateFloat();
|
auto f = parameter->EvaluateFloat();
|
||||||
return new NumericEvalValue(std::cos(f));
|
return RETURN(std::cos(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _deg(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _deg(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
auto f = parameter->EvaluateFloat();
|
auto f = parameter->EvaluateFloat();
|
||||||
return new NumericEvalValue(f * 180 / M_PI);
|
return RETURN(f * 180 / M_PI);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _exp(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _exp(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
auto f = parameter->EvaluateFloat();
|
auto f = parameter->EvaluateFloat();
|
||||||
return new NumericEvalValue(std::exp(f));
|
return RETURN(std::exp(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _floor(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _floor(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
auto f = parameter->EvaluateFloat();
|
auto f = parameter->EvaluateFloat();
|
||||||
return new NumericEvalValue(std::floor(f));
|
return RETURN(std::floor(f));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _fmod(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _fmod(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto f1 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
auto f1 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
||||||
auto f2 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
auto f2 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
||||||
return new NumericEvalValue(std::fmod(f1, f2));
|
return RETURN(std::fmod(f1, f2));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _huge;
|
static const EvalValue* _huge;
|
||||||
|
|
||||||
static const EvalValue* _log(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
static const Return* _log(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount){
|
||||||
if (parameterCount == 1){
|
if (parameterCount == 1){
|
||||||
auto f = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
auto f = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
||||||
return new NumericEvalValue(std::log(f));
|
return RETURN(std::log(f));
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
auto f1 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
auto f1 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateFloat();
|
||||||
auto f2 = dynamic_cast<const NumericEvalValue*>(parameters[1])->EvaluateFloat();
|
auto f2 = dynamic_cast<const NumericEvalValue*>(parameters[1])->EvaluateFloat();
|
||||||
return new NumericEvalValue(std::log(f2) / std::log(f1));
|
return RETURN(std::log(f2) / std::log(f1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,31 +132,31 @@ namespace Porygon::StandardLibraries {
|
||||||
static const EvalValue* _minInteger;
|
static const EvalValue* _minInteger;
|
||||||
static const EvalValue* _pi;
|
static const EvalValue* _pi;
|
||||||
|
|
||||||
static const EvalValue* _rad(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _rad(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
auto f = parameter->EvaluateFloat();
|
auto f = parameter->EvaluateFloat();
|
||||||
return new NumericEvalValue(M_PI *(f / 180));
|
return RETURN(M_PI *(f / 180));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _sin(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _sin(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
return new NumericEvalValue(std::sin(parameter->EvaluateFloat()));
|
return RETURN(std::sin(parameter->EvaluateFloat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _sqrt(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _sqrt(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
return new NumericEvalValue(std::sqrt(parameter->EvaluateFloat()));
|
return RETURN(std::sqrt(parameter->EvaluateFloat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _tan(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _tan(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
auto parameter = dynamic_cast<const NumericEvalValue*>(parameters[0]);
|
||||||
return new NumericEvalValue(std::tan(parameter->EvaluateFloat()));
|
return RETURN(std::tan(parameter->EvaluateFloat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const EvalValue* _ult(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
static const Return* _ult(void*, const ScriptOptions*, const Evaluation::EvalValue* parameters[], int parameterCount) {
|
||||||
auto parameter1 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateInteger();
|
auto parameter1 = dynamic_cast<const NumericEvalValue*>(parameters[0])->EvaluateInteger();
|
||||||
auto parameter2 = dynamic_cast<const NumericEvalValue*>(parameters[1])->EvaluateInteger();
|
auto parameter2 = dynamic_cast<const NumericEvalValue*>(parameters[1])->EvaluateInteger();
|
||||||
return new BooleanEvalValue(parameter1 < parameter2);
|
return new Return(new BooleanEvalValue(parameter1 < parameter2));
|
||||||
}
|
}
|
||||||
|
|
||||||
static UserData::UserDataFunctionOption* CreateFunctionOption(const shared_ptr<const ScriptType>& returnType,
|
static UserData::UserDataFunctionOption* CreateFunctionOption(const shared_ptr<const ScriptType>& returnType,
|
||||||
|
|
|
@ -6,7 +6,7 @@ using namespace Porygon::Evaluation;
|
||||||
|
|
||||||
namespace Porygon::UserData{
|
namespace Porygon::UserData{
|
||||||
extern "C" {
|
extern "C" {
|
||||||
const EvalValue * CreateFunctionEvalValue(const Evaluation::EvalValue* (*func)(void*, const ScriptOptions*,
|
const EvalValue * CreateFunctionEvalValue(const UserData::UserDataReturnValue* (*func)(void*, const ScriptOptions*,
|
||||||
const EvalValue* [], int ), void* obj) {
|
const EvalValue* [], int ), void* obj) {
|
||||||
auto opt = new UserDataFunction(func, obj);
|
auto opt = new UserDataFunction(func, obj);
|
||||||
auto t = new GenericFunctionEvalValue(make_shared<GenericFunctionScriptType>(), Utilities::Random::Get());
|
auto t = new GenericFunctionEvalValue(make_shared<GenericFunctionScriptType>(), Utilities::Random::Get());
|
||||||
|
@ -15,7 +15,7 @@ namespace Porygon::UserData{
|
||||||
}
|
}
|
||||||
|
|
||||||
void RegisterFunctionEvalValueOption(const GenericFunctionEvalValue* val,
|
void RegisterFunctionEvalValueOption(const GenericFunctionEvalValue* val,
|
||||||
const Evaluation::EvalValue* (*func)(void*, const ScriptOptions*, const EvalValue* [], int ), void* obj){
|
const UserData::UserDataReturnValue* (*func)(void*, const ScriptOptions*, const EvalValue* [], int ), void* obj){
|
||||||
auto opt = new UserDataFunction(func, obj);
|
auto opt = new UserDataFunction(func, obj);
|
||||||
val->RegisterOption(opt);
|
val->RegisterOption(opt);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,21 +5,22 @@
|
||||||
#include "UserDataFunctionType.hpp"
|
#include "UserDataFunctionType.hpp"
|
||||||
#include "../ScriptTypes/FunctionScriptType.hpp"
|
#include "../ScriptTypes/FunctionScriptType.hpp"
|
||||||
#include "../ScriptOptions.hpp"
|
#include "../ScriptOptions.hpp"
|
||||||
|
#include "UserDataReturnValue.hpp"
|
||||||
|
|
||||||
namespace Porygon::UserData{
|
namespace Porygon::UserData{
|
||||||
class UserDataFunction : public Evaluation::GenericFunctionOption {
|
class UserDataFunction : public Evaluation::GenericFunctionOption {
|
||||||
const Evaluation::EvalValue* (*_call)(void* obj, const ScriptOptions*, const Evaluation::EvalValue* parameters[],
|
const UserDataReturnValue* (*_call)(void* obj, const ScriptOptions*, const Evaluation::EvalValue* parameters[],
|
||||||
int parameterCount);
|
int parameterCount);
|
||||||
void *_obj;
|
void *_obj;
|
||||||
|
|
||||||
UserDataFunction(const Evaluation::EvalValue* (*call)(void* obj, const ScriptOptions*,
|
UserDataFunction(const UserDataReturnValue* (*call)(void* obj, const ScriptOptions*,
|
||||||
const Evaluation::EvalValue* parameters[], int parameterCount), void* obj,
|
const Evaluation::EvalValue* parameters[], int parameterCount), void* obj,
|
||||||
const shared_ptr<GenericFunctionScriptType>& type, size_t hash) : GenericFunctionOption(){
|
const shared_ptr<GenericFunctionScriptType>& type, size_t hash) : GenericFunctionOption(){
|
||||||
_call = call;
|
_call = call;
|
||||||
_obj = obj;
|
_obj = obj;
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
UserDataFunction(const Evaluation::EvalValue* (*call)(void* obj, const ScriptOptions*,
|
UserDataFunction(const UserDataReturnValue* (*call)(void* obj, const ScriptOptions*,
|
||||||
const Evaluation::EvalValue* parameters[], int parameterCount), void* obj) :
|
const Evaluation::EvalValue* parameters[], int parameterCount), void* obj) :
|
||||||
GenericFunctionOption(){
|
GenericFunctionOption(){
|
||||||
_call = call;
|
_call = call;
|
||||||
|
@ -29,7 +30,7 @@ namespace Porygon::UserData{
|
||||||
~UserDataFunction() final = default;
|
~UserDataFunction() final = default;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
inline const Evaluation::EvalValue* Call(const ScriptOptions* script,
|
inline const UserDataReturnValue* Call(const ScriptOptions* script,
|
||||||
const Evaluation::EvalValue* parameters[], int parameterCount) const{
|
const Evaluation::EvalValue* parameters[], int parameterCount) const{
|
||||||
return _call(_obj, script, parameters, parameterCount);
|
return _call(_obj, script, parameters, parameterCount);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#include "UserDataReturnValue.hpp"
|
||||||
|
|
||||||
|
extern "C"{
|
||||||
|
Porygon::UserData::UserDataReturnValue* ReturnValue(Porygon::Evaluation::EvalValue* value){
|
||||||
|
return new Porygon::UserData::UserDataReturnValue(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
Porygon::UserData::UserDataReturnValue* ErrorValue(const char* message){
|
||||||
|
return new Porygon::UserData::UserDataReturnValue(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef PORYGONLANG_USERDATARETURNVALUE_HPP
|
||||||
|
#define PORYGONLANG_USERDATARETURNVALUE_HPP
|
||||||
|
|
||||||
|
#include "../Evaluator/EvalValues/EvalValue.hpp"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
namespace Porygon::UserData {
|
||||||
|
struct UserDataReturnValue {
|
||||||
|
bool _success;
|
||||||
|
union {
|
||||||
|
const char *_message;
|
||||||
|
const Evaluation::EvalValue *_value;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
UserDataReturnValue(Evaluation::EvalValue *value) : _success(true), _value(value) {}
|
||||||
|
UserDataReturnValue(const Evaluation::EvalValue *value) : _success(true), _value(value) {}
|
||||||
|
UserDataReturnValue(const char *message) : _success(false), _message(message) {}
|
||||||
|
|
||||||
|
inline const Evaluation::EvalValue *Evaluate() const{
|
||||||
|
if (_success) {
|
||||||
|
return _value;
|
||||||
|
}
|
||||||
|
throw Evaluation::EvaluationException(_message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //PORYGONLANG_USERDATARETURNVALUE_HPP
|
|
@ -117,7 +117,8 @@ Porygon::Utilities::HashedString* Convert(const char* k){
|
||||||
Porygon::Utilities::Random::Get()); \
|
Porygon::Utilities::Random::Get()); \
|
||||||
t->RegisterOption(new Porygon::UserData::UserDataFunction( \
|
t->RegisterOption(new Porygon::UserData::UserDataFunction( \
|
||||||
[](void* obj, const ScriptOptions* opts, const Porygon::Evaluation::EvalValue* par[], int parameterCount) \
|
[](void* obj, const ScriptOptions* opts, const Porygon::Evaluation::EvalValue* par[], int parameterCount) \
|
||||||
-> const Porygon::Evaluation::EvalValue*{return ((const T_USERDATA*)obj)->invoke__##fieldName(obj, opts, par, parameterCount);}, \
|
-> const Porygon::UserData::UserDataReturnValue*{ \
|
||||||
|
return new Porygon::UserData::UserDataReturnValue (((const T_USERDATA*)obj)->invoke__##fieldName(obj, opts, par, parameterCount));}, \
|
||||||
obj)); \
|
obj)); \
|
||||||
return t;}, \
|
return t;}, \
|
||||||
nullptr) \
|
nullptr) \
|
||||||
|
|
Loading…
Reference in New Issue