WIP: add a Val struct as an input/output when calling a function
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
19
src/val.cpp
19
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
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user