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

View File

@@ -90,6 +90,14 @@ void Val::copy(const Val & val)
space_local = val.space_local; 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; // user_function = val.user_function;
// model = val.model; // model = val.model;
// model_container_wrapper = val.model_container_wrapper; // model_container_wrapper = val.model_container_wrapper;
@@ -154,6 +162,8 @@ void Val::initialize_empty()
pointer = nullptr; pointer = nullptr;
model_method1 = nullptr; model_method1 = nullptr;
model_method2 = nullptr; model_method2 = nullptr;
model_method3 = nullptr;
model_method4 = nullptr;
space_wrapper = nullptr; space_wrapper = nullptr;
space_table_index = 0; space_table_index = 0;
} }
@@ -500,6 +510,15 @@ void Val::set_pointer_to(morm::Model * model, ModelMethod3 model_method3)
this->pointer = model; this->pointer = model;
this->model_method3 = model_method3; 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 #endif

View File

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