/* compute an expression or action given by an AST node */ Res* computeNode( Node *node, Node *reco, Env *env, ruleExecInfo_t *rei, int reiSaveFlag, rError_t* errmsg, Region *r ) { Hashtable *varTypes = newHashTable2( 10, r ); Region *rNew = make_region( 0, NULL ); Node *en; Node **errnode = &en; Res* res; int errorcode; if ( ( errorcode = typeNode( node, varTypes, errmsg, errnode, r ) ) != 0 ) { res = newErrorRes( r, errorcode ); RETURN; } if ( reco != NULL && ( errorcode = typeNode( reco, varTypes, errmsg, errnode, r ) ) != 0 ) { res = newErrorRes( r, errorcode ); RETURN; } if ( getNodeType( node ) == N_ACTIONS ) { res = evaluateActions( node, NULL, GlobalAllRuleExecFlag, rei, reiSaveFlag, env, errmsg, rNew ); } else { res = evaluateExpression3( node, GlobalAllRuleExecFlag, 0, rei, reiSaveFlag, env, errmsg, rNew ); } /* switch (TYPE(res)) { case T_ERROR: addRErrorMsg(errmsg, -1, "error: in rule"); break; default: break; }*/ ret: res = cpRes( res, r ); cpEnv( env, r ); region_free( rNew ); return res; }
/* copy res values from other region to r */ void cpHashtable(Hashtable *env, Region *r) { int i; for(i=0;i<env->size;i++) { struct bucket *b = env->buckets[i]; while(b!=NULL) { b->value = cpRes((Res *)b->value, r); b= b->next; } } }