From 62a094f2c6e233acd65963f52f0ac8ebda0b78b3 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Fri, 31 Jan 2025 17:10:40 +0100 Subject: [PATCH] WIP: add a Val struct as an input/output when calling a function --- src/generator.h | 70 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/src/generator.h b/src/generator.h index 0f0596e..18465b4 100644 --- a/src/generator.h +++ b/src/generator.h @@ -2103,7 +2103,39 @@ bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias std::wstring & field = find_helper.fields[find_helper.field_index]; ValWrapper * child_valwrapper = find_helper.valwrapper->find_child(field); - if( !child_valwrapper ) + if( child_valwrapper ) + { + // evaluate fun or method in a case they have set a non_cache attr + + if( child_valwrapper->has_evaluated_val ) + { + if( child_valwrapper->evaluated_str ) + { + find_helper.out_stream.escape_input(false); + find_helper.out_stream << *child_valwrapper->evaluated_str; + } + } + else + { + // the same as below + if( child_valwrapper->val.has_function() || child_valwrapper->val.has_method() ) + { + if( (find_helper.field_index + 1 < find_helper.fields.size()) || !is_for_alias ) + { + bool use_parameters = (find_helper.field_index + 1 == find_helper.fields.size()); + + if( !EvaluateFunctions(find_helper, use_parameters, *child_valwrapper) ) + { + return false; + } + } + } + } + + find_helper.set_valwrapper(child_valwrapper); + find_helper.currentval->set_output_stream(find_helper.out_stream); + } + else { morm::Model * model = nullptr; @@ -2127,6 +2159,7 @@ bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias ValWrapper valwrapper; valwrapper.val = model->get_ezc_val(nullptr, field.c_str()); // may it would be better to provide a pointer to get_ezc_val() method? + // the same block as above if( valwrapper.val.has_function() || valwrapper.val.has_method() ) { if( (find_helper.field_index + 1 < find_helper.fields.size()) || !is_for_alias ) @@ -2144,26 +2177,23 @@ bool Generator::FindLastModelWrapper(FindHelper & find_helper, bool is_for_alias (!valwrapper.has_evaluated_val && valwrapper.val.has_object()) ) { child_valwrapper = find_helper.valwrapper->add_child(field, valwrapper); + find_helper.set_valwrapper(child_valwrapper); + find_helper.currentval->set_output_stream(find_helper.out_stream); + + if( child_valwrapper->has_evaluated_val && !child_valwrapper->evaluated_val.is_allowed_to_cache() ) + { + child_valwrapper->has_evaluated_val = false; + + /* + * but find_helper.currentval let point to the evaluated_val (it is set by set_valwrapper() method) + */ + } } } - } - else - { - if( child_valwrapper->has_evaluated_val ) - { - if( child_valwrapper->evaluated_str ) - { - find_helper.out_stream.escape_input(false); - find_helper.out_stream << *child_valwrapper->evaluated_str; - } - } - } - if( !child_valwrapper ) - return false; - - find_helper.set_valwrapper(child_valwrapper); - find_helper.currentval->set_output_stream(find_helper.out_stream); + if( !child_valwrapper ) + return false; + } find_helper.field_index += 1; } @@ -2394,13 +2424,13 @@ bool Generator::CallValue(FindHelper & find_helper) return CallDate(find_helper); } else + #endif if( find_helper.currentval->type == Val::TYPE_SPACE ) { - return CallSpace(find_helper); + //return CallSpace(find_helper); //return CallWrapper(find_helper); } else - #endif // if( find_helper.base_obj ) // OBJECTS WILL BE REMOVED // CallObject(*find_helper.base_obj, find_helper.method_index, parameters, result, out_stream, in_stream); //else