Update of /cvsroot/monetdb/pathfinder/compiler/mil
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv23023/compiler/mil
Modified Files:
Tag: PF_ROX
mil.c milgen.brg milprint.c
Log Message:
propagated changes of Wednesday Jan 30 2008 - Saturday Feb 09 2008
from the development trunk to the PF_ROX branch
Index: milprint.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milprint.c,v
retrieving revision 1.62
retrieving revision 1.62.2.1
diff -u -d -r1.62 -r1.62.2.1
--- milprint.c 20 Jan 2008 22:35:05 -0000 1.62
+++ milprint.c 9 Feb 2008 08:40:34 -0000 1.62.2.1
@@ -97,6 +97,7 @@
| '/(' expression ',' expression ')' <m_div>
| '[/](' expression ',' expression ')' <m_mdiv>
| '[%](' expression ',' expression ')' <m_mmod>
+ | '[max](' expression ',' expression ')' <m_mmax>
| '[abs](' expression ')' <m_mabs>
| '[ceil](' expression ')' <m_mceiling>
| '[floor](' expression ')' <m_mfloor>
@@ -109,6 +110,7 @@
| '[<](' expression ',' expression ')' <m_mlt>
| '[<=](' expression ',' expression ')' <m_mle>
| '[!=](' expression ',' expression ')' <m_mne>
+ | 'enumerate(' expr ',' expr ')' <m_enum>
| 'not(' expression ')' <m_not>
| '[not](' expression ')' <m_mnot>
| '[-](' expression ')' <m_mneg>
@@ -275,6 +277,7 @@
, [m_div] = "/"
, [m_mdiv] = "[/]"
, [m_mmod] = "[%]"
+ , [m_mmax] = "[max]"
, [m_mabs] = "[abs]"
, [m_mceiling] = "[ceil]"
, [m_mfloor] = "[floor]"
@@ -470,6 +473,7 @@
, [m_sc_desc] = "sc_desc"
+ , [m_enum] = "enumerate"
, [m_count] = "count"
, [m_gcount] = "{count}"
, [m_egcount] = "{count}"
@@ -913,6 +917,8 @@
case m_mdiv:
/* expression : '[%](' expression ',' expression ')' */
case m_mmod:
+ /* expression : '[max](' expression ',' expression ')' */
+ case m_mmax:
/* expression : '>(' expression ',' expression ')' */
case m_gt:
/* expression : '=(' expression ',' expression ')' */
@@ -933,6 +939,8 @@
case m_mand:
/* expression : '[or](' expression ',' expression ')' */
case m_mor:
+ /* expression : 'enumerate(' expression ',' expression ')' */
+ case m_enum:
milprintf ("%s(", ID[n->kind]);
print_expression (n->child[0]);
milprintf (", ");
Index: mil.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/mil.c,v
retrieving revision 1.49
retrieving revision 1.49.2.1
diff -u -d -r1.49 -r1.49.2.1
--- mil.c 20 Jan 2008 22:35:04 -0000 1.49
+++ mil.c 9 Feb 2008 08:40:33 -0000 1.49.2.1
@@ -298,6 +298,7 @@
case PF_MIL_VAR_KIND_TEXT: return "TEXT";
case PF_MIL_VAR_KIND_COM: return "COMMENT";
case PF_MIL_VAR_KIND_PI: return "PI";
+ case PF_MIL_VAR_KIND_REF: return "REFERENCE";
case PF_MIL_VAR_ATTR: return "ATTR";
case PF_MIL_VAR_ELEM: return "ELEM";
@@ -895,6 +896,16 @@
}
/**
+ * enumerate operator, return sequence of integers
+ * starting from @a a with the length @a l.
+ */
+PFmil_t *
+PFmil_enumerate (const PFmil_t *a, const PFmil_t *l)
+{
+ return wire2 (m_enum, a, l);
+}
+
+/**
* Monet count operator, return number of items in @a a.
*/
PFmil_t *
@@ -1091,6 +1102,15 @@
}
/**
+ * Multiplexed arithmetic maximum operator
+ */
+PFmil_t *
+PFmil_mmax (const PFmil_t *a, const PFmil_t *b)
+{
+ return wire2 (m_mmax, a, b);
+}
+
+/**
* Multiplexed operator abs
*/
PFmil_t *
Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.103
retrieving revision 1.103.2.1
diff -u -d -r1.103 -r1.103.2.1
--- milgen.brg 25 Jan 2008 10:36:32 -0000 1.103
+++ milgen.brg 9 Feb 2008 08:40:34 -0000 1.103.2.1
@@ -112,6 +112,7 @@
%term bool_or = 47
%term bool_and_atom = 48
%term bool_or_atom = 49
+%term to = 50
%term hash_count = 55
%term avg = 56
%term max_ = 57
@@ -203,11 +204,12 @@
Rel: eq_atom (Rel) = 51 (10);
Rel: gt (Rel) = 52 (10);
Rel: gt_atom (Rel) = 53 (10);
-Rel: bool_not (Rel) = 61 (10);
-Rel: bool_and (Rel) = 62 (10);
-Rel: bool_or (Rel) = 63 (10);
-Rel: bool_and_atom (Rel) = 64 (10);
-Rel: bool_or_atom (Rel) = 65 (10);
+Rel: bool_not (Rel) = 60 (10);
+Rel: bool_and (Rel) = 61 (10);
+Rel: bool_or (Rel) = 62 (10);
+Rel: bool_and_atom (Rel) = 63 (10);
+Rel: bool_or_atom (Rel) = 64 (10);
+Rel: to (Rel) = 65 (10);
Rel: hash_count (Rel) = 66 (10);
Rel: avg (Rel) = 67 (10);
Rel: max_ (Rel) = 68 (10);
@@ -1841,7 +1843,7 @@
/* consider bit results */
if (ty & aat_bln) {
- if (ty == aat_int) {
+ if (ty == aat_bln) {
execute (
assgn (
var (item->name),
@@ -4352,20 +4354,19 @@
case alg_fun_fn_qname:
{
- PFalg_att_t att1, att2;
- att1 = p->sem.fun_1to1.refs.atts[0];
- att2 = p->sem.fun_1to1.refs.atts[0];
+ PFalg_att_t uri, pfx_loc;
+ uri = p->sem.fun_1to1.refs.atts[0];
+ pfx_loc = p->sem.fun_1to1.refs.atts[1];
PFmil_t *str = NULL;
mvar_t *offset = new_var (1);
mvar_t *prefix = new_var (1);
mvar_t *local = new_var (1);
mvar_t *err_str = new_var (1);
- PFmil_t *v_cast = VAR (L(p)->env, att1, aat_str),
- *v_uri = VAR (L(p)->env, att2, aat_str);
+ PFmil_t *v_cast = VAR (L(p)->env, pfx_loc, aat_str),
+ *v_uri = VAR (L(p)->env, uri, aat_str);
/* split up strings using ``:'' as delimiter */
- /* FIXME: currently we we don't retrieve the URI */
execute (
assgn (var (err_str->name),
check_qnames (v_cast)),
@@ -4384,8 +4385,9 @@
mstring (v_cast,
madd (lit_int (1),
var (offset->name)))));
- /* FIXME: do not allow "|" uris if we have
- no namespace prefix */
+
+ /* FIXME: do not allow missing uris (encoded by the string
"|")
+ if we have no namespace prefix */
/* add_qnames changes the working set
in 'var (PF_MIL_VAR_WS)' as side effect */
@@ -4676,74 +4678,135 @@
break;
/* Rel: bool_not (Rel) */
- case 61:
+ case 60:
unary_op (PFmil_mnot, p);
break;
/* Rel: bool_and (Rel) */
- case 62:
+ case 61:
bin_bool (PFmil_mand, p);
break;
/* Rel: bool_or (Rel) */
- case 63:
+ case 62:
bin_bool (PFmil_mor, p);
break;
/* Rel: bool_and_atom (Rel) */
- case 64:
+ case 63:
bin_bool_atom (PFmil_mand, p);
break;
/* Rel: bool_or_atom (Rel) */
- case 65:
+ case 64:
bin_bool_atom (PFmil_mor, p);
break;
+ /* Rel: to (Rel) */
+ case 65:
+ {
+ mvar_t *v = new_var (1);
+ mvar_t *res = new_var (p->refctr);
+
+ execute (
+ /* v := in2.[-](in1).[+](1LL).[max](0LL);
+ v := enumerate(in1, v);
+ res := v.reverse().mark([EMAIL PROTECTED]).reverse();
+ v := v.mark([EMAIL PROTECTED]).reverse();
+
+ out_n := v.leftjoin(in_n);
+ out_n := out_n.tmark([EMAIL PROTECTED]); */
+ assgn (
+ var (v->name),
+ mmax (lit_lng (0),
+ madd (lit_lng (1),
+ msub (VAR (L(p)->env,
+ p->sem.binary.att2,
+ aat_int),
+ VAR (L(p)->env,
+ p->sem.binary.att1,
+ aat_int))))),
+ assgn (
+ var (v->name),
+ enumerate (VAR (L(p)->env, p->sem.binary.att1, aat_int),
+ var (v->name))),
+ assgn (
+ var (res->name),
+ tmark (var (v->name), lit_oid (0))),
+ assgn (
+ var (v->name),
+ reverse (mark (var (v->name), lit_oid (0)))));
+
+ for (unsigned int i = 0; i < env_count (L(p)->env); i++) {
+ mvar_t *w = new_var (p->refctr);
+
+ execute (
+ assgn (var (w->name),
+ leftjoin (
+ var (v->name),
+ var (env_at (L(p)->env, i).mvar->name))),
+ /* because leftjoin does not know that we have
+ exactly one match for each tuple in v,
+ we need to make the heads void ourselves */
+ assgn (var (w->name),
+ tmark (var (w->name), lit_oid (0)))
+ );
+
+ env_add (p->env,
+ env_at (L(p)->env, i).att,
+ env_at (L(p)->env, i).ty,
+ w);
+ }
+ env_add (p->env, p->sem.binary.res, aat_int, res);
+
+ unpin (v, 1);
+ } break;
+
+
/* Rel: hash_count (Rel) */
case 66:
if (p->sem.count.part != att_NULL) {
- for (unsigned int i = 0; i < L(p)->schema.count; i++)
- for (PFalg_simple_type_t t = 1; t; t <<= 1)
- if (t & L(p)->schema.items[i].type) {
-
- if (t != L(p)->schema.items[i].type)
- PFoops (OOPS_FATAL,
- "HashCount not implemented for "
- "polymorphic groups");
-
- mvar_t *v = new_var (1);
- mvar_t *res = new_var (p->refctr);
- mvar_t *part = new_var (p->refctr);
+ mvar_t *v = new_var (1);
+ mvar_t *res = new_var (p->refctr);
+ mvar_t *part = new_var (p->refctr);
+ PFalg_simple_type_t ty = type_of (L(p), p->sem.count.part);
+
+ for (PFalg_simple_type_t t = 1; t; t <<= 1)
+ if (t & ty) {
+ if (t != ty)
+ PFoops (OOPS_FATAL,
+ "HashCount not implemented for "
+ "polymorphic groups");
+ break;
+ }
- execute (
- /* v := {count}(p_in.reverse ()) */
- assgn (
- var (v->name),
- gcount (
- reverse (VAR (L(p)->env,
- p->sem.count.part, t)))),
- /* align with integer representation (lng) */
- assgn (var (v->name),
- mcast (type (mty_lng), var (v->name))),
- /* res := v.reverse ().mark ([EMAIL
PROTECTED]).reverse (); */
- assgn (
- var (res->name),
- reverse (
- mark (
- reverse (var (v->name)),
- lit_oid (0)))),
- /* part := v.mark ([EMAIL PROTECTED]).reverse
(); */
- assgn (
- var (part->name),
- reverse (
- mark (var (v->name), lit_oid (0)))));
+ execute (
+ /* v := {count}(p_in.reverse ()) */
+ assgn (
+ var (v->name),
+ gcount (
+ reverse (VAR (L(p)->env,
+ p->sem.count.part, ty)))),
+ /* align with integer representation (lng) */
+ assgn (var (v->name),
+ mcast (type (mty_lng), var (v->name))),
+ /* res := v.reverse ().mark ([EMAIL PROTECTED]).reverse
(); */
+ assgn (
+ var (res->name),
+ reverse (
+ mark (
+ reverse (var (v->name)),
+ lit_oid (0)))),
+ /* part := v.mark ([EMAIL PROTECTED]).reverse (); */
+ assgn (
+ var (part->name),
+ reverse (
+ mark (var (v->name), lit_oid (0)))));
- env_add (p->env, p->sem.count.res, aat_int, res);
- env_add (p->env, p->sem.count.part, t, part);
+ env_add (p->env, p->sem.count.res, aat_int, res);
+ env_add (p->env, p->sem.count.part, ty, part);
- unpin (v, 1);
- }
+ unpin (v, 1);
}
else {
@@ -5602,31 +5665,23 @@
/* FragRel: doc_tbl (Rel) */
case 100:
{
- mvar_t *time;
-
- /* copy the iter BAT */
- mvar_t *iter = env_mvar (L(p)->env, p->sem.ii.iter, aat_nat);
+ /* temporary variables */
+ mvar_t *time = new_var (1),
+ *v = new_var (1),
+ /* result BATs */
+ *frag = new_var (p->refctr),
+ *pre = new_var (p->refctr);
- env_add (p->env, p->sem.ii.iter, aat_nat, iter);
- pin (iter, p->refctr);
+ env_add (p->env, p->sem.unary.res, aat_pre, pre);
+ env_add (p->env, p->sem.unary.res, aat_pfrag, frag);
/* add timing information */
- time = new_var (1);
execute (assgn (var (time->name), usec ()));
- /* temporary variable */
- mvar_t *v = new_var (1);
- /* result BATs */
- mvar_t *frag = new_var (p->refctr);
- mvar_t *pre = new_var (p->refctr);
-
- env_add (p->env, p->sem.ii.item, aat_pre, pre);
- env_add (p->env, p->sem.ii.item, aat_pfrag, frag);
-
execute (
assgn (var (v->name),
doc_tbl (var (PF_MIL_VAR_WS),
- VAR (L(p)->env, p->sem.ii.item, aat_str))),
+ VAR (L(p)->env, p->sem.unary.att, aat_str))),
assgn (var (pre->name), fetch (var (v->name), lit_int (1))),
assgn (var (frag->name), fetch (var (v->name), lit_int (2))),
assgn (var (PF_MIL_VAR_WS), fetch (var (v->name), lit_int
(0)))
@@ -5642,6 +5697,15 @@
var (time->name)))));
unpin (time, 1);
+ /* copy p's child environment */
+ for (unsigned int i = 0; i < PFarray_last (L(p)->env); i++) {
+
+ env_t entry = env_at (L(p)->env, i);
+
+ env_add (p->env, entry.att, entry.ty, entry.mvar);
+
+ pin (entry.mvar, p->refctr);
+ }
} break;
/* Rel: doc_access (FragList, Rel) */
@@ -7227,7 +7291,7 @@
*(mvar_t **) PFarray_add (twig_state->attr_vars) = v;
}
- if (treat_pre) {
+ if (treat_pre && true) {
mvar_t *unq_iter, *scj_res, *root_level, *content_level;
mvar_t *iter = new_var (1);
mvar_t *item = new_var (1);
@@ -7437,6 +7501,102 @@
env_add (p->env, att_NULL, aat_int, gsize);
}
}
+ else if (treat_pre && false) {
+ mvar_t *v = new_var (1);
+
+ /* add the node references into list of twig constructors
+ (size = 0, kind = REFERENCE, prop = p_prop, cont = p_cont):
+ v := new(void, bat).seqbase([EMAIL PROTECTED]);
+ v.append(p_iter);
+ v.append(p_iter.project(%twig_state->pre%));
+ v.append(p_iter.project(0));
+ v.append(p_iter.project(%twig_state->level%));
+ v.append(p_iter.project(REFERENCE));
+ # store the references to look up the reference
+ # in the PRE_PROP column
+ v.append(p_item);
+ # store the node container to look up the reference
+ # in the PRE_CONT column
+ v.append(p_cont);
+ v.append(p_iter.project(oid(nil)));
+ v.append(p_iter.project(oid(nil)));
+ */
+ execute (
+ assgn (var (v->name),
+ seqbase (new (type (mty_void), type (mty_bat)),
+ lit_oid (0))),
+ /* iter */
+ bappend (var (v->name),
+ var (p_iter->name)),
+ /* pre */
+ bappend (var (v->name),
+ project (
+ var (p_iter->name),
+ lit_oid (twig_state->pre))),
+ /* size */
+ bappend (var (v->name),
+ project (
+ var (p_iter->name),
+ lit_int (0))),
+ /* level */
+ bappend (var (v->name),
+ project (
+ var (p_iter->name),
+ cast (
+ type (mty_chr),
+ lit_int (twig_state->level)))),
+ /* kind */
+ bappend (var (v->name),
+ project (
+ var (p_iter->name),
+ var (PF_MIL_VAR_KIND_REF))),
+ /* prop */
+ bappend (var (v->name),
+ var (p_item->name)),
+ /* cont */
+ bappend (var (v->name),
+ var (p_cont->name)),
+ /* old_pre */
+ bappend (var (v->name),
+ project (
+ var (p_iter->name),
+ cast (type (mty_oid), nil ()))),
+ /* old_cont */
+ bappend (var (v->name),
+ project (
+ var (p_iter->name),
+ cast (type (mty_oid), nil ()))));
+
+ *(mvar_t **) PFarray_add (twig_state->elem_vars) = v;
+ twig_state->pre++;
+ /* do not tell the twig constructor to handle
+ subtree attribute copies */
+ /* twig_state->elem_content = false; */
+
+ /* add count of the references to the environment */
+ if (twig_state->loop) {
+ mvar_t *gsize = new_var (1);
+
+ /* gsize := {count}(p_iter.reverse(),
+ %twig_state->loop%.reverse());
+ # map back to head values
+ gsize := %twig_state->loop%.leftjoin(gsize); */
+ execute (
+ assgn (
+ var (gsize->name),
+ egcount (
+ reverse (var (p_iter->name)),
+ reverse (twig_state->loop))),
+ assgn (
+ var (gsize->name),
+ leftjoin (
+ twig_state->loop,
+ var (gsize->name))));
+
+ /* add the grouped sizes to the variable environment */
+ env_add (p->env, att_NULL, aat_int, gsize);
+ }
+ }
if (treat_pre && treat_attr) {
unpin (p_iter, 1);
@@ -7531,16 +7691,37 @@
if_ (eq (count (VAR (L(p)->env, p->sem.err.att, aat_str)),
lit_int (0)),
nop(),
- error (fetch ( VAR (L(p)->env, p->sem.err.att, aat_str),
- lit_int (0)))));
+ error (fetch (VAR (L(p)->env, p->sem.err.att, aat_str),
+ lit_int (0)))));
/* copy all the attributes */
for (unsigned int i = 0; i < env_count (L(p)->env); i++) {
- pin (env_at (L(p)->env, i).mvar, p->refctr);
- env_add (p->env,
- env_at (L(p)->env, i).att,
- env_at (L(p)->env, i).ty,
- env_at (L(p)->env, i).mvar);
+ /* make sure that the implicit type change
+ is correctly implemented */
+ if (env_at (L(p)->env, i).att == p->sem.err.att) {
+ PFalg_simple_type_t ty = type_of (p, p->sem.err.att);
+ assert (env_at (L(p)->env, i).ty == aat_str);
+
+ for (PFalg_simple_type_t t = 1; t; t <<= 1)
+ if (t & ty) {
+ /* create new variable */
+ mvar_t *v = new_var (p->refctr);
+ /* dummy assignment */
+ execute (
+ assgn (var (v->name),
+ seqbase (new (type (mty_void),
+ implty (t)),
+ lit_oid (0))));
+ env_add (p->env, p->sem.err.att, t, v);
+ }
+ }
+ else {
+ pin (env_at (L(p)->env, i).mvar, p->refctr);
+ env_add (p->env,
+ env_at (L(p)->env, i).att,
+ env_at (L(p)->env, i).ty,
+ env_at (L(p)->env, i).mvar);
+ }
}
break;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins