Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/markos-scratch into lp:zorba.
Requested reviews: Markos Zaharioudakis (markos-za) For more details, see: https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/95339 fixed bug involing eval and the no-copy rule -- https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/95339 Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/compiler/rewriter/rules/nodeid_rules.cpp' --- src/compiler/rewriter/rules/nodeid_rules.cpp 2012-01-15 09:18:22 +0000 +++ src/compiler/rewriter/rules/nodeid_rules.cpp 2012-03-01 11:31:19 +0000 @@ -862,6 +862,22 @@ case eval_expr_kind: { + eval_expr* e = static_cast<eval_expr*>(node); + + // Conservatively assume that, when executed, the eval query will apply + // a "node-id-sensitive" operation on each of the in-scope variables, so + // these variables must be bound to statndalone trees. + csize numEvalVars = e->var_count(); + + for (csize i = 0; i < numEvalVars; ++i) + { + expr* arg = e->get_arg_expr(i); + + std::vector<expr*> sources; + theSourceFinder->findNodeSources(arg, &udfCaller, sources); + markSources(sources); + } + std::vector<var_expr_t> globalVars; node->get_sctx()->getVariables(globalVars, false, true); === modified file 'src/functions/udf.cpp' --- src/functions/udf.cpp 2012-02-27 14:46:27 +0000 +++ src/functions/udf.cpp 2012-03-01 11:31:19 +0000 @@ -91,7 +91,7 @@ ********************************************************************************/ user_function::~user_function() { - if(theLocalUdfs != NULL) + if (theLocalUdfs != NULL) theLocalUdfs->remove(this); } @@ -101,9 +101,11 @@ uint32_t planStateSize; getPlan(compilerCB, planStateSize); std::vector<user_function*>::iterator udf_it; - for(udf_it=theMutuallyRecursiveUDFs.begin(); udf_it!=theMutuallyRecursiveUDFs.end();udf_it++) + for(udf_it = theMutuallyRecursiveUDFs.begin(); + udf_it != theMutuallyRecursiveUDFs.end(); + ++udf_it) { - if((*udf_it)->thePlan == NULL) + if ((*udf_it)->thePlan == NULL) (*udf_it)->prepare_for_serialize(compilerCB); } } @@ -113,45 +115,19 @@ ********************************************************************************/ void user_function::serialize(::zorba::serialization::Archiver& ar) { - //bool save_plan = true; - if(ar.is_serializing_out()) + if (ar.is_serializing_out()) { try { -#if 0 - // We shouldn't try to optimize the body during the process of serializing - // the query plan, because udfs are serialized in some "random" order, and - // as a result, they will be optimized in this random order, instead of a - // bottom up order. This can have undesired effect, like const-folding - // exprs that contain calls to functions that are non-deterministic, or - // access the dynamic context. - // - // As a result, we don't call getPlan() unless the optimizer is off or - // the udf has been optimized already. If getPlan is not called, only - // the body expr of the udf will be serialized. - // - // Note: The compiler attempts to collect and optimize all udfs that - // may actually be invoked during the execution of a query. However, - // some such udfs may go undetected; for example, udfs that appear - // inside eval statements. Only such undetected udfs are affected by - // this if condition. - if (ar.compiler_cb->theConfig.opt_level == CompilerCB::config::O0 || - theIsOptimized) - { - getPlan(ar.compiler_cb); - } -#else //uint32_t planStateSize; //getPlan(ar.compiler_cb, planStateSize); assert(thePlan != NULL); ZORBA_ASSERT(thePlan != NULL); -#endif } catch(...) { // cannot compile user defined function, maybe it is not even used, // so don't fire an error yet - //save_plan = false; } } else @@ -169,15 +145,10 @@ ar & theIsLeaf; ar & theMutuallyRecursiveUDFs; ar & theIsOptimized; - //ar.set_is_temp_field(true); - //ar & save_plan; - //ar.set_is_temp_field(false); - //if(save_plan) ar & thePlan; ar & thePlanStateSize; ar & theArgVarsRefs; - //+ar & theCache; ar & theCacheResults; ar & theCacheComputed; } @@ -341,24 +312,6 @@ /******************************************************************************* ********************************************************************************/ -BoolAnnotationValue user_function::mustCopyNodes(expr* fo, csize input) const -{ - BoolAnnotationValue callerMustCopy = fo->getMustCopyNodes(); - BoolAnnotationValue argMustCopy = theArgVars[input]->getMustCopyNodes(); - - if (argMustCopy == ANNOTATION_TRUE) - { - // The decision depends on the caller - return callerMustCopy; - } - - return argMustCopy; -} - - -/******************************************************************************* - -********************************************************************************/ const std::vector<user_function::ArgVarRefs>& user_function::getArgVarsRefs() const { return theArgVarsRefs; === modified file 'src/functions/udf.h' --- src/functions/udf.h 2012-02-16 12:48:17 +0000 +++ src/functions/udf.h 2012-03-01 11:31:19 +0000 @@ -138,7 +138,7 @@ SERIALIZABLE_CLASS(user_function) user_function(::zorba::serialization::Archiver& ar); void serialize(::zorba::serialization::Archiver& ar); - void prepare_for_serialize(CompilerCB *compilerCB); + void prepare_for_serialize(CompilerCB* compilerCB); public: user_function( @@ -146,7 +146,7 @@ const signature& sig, expr_t expr_body, short kind, - CompilerCB *compilerCB); + CompilerCB* compilerCB); virtual ~user_function(); @@ -192,8 +192,6 @@ BoolAnnotationValue ignoresDuplicateNodes(expr* fo, csize input) const; - BoolAnnotationValue mustCopyNodes(expr* fo, csize input) const; - PlanIter_t getPlan(CompilerCB* cb, uint32_t& planStateSize); void setPlaneStateSize(uint32_t size) { thePlanStateSize = size; } === added file 'test/rbkt/ExpQueryResults/zorba/eval/eval10.xml.res' --- test/rbkt/ExpQueryResults/zorba/eval/eval10.xml.res 1970-01-01 00:00:00 +0000 +++ test/rbkt/ExpQueryResults/zorba/eval/eval10.xml.res 2012-03-01 11:31:19 +0000 @@ -0,0 +1,1 @@ +<root><a><b><c/></b></a></root><a><b><c/></b></a><b><c/></b> === added file 'test/rbkt/Queries/zorba/eval/eval10.xq' --- test/rbkt/Queries/zorba/eval/eval10.xq 1970-01-01 00:00:00 +0000 +++ test/rbkt/Queries/zorba/eval/eval10.xq 2012-03-01 11:31:19 +0000 @@ -0,0 +1,28 @@ + +import module namespace refl = "http://www.zorba-xquery.com/modules/reflection"; + + +declare function local:dummy($n as node()) +{ +}; + + +declare function local:foo($n as node()) as node()* +{ + local:dummy($n), + $n/ancestor::node() +}; + + +declare variable $doc := +<a> + <b> + <c/> + </b> +</a> +; + + +let $n := <root>{$doc}</root> +return refl:eval("local:foo($n//c)") +
-- Mailing list: https://launchpad.net/~zorba-coders Post to : zorba-coders@lists.launchpad.net Unsubscribe : https://launchpad.net/~zorba-coders More help : https://help.launchpad.net/ListHelp