[Aldor-l] Generators
Peter Broadbery
p_broadbery at hotmail.com
Thu Nov 8 18:28:47 EST 2007
ok, managed to lose a little code off the end (this is relative to the aldor/src directory).
This passes the same tests that the unpatched version does on my box; hilbert1, gbtest1 and some others fail even on clean source.
Peter
Index: gf_gener.c
===================================================================
--- gf_gener.c (revision 15)
+++ gf_gener.c (working copy)
@@ -710,6 +710,10 @@
lst = listNConcat(AbSyn)(gen0FindIterVars(abArgv(ab)[i]), lst);
break;
case AB_Comma:
+ lst = listNil(AbSyn);
+ for (i=0; i < abArgc(ab); i++)
+ lst = listNConcat(AbSyn)(gen0FindIterVars(abArgv(ab)[i]), lst);
+ break;
default:
msg = "bad iterator passed to gen0FindIterVars";
comsgFatal(ab, ALDOR_F_Bug, msg);
Index: abcheck.c
===================================================================
--- abcheck.c (revision 15)
+++ abcheck.c (working copy)
@@ -594,8 +594,38 @@
}
local void
-abCheckFor0(AbSyn var)
+abCheckFor0(AbSyn lhs)
{
+ AbSyn *argv = abArgvAs(AB_Comma, lhs);
+ Length i, argc = abArgcAs(AB_Comma, lhs);
+
+ for (i = 0; i < argc; i += 1) {
+ AbSyn arg = argv[i];
+
+ switch (abTag(arg)) {
+ case AB_Id:
+ break;
+
+ case AB_Apply:
+ comsgError(arg, ALDOR_E_ChkBadFor);
+ break;
+
+ case AB_Declare:
+ if (abHasTag(lhs, AB_Comma) &&
+ abHasTag(arg->abDeclare.id, AB_Comma))
+ comsgError(arg, ALDOR_E_ChkBadFor);
+ break;
+
+ default:
+ comsgError(arg, ALDOR_E_ChkBadFor);
+ break;
+ }
+ }
+}
+
+local void
+abCheckFor0_old(AbSyn var)
+{
switch (abTag(var)) {
case AB_Id:
break;
Index: ti_tdn.c
===================================================================
--- ti_tdn.c (revision 15)
+++ ti_tdn.c (working copy)
@@ -1452,8 +1452,10 @@
local Bool
titdnYield(Stab stab, AbSyn absyn, TForm type)
{
- titdn0FarValue(stab, absyn, type, absyn->abYield.value,
- &tuniYieldTForm, &abYieldsList);
+ titdn0FarValue(stab, absyn, type,
+ absyn->abYield.value,
+ &tuniYieldTForm,
+ &abYieldsList);
abTUnique(absyn) = tfExit;
return true;
}
@@ -1784,6 +1786,7 @@
*/
titdn(stab, lhs, tfUnknown);
titdn(stab, test, tfUnknown);
+
abTUnique(absyn) = twhole;
return true;
}
Index: genfoam.c
===================================================================
--- genfoam.c (revision 15)
+++ genfoam.c (working copy)
@@ -6234,26 +6234,45 @@
call->foamCCall.type = FOAM_NOp;
call->foamCCall.op = foamCopy(stepFun);
gen0AddStmt(call, absyn);
+
/* Have we finished */
call = foamNewEmpty(FOAM_CCall, 2);
call->foamCCall.type = FOAM_Word;
call->foamCCall.op = foamCopy(doneFun);
gen0AddStmt(foamNewIf(foamNewCast(FOAM_Bool, call), gen0BreakLabel),
absyn);
+
/* Snarf the value...*/
- id = abDefineeId(absyn);
- call = foamNewEmpty(FOAM_CCall, 2);
- call->foamCCall.type = gen0Type(gen0AbContextType(id), NULL);
- call->foamCCall.op = foamCopy(valueFun);
- gen0AddStmt(foamNewSet(genFoamVal(id), call), absyn);
-
- if (!abIsNothing(absyn->abFor.test)) {
+ /* -- PAB
+ id = abDefineeId(absyn);
+ call = foamNewEmpty(FOAM_CCall, 2);
+ call->foamCCall.type = gen0Type(gen0AbContextType(id), NULL);
+ call->foamCCall.op = foamCopy(valueFun);
+ gen0AddStmt(foamNewSet(genFoamVal(id), call), absyn);
+ */
+ if (abTag(absyn->abFor.lhs) == AB_Comma) {
+ call = foamNewEmpty(FOAM_CCall, 2);
+ call->foamCCall.type = FOAM_Rec;
+ call->foamCCall.op = foamCopy(valueFun);
+ call = gen0CrossToMulti(call, abTUnique(absyn->abFor.lhs));
+ gen0MultiAssign(FOAM_Set, absyn->abFor.lhs, call);
+ }
+ else {
+ id = abDefineeId(absyn);
+ call = foamNewEmpty(FOAM_CCall, 2);
+ call->foamCCall.type = gen0Type(gen0AbContextType(id), NULL);
+ call->foamCCall.op = foamCopy(valueFun);
+ gen0AddStmt(foamNewSet(genFoamVal(id), call), absyn);
+ }
+
+ if (!abIsNothing(absyn->abFor.test)) {
int l1 = gen0State->labelNo++;
Foam test = genFoamBit(absyn->abFor.test);
gen0AddStmt(foamNewIf(test, l1), absyn);
gen0AddStmt(foamNewGoto(gen0IterateLabel), absyn);
gen0AddStmt(foamNewLabel(l1), absyn);
}
+
return;
}
_________________________________________________________________
Get free emoticon packs and customisation from Windows Live.
http://www.pimpmylive.co.uk
More information about the Aldor-l
mailing list