Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/markos-scratch into lp:zorba.
Commit message: Cleaned up eval expr Requested reviews: Markos Zaharioudakis (markos-za) For more details, see: https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/127096 Cleaned up eval expr -- https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/127096 Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/compiler/codegen/plan_visitor.cpp' --- src/compiler/codegen/plan_visitor.cpp 2012-09-17 00:36:37 +0000 +++ src/compiler/codegen/plan_visitor.cpp 2012-09-29 07:14:23 +0000 @@ -2074,23 +2074,35 @@ { CODEGEN_TRACE_OUT(""); - csize numVars = v.var_count(); + csize numVars = v.num_vars(); checked_vector<PlanIter_t> args; args.reserve(numVars+1); - std::vector<store::Item_t> varNames(numVars); - std::vector<xqtref_t> varTypes(numVars); std::vector<int> isGlobalVar(numVars); - for (csize i = 0; i < numVars; ++i) + for (csize i = numVars; i > 0; --i) { - varNames[i] = v.get_var(i)->get_name(); - varTypes[i] = v.get_var(i)->get_type(); - isGlobalVar[i] = (v.get_arg_expr(i) == NULL); - - if (!isGlobalVar[i]) + isGlobalVar[i-1] = false; + + expr* arg = v.get_arg_expr(i-1); + + if (arg->get_expr_kind() == var_expr_kind) + { + var_expr* varArg = static_cast<var_expr*>(arg); + + if (varArg->get_kind() == var_expr::prolog_var) + isGlobalVar[i-1] = true; + } + + if (!isGlobalVar[i-1]) + { args.push_back(pop_itstack()); + } + else + { + pop_itstack(); + } } args.push_back(pop_itstack()); @@ -2102,8 +2114,8 @@ push_itstack(new EvalIterator(sctx, qloc, args, - varNames, - varTypes, + v.get_var_names(), + v.get_var_types(), isGlobalVar, v.get_inner_scripting_kind(), localBindings, === modified file 'src/compiler/expression/expr.cpp' --- src/compiler/expression/expr.cpp 2012-09-28 10:54:54 +0000 +++ src/compiler/expression/expr.cpp 2012-09-29 07:14:23 +0000 @@ -1168,7 +1168,7 @@ lTryCatch->add_catch_expr((*lIter)->clone(subst)); } - for (uint32_t i = 0; i < clause_count(); ++i) + for (csize i = 0; i < clause_count(); ++i) { lTryCatch->add_clause(theCatchClauses[i]->clone(subst)); } @@ -1181,7 +1181,6 @@ ********************************************************************************/ eval_expr::eval_expr( - CompilerCB* creating_ccb, CompilerCB* ccb, static_context* sctx, const QueryLoc& loc, @@ -1189,7 +1188,7 @@ expr_script_kind_t scriptingKind, namespace_context* nsCtx) : - namespace_context_base_expr(creating_ccb, sctx, loc, eval_expr_kind, nsCtx), + namespace_context_base_expr(ccb, sctx, loc, eval_expr_kind, nsCtx), theExpr(e), theInnerScriptingKind(scriptingKind), theDoNodeCopy(false) @@ -1225,20 +1224,25 @@ expr* eval_expr::cloneImpl(substitution_t& s) const { - eval_expr* new_eval = theCCB->theEM->create_eval_expr( - NULL, - theSctx, - theLoc, - theExpr->clone(s), - theInnerScriptingKind, - theNSCtx.getp()); + eval_expr* new_eval = theCCB->theEM-> + create_eval_expr(theSctx, + theLoc, + theExpr->clone(s), + theInnerScriptingKind, + theNSCtx.getp()); + new_eval->setNodeCopy(theDoNodeCopy); - for (csize i = 0; i < theVars.size(); ++i) + new_eval->theOuterVarNames = theOuterVarNames; + new_eval->theOuterVarTypes = theOuterVarTypes; + + csize numVars = theOuterVarNames.size(); + + new_eval->theArgs.resize(numVars); + + for (csize i = 0; i < numVars; ++i) { - var_expr* cloneVar = dynamic_cast<var_expr*>(theVars[i]->clone(s)); - assert(cloneVar != NULL); - new_eval->add_var(cloneVar, (theArgs[i] ? theArgs[i]->clone(s) : NULL)); + new_eval->theArgs[i] = theArgs[i]->clone(s); } return new_eval; === modified file 'src/compiler/expression/expr.h' --- src/compiler/expression/expr.h 2012-09-28 10:54:54 +0000 +++ src/compiler/expression/expr.h 2012-09-29 07:14:23 +0000 @@ -1087,16 +1087,21 @@ -------- The expr that computes the query string to be evaluated by eval. - theVars: - -------- - There is one "eval" var (of kind var_expr::eval_var) for each var that is in - scope where the call to the eval function appears at. + theOuterVarNames: + ----------------- + The names of all the in-scope variables at the place where the call to the + eval function appears at. + + theOuterVarTypes: + ----------------- + The types of all the in-scope variables at the place where the call to the + eval function appears at. theArgs: -------- - The domain expr of each eval var. Initially, the domain expr of an eval var - is always another var. However, that other var may be later inlined, so in - general, the domain expr of an eval var may be any expr. + For each in-scope var, the vector contains an expr that returns the value of + the var. The expr is either a reference to the var itself, or the domain expr + of that var, if that var was inlined. theInnerScriptingKind: ---------------------- @@ -1112,17 +1117,20 @@ friend class ExprManager; protected: - expr* theExpr; - - std::vector<var_expr*> theVars; - std::vector<expr*> theArgs; + expr * theExpr; + + std::vector<store::Item_t> theOuterVarNames; + + std::vector<xqtref_t> theOuterVarTypes; + + std::vector<expr*> theArgs; expr_script_kind_t theInnerScriptingKind; + bool theDoNodeCopy; protected: eval_expr( - CompilerCB* creating_ccb, CompilerCB* ccb, static_context* sctx, const QueryLoc& loc, @@ -1135,14 +1143,17 @@ expr* get_arg_expr(csize i) { return theArgs[i]; } - csize var_count() const { return theVars.size(); } - - const var_expr* get_var(csize i) const { return theVars[i]; } - - void add_var(var_expr* var, expr* arg) + csize num_vars() const { return theOuterVarNames.size(); } + + const std::vector<store::Item_t>& get_var_names() const { return theOuterVarNames; } + + const std::vector<xqtref_t>& get_var_types() const { return theOuterVarTypes; } + + void add_var(var_expr* var) { - theVars.push_back(var); - theArgs.push_back(arg); + theOuterVarNames.push_back(var->get_name()); + theOuterVarTypes.push_back(var->get_return_type()); + theArgs.push_back(var); } expr_script_kind_t get_inner_scripting_kind() const; @@ -1188,7 +1199,7 @@ expr* theExpr; checked_vector<var_expr*> theVars; std::vector<expr*> theArgs; - bool theIsVarDeclaration; + bool theIsVarDeclaration; protected: debugger_expr( === modified file 'src/compiler/expression/expr_manager.cpp' --- src/compiler/expression/expr_manager.cpp 2012-09-19 18:18:02 +0000 +++ src/compiler/expression/expr_manager.cpp 2012-09-29 07:14:23 +0000 @@ -529,14 +529,13 @@ eval_expr* ExprManager::create_eval_expr( - CompilerCB* ccb, static_context* sctx, const QueryLoc& loc, expr* e, expr_script_kind_t scriptingKind, namespace_context* nsCtx) { - CREATE_AND_RETURN_EXPR(eval_expr, ccb, sctx, loc, e, scriptingKind, nsCtx); + CREATE_AND_RETURN_EXPR(eval_expr, sctx, loc, e, scriptingKind, nsCtx); } #ifdef ZORBA_WITH_DEBUGGER === modified file 'src/compiler/expression/expr_manager.h' --- src/compiler/expression/expr_manager.h 2012-09-19 18:18:02 +0000 +++ src/compiler/expression/expr_manager.h 2012-09-29 07:14:23 +0000 @@ -255,7 +255,6 @@ function_trace_expr* create_function_trace_expr(expr* aExpr); eval_expr* create_eval_expr( - CompilerCB* ccb, static_context* sctx, const QueryLoc& loc, expr* e, === modified file 'src/compiler/expression/expr_put.cpp' --- src/compiler/expression/expr_put.cpp 2012-09-28 07:26:34 +0000 +++ src/compiler/expression/expr_put.cpp 2012-09-29 07:14:23 +0000 @@ -435,6 +435,7 @@ END_PUT(); } + ostream& promote_expr::put(ostream& os) const { os << indent << "promote_expr " << theTargetType->toString() @@ -443,7 +444,8 @@ END_PUT(); } -ostream& trycatch_expr::put( ostream& os) const + +ostream& trycatch_expr::put(ostream& os) const { BEGIN_PUT( trycatch_expr ); @@ -463,21 +465,29 @@ return os; } + ostream& eval_expr::put(ostream& os) const { BEGIN_PUT( eval_expr ); + for (csize i = 0; i < theArgs.size(); i++) { - os << indent << "using $" << theVars[i]->get_name()->getStringValue() << " := ["; - os << endl << inc_indent; + os << indent << "using $" + << theOuterVarNames[i]->getStringValue() + << " := [" << endl << inc_indent; + if (theArgs[i]) theArgs[i]->put(os); + os << dec_indent << indent << "]" << endl; } - theExpr->put (os); + + theExpr->put(os); + END_PUT(); } + ostream& function_trace_expr::put(ostream& os) const { BEGIN_PUT(function_trace_expr); === modified file 'src/compiler/expression/var_expr.h' --- src/compiler/expression/var_expr.h 2012-09-20 17:43:35 +0000 +++ src/compiler/expression/var_expr.h 2012-09-29 07:14:23 +0000 @@ -124,7 +124,7 @@ { unknown_var = 0, - eval_var, + eval_var, // TODO: remove (it is used only in the debugger_expr) for_var, let_var, === modified file 'src/compiler/rewriter/rules/nodeid_rules.cpp' --- src/compiler/rewriter/rules/nodeid_rules.cpp 2012-09-18 18:38:16 +0000 +++ src/compiler/rewriter/rules/nodeid_rules.cpp 2012-09-29 07:14:23 +0000 @@ -926,7 +926,7 @@ // 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(); + csize numEvalVars = e->num_vars(); for (csize i = 0; i < numEvalVars; ++i) { @@ -939,22 +939,7 @@ theSourceFinder->findNodeSources(arg, &udfCaller, sources); markSources(sources); } -#if 1 - std::vector<VarInfo*> globalVars; - node->get_sctx()->getVariables(globalVars, false, true); - - FOR_EACH(std::vector<VarInfo*>, ite, globalVars) - { - var_expr* globalVar = (*ite)->getVar(); - - if (globalVar == NULL) - continue; - - std::vector<expr*> sources; - theSourceFinder->findNodeSources(globalVar, &udfCaller, sources); - markSources(sources); - } -#endif + break; } @@ -1154,7 +1139,6 @@ case var_expr::pos_var: case var_expr::score_var: case var_expr::count_var: - case var_expr::eval_var: default: { ZORBA_ASSERT(false); @@ -1314,7 +1298,7 @@ { eval_expr* e = static_cast<eval_expr*>(node); - csize numVars = e->var_count(); + csize numVars = e->num_vars(); for (csize i = 0; i < numVars; ++i) { @@ -1325,16 +1309,7 @@ markForSerialization(arg); } -#if 1 - std::vector<VarInfo*> globalVars; - e->get_sctx()->getVariables(globalVars, true, true); - FOR_EACH(std::vector<VarInfo*>, ite, globalVars) - { - var_expr* globalVar = (*ite)->getVar(); - markForSerialization(globalVar); - } -#endif return; } === modified file 'src/compiler/translator/translator.cpp' --- src/compiler/translator/translator.cpp 2012-09-28 10:54:54 +0000 +++ src/compiler/translator/translator.cpp 2012-09-29 07:14:23 +0000 @@ -10787,13 +10787,13 @@ scriptingKind = SEQUENTIAL_FUNC_EXPR; } - eval_expr* evalExpr = - theExprManager->create_eval_expr(theCCB, - theRootSctx, - loc, - foExpr->get_arg(0), - scriptingKind, - theNSCtx); + eval_expr* evalExpr = theExprManager-> + create_eval_expr(theRootSctx, + loc, + foExpr->get_arg(0), + scriptingKind, + theNSCtx); + resultExpr = evalExpr; std::vector<VarInfo*> inscopeVars; @@ -10803,22 +10803,7 @@ for (csize i = 0; i < numVars; ++i) { - var_expr* ve = inscopeVars[i]->getVar(); - - var_expr* evalVar = create_var(loc, - ve->get_name(), - var_expr::eval_var, - ve->get_return_type()); - - // At this point, the domain expr of an eval var is always another var. - // However, that other var may be later inlined, so in general, the domain - // expr of an eval var may be any expr. - expr* valueExpr = NULL; - - if (ve->get_kind() != var_expr::prolog_var) - valueExpr = ve; - - evalExpr->add_var(evalVar, valueExpr); + evalExpr->add_var(inscopeVars[i]->getVar()); } break; @@ -10870,7 +10855,8 @@ } // create a flwor with LETs to hold the parameters - flwor_expr* flworExpr = theExprManager->create_flwor_expr(theRootSctx, loc, false); + flwor_expr* flworExpr = theExprManager-> + create_flwor_expr(theRootSctx, loc, false); // wrap function's QName expr* qnameExpr = wrap_in_type_promotion(arguments[0], @@ -10931,8 +10917,8 @@ GET_BUILTIN_FUNCTION(FN_LOCAL_NAME_FROM_QNAME_1), temp_vars[0]); - localExpr = - theExprManager->create_fo_expr(theRootSctx, loc, GET_BUILTIN_FUNCTION(FN_STRING_1), localExpr); + localExpr = theExprManager-> + create_fo_expr(theRootSctx, loc, GET_BUILTIN_FUNCTION(FN_STRING_1), localExpr); // qnameExpr := concat("Q{", // namespaceExpr, @@ -10946,61 +10932,33 @@ concat_args.push_back(localExpr); concat_args.push_back(theExprManager->create_const_expr(theRootSctx, loc, query_params)); - qnameExpr = theExprManager->create_fo_expr(theRootSctx, - loc, - GET_BUILTIN_FUNCTION(FN_CONCAT_N), - concat_args); + qnameExpr = theExprManager-> + create_fo_expr(theRootSctx, + loc, + GET_BUILTIN_FUNCTION(FN_CONCAT_N), + concat_args); - eval_expr* evalExpr = - theExprManager->create_eval_expr(theCCB, - theRootSctx, - loc, - qnameExpr, - scriptingKind, - theNSCtx); + eval_expr* evalExpr = theExprManager-> + create_eval_expr(theRootSctx, + loc, + qnameExpr, + scriptingKind, + theNSCtx); flworExpr->set_return_expr(evalExpr); resultExpr = flworExpr; -#if 0 - std::vector<VarInfo*> inscopeVars; - theSctx->getVariables(inscopeVars); - - csize numVars = inscopeVars.size(); - - for (csize i = 0; i < numVars; ++i) - { - var_expr* ve = inscopeVars[i]->getVar(); - - if (ve->get_kind() == var_expr::prolog_var) - continue; - - var_expr* evalVar = create_var(loc, - ve->get_name(), - var_expr::eval_var, - ve->get_return_type()); - - expr* valueExpr = ve; - evalExpr->add_var(evalVar, valueExpr); - } -#endif - for (csize i = 0; i < temp_vars.size(); ++i) { - var_expr* evalVar = create_var(loc, - temp_vars[i]->get_name(), - var_expr::eval_var, - temp_vars[i]->get_return_type()); - - expr* valueExpr = temp_vars[i]; - evalExpr->add_var(evalVar, valueExpr); + evalExpr->add_var(temp_vars[i]); } break; } - default: {} - + default: + { + } } // switch f->processPragma(resultExpr, theScopedPragmas);
-- 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