* included in the distribution.
*
* $RCSfile: static.c,v $
- * $Revision: 1.34 $
- * $Date: 2000/04/04 01:07:49 $
+ * $Revision: 1.40 $
+ * $Date: 2000/04/07 10:00:28 $
* ------------------------------------------------------------------------*/
#include "hugsbasictypes.h"
static List local checkExportTycon ( List,Text,Cell,Tycon );
static List local checkExportClass ( List,Text,Cell,Class );
static List local checkExport ( List,Text,Cell );
-static List local checkImportEntity ( List,Module,Bool,Cell );
-static List local resolveImportList ( Module,Cell,Bool );
+static List local checkImportEntity ( List,Module,Cell );
+static List local resolveImportList ( Module,Cell );
static Void local checkImportList ( Pair );
static Void local importEntity ( Module,Cell );
return imports;
}
-static List local checkImportEntity(imports,exporter,priv,entity)
+static List local checkImportEntity(imports,exporter,entity)
List imports; /* Accumulated list of things to import */
Module exporter;
-Bool priv;
Cell entity; { /* Entry from import list */
List oldImports = imports;
Text t = isIdent(entity) ? textOf(entity) : textOf(fst(entity));
List es = NIL;
- if (priv) {
- es = module(exporter).names;
- es = dupOnto(module(exporter).tycons,es);
- es = dupOnto(module(exporter).classes,es);
- } else {
- es = module(exporter).exports;
- }
+ es = module(exporter).exports;
for(; nonNull(es); es=tl(es)) {
Cell e = hd(es); /* :: Entity
if (isIdent(entity) && name(e).text == t) {
imports = cons(e,imports);
}
- } else if (isTycon(e) && priv) {
- if (tycon(e).text == t) {
- imports = cons(e,imports);
- return dupOnto(tycon(e).defn,imports);
- }
- } else if (isClass(e) && priv) {
- if (cclass(e).text == t) {
- imports = cons(e,imports);
- return dupOnto(cclass(e).members,imports);
- }
- } else if (whatIs(e) == TUPLE && priv) {
- // do nothing
} else {
internal("checkImportEntity3");
}
return imports;
}
-static List local resolveImportList(m,impList,priv)
+static List local resolveImportList(m,impList)
Module m; /* exporting module */
-Cell impList;
-Bool priv; {
+Cell impList; {
List imports = NIL;
if (DOTDOT == impList) {
List es = module(m).exports;
}
}
} else {
- map2Accum(checkImportEntity,imports,m,priv,impList);
+ map1Accum(checkImportEntity,imports,m,impList);
}
return imports;
}
/* Somewhat inefficient - but obviously correct:
* imports = importsOf("module Foo") `setDifference` hidden;
*/
- hidden = resolveImportList(m, snd(impList),FALSE);
- imports = resolveImportList(m, DOTDOT,FALSE);
- } else if (isPair(impList) && STAR == fst(impList)) {
- // Previously, I was forcing an import Prelude,
- // but this precluded doing things like
- // import Prelude hiding ( catch)
- // so, for now, you need to put an explicit
- // import Prelude if you use import privileged.
- imports = resolveImportList(m, snd(impList),TRUE);
+ hidden = resolveImportList(m, snd(impList));
+ imports = resolveImportList(m, DOTDOT);
} else {
- imports = resolveImportList(m, impList,FALSE);
+ imports = resolveImportList(m, impList);
}
for(; nonNull(imports); imports=tl(imports)) {
name(n).defn = nameId;
} else {
implementCfun(n,scs);
+ name(n).hasStrict = nonNull(scs);
}
hd(cs) = n;
Cell type; {
Text t = textOf(intName);
Name n = findName(t);
- Int l = intOf(line);
if (isNull(n)) {
n = newName(t,NIL);
} else if (name(n).defn!=PREDEFINED) {
- ERRMSG(l) "Redeclaration of foreign \"%s\"", textToStr(t)
+ ERRMSG(line) "Redeclaration of foreign \"%s\"", textToStr(t)
EEND;
}
- name(n).line = l;
+ name(n).line = line;
name(n).defn = extName;
name(n).type = type;
name(n).callconv = callconv;
Cell type; {
Text t = textOf(intName);
Name n = findName(t);
- Int l = intOf(line);
if (isNull(n)) {
n = newName(t,NIL);
} else if (name(n).defn!=PREDEFINED) {
- ERRMSG(l) "Redeclaration of foreign \"%s\"", textToStr(t)
+ ERRMSG(line) "Redeclaration of foreign \"%s\"", textToStr(t)
EEND;
}
- name(n).line = l;
+ name(n).line = line;
name(n).defn = NIL; /* nothing to say */
name(n).type = type;
name(n).callconv = callconv;
EEND;
}
-#if 0
- what is this for??
- if (!moduleThisScript(name(n).mod)) {
- return n;
- }
-#endif
/* Later phases of the system cannot cope if we resolve references
* to unprocessed objects too early. This is the main reason that
* we cannot cope with recursive modules at the moment.
#endif
Void checkDefns ( Module thisModule ) { /* Top level static analysis */
+ Text modName = module(thisModule).text;
staticAnalysis(RESET);
mapProc(checkQualImport, module(thisModule).qualImports);
mapProc(checkUnqualImport,unqualImports);
/* Add "import Prelude" if there`s no explicit import */
-#if 0
- if (thisModule==modulePrelude || thisModule == modulePrelude2) {
+ if (modName == textPrelPrim || modName == textPrelude) {
/* Nothing. */
} else if (isNull(cellAssoc(modulePrelude,unqualImports))
&& isNull(cellRevAssoc(modulePrelude,module(thisModule).qualImports))) {
unqualImports = cons(pair(modulePrelude,DOTDOT),unqualImports);
} else {
- /* Every module (including the Prelude) implicitly contains
- * "import qualified Prelude"
+ /* Every module implicitly contains "import qualified Prelude"
*/
module(thisModule).qualImports
=cons(pair(mkCon(textPrelude),modulePrelude),
module(thisModule).qualImports);
}
-#endif
mapProc(checkImportList, unqualImports);
/* Note: there's a lot of side-effecting going on here, so