[project @ 1999-07-14 11:15:09 by simonmar]
[ghc-hetmet.git] / ghc / interpreter / connect.h
index b80ebfd..41dc004 100644 (file)
-/* -*- mode: hugs-c; -*- */
 /* --------------------------------------------------------------------------
  * Connections between components of the Hugs system
  *
- * Copyright (c) The University of Nottingham and Yale University, 1994-1997.
- * All rights reserved. See NOTICE for details and conditions of use etc...
- * Hugs version 1.4, December 1997
+ * 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.
  *
  * $RCSfile: connect.h,v $
- * $Revision: 1.2 $
- * $Date: 1998/12/02 13:22:03 $
+ * $Revision: 1.7 $
+ * $Date: 1999/06/07 17:22:45 $
  * ------------------------------------------------------------------------*/
 
 /* --------------------------------------------------------------------------
  * Standard data:
  * ------------------------------------------------------------------------*/
 
+extern Bool   haskell98;                /* TRUE => Haskell 98 compatibility*/
+extern Module modulePrelude;
+
+/* --------------------------------------------------------------------------
+ * Primitive constructor functions 
+ * ------------------------------------------------------------------------*/
+
+extern Name  nameFalse, nameTrue;
+extern Name  nameNil,   nameCons;
+extern Name  nameJust,  nameNothing;
+extern Name  nameLeft,  nameRight;
+extern Name  nameUnit;
+
+extern Name  nameLT,      nameEQ;
+extern Name  nameGT;
+extern Name  nameFst,     nameSnd;      /* standard combinators            */
+extern Name  nameId,      nameOtherwise;
+extern Name  nameNegate,  nameFlip;     /* primitives reqd for parsing     */
+extern Name  nameFrom,    nameFromThen;
+extern Name  nameFromTo,  nameFromThenTo;
+extern Name  nameFatbar,  nameFail;     /* primitives reqd for translation */
+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      */
+extern Name  nameInd;                   /* For dict indirection            */
+extern Name  nameAnd,     nameOr;       /* For optimisation of && and ||   */
+extern Name  nameFromInt, nameFromDouble;/*coercion of numerics            */
+extern Name  nameFromInteger;
+extern Name  nameEq,      nameCompare;  /* names used for deriving         */
+extern Name  nameMinBnd,  nameMaxBnd;
+extern Name  nameIndex,   nameInRange;
+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                */
+extern Name  nameReadField;             /* read single field               */
+extern Name  nameReadParen;             /* unwrap from parens              */
+extern Name  nameLex;                   /* lexer                           */
+extern Name  nameRangeSize;             /* calculate size of index range   */
+extern Class classMonad;                /* Monads                          */
+extern Name  nameReturn,  nameBind;     /* for translating monad comps     */
+extern Name  nameMFail;
+extern Name  nameListMonad;             /* builder function for List Monad */
+extern Name  namePrint;                 /* printing primitive              */
+extern Text  textPrelude;
+extern Text  textNum;                   /* used to process default decls   */
+#if    NPLUSK
+extern Text  textPlus;                  /* Used to recognise n+k patterns  */
+#endif
+#if TREX
+extern Name  nameNoRec;                 /* The empty record                */
+extern Type  typeNoRow;                 /* The empty row                   */
+extern Type  typeRec;                   /* Record formation                */
+extern Kind  extKind;                   /* Kind of extension, *->row->row  */
+extern Name  nameRecExt;                /* Extend a record                 */
+extern Name  nameRecBrk;                /* Break a record                  */
+extern Name  nameAddEv;                 /* Addition of evidence values     */
+extern Name  nameRecSel;                /* Select a record                 */
+extern Name  nameRecShw;                /* Show a record                   */
+extern Name  nameShowRecRow;            /* Used to output rows             */
+extern Name  nameRecEq;                 /* Compare records                 */
+extern Name  nameEqRecRow;              /* Used to compare rows            */
+extern Name  nameInsFld;                /* Field insertion routine         */
+#endif
+
+extern String repeatStr;                /* Repeat last command string      */
+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  typeArrow;                 /* Builtin type constructors       */
+extern Type  typeList;
+extern Type  typeUnit;
+
+#define fn(from,to)  ap(ap(typeArrow,from),to)  /* make type: from -> to   */
+
+extern List  stdDefaults;               /* List of standard default types  */
+
+extern Class classEq;                   /* `standard' classes              */
+extern Class classOrd;
+extern Class classShow;
+extern Class classRead;
+extern Class classIx;
+extern Class classEnum;
+extern Class classBounded;
+
+extern Class classReal;                 /* `numeric' classes               */
+extern Class classIntegral;
+extern Class classRealFrac;
+extern Class classRealFloat;
+extern Class classFractional;
+extern Class classFloating;
+extern Class classNum;
+
+extern Cell  *CStackBase;               /* pointer to base of C stack      */
+
+extern List  tyconDefns;                /* list of type constructor defns  */
+extern List  typeInDefns;               /* list of synonym restrictions    */
+extern List  valDefns;                  /* list of value definitions       */
+extern List  classDefns;                /* list of class definitions       */
+extern List  instDefns;                 /* list of instance definitions    */
+extern List  selDefns;                  /* list of selector lists          */
+extern List  genDefns;                  /* list of generated defns         */
+extern List  primDefns;                 /* list of primitive definitions   */
+extern List  unqualImports;             /* unqualified import list         */
+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 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     */
+extern Long  numCells;                  /* number of cells allocated       */
+extern Int   numGcs;                    /* number of garbage collections   */
+extern Bool  broken;                    /* indicates interrupt received    */
+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 */
+extern Bool  optimise;                  /* TRUE => simplify STG            */
+
+extern Int   cutoff;                    /* Constraint Cutoff depth         */
+
+#if USE_PREPROCESSOR
+extern String preprocessor;             /* preprocessor command            */
+#endif
+
+#if DEBUG_CODE
+extern Bool  debugCode;                 /* TRUE => print G-code to screen  */
+#endif
+extern Bool  kindExpert;                /* TRUE => display kind errors in  */
+                                        /*         full detail             */
+extern Bool  allowOverlap;              /* TRUE => allow overlapping insts */
+
 /* --------------------------------------------------------------------------
  * Function prototypes etc...
  * ------------------------------------------------------------------------*/
 
+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 GCDONE  6               /* Restore subsystem invariantss after GC  */
+
+typedef long   Target;
+extern  Void   setGoal          Args((String, Target));
+extern  Void   soFar            Args((Target));
+extern  Void   done             Args((Void));
+extern  String fromEnv          Args((String,String));
+extern  Bool   chase            Args((List));
 
-extern  Void   everybody        Args((Int));
-extern  Void   machdep          Args((Int));
 extern  Void   storage          Args((Int));
-extern  Void   linkControl      Args((Int));
-extern  Void   translateControl Args((Int));
-extern  Void   staticAnalysis   Args((Int));
-extern  Void   interface        Args((Int));
-extern  Void   deriveControl    Args((Int));
+
 extern  Void   input            Args((Int));
+extern  Void   consoleInput     Args((String));
+extern  Void   projInput        Args((String));
+extern  Void   stringInput      Args((String));
+extern  Void   parseScript      Args((String,Long));
+extern  Void   parseExp         Args((Void));
+extern  String readFilename     Args((Void));
+extern  String readLine         Args((Void));
+extern  Syntax defaultSyntax    Args((Text));
+extern  Syntax syntaxOf         Args((Name));
+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));
+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));
+
+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   instDefn         Args((Int,Cell,Cell));
+extern  Void   addTupInst       Args((Class,Int));
+#if TREX
+extern  Inst   addRecShowInst   Args((Class,Ext));
+extern  Inst   addRecEqInst     Args((Class,Ext));
+#endif
+extern  Void   primDefn         Args((Cell,List,Cell));
+extern  Void   defaultDefn      Args((Int,List));
+extern  Void   checkExp         Args((Void));
+extern  Void   checkDefns       Args((Void));
+extern  Bool   h98Pred          Args((Bool,Cell));
+extern  Cell   h98Context       Args((Bool,List));
+extern  Void   h98CheckCtxt     Args((Int,String,Bool,List,Inst));
+extern  Void   h98CheckType     Args((Int,String,Cell,Type));
+extern  Void   h98DoesntSupport Args((Int,String));
+
 extern  Void   typeChecker      Args((Int));
-extern  Void   desugarControl   Args((Int));
-extern  Void   codegen          Args((Int));
+extern  Type   typeCheckExp     Args((Bool));
+extern  Void   typeCheckDefns   Args((Void));
+extern  Cell   provePred        Args((Kinds,List,Cell));
+extern  List   simpleContext    Args((List,Int));
+extern  Cell   rhsExpr          Args((Cell));
+extern  Int    rhsLine          Args((Cell));
+extern  Bool   isProgType       Args((List,Type));
+extern  Cell   superEvid        Args((Cell,Class,Class));
+extern  Void   linkPreludeTC    Args((Void));
+extern  Void   linkPreludeCM    Args((Void));
+
 extern  Void   compiler         Args((Int));
-extern  Void   substitution     Args((Int));
-extern  Void   stgTranslate     Args((Int));
-extern  Void   codegen          Args((Int));
+extern  Void   compileDefns     Args((Void));
+extern  Void   compileExp       Args((Void));
+extern  Bool   failFree         Args((Cell));
+extern  Int    discrArity       Args((Cell));
+
+extern  Addr   codeGen          Args((Name,Int,Cell));
+extern  Void   implementCfun    Args((Name,List));
+#if TREX
+extern  Name   implementRecShw  Args((Text,Cell));
+extern  Name   implementRecEq   Args((Text,Cell));
+#endif
+extern  Void   addCfunTable     Args((Tycon));
+extern  Name   succCfun         Args((Name));
+extern  Name   nextCfun         Args((Name,Name));
+extern  Name   cfunByNum        Args((Name,Int));
+extern  Void   unwind           Args((Cell));
+extern  Void   run              Args((Addr,StackPtr));
+
+extern  Void   eval             Args((Cell));
+extern  Cell   evalWithNoError  Args((Cell));
+extern  Void   evalFails        Args((StackPtr));
+
+extern  Void   abandon          Args((String,Cell));
+extern  Void   outputString     Args((FILE *));
+extern  Void   dialogue         Args((Cell));
+#define consChar(c) ap(nameCons,mkChar(c))
+
+extern  Int    shellEsc         Args((String));
+extern  Int    getTerminalWidth Args((Void));
+extern  Void   normalTerminal   Args((Void));
+extern  Void   noechoTerminal   Args((Void));
+extern  Int    readTerminalChar Args((Void));
+extern  Void   gcStarted        Args((Void));
+extern  Void   gcScanning       Args((Void));
+extern  Void   gcRecovered      Args((Int));
+extern  Void   gcCStack         Args((Void));
+extern  Void   needPrims        Args((Int)); 
+
+extern Type primType( Int /*AsmMonad*/ monad, String a_kinds, String r_kinds );
+#define aVar            mkOffset(0)     /* Simple skeleton for type var    */
 
 /*-------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------
+ * Interrupting execution (signals, allowBreak):
+ *-------------------------------------------------------------------------*/
+
+extern Bool breakOn      Args((Bool));
+
+extern Bool  broken;                    /* indicates interrupt received    */
+
+#ifndef SIGBREAK /* Sigh, not defined in cygwin32 beta release 16 */
+# define SIGBREAK 21
+#endif
+
+/* allowBreak: call to allow user to interrupt computation
+ * ctrlbrk:    set control break handler
+ */
+
+#if HUGS_FOR_WINDOWS
+#  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); }
+#endif /* !HUGS_FOR_WINDOWS */
+
+/*---------------------------------------------------------------------------
+ * Environment variables and the registry
+ *-------------------------------------------------------------------------*/
+
+/* On Win32 we can use the registry to supplement info in environment 
+ * variables.
+ */
+#define USE_REGISTRY (HAVE_WINDOWS_H && !__MSDOS__)
+
+#ifdef USE_REGISTRY
+Bool   writeRegString Args((String var, String val));
+String         readRegString  Args((String var, String def));
+Int    readRegInt     Args((String var, Int def));
+Bool   writeRegInt    Args((String var, Int val));
+#endif
+
+/*---------------------------------------------------------------------------
+ * File operations:
+ *-------------------------------------------------------------------------*/
+
+#if HAVE_UNISTD_H
+# include <sys/types.h>
+# include <unistd.h>
+#elif !HUGS_FOR_WINDOWS
+extern int      chdir      Args((const char*));
+#endif
+
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#else
+extern int      system     Args((const char *));
+extern double   atof       Args((const char *));
+extern void     exit       Args((int));
+#endif
+
+#ifndef FILENAME_MAX       /* should already be defined in an ANSI compiler*/
+#define FILENAME_MAX 256
+#else
+#if     FILENAME_MAX < 256
+#undef  FILENAME_MAX
+#define FILENAME_MAX 256
+#endif
+#endif
+
+/* Hack, hack: if you have dos.h, you probably have a DOS filesystem */
+#define DOS_FILENAMES              HAVE_DOS_H
+/* ToDo: can we replace this with a feature test? */
+#define MAC_FILENAMES              SYMANTEC_C
+
+#define CASE_INSENSITIVE_FILENAMES (DOS_FILENAMES | RISCOS)
+
+#if CASE_INSENSITIVE_FILENAMES
+# if HAVE_STRCASECMP
+#  define filenamecmp(s1,s2) strcasecmp(s1,s2)
+# elif HAVE__STRICMP
+#  define filenamecmp(s1,s2) _stricmp(s1,s2)
+# elif HAVE_STRICMP
+#  define filenamecmp(s1,s2) stricmp(s1,s2)
+# elif HAVE_STRCMPI
+#  define filenamecmp(s1,s2) strcmpi(s1,s2)
+# endif
+#else
+# define filenamecmp(s1,s2) strcmp(s1,s2)
+#endif
+
+/*---------------------------------------------------------------------------
+ * Pipe-related operations:
+ *
+ * On Windows, many standard Unix names acquire a leading underscore.
+ * Irritating, but easy to work around.
+ *-------------------------------------------------------------------------*/
+
+#if !defined(HAVE_POPEN) && defined(HAVE__POPEN)
+#define popen(x,y) _popen(x,y)
+#endif
+#if !defined(HAVE_PCLOSE) && defined(HAVE__PCLOSE)
+#define pclose(x) _pclose(x)
+#endif
+
+/*---------------------------------------------------------------------------
+ * Bit manipulation:
+ *-------------------------------------------------------------------------*/
+
+#define bitArraySize(n)    ((n)/bitsPerWord + 1)
+#define placeInSet(n)      ((-(n)-1)>>wordShift)
+#define maskInSet(n)       (1<<((-(n)-1)&wordMask))
+
+/*---------------------------------------------------------------------------
+ * Function prototypes for code in machdep.c
+ *-------------------------------------------------------------------------*/
+
+extern  String findMPathname    Args((String,String,String));
+extern  String findPathname     Args((String,String));
+
+extern  Int    shellEsc         Args((String));
+extern  Int    getTerminalWidth Args((Void));
+extern  Void   normalTerminal   Args((Void));
+extern  Void   noechoTerminal   Args((Void));
+extern  Int    readTerminalChar Args((Void));
+extern  Void   gcStarted        Args((Void));
+extern  Void   gcScanning       Args((Void));
+extern  Void   gcRecovered      Args((Int));
+extern  Void   gcCStack         Args((Void));
+
+/*-------------------------------------------------------------------------*/
+
+extern Type typeInt64;
+extern Type typeWord;
+extern Type typeFloat;
+extern Type typePrimArray;
+extern Type typePrimByteArray;
+extern Type typeRef;
+extern Type typePrimMutableArray;
+extern Type typePrimMutableByteArray;
+extern Type typeStable;
+extern Type typeWeak;
+extern Type typeIO;
+extern Type typeForeign;
+extern Type typeMVar;
+extern Type typeThreadId;
+extern Type typeException;
+extern Type typeIO;
+extern Type typeST;
+
+extern  Void   foreignImport    Args((Cell,Pair,Cell,Cell));
+extern List  foreignImports;            /* foreign import declarations     */
+extern  Void   implementForeignImport Args((Name));
+extern  Void   foreignExport   Args((Cell,Cell,Cell,Cell));
+extern List  foreignExports;            /* foreign export declarations     */
+extern  Void   implementForeignExport Args((Name));
+
+extern List diVars;
+extern Int  diNum;
+
+Int     userArity           Args((Name));
+
+
+extern List    deriveEq            Args((Tycon));
+extern List    deriveOrd           Args((Tycon));
+extern List    deriveEnum          Args((Tycon));
+extern List    deriveIx            Args((Tycon));
+extern List    deriveShow          Args((Tycon));
+extern List    deriveRead          Args((Cell));
+extern List    deriveBounded       Args((Tycon));
+extern List    checkPrimDefn       Args((Triple));
+
+extern Bool  typeMatches        Args((Type,Type));
+extern  Void   evalExp           Args((Void));
+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 linkPreludeNames(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 List offsetTyvarsIn          Args((Type,List));
+
+extern Void optimiseTopBinds  Args((List));
+extern List cfunSfuns;                  /* List of (Cfun,[SelectorVar])    */
+
+extern Void  interface        Args((Int));
+
+extern List typeVarsIn        Args((Cell,List,List));
+
+extern Void getFileSize       Args((String, Long *));
+
+extern Void loadInterface     Args((String,Long));
+
+extern Void openGHCIface      Args((Text));
+extern Void loadSharedLib     Args((String));
+extern Void addGHCImports     Args((Int,Text,List));
+extern Void addGHCExports     Args((Cell,List));
+extern Void addGHCVar         Args((Int,Text,Type));
+extern Void addGHCSynonym     Args((Int,Cell,List,Type));
+extern Void addGHCDataDecl    Args((Int,List,Cell,List,List));
+extern Void addGHCNewType     Args((Int,List,Cell,List,Cell));
+extern Void addGHCClass       Args((Int,List,Cell,List,List));
+extern Void addGHCInstance    Args((Int,List,Pair,Text));
+extern Void finishInterfaces  Args((Void));
+
+extern Void hi_o_namesFromSrcName Args((String,String*,String* oName));
+extern Void parseInterface        Args((String,Long));
+
+
+#define SMALL_INLINE_SIZE 9
+
+
+// nasty hack, but seems an easy to convey the object name
+// and size to openGHCIface
+char nameObj[FILENAME_MAX+1];
+int  sizeObj;
+