From 8819adbb3f1676080e7ec608cd586607f056afe0 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Wed, 15 Jan 2025 18:29:46 +0100 Subject: [PATCH] WIP: add a Val struct as an input/output when calling a function --- src/generator.h | 32 +++++++++++++++++++++----------- src/val.cpp | 19 +++++++++++++++++++ src/val.h | 3 +++ 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/generator.h b/src/generator.h index fbb0bad..64b01af 100644 --- a/src/generator.h +++ b/src/generator.h @@ -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; } diff --git a/src/val.cpp b/src/val.cpp index 7a6d733..e18c6b8 100644 --- a/src/val.cpp +++ b/src/val.cpp @@ -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 diff --git a/src/val.h b/src/val.h index 60d84fd..739af2a 100644 --- a/src/val.h +++ b/src/val.h @@ -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