← Back to team overview

zorba-coders team mailing list archive

[Merge] lp:~zorba-coders/zorba/markos-scratch into lp:zorba

 

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/82572

converted variable assignment to a full-blown expression instead of a function + fixed a bug with the cloning of var_decl_expr
-- 
https://code.launchpad.net/~zorba-coders/zorba/markos-scratch/+merge/82572
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/compiler/codegen/plan_visitor.cpp'
--- src/compiler/codegen/plan_visitor.cpp	2011-10-24 02:42:07 +0000
+++ src/compiler/codegen/plan_visitor.cpp	2011-11-17 17:26:00 +0000
@@ -636,6 +636,41 @@
 }
 
 
+/***************************************************************************//**
+
+********************************************************************************/
+bool begin_visit(var_set_expr& v)
+{
+  CODEGEN_TRACE_IN("");
+  return true;
+}
+
+
+void end_visit(var_set_expr& v)
+{
+  CODEGEN_TRACE_OUT("");
+
+  const var_expr* varExpr = v.get_var_expr();
+
+  xqtref_t exprType = v.get_expr()->get_return_type();
+
+  PlanIter_t exprIter = pop_itstack();
+
+  CtxVarAssignIterator* iter = 
+  new CtxVarAssignIterator(sctx,
+                           qloc,
+                           varExpr->get_unique_id(),
+                           varExpr->get_name(),
+                           (varExpr->get_kind() == var_expr::local_var),
+                           exprIter);
+  
+  if (exprType->get_quantifier() == TypeConstants::QUANT_ONE)
+    iter->setSingleItem();
+
+  push_itstack(iter);
+}
+
+
 /*******************************************************************************
   VarRef expr
 ********************************************************************************/

=== modified file 'src/compiler/expression/abstract_expr_visitor.h'
--- src/compiler/expression/abstract_expr_visitor.h	2011-06-14 17:26:33 +0000
+++ src/compiler/expression/abstract_expr_visitor.h	2011-11-17 17:26:00 +0000
@@ -84,6 +84,7 @@
   EXPR_VISITOR_METHODS (block_expr);
   EXPR_VISITOR_METHODS (apply_expr);
   EXPR_VISITOR_METHODS (var_decl_expr);
+  EXPR_VISITOR_METHODS (var_set_expr);
   EXPR_VISITOR_METHODS (exit_expr);
   EXPR_VISITOR_METHODS (exit_catcher_expr);
   EXPR_VISITOR_METHODS (flowctl_expr);

=== modified file 'src/compiler/expression/expr_annotations.cpp'
--- src/compiler/expression/expr_annotations.cpp	2011-06-14 17:26:33 +0000
+++ src/compiler/expression/expr_annotations.cpp	2011-11-17 17:26:00 +0000
@@ -19,64 +19,6 @@
 
 namespace zorba {
 
-#if 0
-void SourceFinder::findSources(expr *e)
-{
-  switch(e->get_expr_kind()) 
-  {
-  case flwor_expr_kind:
-  case gflwor_expr_kind:
-    findSources(static_cast<flwor_expr *>(e)->getReturnExpr());
-    break;
-
-  case fo_expr_kind:
-  {
-    fo_expr *fo = static_cast<fo_expr *>(e);
-    const function *fn = fo->get_func();
-    if (fn->isSource()) {
-      m_sources.insert(fo);
-    } else {
-      findSourcesInChildren(fo);
-    }
-  }
-  break;
-
-  case var_expr_kind:
-  {
-    var_expr *var = static_cast<var_expr *>(e);
-    switch(var->get_kind()) {
-    case var_expr::for_var:
-    case var_expr::let_var:
-      findSources(&*var->get_flwor_clause()->get_expr());
-      break;
-      
-    case var_expr::context_var:
-    case var_expr::param_var:
-      m_sources.insert(var);
-      break;
-      
-    default:
-      break;
-    }
-  }
-  break;
-
-  default:
-    findSourcesInChildren(e);
-    break;
-  }
-}
-
-void SourceFinder::findSourcesInChildren(expr *e)
-{
-  for(expr_iterator i = e->expr_begin(); !i.done(); ++i) {
-    if (*i != NULL) {
-      findSources(*i);
-    }
-  }
-}
-#endif
-
 
 bool ExpressionPropertyComputer::returnsDuplicateNodes(expr *e)
 {

=== modified file 'src/compiler/expression/expr_base.cpp'
--- src/compiler/expression/expr_base.cpp	2011-08-12 10:21:10 +0000
+++ src/compiler/expression/expr_base.cpp	2011-11-17 17:26:00 +0000
@@ -50,7 +50,7 @@
 
 static xqtref_t print_expr_and_type(expr* e, xqtref_t t)
 {
-  if (Properties::instance()->printStaticTypes ())
+  if (Properties::instance()->printStaticTypes())
   {
     std::cout << "Return type for " << e << ":\n";
     e->put(std::cout);
@@ -85,10 +85,10 @@
 bool expr::is_sequential(short theScriptingKind)
 {
   return (theScriptingKind & (VAR_SETTING_EXPR |
-                             APPLYING_EXPR |
-                             EXITING_EXPR |
-                             BREAKING_EXPR | 
-                             SEQUENTIAL_FUNC_EXPR)) != 0;
+                              APPLYING_EXPR |
+                              EXITING_EXPR |
+                              BREAKING_EXPR | 
+                              SEQUENTIAL_FUNC_EXPR)) != 0;
 }
 
 
@@ -751,18 +751,25 @@
   {
     const fo_expr* foExpr = static_cast<const fo_expr *>(this);
     const function* func = foExpr->get_func();
-    ulong numArgs = foExpr->num_args();
+    csize numArgs = foExpr->num_args();
 
-    for (ulong i = 0; i < numArgs; ++i) {
+    for (csize i = 0; i < numArgs; ++i) 
+    {
       const expr* argExpr = foExpr->get_arg(i);
 
-      if (func->isMap(i)) {
-        if (argExpr->is_map_internal(e, found) && found) {
+      if (func->isMap(i)) 
+      {
+        if (argExpr->is_map_internal(e, found) && found) 
+        {
           return true;
-        } else if (found) {
+        }
+        else if (found)
+        {
           return false;
         }
-      } else if (argExpr->contains_expr(e)) {
+      }
+      else if (argExpr->contains_expr(e))
+      {
         return false;
       }
     }
@@ -775,9 +782,9 @@
   {
     const flwor_expr* flworExpr = static_cast<const flwor_expr *>(this);
     bool haveOrderBy = false;
-    ulong numClauses = flworExpr->num_clauses();
+    csize numClauses = flworExpr->num_clauses();
 
-    for (ulong i = 0; i < numClauses; ++i)
+    for (csize i = 0; i < numClauses; ++i)
     {
       const flwor_clause* clause = (*flworExpr)[i];
 
@@ -845,8 +852,8 @@
 
         const orderby_clause* obc = static_cast<const orderby_clause*>(clause);
 
-        ulong numColumns = obc->num_columns();
-        for (ulong k = 0; k < numColumns; ++k)
+        csize numColumns = obc->num_columns();
+        for (csize k = 0; k < numColumns; ++k)
         {
           if (obc->get_column_expr(k)->contains_expr(e))
             return false;
@@ -858,7 +865,7 @@
       default:
         ZORBA_ASSERT(false);
       }
-    }
+    } // for each clause
 
     if (found)
     {
@@ -971,6 +978,7 @@
     return false; // TODO
 
   case var_decl_expr_kind:
+  case var_set_expr_kind:
   {
     return !contains_expr(e);
   }

=== modified file 'src/compiler/expression/expr_base.h'
--- src/compiler/expression/expr_base.h	2011-07-29 06:13:28 +0000
+++ src/compiler/expression/expr_base.h	2011-11-17 17:26:00 +0000
@@ -89,6 +89,7 @@
 
   block_expr_kind,
   var_decl_expr_kind,
+  var_set_expr_kind,
   apply_expr_kind,
   exit_expr_kind,
   exit_catcher_expr_kind,

=== modified file 'src/compiler/expression/expr_classes.h'
--- src/compiler/expression/expr_classes.h	2011-06-14 17:26:33 +0000
+++ src/compiler/expression/expr_classes.h	2011-11-17 17:26:00 +0000
@@ -60,6 +60,7 @@
   class block_expr; 
   class apply_expr;
   class var_decl_expr;
+  class var_set_expr;
   class exit_expr;
   class exit_catcher_expr; 
   class while_expr; 

=== modified file 'src/compiler/expression/expr_iter.cpp'
--- src/compiler/expression/expr_iter.cpp	2011-09-20 14:33:34 +0000
+++ src/compiler/expression/expr_iter.cpp	2011-11-17 17:26:00 +0000
@@ -592,6 +592,15 @@
     break;
   }
 
+  case var_set_expr_kind:
+  {
+    var_set_expr* varSetExpr = static_cast<var_set_expr*>(theExpr);
+    EXPR_ITER_BEGIN();
+    EXPR_ITER_NEXT(varSetExpr->theExpr);
+    EXPR_ITER_END();
+    break;
+  }
+
   case flowctl_expr_kind:
   {
     EXPR_ITER_BEGIN();

=== modified file 'src/compiler/expression/expr_put.cpp'
--- src/compiler/expression/expr_put.cpp	2011-06-14 17:26:33 +0000
+++ src/compiler/expression/expr_put.cpp	2011-11-17 17:26:00 +0000
@@ -424,7 +424,7 @@
   return os;
 }
 
-ostream& eval_expr::put( ostream& os) const
+ostream& eval_expr::put(ostream& os) const
 {
   BEGIN_PUT( eval_expr );
   for (ulong i = 0; i < theArgs.size(); i++)
@@ -438,15 +438,15 @@
   END_PUT();
 }
 
-ostream& function_trace_expr::put( ostream& os) const
+ostream& function_trace_expr::put(ostream& os) const
 {
-  BEGIN_PUT( function_trace_expr );
-  theExpr->put (os);
+  BEGIN_PUT(function_trace_expr);
+  theExpr->put(os);
   END_PUT();
 }
 
 
-ostream& apply_expr::put( ostream& os) const
+ostream& apply_expr::put(ostream& os) const
 {
   BEGIN_PUT(apply_expr);
   theExpr->put(os);
@@ -454,32 +454,46 @@
 }
 
 
-ostream& var_decl_expr::put( ostream& os) const
+ostream& var_decl_expr::put(ostream& os) const
 {
-  BEGIN_PUT( var_decl_expr );
+  BEGIN_PUT(var_decl_expr);
+
   theVarExpr->put(os);
   if (theInitExpr)
     theInitExpr->put(os);
-  END_PUT();
-}
-
-
-ostream& if_expr::put( ostream& os) const
-{
-  BEGIN_PUT( if_expr );
+
+  END_PUT();
+}
+
+
+ostream& var_set_expr::put(ostream& os) const
+{
+  BEGIN_PUT(var_set_expr);
+
+  theVarExpr->put(os);
+  theExpr->put(os);
+
+  END_PUT();
+}
+
+
+ostream& if_expr::put(ostream& os) const
+{
+  BEGIN_PUT(if_expr);
   theCondExpr->put(os);
   PUT_SUB("THEN", theThenExpr);
   PUT_SUB("ELSE", theElseExpr);
   END_PUT();
 }
 
-ostream& fo_expr::put( ostream& os) const
+
+ostream& fo_expr::put(ostream& os) const
 {
   const store::Item* qname = theFunction->getName();
   BEGIN_PUT2( qname->getStringValue() << "/" << num_args() );
-  ulong numArgs = (ulong)theArgs.size();
+  csize numArgs = theArgs.size();
 
-  for (ulong i = 0; i < numArgs; ++i)
+  for (csize i = 0; i < numArgs; ++i)
   {
     theArgs[i]->put(os);
   }

=== modified file 'src/compiler/expression/expr_type.cpp'
--- src/compiler/expression/expr_type.cpp	2011-08-12 10:21:10 +0000
+++ src/compiler/expression/expr_type.cpp	2011-11-17 17:26:00 +0000
@@ -650,19 +650,16 @@
     return;
   }
 
+  case var_set_expr_kind:
+  {
+    theType = rtm.EMPTY_TYPE;
+    return;
+  }
+
   case exit_expr_kind:
   {
-    // TODO: should this be the empty-sequence type ???? Or should we check
-    // for an exit operand when computing the type of any other expr and
-    // just skip the exit ????
-#if 0
-    exit_expr* e = static_cast<exit_expr*>(this);
-    newType = e->theExpr->get_return_type();
-    break;
-#else
     theType = rtm.EMPTY_TYPE;
     return;
-#endif
   }
 
   case exit_catcher_expr_kind:

=== modified file 'src/compiler/expression/expr_visitor.h'
--- src/compiler/expression/expr_visitor.h	2011-06-14 17:26:33 +0000
+++ src/compiler/expression/expr_visitor.h	2011-11-17 17:26:00 +0000
@@ -81,6 +81,7 @@
 
   DECL_EXPR_VISITOR_VISIT_MEM_FNS(block_expr);
   DECL_EXPR_VISITOR_VISIT_MEM_FNS(var_decl_expr);
+  DECL_EXPR_VISITOR_VISIT_MEM_FNS(var_set_expr);
   DECL_EXPR_VISITOR_VISIT_MEM_FNS(apply_expr);
   DECL_EXPR_VISITOR_VISIT_MEM_FNS(exit_expr);
   DECL_EXPR_VISITOR_VISIT_MEM_FNS(exit_catcher_expr);

=== modified file 'src/compiler/expression/fo_expr.cpp'
--- src/compiler/expression/fo_expr.cpp	2011-07-29 06:13:28 +0000
+++ src/compiler/expression/fo_expr.cpp	2011-11-17 17:26:00 +0000
@@ -151,7 +151,7 @@
 void fo_expr::compute_scripting_kind()
 {
   const function* func = get_func();
-  ulong numArgs = num_args();
+  csize numArgs = num_args();
 
   if (func->getKind() == FunctionConsts::OP_CONCATENATE_N)
   {
@@ -159,7 +159,7 @@
 
     theScriptingKind = VACUOUS_EXPR;
 
-    for (ulong i = 0; i < numArgs; ++i)
+    for (csize i = 0; i < numArgs; ++i)
     {
       if (theArgs[i] == NULL)
         continue;
@@ -202,26 +202,13 @@
 
     checkScriptingKind();
   }
-  else if (func->getKind() == FunctionConsts::OP_VAR_ASSIGN_1)
-  {
-    assert(numArgs == 2);
-
-    expr* valueExpr = theArgs[1];
-
-    theScriptingKind = VAR_SETTING_EXPR;
-    theScriptingKind |= valueExpr->get_scripting_detail();
-    theScriptingKind &= ~VACUOUS_EXPR;
-    theScriptingKind &= ~SIMPLE_EXPR;
-
-    checkScriptingKind();
-  }
   else
   {
     theScriptingKind = func->getScriptingKind();
 
     bool vacuous = (theScriptingKind == VACUOUS_EXPR);
 
-    for (ulong i = 0; i < numArgs; ++i)
+    for (csize i = 0; i < numArgs; ++i)
     {
       if (theArgs[i] == NULL)
         continue;
@@ -272,7 +259,7 @@
 
   std::auto_ptr<fo_expr> fo(new fo_expr(theSctx, get_loc(), get_func()));
 
-  for (ulong i = 0; i < theArgs.size(); ++i)
+  for (csize i = 0; i < theArgs.size(); ++i)
     fo->theArgs.push_back(theArgs[i]->clone(subst));
 
   fo->theScriptingKind  = theScriptingKind;

=== modified file 'src/compiler/expression/script_exprs.cpp'
--- src/compiler/expression/script_exprs.cpp	2011-08-26 15:58:33 +0000
+++ src/compiler/expression/script_exprs.cpp	2011-11-17 17:26:00 +0000
@@ -38,6 +38,9 @@
 SERIALIZABLE_CLASS_VERSIONS(var_decl_expr)
 END_SERIALIZABLE_CLASS_VERSIONS(var_decl_expr)
 
+SERIALIZABLE_CLASS_VERSIONS(var_set_expr)
+END_SERIALIZABLE_CLASS_VERSIONS(var_set_expr)
+
 SERIALIZABLE_CLASS_VERSIONS(exit_expr)
 END_SERIALIZABLE_CLASS_VERSIONS(exit_expr)
 
@@ -53,6 +56,7 @@
 DEF_EXPR_ACCEPT(block_expr)
 DEF_EXPR_ACCEPT(apply_expr)
 DEF_EXPR_ACCEPT(var_decl_expr)
+DEF_EXPR_ACCEPT(var_set_expr)
 DEF_EXPR_ACCEPT(exit_expr)
 DEF_EXPR_ACCEPT(exit_catcher_expr)
 DEF_EXPR_ACCEPT(flowctl_expr)
@@ -83,15 +87,10 @@
 }
 
 
-void block_expr::add_at(ulong pos, const expr_t& arg)
+void block_expr::add_at(csize pos, const expr_t& arg)
 {
-#ifndef NDEBUG
-  if (arg->get_expr_kind() == fo_expr_kind)
-  {
-    fo_expr* fo = static_cast<fo_expr*>(arg.getp());
-    assert(fo->get_func()->getKind() != FunctionConsts::OP_VAR_ASSIGN_1);
-  }
-#endif
+  assert(arg->get_expr_kind() != var_set_expr_kind);
+
   theArgs.insert(theArgs.begin() + pos, arg);
   compute_scripting_kind2(NULL, false);
 }
@@ -193,7 +192,7 @@
 expr_t block_expr::clone(substitution_t& subst) const
 {
   checked_vector<expr_t> seq2;
-  for (unsigned i = 0; i < theArgs.size(); ++i)
+  for (csize i = 0; i < theArgs.size(); ++i)
     seq2.push_back(theArgs[i]->clone(subst));
 
   return new block_expr(theSctx, get_loc(), true, seq2, NULL);
@@ -290,11 +289,12 @@
 
 expr_t var_decl_expr::clone(substitution_t& s) const
 {
-  assert(theVarExpr.getp() == theVarExpr->clone(s).getp());
+  var_expr_t varCopy(new var_expr(*theVarExpr));
+  s[theVarExpr.getp()] = varCopy.getp();
 
   return new var_decl_expr(theSctx,
                            get_loc(),
-                           theVarExpr,
+                           varCopy,
                            (theInitExpr ? theInitExpr->clone(s) : NULL));
 }
 
@@ -302,6 +302,63 @@
 /*******************************************************************************
 
 ********************************************************************************/
+var_set_expr::var_set_expr(
+    static_context* sctx,
+    const QueryLoc& loc,
+    const var_expr_t& varExpr,
+    const expr_t& setExpr)
+  :
+  expr(sctx, loc, var_set_expr_kind),
+  theVarExpr(varExpr),
+  theExpr(setExpr)
+{
+  assert(varExpr->get_kind() == var_expr::prolog_var || 
+         varExpr->get_kind() == var_expr::local_var);
+
+  compute_scripting_kind();
+
+  // var_set_expr is unfoldable because it requires access to the dyn ctx.
+  setUnfoldable(ANNOTATION_TRUE_FIXED);
+}
+
+
+void var_set_expr::serialize(::zorba::serialization::Archiver& ar)
+{
+  serialize_baseclass(ar, (expr*)this);
+  ar & theVarExpr;
+  ar & theExpr;
+}
+
+
+void var_set_expr::compute_scripting_kind()
+{
+  checkNonUpdating(theExpr);
+
+  theScriptingKind = VAR_SETTING_EXPR;
+  theScriptingKind |= theExpr->get_scripting_detail();
+  theScriptingKind &= ~VACUOUS_EXPR;
+  theScriptingKind &= ~SIMPLE_EXPR;
+
+  checkScriptingKind();
+}
+
+
+expr_t var_set_expr::clone(substitution_t& s) const
+{
+  expr_t varClone = theVarExpr->clone(s);
+
+  ZORBA_ASSERT(varClone->get_expr_kind() == var_expr_kind);
+
+  return new var_set_expr(theSctx,
+                          get_loc(),
+                          static_cast<var_expr*>(varClone.getp()),
+                          theExpr->clone(s));
+}
+
+
+/*******************************************************************************
+
+********************************************************************************/
 exit_expr::exit_expr(
     static_context* sctx,
     const QueryLoc& loc,

=== modified file 'src/compiler/expression/script_exprs.h'
--- src/compiler/expression/script_exprs.h	2011-08-16 11:25:55 +0000
+++ src/compiler/expression/script_exprs.h	2011-11-17 17:26:00 +0000
@@ -135,13 +135,13 @@
       std::vector<expr_t>& seq,
       std::vector<var_expr*>* assignedVars);
 
-  void add_at(ulong pos, const expr_t& arg);
-
-  ulong size() const { return (ulong)theArgs.size(); }
-
-  const expr_t& operator[](ulong i) const { return theArgs[i]; }
-
-  expr_t& operator[](ulong i) { return theArgs[i]; }
+  void add_at(csize pos, const expr_t& arg);
+
+  csize size() const { return theArgs.size(); }
+
+  const expr_t& operator[](csize i) const { return theArgs[i]; }
+
+  expr_t& operator[](csize i) { return theArgs[i]; }
 
   expr_t clone(substitution_t& s) const;
 
@@ -260,6 +260,52 @@
 
 
 /*******************************************************************************
+
+  AssignStatement ::= "$" VarName ":=" ExprSingle ";"
+
+  The RHS of the assignment must be a non-updating expr.
+
+  var_set_expr is used to assign a value to a prolog or block-local var. During
+  runtime, the function computes theExpr and stores the resulting value inside 
+  the appropriate dynamic ctx (global or local), at the location that is identified
+  by the variable id.
+********************************************************************************/
+class var_set_expr : public expr 
+{
+  friend class ExprIterator;
+  friend class expr;
+
+protected:
+  var_expr_t theVarExpr;
+  expr_t     theExpr;
+
+public:
+  SERIALIZABLE_CLASS(var_set_expr)
+  SERIALIZABLE_CLASS_CONSTRUCTOR2(var_set_expr, expr)
+  void serialize(::zorba::serialization::Archiver& ar);
+
+public:
+  var_set_expr(
+      static_context* sctx,
+      const QueryLoc& loc,
+      const var_expr_t& varExpr,
+      const expr_t& setExpr);
+
+  var_expr* get_var_expr() const { return theVarExpr.getp(); }
+
+  expr* get_expr() const { return theExpr.getp(); }
+
+  void compute_scripting_kind();
+
+  expr_t clone(substitution_t& s) const;
+
+  void accept(expr_visitor&);
+
+  std::ostream& put(std::ostream&) const;
+};
+
+
+/*******************************************************************************
   ExitExpr ::= "exit" "with" ExprSingle
 ********************************************************************************/
 class exit_expr : public expr 

=== modified file 'src/compiler/expression/var_expr.h'
--- src/compiler/expression/var_expr.h	2011-11-01 14:26:48 +0000
+++ src/compiler/expression/var_expr.h	2011-11-17 17:26:00 +0000
@@ -133,10 +133,10 @@
 
 public:
   var_expr(
-        static_context* sctx,
-        const QueryLoc& loc,
-        var_kind k,
-        store::Item* name);
+      static_context* sctx,
+      const QueryLoc& loc,
+      var_kind k,
+      store::Item* name);
 
   ulong get_unique_id() const { return theUniqueId; }
 

=== modified file 'src/compiler/rewriter/rules/nodeid_rules.cpp'
--- src/compiler/rewriter/rules/nodeid_rules.cpp	2011-11-10 14:06:57 +0000
+++ src/compiler/rewriter/rules/nodeid_rules.cpp	2011-11-17 17:26:00 +0000
@@ -124,9 +124,9 @@
   case block_expr_kind :
   {
     block_expr* seqExpr = static_cast<block_expr *>(node);
-    ulong numChildren = seqExpr->size();
+    csize numChildren = seqExpr->size();
 
-    for (ulong i = 0; i < numChildren-1; ++i)
+    for (csize i = 0; i < numChildren-1; ++i)
     {
       expr_t& child = (*seqExpr)[i];
       set_ignores_sorted_nodes(child.getp(), ANNOTATION_TRUE);
@@ -163,6 +163,7 @@
   }
 
   case var_decl_expr_kind :
+  case var_set_expr_kind :
   {
     break;
   }
@@ -193,7 +194,7 @@
     // Process the clauses in reverse order so that by the time we reach the
     // definition of a LET var, we know if the LET var sequence must be in
     // doc order and/or without duplicates.
-    ulong i = flwor->num_clauses();
+    csize i = flwor->num_clauses();
     for (; i > 0; --i)
     {
       flwor_clause* clause = flwor->get_clause(i-1);
@@ -248,9 +249,9 @@
         // apply the rule recursively on the orderby exprs
         orderby_clause* oc = static_cast<orderby_clause*>(clause);
       
-        ulong numExprs = oc->num_columns();
+        csize numExprs = oc->num_columns();
       
-        for (ulong i = 0; i < numExprs; ++i)
+        for (csize i = 0; i < numExprs; ++i)
         {
           apply(rCtx, oc->get_column_expr(i), modified);
         }
@@ -376,9 +377,9 @@
     
     FunctionConsts::FunctionKind fkind = f->getKind();
     
-    ulong numArgs = fo->num_args();
+    csize numArgs = fo->num_args();
     
-    for (ulong i = 0; i < numArgs; ++i)
+    for (csize i = 0; i < numArgs; ++i)
     {
       expr* arg = fo->get_arg(i);
         

=== modified file 'src/compiler/rewriter/tools/dataflow_annotations.cpp'
--- src/compiler/rewriter/tools/dataflow_annotations.cpp	2011-08-12 10:21:10 +0000
+++ src/compiler/rewriter/tools/dataflow_annotations.cpp	2011-11-17 17:26:00 +0000
@@ -60,6 +60,10 @@
     compute_var_decl_expr(static_cast<var_decl_expr*>(e));
     break;
 
+  case var_set_expr_kind:
+    compute_var_set_expr(static_cast<var_set_expr*>(e));
+    break;
+
   case block_expr_kind:
     compute_block_expr(static_cast<block_expr *>(e));
     break;
@@ -293,6 +297,16 @@
 /*******************************************************************************
 
 ********************************************************************************/
+void DataflowAnnotationsComputer::compute_var_set_expr(var_set_expr* e)
+{
+  generic_compute(e);
+  default_walk(e);
+}
+
+
+/*******************************************************************************
+
+********************************************************************************/
 void DataflowAnnotationsComputer::compute_block_expr(block_expr* e)
 {
   default_walk(e);

=== modified file 'src/compiler/rewriter/tools/dataflow_annotations.h'
--- src/compiler/rewriter/tools/dataflow_annotations.h	2011-06-14 17:26:33 +0000
+++ src/compiler/rewriter/tools/dataflow_annotations.h	2011-11-17 17:26:00 +0000
@@ -36,6 +36,7 @@
   void compute_block_expr(block_expr* e);
   void compute_wrapper_expr(wrapper_expr* e);
   void compute_var_expr(var_expr* e);
+  void compute_var_set_expr(var_set_expr* e);
   void compute_flwor_expr(flwor_expr* e);
   void compute_trycatch_expr(trycatch_expr* e);
   void compute_promote_expr(promote_expr* e);

=== modified file 'src/compiler/rewriter/tools/expr_tools.cpp'
--- src/compiler/rewriter/tools/expr_tools.cpp	2011-10-05 19:22:52 +0000
+++ src/compiler/rewriter/tools/expr_tools.cpp	2011-11-17 17:26:00 +0000
@@ -269,17 +269,17 @@
         const group_clause* gc = static_cast<const group_clause *>(c);
 
         const flwor_clause::rebind_list_t& gvars = gc->get_grouping_vars();
-        unsigned numGroupVars = (unsigned)gvars.size();
+        csize numGroupVars = gvars.size();
 
-        for (unsigned i = 0; i < numGroupVars; ++i)
+        for (csize i = 0; i < numGroupVars; ++i)
         {
           add_var(gvars[i].second.getp(), numVars, varidmap, idvarmap);
         }
 
         const flwor_clause::rebind_list_t& ngvars = gc->get_nongrouping_vars();
-        unsigned numNonGroupVars = (unsigned)ngvars.size();
+        csize numNonGroupVars = ngvars.size();
 
-        for (unsigned i = 0; i < numNonGroupVars; ++i)
+        for (csize i = 0; i < numNonGroupVars; ++i)
         {
           add_var(ngvars[i].second.getp(), numVars, varidmap, idvarmap);
         }
@@ -299,8 +299,8 @@
       else if (c->get_kind() == flwor_clause::order_clause)
       {
         const orderby_clause* obc = static_cast<const orderby_clause *>(c);
-        ulong numExprs = obc->num_columns();
-        for (ulong i = 0; i < numExprs; ++i)
+        csize numExprs = obc->num_columns();
+        for (csize i = 0; i < numExprs; ++i)
         {
           index_flwor_vars(obc->get_column_expr(i), numVars, varidmap, idvarmap);
         }

=== modified file 'src/compiler/translator/translator.cpp'
--- src/compiler/translator/translator.cpp	2011-11-16 04:02:48 +0000
+++ src/compiler/translator/translator.cpp	2011-11-17 17:26:00 +0000
@@ -1838,17 +1838,17 @@
 
   The corresponding expr created here (and added to stmts) are:
 
-  1. var_dec_expr(varExpr, initExpr)
-
-  2. var_dec_expr(varExpr, initExpr)
-
-     In this case, the var_dec_expr will be a NOOP if a value has been assigned
+  1. var_decl_expr(varExpr, initExpr)
+
+  2. var_decl_expr(varExpr, initExpr)
+
+     In this case, the var_decl_expr will be a NOOP if a value has been assigned
      to the external var via the c++ api. If so, this value overrides the
      initializing expr in the prolog.
 
-  3. var_dec_expr(varExpr)
+  3. var_decl_expr(varExpr)
 
-  4. var_dec_expr(varExpr)
+  4. var_decl_expr(varExpr)
 
      In this case, the variable must be initialized via the c++ api before the
      query is executed, and it is this external intialization that will declare
@@ -5457,11 +5457,7 @@
   if (varType != NULL)
     valueExpr = new treat_expr(theRootSctx, loc, valueExpr, varType, err::XPTY0004);
 
-  push_nodestack(new fo_expr(theRootSctx,
-                             loc,
-                             GET_BUILTIN_FUNCTION(OP_VAR_ASSIGN_1),
-                             ve,
-                             valueExpr));
+  push_nodestack(new var_set_expr(theRootSctx, loc, ve, valueExpr));
 
   theAssignedVars.back().push_back(ve.getp());
 }

=== modified file 'src/functions/func_var_decl.cpp'
--- src/functions/func_var_decl.cpp	2011-07-29 06:13:28 +0000
+++ src/functions/func_var_decl.cpp	2011-11-17 17:26:00 +0000
@@ -32,63 +32,6 @@
 
 
 /*******************************************************************************
-  ctxvar-assign(varExpr, initExpr)
-
-  This internal function is used to initialize prolog variables (including the
-  context item, if it is declared in the prolog) that do have an initializing
-  expr, or to assign a value to a prolog or block-local var. During runtime,
-  the function computes the initExpr and stores the resulting value inside the
-  appropriate dynamic ctx (global or local), at the location that is identified
-  by the variable id.
-********************************************************************************/
-class ctx_var_assign : public function
-{
-public:
-  ctx_var_assign(const signature& sig) 
-    :
-    function(sig, FunctionConsts::OP_VAR_ASSIGN_1)
-  {
-  }
-
-  bool accessesDynCtx() const { return true; }
-
-  short getScriptingKind() const { return VAR_SETTING_EXPR; }
-
-  CODEGEN_DECL();
-};
-
-
-PlanIter_t ctx_var_assign::codegen(
-    CompilerCB* cb,
-    static_context* sctx,
-    const QueryLoc& loc,
-    std::vector<PlanIter_t>& argv,
-    AnnotationHolder& ann) const
-{
-  const fo_expr& foExpr = static_cast<const fo_expr&>(ann);
-
-  assert(foExpr.get_arg(0)->get_expr_kind() == var_expr_kind);
-
-  const var_expr* varExpr = static_cast<const var_expr*>(foExpr.get_arg(0));
-
-  xqtref_t exprType = foExpr.get_arg(1)->get_return_type();
-
-  CtxVarAssignIterator* iter = 
-  new CtxVarAssignIterator(sctx,
-                           loc,
-                           varExpr->get_unique_id(),
-                           varExpr->get_name(),
-                           (varExpr->get_kind() == var_expr::local_var),
-                           argv[1]);
-  
-  if (exprType->get_quantifier() == TypeConstants::QUANT_ONE)
-    iter->setSingleItem();
-
-  return iter;
-}
-
-
-/*******************************************************************************
   ctxvar-get(varExpr)
 
   An "artificial" function that is needed by the optimizer only. During runtime,
@@ -142,12 +85,6 @@
 {
   const char* zorba_op_ns = static_context::ZORBA_OP_NS.c_str();
 
-  DECL(sctx, ctx_var_assign,
-       (createQName(zorba_op_ns, "", "ctxvar-assign"),
-        GENV_TYPESYSTEM.ITEM_TYPE_ONE,
-        GENV_TYPESYSTEM.ITEM_TYPE_STAR,
-        GENV_TYPESYSTEM.EMPTY_TYPE));
-
   DECL(sctx, ctx_var_get,
        (createQName(zorba_op_ns, "", "ctxvar-get"),
         GENV_TYPESYSTEM.ITEM_TYPE_ONE,

=== modified file 'src/functions/function_consts.h'
--- src/functions/function_consts.h	2011-07-28 15:28:16 +0000
+++ src/functions/function_consts.h	2011-11-17 17:26:00 +0000
@@ -205,7 +205,6 @@
   OP_AND_N,
   OP_OR_N,
 
-  OP_VAR_ASSIGN_1,
   OP_VAR_GET_1,
 
   OP_EITHER_NODES_OR_ATOMICS_1,


Follow ups