Exemple #1
0
/* 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;
}
Exemple #2
0
/* 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;
            }
	}
}