[project @ 2000-03-10 14:53:00 by sewardj]
[ghc-hetmet.git] / ghc / interpreter / connect.h
index 2f3ccc6..10cf0ff 100644 (file)
@@ -1,14 +1,15 @@
 /* --------------------------------------------------------------------------
  * Connections between components of the Hugs system
  *
- * Hugs 98 is Copyright (c) Mark P Jones, Alastair Reid and the Yale
- * Haskell Group 1994-99, and is distributed as Open Source software
- * under the Artistic License; see the file "Artistic" that is included
- * in the distribution for details.
+ * The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the
+ * Yale Haskell Group, and the Oregon Graduate Institute of Science and
+ * Technology, 1994-1999, All rights reserved.  It is distributed as
+ * free software under the license in the file "License", which is
+ * included in the distribution.
  *
  * $RCSfile: connect.h,v $
- * $Revision: 1.3 $
- * $Date: 1999/02/03 17:08:27 $
+ * $Revision: 1.25 $
+ * $Date: 2000/03/10 14:53:00 $
  * ------------------------------------------------------------------------*/
 
 /* --------------------------------------------------------------------------
@@ -16,8 +17,8 @@
  * ------------------------------------------------------------------------*/
 
 extern Bool   haskell98;                /* TRUE => Haskell 98 compatibility*/
+extern Bool   combined;                 /* TRUE => combined operation      */
 extern Module modulePrelude;
-extern Module modulePreludeHugs;
 
 /* --------------------------------------------------------------------------
  * Primitive constructor functions 
@@ -41,9 +42,7 @@ extern Name  nameIf,      nameSel;
 extern Name  nameCompAux;
 extern Name  namePmInt,   namePmFlt;    /* primitives for pattern matching */
 extern Name  namePmInteger;
-#if NPLUSK
 extern Name  namePmNpk,   namePmSub;    /* primitives for (n+k) patterns   */
-#endif
 extern Name  nameError;                 /* For runtime error messages      */
 extern Name  nameUndefined;             /* A generic undefined value       */
 extern Name  nameBlackHole;             /* For GC-detected black hole      */
@@ -58,11 +57,6 @@ extern Name  nameRange;
 extern Name  nameLe,      nameGt;
 extern Name  nameShowsPrec, nameReadsPrec;
 extern Name  nameMult,    namePlus;
-extern Name  nameConCmp,  nameEnRange;
-extern Name  nameEnIndex, nameEnInRng;
-extern Name  nameEnToEn,  nameEnFrEn;
-extern Name  nameEnFrom,  nameEnFrTh;
-extern Name  nameEnFrTo;
 extern Name  nameComp,    nameApp;      /* composition and append          */
 extern Name  nameShowField;             /* display single field            */
 extern Name  nameShowParen;             /* wrap with parens                */
@@ -74,32 +68,14 @@ extern Class classMonad;                /* Monads                          */
 extern Name  nameReturn,  nameBind;     /* for translating monad comps     */
 extern Name  nameMFail;
 extern Name  nameListMonad;             /* builder function for List Monad */
-
-#if EVAL_INSTANCES
-extern Name  nameStrict,  nameSeq;      /* Members of class Eval           */
-extern Name  nameIStrict, nameISeq;     /* ... and their implementations   */
-#endif
-
 extern Name  namePrint;                 /* printing primitive              */
-
-#if    IO_MONAD
-extern Type   typeProgIO;               /* For the IO monad, IO ()         */
-extern Name   nameIORun;                /* IO monad executor               */
-extern Name   namePutStr;               /* Prelude.putStr                  */
-extern Name   nameUserErr;              /* primitives required for IOError */
-extern Name   nameNameErr,  nameSearchErr;
-#endif
-
-#if IO_HANDLES
-extern Name   nameWriteErr, nameIllegal;/* primitives required for IOError */
-extern Name   nameEOFErr;
-#endif
-
+extern Name  nameCreateAdjThunk;        /* f-x-dyn: create adjustor thunk  */
 extern Text  textPrelude;
 extern Text  textNum;                   /* used to process default decls   */
-#if    NPLUSK
+extern Text  textCcall;                 /* used to process foreign import  */
+extern Text  textStdcall;               /*         ... and foreign export  */
 extern Text  textPlus;                  /* Used to recognise n+k patterns  */
-#endif
+
 #if TREX
 extern Name  nameNoRec;                 /* The empty record                */
 extern Type  typeNoRow;                 /* The empty row                   */
@@ -121,6 +97,7 @@ extern String hugsEdit;                 /* String for editor command       */
 extern String hugsPath;                 /* String for file search path     */
 extern String projectPath;              /* String for project search path  */
 
+extern Type  typeProgIO;               /* For the IO monad, IO a          */
 extern Type  typeArrow;                 /* Builtin type constructors       */
 extern Type  typeList;
 extern Type  typeUnit;
@@ -135,9 +112,6 @@ extern Class classShow;
 extern Class classRead;
 extern Class classIx;
 extern Class classEnum;
-#if EVAL_INSTANCES
-extern Class classEval;
-#endif
 extern Class classBounded;
 
 extern Class classReal;                 /* `numeric' classes               */
@@ -163,23 +137,22 @@ extern List  defaultDefns;              /* default definitions (if any)    */
 extern Int   defaultLine;               /* line in which default defs occur*/
 extern List  evalDefaults;              /* defaults for evaluator          */
 extern Cell  inputExpr;                 /* evaluator input expression      */
+extern Cell  inputContext;             /* evaluator input expression      */
 extern Addr  inputCode;                 /* Code for compiled input expr    */
 
 extern Int   whnfArgs;                  /* number of args of term in whnf  */
 extern Cell  whnfHead;                  /* head of term in whnf            */
 extern Int   whnfInt;                   /* integer value of term in whnf   */
 extern Float whnfFloat;                 /* float value of term in whnf     */
-/*ToDo?? extern Long  numReductions;*/             /* number of reductions used       */
 extern Long  numCells;                  /* number of cells allocated       */
 extern Int   numGcs;                    /* number of garbage collections   */
 extern Bool  broken;                    /* indicates interrupt received    */
-/*ToDo?? extern Bool  preludeLoaded;*/             /* TRUE => prelude has been loaded */
+extern Bool  preludeLoaded;             /* TRUE => prelude has been loaded */
 
 extern Bool  gcMessages;                /* TRUE => print GC messages       */
 extern Bool  literateScripts;           /* TRUE => default lit scripts     */
 extern Bool  literateErrors;            /* TRUE => report errs in lit scrs */
-/*ToDo?? extern Bool  failOnError;*/              /* TRUE => error produces immediate*/
-                                        /*         termination             */
+extern Bool  showInstRes;               /* TRUE => show instance resolution */
 
 extern Int   cutoff;                    /* Constraint Cutoff depth         */
 
@@ -190,6 +163,7 @@ extern String preprocessor;             /* preprocessor command            */
 #if DEBUG_CODE
 extern Bool  debugCode;                 /* TRUE => print G-code to screen  */
 #endif
+extern Bool  debugSC;                  /* TRUE => print SC to screen  */
 extern Bool  kindExpert;                /* TRUE => display kind errors in  */
                                         /*         full detail             */
 extern Bool  allowOverlap;              /* TRUE => allow overlapping insts */
@@ -200,11 +174,19 @@ extern Bool  allowOverlap;              /* TRUE => allow overlapping insts */
 
 extern Void everybody Args((Int));
 
-#define RESET   1               /* reset subsystem                         */
-#define MARK    2               /* mark parts of graph in use by subsystem */
-#define INSTALL 3               /* install subsystem (executed once only)  */
-#define EXIT    4               /* Take action immediately before exit()   */
-#define BREAK   5               /* Take action after program break         */
+
+#define RESET    1            /* reset subsystem                           */
+#define MARK     2            /* mark parts of graph in use by subsystem   */
+#define PREPREL  3            /* do startup actions before Prelude loading */
+#define POSTPREL 4            /* do startup actions after Prelude loading  */
+#define EXIT     5            /* Take action immediately before exit()     */
+#define BREAK    6            /* Take action after program break           */
+#define GCDONE   7            /* Restore subsystem invariantss after GC    */
+
+/* PREPREL was formerly called INSTALL.  POSTPREL doesn't have an analogy
+   in the old Hugs. 
+*/
+
 
 typedef long   Target;
 extern  Void   setGoal          Args((String, Target));
@@ -221,6 +203,9 @@ extern  Void   projInput        Args((String));
 extern  Void   stringInput      Args((String));
 extern  Void   parseScript      Args((String,Long));
 extern  Void   parseExp         Args((Void));
+#if EXPLAIN_INSTANCE_RESOLUTION
+extern  Void   parseContext     Args((Void));
+#endif
 extern  String readFilename     Args((Void));
 extern  String readLine         Args((Void));
 extern  Syntax defaultSyntax    Args((Text));
@@ -229,40 +214,39 @@ extern  String unlexChar        Args((Char,Char));
 extern  Void   printString      Args((String));
 
 extern  Void   substitution     Args((Int));
+extern  Void   optimiser        Args((Int));
 
 extern  Void   staticAnalysis   Args((Int));
-#if IGNORE_MODULES
-#define startModule(m)       doNothing()
-#define setExportList(l)     doNothing()
-#define setExports(l)        doNothing()
-#define addQualImport(m,as)  doNothing()
-#define addUnqualImport(m,l) doNothing()
-#else
 extern  Void   startModule      Args((Cell));
 extern  Void   setExportList    Args((List));
 extern  Void   setExports       Args((List));
 extern  Void   addQualImport    Args((Text,Text));
 extern  Void   addUnqualImport  Args((Text,List));
-#endif
+
 extern  Void   tyconDefn        Args((Int,Cell,Cell,Cell));
 extern  Void   setTypeIns       Args((List));
 extern  Void   clearTypeIns     Args((Void));
 extern  Type   fullExpand       Args((Type));
 extern  Bool   isAmbiguous      Args((Type));
 extern  Void   ambigError       Args((Int,String,Cell,Type));
-extern  Void   classDefn        Args((Int,Cell,Cell));
+extern  Void   classDefn       Args((Int,Cell,List,List));
 extern  Void   instDefn         Args((Int,Cell,Cell));
 extern  Void   addTupInst       Args((Class,Int));
-#if EVAL_INSTANCES
-extern  Void   addEvalInst      Args((Int,Cell,Int,List));
-#endif
 #if TREX
 extern  Inst   addRecShowInst   Args((Class,Ext));
 extern  Inst   addRecEqInst     Args((Class,Ext));
 #endif
+extern  List   typeVarsIn      Args((Cell,List,List,List));
+extern  List   oclose          Args((List,List));
+extern  List   zonkTyvarsIn    Args((Type,List));
+extern  Type   zonkTyvar       Args((Int));
+extern  Type   zonkType                Args((Type,Int));
 extern  Void   primDefn         Args((Cell,List,Cell));
 extern  Void   defaultDefn      Args((Int,List));
 extern  Void   checkExp         Args((Void));
+#if EXPLAIN_INSTANCE_RESOLUTION
+extern  Void   checkContext    Args((Void));
+#endif
 extern  Void   checkDefns       Args((Void));
 extern  Bool   h98Pred          Args((Bool,Cell));
 extern  Cell   h98Context       Args((Bool,List));
@@ -305,40 +289,10 @@ extern  Void   eval             Args((Cell));
 extern  Cell   evalWithNoError  Args((Cell));
 extern  Void   evalFails        Args((StackPtr));
 
-#if BYTECODE_PRIMS
-extern Int     IntAt            Args((Addr));
-#if !BREAK_FLOATS
-extern Float   FloatAt          Args((Addr));
-#endif
-extern Cell    CellAt           Args((Addr));
-extern Text    TextAt           Args((Addr));
-extern Addr    AddrAt           Args((Addr));
-extern Int     InstrAt          Args((Addr));
-#endif /* BYTECODE_PRIMS */
-
 extern  Void   abandon          Args((String,Cell));
 extern  Void   outputString     Args((FILE *));
 extern  Void   dialogue         Args((Cell));
-#define consChar(c) ap(conCons,mkChar(c))
-
-#if BIGNUMS
-extern  Bignum bigInt           Args((Int));
-extern  Bignum bigDouble        Args((double));
-extern  Bignum bigNeg           Args((Bignum));
-extern  Cell   bigToInt         Args((Bignum));
-extern  Cell   bigToFloat       Args((Bignum));
-extern  Bignum bigStr           Args((String));
-extern  Cell   bigOut           Args((Bignum,Cell,Bool));
-extern  Bignum bigShift         Args((Bignum,Int,Int));
-extern  Int    bigCmp           Args((Bignum,Bignum));
-#endif
-#if IO_MONAD
-extern Void   setHugsArgs       Args((Int,String[]));
-#endif
-
-#if PROFILING
-extern  String timeString       Args((Void));
-#endif
+#define consChar(c) ap(nameCons,mkChar(c))
 
 extern  Int    shellEsc         Args((String));
 extern  Int    getTerminalWidth Args((Void));
@@ -350,6 +304,14 @@ extern  Void   gcScanning       Args((Void));
 extern  Void   gcRecovered      Args((Int));
 extern  Void   gcCStack         Args((Void));
 extern  Void   needPrims        Args((Int)); 
+extern  List   calcFunDepsPreds Args((List));
+extern  Inst   findInstFor      Args((Cell,Int));
+#if MULTI_INST
+extern  List   findInstsFor     Args((Cell,Int));
+#endif
+
+extern Void ppScripts ( Void );
+extern Void ppModules ( Void );
 
 extern Type primType( Int /*AsmMonad*/ monad, String a_kinds, String r_kinds );
 #define aVar            mkOffset(0)     /* Simple skeleton for type var    */
@@ -376,8 +338,26 @@ extern Bool  broken;                    /* indicates interrupt received    */
 #  define ctrlbrk(bh) 
 #  define allowBreak()  kbhit()
 #else /* !HUGS_FOR_WINDOWS */
-#  define ctrlbrk(bh)   signal(SIGINT,bh); signal(SIGBREAK,bh)
-#  define allowBreak()  if (broken) { broken=FALSE; sigRaise(breakHandler); }
+# if HAVE_SIGPROCMASK
+#  include <signal.h>
+#  define ctrlbrk(bh)  { sigset_t mask; \
+                         signal(SIGINT,bh); \
+                         sigemptyset(&mask); \
+                         sigaddset(&mask, SIGINT); \
+                         sigprocmask(SIG_UNBLOCK, &mask, NULL); \
+                       }
+# else
+#  define ctrlbrk(bh)  signal(SIGINT,bh)
+# endif
+#if SYMANTEC_C
+extern int time_release;
+extern int allow_break_count;
+# define allowBreak()  if (time_release !=0 && \
+                           (++allow_break_count % time_release) == 0) \
+                           ProcessEvent();
+#else
+# define allowBreak()  if (broken) { broken=FALSE; sigRaise(breakHandler); }
+#endif
 #endif /* !HUGS_FOR_WINDOWS */
 
 /*---------------------------------------------------------------------------
@@ -387,7 +367,8 @@ extern Bool  broken;                    /* indicates interrupt received    */
 /* On Win32 we can use the registry to supplement info in environment 
  * variables.
  */
-#define USE_REGISTRY (HAVE_WINDOWS_H && !__MSDOS__)
+/* AJG: Commented out for now for development */
+/* #define USE_REGISTRY (HAVE_WINDOWS_H && !__MSDOS__) */
 
 #ifdef USE_REGISTRY
 Bool   writeRegString Args((String var, String val));
@@ -396,6 +377,9 @@ Int         readRegInt     Args((String var, Int def));
 Bool   writeRegInt    Args((String var, Int val));
 #endif
 
+#define N_INSTALLDIR 200
+extern char installDir[N_INSTALLDIR];
+
 /*---------------------------------------------------------------------------
  * File operations:
  *-------------------------------------------------------------------------*/
@@ -504,10 +488,10 @@ extern Type typeException;
 extern Type typeIO;
 extern Type typeST;
 
-extern  Void   foreignImport    Args((Cell,Pair,Cell,Cell));
+extern  Void   foreignImport    Args((Cell,Text,Pair,Cell,Cell));
 extern List  foreignImports;            /* foreign import declarations     */
 extern  Void   implementForeignImport Args((Name));
-extern  Void   foreignExport   Args((Cell,Cell,Cell,Cell));
+extern  Void   foreignExport   Args((Cell,Text,Cell,Cell,Cell));
 extern List  foreignExports;            /* foreign export declarations     */
 extern  Void   implementForeignExport Args((Name));
 
@@ -532,3 +516,58 @@ extern  Void   linkControl      Args((Int));
 extern  Void   deriveControl    Args((Int));
 extern  Void   translateControl Args((Int));
 extern  Void   codegen          Args((Int));
+extern  Void   machdep          Args((Int));
+
+extern Void linkPrimitiveNames(void);
+
+extern  Kind  starToStar;                /* Type -> Type                    */
+extern Type  boundPair;                 /* (mkOffset(0),mkOffset(0))       */
+extern        Type typeOrdering;
+
+extern  Type   conToTagType     Args((Tycon));
+extern  Type   tagToConType     Args((Tycon));
+
+#define BOGUS(k) (-9000000-(k))
+
+extern Void putChr  Args((Int));
+extern Void putStr  Args((String));
+extern Void putInt  Args((Int));
+extern Void putPtr  Args((Ptr));
+
+extern Void unlexCharConst Args((Cell));
+extern FILE *outputStream;             /* current output stream            */
+extern Int  outColumn;                 /* current output column number     */
+
+extern Void unlexStrConst  Args((Text));
+extern Void unlexVar       Args((Text));
+extern Void unlexVarStr    Args((String));
+extern List offsetTyvarsIn          Args((Type,List));
+
+extern List cfunSfuns;                  /* List of (Cfun,[SelectorVar])    */
+
+extern Void  interface        Args((Int));
+
+extern Void getFileSize       Args((String, Long *));
+
+extern ZPair readInterface      Args((String,Long));
+extern Bool  processInterfaces  Args((Void));
+extern void  ifLinkConstrItbl ( Name n );
+
+
+extern List /* of ZTriple(I_INTERFACE, 
+                          Text--name of obj file, 
+                          Int--size of obj file) */
+             ifaces_outstanding;
+
+
+extern Void hi_o_namesFromSrcName Args((String,String*,String* oName));
+extern Cell parseInterface        Args((String,Long));
+
+extern String getExtraObjectInfo ( String primaryObjectName,
+                                   String extraFileName,
+                                   Int*   extraFileSize );
+
+extern Name         newDSel             Args((Class,Int));
+extern Int          visitClass          Args((Class));
+
+extern Kind  simpleKind         Args((Int));