[augeas-devel] augeas: master - Suppress buildtime typechecks for L_REC; propagate recursive flag
David Lutterkort
lutter at fedoraproject.org
Fri Jan 15 01:31:24 UTC 2010
Gitweb: http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=c16b942b9b1c169d61f3a5806396cba0b6381d8a
Commit: c16b942b9b1c169d61f3a5806396cba0b6381d8a
Parent: 5b0fde3b4204a7e3e644c744f40a2a68a40b2cf8
Author: David Lutterkort <lutter at redhat.com>
AuthorDate: Fri Dec 18 16:02:34 2009 -0800
Committer: David Lutterkort <lutter at redhat.com>
CommitterDate: Thu Jan 14 14:48:38 2010 -0800
Suppress buildtime typechecks for L_REC; propagate recursive flag
---
src/lens.c | 37 ++++++++++++++++++++++++++++---------
1 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/src/lens.c b/src/lens.c
index 5cdc31c..316570e 100644
--- a/src/lens.c
+++ b/src/lens.c
@@ -147,6 +147,8 @@ static struct lens *make_lens_binop(enum lens_tag tag, struct info *info,
lens->nchildren = n1;
lens->nchildren += (l2->tag == tag) ? l2->nchildren : 1;
+ lens->recursive = l1->recursive || l2->recursive;
+
if (ALLOC_N(lens->children, lens->nchildren) < 0) {
lens->nchildren = 0;
goto error;
@@ -176,10 +178,12 @@ static struct lens *make_lens_binop(enum lens_tag tag, struct info *info,
if (ALLOC_N(types, lens->nchildren) < 0)
goto error;
- for (int t=0; t < ntypes; t++) {
- for (int i=0; i < lens->nchildren; i++)
- types[i] = ltype(lens->children[i], t);
- ltype(lens, t) = (*combinator)(info, lens->nchildren, types);
+ if (!lens->recursive) {
+ for (int t=0; t < ntypes; t++) {
+ for (int i=0; i < lens->nchildren; i++)
+ types[i] = ltype(lens->children[i], t);
+ ltype(lens, t) = (*combinator)(info, lens->nchildren, types);
+ }
}
FREE(types);
@@ -205,8 +209,9 @@ struct value *lns_make_union(struct info *info,
struct lens *l1, struct lens *l2, int check) {
struct lens *lens = NULL;
int consumes_value = l1->consumes_value && l2->consumes_value;
+ int recursive = l1->recursive || l2->recursive;
- if (check) {
+ if (check && !recursive) {
struct value *exn = typecheck_union(info, l1, l2);
if (exn != NULL)
return exn;
@@ -221,8 +226,9 @@ struct value *lns_make_concat(struct info *info,
struct lens *l1, struct lens *l2, int check) {
struct lens *lens = NULL;
int consumes_value = l1->consumes_value || l2->consumes_value;
+ int recursive = l1->recursive || l2->recursive;
- if (check) {
+ if (check && !recursive) {
struct value *exn = typecheck_concat(info, l1, l2);
if (exn != NULL) {
return exn;
@@ -289,15 +295,17 @@ struct value *lns_make_subtree(struct info *info, struct lens *l) {
lens = make_lens_unop(L_SUBTREE, info, l);
lens->ctype = ref(l->ctype);
- lens->atype = subtree_atype(info, l->ktype, l->vtype);
+ if (! l->recursive)
+ lens->atype = subtree_atype(info, l->ktype, l->vtype);
lens->value = lens->key = 0;
+ lens->recursive = l->recursive;
return make_lens_value(lens);
}
struct value *lns_make_star(struct info *info, struct lens *l, int check) {
struct lens *lens;
- if (check) {
+ if (check && !l->recursive) {
struct value *exn = typecheck_iter(info, l);
if (exn != NULL) {
return exn;
@@ -314,6 +322,7 @@ struct value *lns_make_star(struct info *info, struct lens *l, int check) {
for (int t = 0; t < ntypes; t++) {
ltype(lens, t) = regexp_iter(info, ltype(l, t), 0, -1);
}
+ lens->recursive = l->recursive;
return make_lens_value(lens);
}
@@ -332,7 +341,7 @@ struct value *lns_make_plus(struct info *info, struct lens *l, int check) {
struct value *lns_make_maybe(struct info *info, struct lens *l, int check) {
struct lens *lens;
- if (check) {
+ if (check && !l->recursive) {
struct value *exn = typecheck_maybe(info, l);
if (exn != NULL) {
return exn;
@@ -343,6 +352,7 @@ struct value *lns_make_maybe(struct info *info, struct lens *l, int check) {
ltype(lens, t) = regexp_maybe(info, ltype(l, t));
lens->value = l->value;
lens->key = l->key;
+ lens->recursive = l->recursive;
return make_lens_value(lens);
}
@@ -494,6 +504,9 @@ static struct value *disjoint_check(struct info *info, bool is_get,
struct value *exn = NULL;
const char *const msg = is_get ? "union.get" : "tree union.put";
+ if (r1 == NULL || r2 == NULL)
+ return NULL;
+
exn = regexp_to_fa(r1, &fa1);
if (exn != NULL)
goto done;
@@ -609,6 +622,9 @@ static struct value *ambig_concat_check(struct info *info, const char *msg,
struct fa *fa2 = NULL;
struct value *result = NULL;
+ if (r1 == NULL || r2 == NULL)
+ return NULL;
+
result = regexp_to_fa(r1, &fa1);
if (result != NULL)
goto done;
@@ -650,6 +666,9 @@ static struct value *ambig_iter_check(struct info *info, const char *msg,
struct fa *fas = NULL, *fa = NULL;
struct value *result = NULL;
+ if (r == NULL)
+ return NULL;
+
result = regexp_to_fa(r, &fa);
if (result != NULL)
goto done;
More information about the augeas-devel
mailing list