WIP: add a Val struct as an input/output when calling a function

This commit is contained in:
2025-01-15 18:29:46 +01:00
parent 19d33139fc
commit 8819adbb3f
3 changed files with 43 additions and 11 deletions

View File

@@ -372,6 +372,7 @@ private:
void CallMethod(morm::Model * model, Val::ModelMethod1 method, Env & env);
void CallMethod(morm::Model * model, Val::ModelMethod2 method, Val & res);
bool CallMethod(morm::Model * model, Val::ModelMethod3 method);
bool CallMethod(morm::Model * model, Val::ModelMethod4 method);
bool CallBlock(FindHelper & find_helper);
bool CallPodType(FindHelper & find_helper);
@@ -1326,6 +1327,12 @@ bool Generator::CallMethod(morm::Model * model, Val::ModelMethod3 method)
}
bool Generator::CallMethod(morm::Model * model, Val::ModelMethod4 method)
{
return (model->*method)();
}
void Generator::CallObject(BaseObj & base_obj, int method_index, Env & info)
{
PrepareEnvStruct(info);
@@ -2037,7 +2044,7 @@ bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias
{
if( EvaluateFunctionOrMethod(find_helper.out_stream, *find_helper.currentval, res) )
{
find_helper.currentval = &res;
child_val = find_helper.currentval->add_child(field, res);
}
else
{
@@ -2292,19 +2299,25 @@ bool Generator::CallValue(FindHelper & find_helper)
if( find_helper.currentval->type == Val::TYPE_MODEL )
{
//return CallWrapper(find_helper);
return CallModel(find_helper);
//return CallModel(find_helper);
}
else
if( find_helper.currentval->type == Val::TYPE_MODEL_CONTAINER_WRAPPER )
return CallModelContainerWrapper(find_helper);
{
//return CallModelContainerWrapper(find_helper);
}
else
if( find_helper.currentval->type == Val::TYPE_DATE )
{
//return CallWrapper(find_helper);
return CallDate(find_helper);
}
else
if( find_helper.currentval->type == Val::TYPE_SPACE )
{
return CallSpace(find_helper);
//return CallWrapper(find_helper);
}
else
#endif
// if( find_helper.base_obj ) // OBJECTS WILL BE REMOVED
@@ -2312,12 +2325,14 @@ bool Generator::CallValue(FindHelper & find_helper)
//else
if( find_helper.currentval->type == Val::TYPE_FUNCTION )
{
CallFunction(find_helper);
//CallFunction(find_helper);
return true;
}
else
if( find_helper.currentval->type == Val::TYPE_ITEM_BLOCK )
{
return CallBlock(find_helper);
}
// else
// if( find_helper.variable )
// return CallVariable(item_fun, *find_helper.variable, parameters, result, out_stream, in_stream);
@@ -2326,13 +2341,8 @@ bool Generator::CallValue(FindHelper & find_helper)
// if( find_helper.currentval->has_pod_type() )
// return CallPodType(find_helper);
if( find_helper.currentval->type == Val::TYPE_SPACE_LOCAL || find_helper.currentval->type == Val::TYPE_INT )
{
find_helper.result = *find_helper.currentval; // IMPROVEME this makes a copy
return true;
}
return false;
find_helper.result = *find_helper.currentval; // IMPROVEME this makes a copy
return true;
}

View File

@@ -90,6 +90,14 @@ void Val::copy(const Val & val)
space_local = val.space_local;
}
if( type == Type::TYPE_MODEL_METHOD )
{
model_method1 = val.model_method1;
model_method2 = val.model_method2;
model_method3 = val.model_method3;
model_method4 = val.model_method4;
}
// user_function = val.user_function;
// model = val.model;
// model_container_wrapper = val.model_container_wrapper;
@@ -154,6 +162,8 @@ void Val::initialize_empty()
pointer = nullptr;
model_method1 = nullptr;
model_method2 = nullptr;
model_method3 = nullptr;
model_method4 = nullptr;
space_wrapper = nullptr;
space_table_index = 0;
}
@@ -500,6 +510,15 @@ void Val::set_pointer_to(morm::Model * model, ModelMethod3 model_method3)
this->pointer = model;
this->model_method3 = model_method3;
}
void Val::set_pointer_to(morm::Model * model, ModelMethod4 model_method4)
{
clear();
type = TYPE_MODEL_METHOD;
this->pointer = model;
this->model_method4 = model_method4;
}
#endif

View File

@@ -70,6 +70,7 @@ public:
using ModelMethod1 = void (morm::Model::*)(Env &);
using ModelMethod2 = void (morm::Model::*)(Val &);
using ModelMethod3 = bool (morm::Model::*)();
using ModelMethod4 = bool (morm::Model::*)() const;
#endif
@@ -159,6 +160,7 @@ public:
void set_pointer_to(morm::Model * model, ModelMethod1 model_method1);
void set_pointer_to(morm::Model * model, ModelMethod2 model_method2);
void set_pointer_to(morm::Model * model, ModelMethod3 model_method3);
void set_pointer_to(morm::Model * model, ModelMethod4 model_method4);
#endif
void set_pointer_to(pt::Date * date);
void set_pointer_to(morm::Model * model);
@@ -247,6 +249,7 @@ public:
ModelMethod1 model_method1;
ModelMethod2 model_method2;
ModelMethod3 model_method3;
ModelMethod4 model_method4;
#endif