* included in the distribution.
*
* $RCSfile: hugs.c,v $
- * $Revision: 1.17 $
- * $Date: 1999/11/09 00:40:11 $
+ * $Revision: 1.25 $
+ * $Date: 1999/11/29 18:59:26 $
* ------------------------------------------------------------------------*/
#include <setjmp.h>
#include "Rts.h"
#include "RtsAPI.h"
#include "Schedule.h"
-
+#include "Assembler.h" /* DEBUG_LoadSymbols */
Bool haskell98 = TRUE; /* TRUE => Haskell 98 compatibility*/
static Void local setLastEdit Args((String,Int));
static Void local failed Args((Void));
static String local strCopy Args((String));
-static Void local browseit Args((Module,String));
+static Void local browseit Args((Module,String,Bool));
static Void local browse Args((Void));
/* --------------------------------------------------------------------------
static Bool printing = FALSE; /* TRUE => currently printing value*/
static Bool showStats = FALSE; /* TRUE => print stats after eval */
-static Bool listScripts = TRUE; /* TRUE => list scripts after loading*/
+static Bool listScripts = TRUE; /* TRUE => list scripts after loading*/
static Bool addType = FALSE; /* TRUE => print type with value */
static Bool useDots = RISCOS; /* TRUE => use dots in progress */
static Bool quiet = FALSE; /* TRUE => don't show progress */
static Bool lastWasObject = FALSE;
Bool preludeLoaded = FALSE;
- Bool optimise = FALSE;
+ Bool debugSC = FALSE;
typedef
struct {
scriptInfo[i].path
);
}
- // printf ( "\n" );
fflush(stdout);fflush(stderr);
-ppScripts();
-ppModules();
+ ppScripts();
+ ppModules();
printf ( "\n" );
}
CStackBase = &argc; /* Save stack base for use in gc */
- /* Try and figure out an absolute path to the executable, so
- we can make a reasonable guess about where the default
- libraries (Prelude etc) are.
- */
- setDefaultLibDir ( argv[0] );
-
/* If first arg is +Q or -Q, be entirely silent, and automatically run
main after loading scripts. Useful for running the nofib suite. */
if (argc > 1 && (strcmp(argv[1],"+Q") == 0 || strcmp(argv[1],"-Q")==0)) {
autoMain = TRUE;
- hugsEnableOutput(0);
+ if (strcmp(argv[1],"-Q") == 0) {
+ hugsEnableOutput(0);
+ }
}
Printf("__ __ __ __ ____ ___ _________________________________________\n");
- Printf("|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard\n");
+ Printf("|| || || || || || ||__ STGHugs: Based on the Haskell 98 standard\n");
Printf("||___|| ||__|| ||__|| __|| Copyright (c) 1994-1999\n");
Printf("||---|| ___|| World Wide Web: http://haskell.org/hugs\n");
Printf("|| || Report bugs to: hugs-bugs@haskell.org\n");
Printf("|| || Version: %s _________________________________________\n\n",HUGS_VERSION);
+ /* Get the absolute path to the directory containing the hugs
+ executable, so that we know where the Prelude and nHandle.so/.dll are.
+ We do this by reading env var STGHUGSDIR. This needs to succeed, so
+ setInstallDir won't return unless it succeeds.
+ */
+ setInstallDir ( argv[0] );
+
#if SYMANTEC_C
Printf(" Ported to Macintosh by Hans Aberg, compiled " __DATE__ ".\n\n");
#endif
}
}
-#ifdef DEBUG
- DEBUG_LoadSymbols(argv_0_orig);
+#if DEBUG
+ {
+ char exe_name[N_INSTALLDIR + 6];
+ strcpy(exe_name, installDir);
+ strcat(exe_name, "hugs");
+ DEBUG_LoadSymbols(exe_name);
+ }
#endif
-
#if 0
if (!scriptName[0]) {
Printf("Prelude not found on current path: \"%s\"\n",
default : if (strcmp("98",s)==0) {
if (heapBuilt() && ((state && !haskell98) ||
(!state && haskell98))) {
- FPrintf(stderr,"Haskell 98 compatibility cannot be changed while the interpreter is running\n");
+ FPrintf(stderr,
+ "Haskell 98 compatibility cannot be changed"
+ " while the interpreter is running\n");
} else {
haskell98 = state;
}
{'w', 1, "Always show which modules are loaded", &listScripts},
{'k', 1, "Show kind errors in full", &kindExpert},
{'o', 0, "Allow overlapping instances", &allowOverlap},
- {'O', 1, "Optimise (improve?) generated code", &optimise},
#if DEBUG_CODE
#if DEBUG_CODE
{'D', 1, "Debug: show generated G code", &debugCode},
#endif
-#if DEBUG_SHOWSC
{'S', 1, "Debug: show generated SC code", &debugSC},
-#endif
#if 0
{'f', 1, "Terminate evaluation on first error", &failOnError},
{'u', 1, "Use \"show\" to display results", &useShow},
);
if (!ok) {
ERRMSG(0)
- /* "Can't file source or object+interface for module \"%s\"", */
- "Can't file source for module \"%s\"",
+ "Can't find source or object+interface for module \"%s\"",
+ /* "Can't find source for module \"%s\"", */
iname
EEND;
}
/* Load objects in preference to sources if both are available */
/* 11 Oct 99: disable object loading in the interim.
Will probably only reinstate when HEP becomes available.
+ */
fromObj = sAvail
? (oAvail && iAvail && timeEarlier(sTime,oTime))
: TRUE;
- */
- fromObj = FALSE;
/* ToDo: namesUpto overflow */
ent->modName = strCopy(iname);
#endif
#if 1
- if (typeMatches(type,ap(typeIO,typeUnit))) {
+ if (isProgType(ks,bd)) {
inputExpr = ap(nameRunIO,inputExpr);
evalExp();
Putchar('\n');
}
-static Void local browseit(mod,t)
+static Void local browseit(mod,t,all)
Module mod;
-String t; {
+String t;
+Bool all; {
if (nonNull(mod)) {
Cell cs;
- Printf("module %s where\n",textToStr(module(mod).text));
+ if (nonNull(t))
+ Printf("module %s where\n",textToStr(module(mod).text));
for (cs = module(mod).names; nonNull(cs); cs=tl(cs)) {
Name nm = hd(cs);
- /* only look at things defined in this module */
- if (name(nm).mod == mod) {
+ /* only look at things defined in this module,
+ unless `all' flag is set */
+ if (all || name(nm).mod == mod) {
/* unwanted artifacts, like lambda lifted values,
are in the list of names, but have no types */
if (nonNull(name(nm).type)) {
static Void local browse() { /* browse modules */
Int count = 0; /* or give menu of commands */
String s;
+ Bool all = FALSE;
setCurrModule(findEvalModule());
startNewScript(0); /* for recovery of storage */
- for (; (s=readFilename())!=0; count++) {
- browseit(findModule(findText(s)),s);
- }
+ for (; (s=readFilename())!=0; count++)
+ if (strcmp(s,"all") == 0) {
+ all = TRUE;
+ --count;
+ } else
+ browseit(findModule(findText(s)),s,all);
if (count == 0) {
- whatScripts();
+ browseit(findEvalModule(),NULL,all);
}
}
#if EXPLAIN_INSTANCE_RESOLUTION
static Void local xplain() { /* print type of expression (if any)*/
- Cell type;
Cell d;
Bool sir = showInstRes;
if (isNull(n) && whatIs(v)==STGVAR) {
Printf ( "\n{- `%s' has no nametable entry -}\n", s );
- Printf ( "{- stgSize of body is %d -}\n\n", stgSize(stgVarBody(v)));
printStg(stderr, v );
} else
if (isNull(n)) {
Printf ( "Doesn't have a STG tree: %s\n", s );
} else {
Printf ( "\n{- stgVar of `%s' is id%d -}\n", s, -name(n).stgVar);
- Printf ( "{- stgSize of body is %d -}\n\n",
- stgSize(stgVarBody(name(n).stgVar)));
printStg(stderr, name(n).stgVar);
}
}
forHelp();
}
+ /* initialize calls startupHaskell, which trashes our signal handlers */
+ breakOn(TRUE);
+
for (;;) {
Command cmd;
everybody(RESET); /* reset to sensible initial state */
Void setGoal(what, t) /* Set goal for what to be t */
String what;
Target t; {
- if (quiet) return;
+ if (quiet)
+ return;
+#if EXPLAIN_INSTANCE_RESOLUTION
+ if (showInstRes)
+ return;
+#endif
currTarget = (t?t:1);
aiming = TRUE;
if (useDots) {
Void soFar(t) /* Indicate progress towards goal */
Target t; { /* has now reached t */
- if (quiet) return;
+ if (quiet)
+ return;
+#if EXPLAIN_INSTANCE_RESOLUTION
+ if (showInstRes)
+ return;
+#endif
if (useDots) {
Int newPos = (Int)((maxPos * ((long)t))/currTarget);
}
Void done() { /* Goal has now been achieved */
- if (quiet) return;
+ if (quiet)
+ return;
+#if EXPLAIN_INSTANCE_RESOLUTION
+ if (showInstRes)
+ return;
+#endif
if (useDots) {
while (maxPos>currPos++)
Putchar('.');
typeChecker(what);
compiler(what);
codegen(what);
- optimiser(what);
}
/* --------------------------------------------------------------------------