2 /* --------------------------------------------------------------------------
3 * GHC interface file processing for Hugs
5 * Copyright (c) The University of Nottingham and Yale University, 1994-1997.
6 * All rights reserved. See NOTICE for details and conditions of use etc...
7 * Hugs version 1.4, December 1997
9 * $RCSfile: interface.c,v $
11 * $Date: 2000/03/13 11:37:16 $
12 * ------------------------------------------------------------------------*/
20 #include "Assembler.h" /* for wrapping GHC objects */
23 /*#define DEBUG_IFACE*/
26 /* --------------------------------------------------------------------------
27 * (This comment is now out of date. JRS, 991216).
28 * The "addGHC*" functions act as "impedence matchers" between GHC
29 * interface files and Hugs. Their main job is to convert abstract
30 * syntax trees into Hugs' internal representations.
32 * The main trick here is how we deal with mutually recursive interface
35 * o As we read an import decl, we add it to a list of required imports
36 * (unless it's already loaded, of course).
38 * o Processing of declarations is split into two phases:
40 * 1) While reading the interface files, we construct all the Names,
41 * Tycons, etc declared in the interface file but we don't try to
42 * resolve references to any entities the declaration mentions.
44 * This is done by the "addGHC*" functions.
46 * 2) After reading all the interface files, we finish processing the
47 * declarations by resolving any references in the declarations
48 * and doing any other processing that may be required.
50 * This is done by the "finishGHC*" functions which use the
51 * "fixup*" functions to assist them.
53 * The interface between these two phases are the "ghc*Decls" which
54 * contain lists of decls that haven't been completed yet.
56 * ------------------------------------------------------------------------*/
60 New comment, 991216, explaining roughly how it all works.
61 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
63 Interfaces can contain references to unboxed types, and these need to
64 be handled carefully. The following is a summary of how the interface
65 loader now works. It is applied to groups of interfaces simultaneously,
66 viz, the entire Prelude at once:
68 0. Parse interfaces, chasing imports until a complete
69 strongly-connected-component of ifaces has been parsed.
70 All interfaces in this scc are processed together, in
73 1. Throw away any entity not mentioned in the export lists.
75 2. Delete type (not data or newtype) definitions which refer to
76 unknown types in their right hand sides. Because Hugs doesn't
77 know of any unboxed types, this has the side effect of removing
78 all type defns referring to unboxed types. Repeat step 2 until
79 a fixed point is reached.
81 3. Make abstract all data/newtype defns which refer to an unknown
82 type. eg, data Word = MkW Word# becomes data Word, because
83 Word# is unknown. Hugs is happy to know about abstract boxed
84 Words, but not about Word#s.
86 4. Step 2 could delete types referred to by values, instances and
87 classes. So filter all entities, and delete those referring to
88 unknown types _or_ classes. This could cause other entities
89 to become invalid, so iterate step 4 to a fixed point.
91 After step 4, the interfaces no longer contain anything
94 5. Steps 1-4 operate purely on the iface syntax trees. We now start
95 creating symbol table entries. First, create a module table
96 entry for each interface, and locate and read in the corresponding
97 object file. This is done by the startGHCModule function.
99 6. Traverse all interfaces. For each entity, create an entry in
100 the name, tycon, class or instance table, and fill in relevant
101 fields, but do not attempt to link tycon/class/instance/name uses
102 to their symbol table entries. This is done by the startGHC*
105 7. Revisit all symbol table entries created in step 6. We should
106 now be able to replace all references to tycons/classes/instances/
107 names with the relevant symbol table entries. This is done by
108 the finishGHC* functions.
110 8. Traverse all interfaces. For each iface, examine the export lists
111 and use it to build export lists in the module table. Do the
112 implicit 'import Prelude' thing if necessary. Finally, resolve
113 references in the object code for this module. This is done
114 by the finishGHCModule function.
117 /* --------------------------------------------------------------------------
118 * local function prototypes:
119 * ------------------------------------------------------------------------*/
121 static Void startGHCValue ( Int,VarId,Type );
122 static Void finishGHCValue ( VarId );
124 static Void startGHCSynonym ( Int,Cell,List,Type );
125 static Void finishGHCSynonym ( Tycon );
127 static Void startGHCClass ( Int,List,Cell,List,List );
128 static Class finishGHCClass ( Class );
130 static Inst startGHCInstance ( Int,List,Pair,VarId );
131 static Void finishGHCInstance ( Inst );
133 static Void startGHCImports ( ConId,List );
134 static Void finishGHCImports ( ConId,List );
136 static Void startGHCExports ( ConId,List );
137 static Void finishGHCExports ( ConId,List );
139 static Void finishGHCFixdecl ( Cell prec, Cell assoc, ConVarId name );
141 static Void finishGHCModule ( Cell );
142 static Void startGHCModule ( Text, Int, Text );
144 static Void startGHCDataDecl ( Int,List,Cell,List,List );
145 static List finishGHCDataDecl ( ConId tyc );
146 /* Supporting stuff for {start|finish}GHCDataDecl */
147 static List startGHCConstrs ( Int,List,List );
148 static Name startGHCSel ( Int,Pair );
149 static Name startGHCConstr ( Int,Int,Triple );
151 static Void startGHCNewType ( Int,List,Cell,List,Cell );
152 static Void finishGHCNewType ( ConId tyc );
156 static Kinds tvsToKind ( List );
157 static Int arityFromType ( Type );
158 static Int arityInclDictParams ( Type );
159 static Bool allTypesKnown ( Type type,
160 List aktys /* [QualId] */,
163 static List ifTyvarsIn ( Type );
164 static Type tvsToOffsets ( Int,Type,List );
165 static Type conidcellsToTycons ( Int,Type );
166 static void* lookupObjName ( char* );
172 /* --------------------------------------------------------------------------
173 * Top-level interface processing
174 * ------------------------------------------------------------------------*/
176 /* getIEntityName :: I_IMPORT..I_VALUE -> ConVarId | NIL */
177 static ConVarId getIEntityName ( Cell c )
180 case I_IMPORT: return NIL;
181 case I_INSTIMPORT: return NIL;
182 case I_EXPORT: return NIL;
183 case I_FIXDECL: return zthd3(unap(I_FIXDECL,c));
184 case I_INSTANCE: return NIL;
185 case I_TYPE: return zsel24(unap(I_TYPE,c));
186 case I_DATA: return zsel35(unap(I_DATA,c));
187 case I_NEWTYPE: return zsel35(unap(I_NEWTYPE,c));
188 case I_CLASS: return zsel35(unap(I_CLASS,c));
189 case I_VALUE: return zsnd3(unap(I_VALUE,c));
190 default: internal("getIEntityName");
195 /* Filter the contents of an interface, using the supplied predicate.
196 For flexibility, the predicate is passed as a second arg the value
197 extraArgs. This is a hack to get round the lack of partial applications
198 in C. Pred should not have any side effects. The dumpaction param
199 gives us the chance to print a message or some such for dumped items.
200 When a named entity is deleted, filterInterface also deletes the name
203 static Cell filterInterface ( Cell root,
204 Bool (*pred)(Cell,Cell),
206 Void (*dumpAction)(Cell) )
209 Cell iface = unap(I_INTERFACE,root);
211 List deleted_ids = NIL; /* :: [ConVarId] */
213 for (tops = zsnd(iface); nonNull(tops); tops=tl(tops)) {
214 if (pred(hd(tops),extraArgs)) {
215 tops2 = cons( hd(tops), tops2 );
217 ConVarId deleted_id = getIEntityName ( hd(tops) );
218 if (nonNull(deleted_id))
219 deleted_ids = cons ( deleted_id, deleted_ids );
221 dumpAction ( hd(tops) );
224 tops2 = reverse(tops2);
226 /* Clean up the export list now. */
227 for (tops=tops2; nonNull(tops); tops=tl(tops)) {
228 if (whatIs(hd(tops))==I_EXPORT) {
229 Cell exdecl = unap(I_EXPORT,hd(tops));
230 List exlist = zsnd(exdecl);
232 for (; nonNull(exlist); exlist=tl(exlist)) {
233 Cell ex = hd(exlist);
234 ConVarId exid = isZPair(ex) ? zfst(ex) : ex;
235 assert (isCon(exid) || isVar(exid));
236 if (!varIsMember(textOf(exid),deleted_ids))
237 exlist2 = cons(ex, exlist2);
239 hd(tops) = ap(I_EXPORT,zpair(zfst(exdecl),exlist2));
243 return ap(I_INTERFACE, zpair(zfst(iface),tops2));
247 ZPair readInterface(String fname, Long fileSize)
251 ZPair iface = parseInterface(fname,fileSize);
252 assert (whatIs(iface)==I_INTERFACE);
254 for (tops = zsnd(unap(I_INTERFACE,iface)); nonNull(tops); tops=tl(tops))
255 if (whatIs(hd(tops)) == I_IMPORT) {
256 ZPair imp_decl = unap(I_IMPORT,hd(tops));
257 ConId m_to_imp = zfst(imp_decl);
258 if (textOf(m_to_imp) != findText("PrelGHC")) {
259 imports = cons(m_to_imp,imports);
261 fprintf(stderr, "add iface %s\n",
262 textToStr(textOf(m_to_imp)));
266 return zpair(iface,imports);
270 /* getExportDeclsInIFace :: I_INTERFACE -> [I_EXPORT] */
271 static List getExportDeclsInIFace ( Cell root )
273 Cell iface = unap(I_INTERFACE,root);
274 List decls = zsnd(iface);
277 for (ds=decls; nonNull(ds); ds=tl(ds))
278 if (whatIs(hd(ds))==I_EXPORT)
279 exports = cons(hd(ds), exports);
284 /* Does t start with "$dm" ? */
285 static Bool isIfaceDefaultMethodName ( Text t )
287 String s = textToStr(t);
288 return (s && s[0]=='$' && s[1]=='d' && s[2]=='m' && s[3]);
292 static Bool isExportedIFaceEntity ( Cell ife, List exlist_list )
294 /* ife :: I_IMPORT..I_VALUE */
295 /* exlist_list :: [[ ConVarId | ((ConId, [ConVarId])) ]] */
301 ConVarId ife_id = getIEntityName ( ife );
303 if (isNull(ife_id)) return TRUE;
305 tnm = textOf(ife_id);
307 /* Don't junk default methods, even tho the export list doesn't
310 if (isIfaceDefaultMethodName(tnm)) goto retain;
312 /* for each export list ... */
313 for (; nonNull(exlist_list); exlist_list=tl(exlist_list)) {
314 exlist = hd(exlist_list);
316 /* for each entity in an export list ... */
317 for (t=exlist; nonNull(t); t=tl(t)) {
318 if (isZPair(hd(t))) {
319 /* A pair, which means an export entry
320 of the form ClassName(foo,bar). */
321 List subents = cons(zfst(hd(t)),zsnd(hd(t)));
322 for (; nonNull(subents); subents=tl(subents))
323 if (textOf(hd(subents)) == tnm) goto retain;
325 /* Single name in the list. */
326 if (textOf(hd(t)) == tnm) goto retain;
332 fprintf ( stderr, " dump %s\n", textToStr(tnm) );
338 fprintf ( stderr, " retain %s\n", textToStr(tnm) );
344 static Bool isExportedAbstractly ( ConId ife_id, List exlist_list )
346 /* ife_id :: ConId */
347 /* exlist_list :: [[ ConVarId | ((ConId, [ConVarId])) ]] */
352 assert (isCon(ife_id));
353 tnm = textOf(ife_id);
355 /* for each export list ... */
356 for (; nonNull(exlist_list); exlist_list=tl(exlist_list)) {
357 exlist = hd(exlist_list);
359 /* for each entity in an export list ... */
360 for (t=exlist; nonNull(t); t=tl(t)) {
361 if (isZPair(hd(t))) {
362 /* A pair, which means an export entry
363 of the form ClassName(foo,bar). */
364 if (textOf(zfst(hd(t))) == tnm) return FALSE;
366 if (textOf(hd(t)) == tnm) return TRUE;
370 internal("isExportedAbstractly");
371 return FALSE; /*notreached*/
375 /* Remove entities not mentioned in any of the export lists. */
376 static Cell deleteUnexportedIFaceEntities ( Cell root )
378 Cell iface = unap(I_INTERFACE,root);
379 ConId iname = zfst(iface);
380 List decls = zsnd(iface);
382 List exlist_list = NIL;
386 fprintf(stderr, "\ncleanIFace: %s\n", textToStr(textOf(iname)));
389 exlist_list = getExportDeclsInIFace ( root );
390 /* exlist_list :: [I_EXPORT] */
392 for (t=exlist_list; nonNull(t); t=tl(t))
393 hd(t) = zsnd(unap(I_EXPORT,hd(t)));
394 /* exlist_list :: [[ ConVarId | ((ConId, [ConVarId])) ]] */
396 if (isNull(exlist_list)) {
397 ERRMSG(0) "Can't find any export lists in interface file"
401 return filterInterface ( root, isExportedIFaceEntity,
406 /* addTyconsAndClassesFromIFace :: I_INTERFACE -> [QualId] -> [QualId] */
407 static List addTyconsAndClassesFromIFace ( Cell root, List aktys )
409 Cell iface = unap(I_INTERFACE,root);
410 Text mname = textOf(zfst(iface));
411 List defns = zsnd(iface);
412 for (; nonNull(defns); defns = tl(defns)) {
413 Cell defn = hd(defns);
414 Cell what = whatIs(defn);
415 if (what==I_TYPE || what==I_DATA
416 || what==I_NEWTYPE || what==I_CLASS) {
417 QualId q = mkQCon ( mname, textOf(getIEntityName(defn)) );
418 if (!qualidIsMember ( q, aktys ))
419 aktys = cons ( q, aktys );
426 static Void ifentityAllTypesKnown_dumpmsg ( Cell entity )
428 ConVarId id = getIEntityName ( entity );
431 "dumping %s because of unknown type(s)\n",
432 isNull(id) ? "(nameless entity?!)" : textToStr(textOf(id)) );
437 /* ifentityAllTypesKnown :: I_IMPORT..I_VALUE -> (([QualId], ConId)) -> Bool */
438 /* mod is the current module being processed -- so we can qualify unqual'd
439 names. Strange calling convention for aktys and mod is so we can call this
440 from filterInterface.
442 static Bool ifentityAllTypesKnown ( Cell entity, ZPair aktys_mod )
445 List aktys = zfst ( aktys_mod );
446 ConId mod = zsnd ( aktys_mod );
447 switch (whatIs(entity)) {
454 Cell inst = unap(I_INSTANCE,entity);
455 List ctx = zsel25 ( inst ); /* :: [((QConId,VarId))] */
456 Type cls = zsel35 ( inst ); /* :: Type */
457 for (t = ctx; nonNull(t); t=tl(t))
458 if (!allTypesKnown(zfst(hd(t)),aktys,mod)) return FALSE;
459 if (!allTypesKnown(cls, aktys,mod)) return FALSE;
463 return allTypesKnown( zsel44(unap(I_TYPE,entity)), aktys,mod );
465 Cell data = unap(I_DATA,entity);
466 List ctx = zsel25 ( data ); /* :: [((QConId,VarId))] */
467 List constrs = zsel55 ( data ); /* :: [ ((ConId, [((Type,VarId,Int))] )) ] */
468 for (t = ctx; nonNull(t); t=tl(t))
469 if (!allTypesKnown(zfst(hd(t)),aktys,mod)) return FALSE;
470 for (t = constrs; nonNull(t); t=tl(t))
471 for (u = zsnd(hd(t)); nonNull(u); u=tl(u))
472 if (!allTypesKnown(zfst3(hd(u)),aktys,mod)) return FALSE;
476 Cell newty = unap(I_NEWTYPE,entity);
477 List ctx = zsel25(newty); /* :: [((QConId,VarId))] */
478 ZPair constr = zsel55 ( newty ); /* :: ((ConId,Type)) */
479 for (t = ctx; nonNull(t); t=tl(t))
480 if (!allTypesKnown(zfst(hd(t)),aktys,mod)) return FALSE;
482 && !allTypesKnown(zsnd(constr),aktys,mod)) return FALSE;
486 Cell klass = unap(I_CLASS,entity);
487 List ctx = zsel25(klass); /* :: [((QConId,VarId))] */
488 List sigs = zsel55(klass); /* :: [((VarId,Type))] */
489 for (t = ctx; nonNull(t); t=tl(t))
490 if (!allTypesKnown(zfst(hd(t)),aktys,mod)) return FALSE;
491 for (t = sigs; nonNull(t); t=tl(t))
492 if (!allTypesKnown(zsnd(hd(t)),aktys,mod)) return FALSE;
496 return allTypesKnown( zthd3(unap(I_VALUE,entity)), aktys,mod );
498 internal("ifentityAllTypesKnown");
503 /* ifTypeDoesntRefUnknownTycon :: I_IMPORT..I_VALUE -> (([QualId], ConId)) -> Bool */
504 /* mod is the current module being processed -- so we can qualify unqual'd
505 names. Strange calling convention for aktys and mod is so we can call this
506 from filterInterface.
508 static Bool ifTypeDoesntRefUnknownTycon ( Cell entity, ZPair aktys_mod )
511 List aktys = zfst ( aktys_mod );
512 ConId mod = zsnd ( aktys_mod );
513 if (whatIs(entity) != I_TYPE) {
516 return allTypesKnown( zsel44(unap(I_TYPE,entity)), aktys,mod );
521 static Void ifTypeDoesntRefUnknownTycon_dumpmsg ( Cell entity )
523 ConVarId id = getIEntityName ( entity );
524 assert (whatIs(entity)==I_TYPE);
528 "dumping type %s because of unknown tycon(s)\n",
529 textToStr(textOf(id)) );
534 /* abstractifyExport :: I_EXPORT -> ConId -> I_EXPORT
536 static List abstractifyExDecl ( Cell root, ConId toabs )
538 ZPair exdecl = unap(I_EXPORT,root);
539 List exlist = zsnd(exdecl);
541 for (; nonNull(exlist); exlist = tl(exlist)) {
542 if (isZPair(hd(exlist))
543 && textOf(toabs) == textOf(zfst(hd(exlist)))) {
544 /* it's toabs, exported non-abstractly */
545 res = cons ( zfst(hd(exlist)), res );
547 res = cons ( hd(exlist), res );
550 return ap(I_EXPORT,zpair(zfst(exdecl),reverse(res)));
554 static Void ppModule ( Text modt )
557 fflush(stderr); fflush(stdout);
558 fprintf(stderr, "---------------- MODULE %s ----------------\n",
564 static void* ifFindItblFor ( Name n )
566 /* n is a constructor for which we want to find the GHC info table.
567 First look for a _con_info symbol. If that doesn't exist, _and_
568 this is a nullary constructor, then it's safe to look for the
569 _static_info symbol instead.
575 sprintf ( buf, MAYBE_LEADING_UNDERSCORE_STR("%s_%s_con_info"),
576 textToStr( module(name(n).mod).text ),
577 textToStr( name(n).text ) );
578 t = enZcodeThenFindText(buf);
579 p = lookupOTabName ( name(n).mod, textToStr(t) );
583 if (name(n).arity == 0) {
584 sprintf ( buf, MAYBE_LEADING_UNDERSCORE_STR("%s_%s_static_info"),
585 textToStr( module(name(n).mod).text ),
586 textToStr( name(n).text ) );
587 t = enZcodeThenFindText(buf);
588 p = lookupOTabName ( name(n).mod, textToStr(t) );
592 ERRMSG(0) "Can't find info table %s", textToStr(t)
597 void ifLinkConstrItbl ( Name n )
599 /* name(n) is either a constructor or a field name.
600 If the latter, ignore it. If it is a non-nullary constructor,
601 find its info table in the object code. If it's nullary,
602 we can skip the info table, since all accesses will go via
605 if (islower(textToStr(name(n).text)[0])) return;
606 if (name(n).arity == 0) return;
607 name(n).itbl = ifFindItblFor(n);
611 static void ifSetClassDefaultsAndDCon ( Class c )
619 List defs; /* :: [Name] */
620 List mems; /* :: [Name] */
622 assert(isNull(cclass(c).defaults));
624 /* Create the defaults list by more-or-less cloning the members list. */
626 for (mems=cclass(c).members; nonNull(mems); mems=tl(mems)) {
628 s = textToStr( name(hd(mems)).text );
629 assert(strlen(s) < 95);
631 n = findNameInAnyModule(findText(buf));
636 cclass(c).defaults = defs;
638 /* Create a name table entry for the dictionary datacon.
639 Interface files don't mention them, so it had better not
643 s = textToStr( cclass(c).text );
644 assert( strlen(s) < 96 );
647 n = findNameInAnyModule(t);
653 name(n).arity = cclass(c).numSupers + cclass(c).numMembers;
654 name(n).number = cfunNo(0);
657 /* And finally ... set name(n).itbl to Mod_:DClass_con_info.
658 Because this happens right at the end of loading, we know
659 that we should actually be able to find the symbol in this
660 module's object symbol table. Except that if the dictionary
661 has arity 1, we don't bother, since it will be represented as
662 a newtype and not as a data, so its itbl can remain NULL.
664 if (name(n).arity == 1) {
666 name(n).defn = nameId;
668 p = ifFindItblFor ( n );
674 /* ifaces_outstanding holds a list of parsed interfaces
675 for which we need to load objects and create symbol
678 Return TRUE if Prelude `elem` ifaces_outstanding, else FALSE.
680 Bool processInterfaces ( void )
691 List all_known_types;
694 List cls_list; /* :: List Class */
695 List constructor_list; /* :: List Name */
697 List ifaces = NIL; /* :: List I_INTERFACE */
698 List iface_sizes = NIL; /* :: List Int */
699 List iface_onames = NIL; /* :: List Text */
701 if (isNull(ifaces_outstanding)) return FALSE;
705 "processInterfaces: %d interfaces to process\n",
706 length(ifaces_outstanding) );
709 /* unzip3 ifaces_outstanding into ifaces, iface_sizes, iface_onames */
710 for (xs = ifaces_outstanding; nonNull(xs); xs=tl(xs)) {
711 ifaces = cons ( zfst3(hd(xs)), ifaces );
712 iface_onames = cons ( zsnd3(hd(xs)), iface_onames );
713 iface_sizes = cons ( zthd3(hd(xs)), iface_sizes );
716 ifaces = reverse(ifaces);
717 iface_onames = reverse(iface_onames);
718 iface_sizes = reverse(iface_sizes);
720 /* Clean up interfaces -- dump non-exported value, class, type decls */
721 for (xs = ifaces; nonNull(xs); xs = tl(xs))
722 hd(xs) = deleteUnexportedIFaceEntities(hd(xs));
725 /* Iteratively delete any type declarations which refer to unknown
728 num_known_types = 999999999;
732 /* Construct a list of all known tycons. This is a list of QualIds.
733 Unfortunately it also has to contain all known class names, since
734 allTypesKnown cannot distinguish between tycons and classes -- a
735 deficiency of the iface abs syntax.
737 all_known_types = getAllKnownTyconsAndClasses();
738 for (xs = ifaces; nonNull(xs); xs=tl(xs))
739 all_known_types = addTyconsAndClassesFromIFace ( hd(xs), all_known_types );
741 /* Have we reached a fixed point? */
742 i = length(all_known_types);
745 "\n============= %d known types =============\n", i );
747 if (num_known_types == i) break;
750 /* Delete all entities which refer to unknown tycons. */
751 for (xs = ifaces; nonNull(xs); xs = tl(xs)) {
752 ConId mod = zfst(unap(I_INTERFACE,hd(xs)));
753 assert(nonNull(mod));
754 hd(xs) = filterInterface ( hd(xs),
755 ifTypeDoesntRefUnknownTycon,
756 zpair(all_known_types,mod),
757 ifTypeDoesntRefUnknownTycon_dumpmsg );
761 /* Now abstractify any datas and newtypes which refer to unknown tycons
762 -- including, of course, the type decls just deleted.
764 for (xs = ifaces; nonNull(xs); xs = tl(xs)) {
765 List absify = NIL; /* :: [ConId] */
766 ZPair iface = unap(I_INTERFACE,hd(xs)); /* ((ConId, [I_IMPORT..I_VALUE])) */
767 ConId mod = zfst(iface);
768 List aktys = all_known_types; /* just a renaming */
772 /* Compute into absify the list of all ConIds (tycons) we need to
775 for (es = zsnd(iface); nonNull(es); es=tl(es)) {
777 Bool allKnown = TRUE;
779 if (whatIs(ent)==I_DATA) {
780 Cell data = unap(I_DATA,ent);
781 List ctx = zsel25 ( data ); /* :: [((QConId,VarId))] */
782 List constrs = zsel55 ( data ); /* :: [ ((ConId, [((Type,VarId,Int))] )) ] */
783 for (t = ctx; nonNull(t); t=tl(t))
784 if (!allTypesKnown(zfst(hd(t)),aktys,mod)) allKnown = FALSE;
785 for (t = constrs; nonNull(t); t=tl(t))
786 for (u = zsnd(hd(t)); nonNull(u); u=tl(u))
787 if (!allTypesKnown(zfst3(hd(u)),aktys,mod)) allKnown = FALSE;
789 else if (whatIs(ent)==I_NEWTYPE) {
790 Cell newty = unap(I_NEWTYPE,ent);
791 List ctx = zsel25(newty); /* :: [((QConId,VarId))] */
792 ZPair constr = zsel55 ( newty ); /* :: ((ConId,Type)) */
793 for (t = ctx; nonNull(t); t=tl(t))
794 if (!allTypesKnown(zfst(hd(t)),aktys,mod)) allKnown = FALSE;
795 if (!allTypesKnown(zsnd(constr),aktys,mod)) allKnown = FALSE;
799 absify = cons ( getIEntityName(ent), absify );
802 "abstractifying %s because it uses an unknown type\n",
803 textToStr(textOf(getIEntityName(ent))) );
808 /* mark in exports as abstract all names in absify (modifies iface) */
809 for (; nonNull(absify); absify=tl(absify)) {
810 ConId toAbs = hd(absify);
811 for (es = zsnd(iface); nonNull(es); es=tl(es)) {
812 if (whatIs(hd(es)) != I_EXPORT) continue;
813 hd(es) = abstractifyExDecl ( hd(es), toAbs );
817 /* For each data/newtype in the export list marked as abstract,
818 remove the constructor lists. This catches all abstractification
819 caused by the code above, and it also catches tycons which really
820 were exported abstractly.
823 exlist_list = getExportDeclsInIFace ( ap(I_INTERFACE,iface) );
824 /* exlist_list :: [I_EXPORT] */
825 for (t=exlist_list; nonNull(t); t=tl(t))
826 hd(t) = zsnd(unap(I_EXPORT,hd(t)));
827 /* exlist_list :: [[ ConVarId | ((ConId, [ConVarId])) ]] */
829 for (es = zsnd(iface); nonNull(es); es=tl(es)) {
831 if (whatIs(ent)==I_DATA
832 && isExportedAbstractly ( getIEntityName(ent),
834 Cell data = unap(I_DATA,ent);
835 data = z5ble ( zsel15(data), zsel25(data), zsel35(data),
836 zsel45(data), NIL /* the constr list */ );
837 hd(es) = ap(I_DATA,data);
839 fprintf(stderr, "abstractify data %s\n",
840 textToStr(textOf(getIEntityName(ent))) );
843 else if (whatIs(ent)==I_NEWTYPE
844 && isExportedAbstractly ( getIEntityName(ent),
846 Cell data = unap(I_NEWTYPE,ent);
847 data = z5ble ( zsel15(data), zsel25(data), zsel35(data),
848 zsel45(data), NIL /* the constr-type pair */ );
849 hd(es) = ap(I_NEWTYPE,data);
851 fprintf(stderr, "abstractify newtype %s\n",
852 textToStr(textOf(getIEntityName(ent))) );
857 /* We've finally finished mashing this iface. Update the iface list. */
858 hd(xs) = ap(I_INTERFACE,iface);
862 /* At this point, the interfaces are cleaned up so that no type, data or
863 newtype defn refers to a non-existant type. However, there still may
864 be value defns, classes and instances which refer to unknown types.
865 Delete iteratively until a fixed point is reached.
868 fprintf(stderr,"\n");
870 num_known_types = 999999999;
874 /* Construct a list of all known tycons. This is a list of QualIds.
875 Unfortunately it also has to contain all known class names, since
876 allTypesKnown cannot distinguish between tycons and classes -- a
877 deficiency of the iface abs syntax.
879 all_known_types = getAllKnownTyconsAndClasses();
880 for (xs = ifaces; nonNull(xs); xs=tl(xs))
881 all_known_types = addTyconsAndClassesFromIFace ( hd(xs), all_known_types );
883 /* Have we reached a fixed point? */
884 i = length(all_known_types);
887 "\n------------- %d known types -------------\n", i );
889 if (num_known_types == i) break;
892 /* Delete all entities which refer to unknown tycons. */
893 for (xs = ifaces; nonNull(xs); xs = tl(xs)) {
894 ConId mod = zfst(unap(I_INTERFACE,hd(xs)));
895 assert(nonNull(mod));
897 hd(xs) = filterInterface ( hd(xs),
898 ifentityAllTypesKnown,
899 zpair(all_known_types,mod),
900 ifentityAllTypesKnown_dumpmsg );
905 /* Allocate module table entries and read in object code. */
908 xs=tl(xs), iface_sizes=tl(iface_sizes), iface_onames=tl(iface_onames)) {
909 startGHCModule ( textOf(zfst(unap(I_INTERFACE,hd(xs)))),
910 intOf(hd(iface_sizes)),
913 assert (isNull(iface_sizes));
914 assert (isNull(iface_onames));
917 /* Now work through the decl lists of the modules, and call the
918 startGHC* functions on the entities. This creates names in
919 various tables but doesn't bind them to anything.
922 for (xs = ifaces; nonNull(xs); xs = tl(xs)) {
923 iface = unap(I_INTERFACE,hd(xs));
924 mname = textOf(zfst(iface));
925 mod = findModule(mname);
926 if (isNull(mod)) internal("processInterfaces(4)");
928 ppModule ( module(mod).text );
930 for (decls = zsnd(iface); nonNull(decls); decls = tl(decls)) {
931 Cell decl = hd(decls);
932 switch(whatIs(decl)) {
934 Cell exdecl = unap(I_EXPORT,decl);
935 startGHCExports ( zfst(exdecl), zsnd(exdecl) );
939 Cell imdecl = unap(I_IMPORT,decl);
940 startGHCImports ( zfst(imdecl), zsnd(imdecl) );
947 /* Trying to find the instance table location allocated by
948 startGHCInstance in subsequent processing is a nightmare, so
949 cache it on the tree.
951 Cell instance = unap(I_INSTANCE,decl);
952 Inst in = startGHCInstance ( zsel15(instance), zsel25(instance),
953 zsel35(instance), zsel45(instance) );
954 hd(decls) = ap(I_INSTANCE,
955 z5ble( zsel15(instance), zsel25(instance),
956 zsel35(instance), zsel45(instance), in ));
960 Cell tydecl = unap(I_TYPE,decl);
961 startGHCSynonym ( zsel14(tydecl), zsel24(tydecl),
962 zsel34(tydecl), zsel44(tydecl) );
966 Cell ddecl = unap(I_DATA,decl);
967 startGHCDataDecl ( zsel15(ddecl), zsel25(ddecl),
968 zsel35(ddecl), zsel45(ddecl), zsel55(ddecl) );
972 Cell ntdecl = unap(I_NEWTYPE,decl);
973 startGHCNewType ( zsel15(ntdecl), zsel25(ntdecl),
974 zsel35(ntdecl), zsel45(ntdecl),
979 Cell klass = unap(I_CLASS,decl);
980 startGHCClass ( zsel15(klass), zsel25(klass),
981 zsel35(klass), zsel45(klass),
986 Cell value = unap(I_VALUE,decl);
987 startGHCValue ( zfst3(value), zsnd3(value), zthd3(value) );
991 internal("processInterfaces(1)");
997 fprintf(stderr, "\n============================"
998 "=============================\n");
999 fprintf(stderr, "=============================="
1000 "===========================\n");
1003 /* Traverse again the decl lists of the modules, this time
1004 calling the finishGHC* functions. But don't process
1005 the export lists; those must wait for later.
1009 constructor_list = NIL;
1010 for (xs = ifaces; nonNull(xs); xs = tl(xs)) {
1011 iface = unap(I_INTERFACE,hd(xs));
1012 mname = textOf(zfst(iface));
1013 mod = findModule(mname);
1014 if (isNull(mod)) internal("processInterfaces(3)");
1016 ppModule ( module(mod).text );
1018 if (mname == textPrelude) didPrelude = TRUE;
1020 for (decls = zsnd(iface); nonNull(decls); decls = tl(decls)) {
1021 Cell decl = hd(decls);
1022 switch(whatIs(decl)) {
1030 Cell fixdecl = unap(I_FIXDECL,decl);
1031 finishGHCFixdecl ( zfst3(fixdecl), zsnd3(fixdecl), zthd3(fixdecl) );
1035 Cell instance = unap(I_INSTANCE,decl);
1036 finishGHCInstance ( zsel55(instance) );
1040 Cell tydecl = unap(I_TYPE,decl);
1041 finishGHCSynonym ( zsel24(tydecl) );
1045 Cell ddecl = unap(I_DATA,decl);
1046 List constrs = finishGHCDataDecl ( zsel35(ddecl) );
1047 constructor_list = appendOnto ( constrs, constructor_list );
1051 Cell ntdecl = unap(I_NEWTYPE,decl);
1052 finishGHCNewType ( zsel35(ntdecl) );
1056 Cell klass = unap(I_CLASS,decl);
1057 Class cls = finishGHCClass ( zsel35(klass) );
1058 cls_list = cons(cls,cls_list);
1062 Cell value = unap(I_VALUE,decl);
1063 finishGHCValue ( zsnd3(value) );
1067 internal("processInterfaces(2)");
1072 fprintf(stderr, "\n+++++++++++++++++++++++++++++"
1073 "++++++++++++++++++++++++++++\n");
1074 fprintf(stderr, "+++++++++++++++++++++++++++++++"
1075 "++++++++++++++++++++++++++\n");
1078 /* Build the module(m).export lists for each module, by running
1079 through the export lists in the iface. Also, do the implicit
1080 'import Prelude' thing. And finally, do the object code
1083 for (xs = ifaces; nonNull(xs); xs = tl(xs))
1084 finishGHCModule(hd(xs));
1086 mapProc(visitClass,cls_list);
1087 mapProc(ifSetClassDefaultsAndDCon,cls_list);
1088 mapProc(ifLinkConstrItbl,constructor_list);
1091 ifaces_outstanding = NIL;
1097 /* --------------------------------------------------------------------------
1099 * ------------------------------------------------------------------------*/
1101 static void startGHCModule_errMsg ( char* msg )
1103 fprintf ( stderr, "object error: %s\n", msg );
1106 static void* startGHCModule_clientLookup ( char* sym )
1109 /* fprintf ( stderr, "CLIENTLOOKUP %s\n", sym ); */
1111 return lookupObjName ( sym );
1114 static ObjectCode* startGHCModule_partial_load ( String objNm, Int objSz )
1117 = ocNew ( startGHCModule_errMsg,
1118 startGHCModule_clientLookup,
1122 ERRMSG(0) "Storage allocation for object file \"%s\" failed", objNm
1125 if (!ocLoadImage(oc,VERBOSE)) {
1126 ERRMSG(0) "Reading of object file \"%s\" failed", objNm
1129 if (!ocVerifyImage(oc,VERBOSE)) {
1130 ERRMSG(0) "Validation of object file \"%s\" failed", objNm
1133 if (!ocGetNames(oc,VERBOSE)) {
1134 ERRMSG(0) "Reading of symbol names in object file \"%s\" failed", objNm
1140 static Void startGHCModule ( Text mname, Int sizeObj, Text nameObj )
1143 Module m = findModule(mname);
1146 m = newModule(mname);
1148 fprintf ( stderr, "startGHCIface: name %16s objsize %d\n",
1149 textToStr(mname), sizeObj );
1152 if (module(m).fake) {
1153 module(m).fake = FALSE;
1155 ERRMSG(0) "Module \"%s\" already loaded", textToStr(mname)
1160 /* Get hold of the primary object for the module. */
1162 = startGHCModule_partial_load ( textToStr(nameObj), sizeObj );
1164 /* and any extras ... */
1165 for (xts = module(m).objectExtraNames; nonNull(xts); xts=tl(xts)) {
1169 String nm = getExtraObjectInfo ( textToStr(nameObj),
1173 ERRMSG(0) "Can't find extra object file \"%s\"", nm
1176 oc = startGHCModule_partial_load ( nm, size );
1177 oc->next = module(m).objectExtras;
1178 module(m).objectExtras = oc;
1183 /* For the module mod, augment both the export environment (.exports)
1184 and the eval environment (.names, .tycons, .classes)
1185 with the symbols mentioned in exlist. We don't actually need
1186 to modify the names, tycons, classes or instances in the eval
1187 environment, since previous processing of the
1188 top-level decls in the iface should have done this already.
1190 mn is the module mentioned in the export list; it is the "original"
1191 module for the symbols in the export list. We should also record
1192 this info with the symbols, since references to object code need to
1193 refer to the original module in which a symbol was defined, rather
1194 than to some module it has been imported into and then re-exported.
1196 We take the policy that if something mentioned in an export list
1197 can't be found in the symbol tables, it is simply ignored. After all,
1198 previous processing of the iface syntax trees has already removed
1199 everything which Hugs can't handle, so if there is mention of these
1200 things still lurking in export lists somewhere, about the only thing
1201 to do is to ignore it.
1203 Also do an implicit 'import Prelude' thingy for the module,
1208 static Void finishGHCModule ( Cell root )
1210 /* root :: I_INTERFACE */
1211 Cell iface = unap(I_INTERFACE,root);
1212 ConId iname = zfst(iface);
1213 Module mod = findModule(textOf(iname));
1214 List exlist_list = NIL;
1219 fprintf(stderr, "begin finishGHCModule %s\n", textToStr(textOf(iname)));
1222 if (isNull(mod)) internal("finishExports(1)");
1225 exlist_list = getExportDeclsInIFace ( root );
1226 /* exlist_list :: [I_EXPORT] */
1228 for (; nonNull(exlist_list); exlist_list=tl(exlist_list)) {
1229 ZPair exdecl = unap(I_EXPORT,hd(exlist_list));
1230 ConId exmod = zfst(exdecl);
1231 List exlist = zsnd(exdecl);
1232 /* exlist :: [ ConVarId | ((ConId, [ConVarId])) ] */
1234 for (; nonNull(exlist); exlist=tl(exlist)) {
1239 Cell ex = hd(exlist);
1241 switch (whatIs(ex)) {
1243 case VARIDCELL: /* variable */
1244 q = mkQualId(exmod,ex);
1245 c = findQualNameWithoutConsultingExportList ( q );
1246 if (isNull(c)) goto notfound;
1248 fprintf(stderr, " var %s\n", textToStr(textOf(ex)) );
1250 module(mod).exports = cons(c, module(mod).exports);
1254 case CONIDCELL: /* non data tycon */
1255 q = mkQualId(exmod,ex);
1256 c = findQualTyconWithoutConsultingExportList ( q );
1257 if (isNull(c)) goto notfound;
1259 fprintf(stderr, " type %s\n", textToStr(textOf(ex)) );
1261 module(mod).exports = cons(pair(c,NIL), module(mod).exports);
1265 case ZTUP2: /* data T = C1 ... Cn or class C where f1 ... fn */
1266 subents = zsnd(ex); /* :: [ConVarId] */
1267 ex = zfst(ex); /* :: ConId */
1268 q = mkQualId(exmod,ex);
1269 c = findQualTyconWithoutConsultingExportList ( q );
1271 if (nonNull(c)) { /* data */
1273 fprintf(stderr, " data/newtype %s = { ",
1274 textToStr(textOf(ex)) );
1276 assert(tycon(c).what == DATATYPE || tycon(c).what==NEWTYPE);
1277 abstract = isNull(tycon(c).defn);
1278 /* This data/newtype could be abstract even tho the export list
1279 says to export it non-abstractly. That happens if it was
1280 imported from some other module and is now being re-exported,
1281 and previous cleanup phases have abstractified it in the
1282 original (defining) module.
1285 module(mod).exports = cons(pair(c,NIL), module(mod).exports);
1288 fprintf ( stderr, "(abstract) ");
1291 module(mod).exports = cons(pair(c,DOTDOT), module(mod).exports);
1293 for (; nonNull(subents); subents = tl(subents)) {
1294 Cell ent2 = hd(subents);
1295 assert(isCon(ent2) || isVar(ent2));
1296 /* isVar since could be a field name */
1297 q = mkQualId(exmod,ent2);
1298 c = findQualNameWithoutConsultingExportList ( q );
1300 fprintf(stderr, "%s ", textToStr(name(c).text));
1303 /* module(mod).exports = cons(c, module(mod).exports); */
1308 fprintf(stderr, "}\n" );
1310 } else { /* class */
1311 q = mkQualId(exmod,ex);
1312 c = findQualClassWithoutConsultingExportList ( q );
1313 if (isNull(c)) goto notfound;
1315 fprintf(stderr, " class %s { ", textToStr(textOf(ex)) );
1317 module(mod).exports = cons(pair(c,DOTDOT), module(mod).exports);
1319 for (; nonNull(subents); subents = tl(subents)) {
1320 Cell ent2 = hd(subents);
1321 assert(isVar(ent2));
1322 q = mkQualId(exmod,ent2);
1323 c = findQualNameWithoutConsultingExportList ( q );
1325 fprintf(stderr, "%s ", textToStr(name(c).text));
1327 if (isNull(c)) goto notfound;
1328 /* module(mod).exports = cons(c, module(mod).exports); */
1332 fprintf(stderr, "}\n" );
1338 internal("finishExports(2)");
1341 continue; /* so notfound: can be placed after this */
1344 /* q holds what ain't found */
1345 assert(whatIs(q)==QUALIDENT);
1347 fprintf( stderr, " ------ IGNORED: %s.%s\n",
1348 textToStr(qmodOf(q)), textToStr(qtextOf(q)) );
1355 if (preludeLoaded) {
1356 /* do the implicit 'import Prelude' thing */
1357 List pxs = module(modulePrelude).exports;
1358 for (; nonNull(pxs); pxs=tl(pxs)) {
1361 switch (whatIs(px)) {
1366 module(mod).names = cons ( px, module(mod).names );
1369 module(mod).tycons = cons ( px, module(mod).tycons );
1372 module(mod).classes = cons ( px, module(mod).classes );
1375 fprintf(stderr, "finishGHCModule: unknown tag %d\n", whatIs(px));
1376 internal("finishGHCModule -- implicit import Prelude");
1383 /* Last, but by no means least ... */
1384 if (!ocResolve(module(mod).object,VERBOSE))
1385 internal("finishGHCModule: object resolution failed");
1387 for (oc=module(mod).objectExtras; oc; oc=oc->next) {
1388 if (!ocResolve(oc, VERBOSE))
1389 internal("finishGHCModule: extra object resolution failed");
1394 /* --------------------------------------------------------------------------
1396 * ------------------------------------------------------------------------*/
1398 static Void startGHCExports ( ConId mn, List exlist )
1401 fprintf(stderr,"startGHCExports %s\n", textToStr(textOf(mn)) );
1403 /* Nothing to do. */
1406 static Void finishGHCExports ( ConId mn, List exlist )
1409 fprintf(stderr,"finishGHCExports %s\n", textToStr(textOf(mn)) );
1411 /* Nothing to do. */
1415 /* --------------------------------------------------------------------------
1417 * ------------------------------------------------------------------------*/
1419 static Void startGHCImports ( ConId mn, List syms )
1420 /* nm the module to import from */
1421 /* syms [ConId | VarId] -- the names to import */
1424 fprintf(stderr,"startGHCImports %s\n", textToStr(textOf(mn)) );
1426 /* Nothing to do. */
1430 static Void finishGHCImports ( ConId nm, List syms )
1431 /* nm the module to import from */
1432 /* syms [ConId | VarId] -- the names to import */
1435 fprintf(stderr,"finishGHCImports %s\n", textToStr(textOf(nm)) );
1437 /* Nothing to do. */
1441 /* --------------------------------------------------------------------------
1443 * ------------------------------------------------------------------------*/
1445 static Void finishGHCFixdecl ( Cell prec, Cell assoc, ConVarId name )
1447 Int p = intOf(prec);
1448 Int a = intOf(assoc);
1449 Name n = findName(textOf(name));
1450 assert (nonNull(n));
1451 name(n).syntax = mkSyntax ( a, p );
1455 /* --------------------------------------------------------------------------
1457 * ------------------------------------------------------------------------*/
1459 /* convert a leading run of DICTAPs into Hugs' internal Qualtype form, viz:
1460 { C1 a } -> { C2 b } -> T into
1461 ap(QUALTYPE, ( [(C1,a),(C2,b)], T ))
1463 static Type dictapsToQualtype ( Type ty )
1466 List preds, dictaps;
1468 /* break ty into pieces at the top-level arrows */
1469 while (isAp(ty) && isAp(fun(ty)) && fun(fun(ty))==typeArrow) {
1470 pieces = cons ( arg(fun(ty)), pieces );
1473 pieces = cons ( ty, pieces );
1474 pieces = reverse ( pieces );
1477 while (nonNull(pieces) && whatIs(hd(pieces))==DICTAP) {
1478 dictaps = cons ( hd(pieces), dictaps );
1479 pieces = tl(pieces);
1482 /* dictaps holds the predicates, backwards */
1483 /* pieces holds the remainder of the type, forwards */
1484 assert(nonNull(pieces));
1485 pieces = reverse(pieces);
1487 pieces = tl(pieces);
1488 for (; nonNull(pieces); pieces=tl(pieces))
1489 ty = fn(hd(pieces),ty);
1492 for (; nonNull(dictaps); dictaps=tl(dictaps)) {
1493 Cell da = hd(dictaps);
1494 QualId cl = fst(unap(DICTAP,da));
1495 Cell arg = snd(unap(DICTAP,da));
1496 preds = cons ( pair(cl,arg), preds );
1499 if (nonNull(preds)) ty = ap(QUAL, pair(preds,ty));
1505 static void startGHCValue ( Int line, VarId vid, Type ty )
1509 Text v = textOf(vid);
1512 fprintf(stderr,"begin startGHCValue %s\n", textToStr(v));
1517 if (nonNull(n) && name(n).defn != PREDEFINED) {
1518 ERRMSG(line) "Attempt to redefine variable \"%s\"", textToStr(v)
1521 if (isNull(n)) n = newName(v,NIL);
1523 ty = dictapsToQualtype(ty);
1525 tvs = ifTyvarsIn(ty);
1526 for (tmp=tvs; nonNull(tmp); tmp=tl(tmp))
1527 hd(tmp) = zpair(hd(tmp),STAR);
1529 ty = mkPolyType(tvsToKind(tvs),ty);
1531 ty = tvsToOffsets(line,ty,tvs);
1533 name(n).arity = arityInclDictParams(ty);
1534 name(n).line = line;
1539 static void finishGHCValue ( VarId vid )
1541 Name n = findName ( textOf(vid) );
1542 Int line = name(n).line;
1544 fprintf(stderr, "begin finishGHCValue %s\n", textToStr(name(n).text) );
1546 assert(currentModule == name(n).mod);
1547 name(n).type = conidcellsToTycons(line,name(n).type);
1549 if (isIfaceDefaultMethodName(name(n).text)) {
1550 /* ... we need to set .parent to point to the class
1551 ... once we figure out what the class actually is :-)
1553 Type t = name(n).type;
1554 assert(isPolyType(t));
1555 if (isPolyType(t)) t = monotypeOf(t);
1556 assert(isQualType(t));
1557 t = fst(snd(t)); /* t :: [(Class,Offset)] */
1559 assert(nonNull(hd(t)));
1560 assert(isPair(hd(t)));
1561 t = fst(hd(t)); /* t :: Class */
1564 name(n).parent = t; /* phew! */
1569 /* --------------------------------------------------------------------------
1571 * ------------------------------------------------------------------------*/
1573 static Void startGHCSynonym ( Int line, ConId tycon, List tvs, Type ty )
1575 /* tycon :: ConId */
1576 /* tvs :: [((VarId,Kind))] */
1578 Text t = textOf(tycon);
1580 fprintf(stderr, "begin startGHCSynonym %s\n", textToStr(t) );
1583 if (nonNull(findTycon(t))) {
1584 ERRMSG(line) "Repeated definition of type constructor \"%s\"",
1588 Tycon tc = newTycon(t);
1589 tycon(tc).line = line;
1590 tycon(tc).arity = length(tvs);
1591 tycon(tc).what = SYNONYM;
1592 tycon(tc).kind = tvsToKind(tvs);
1594 /* prepare for finishGHCSynonym */
1595 tycon(tc).defn = tvsToOffsets(line,ty,tvs);
1600 static Void finishGHCSynonym ( ConId tyc )
1602 Tycon tc = findTycon(textOf(tyc));
1603 Int line = tycon(tc).line;
1605 fprintf(stderr, "begin finishGHCSynonym %s\n", textToStr(textOf(tyc)) );
1608 assert (currentModule == tycon(tc).mod);
1609 // setCurrModule(tycon(tc).mod);
1610 tycon(tc).defn = conidcellsToTycons(line,tycon(tc).defn);
1612 /* (ADR) ToDo: can't really do this until I've done all synonyms
1613 * and then I have to do them in order
1614 * tycon(tc).defn = fullExpand(ty);
1615 * (JRS) What?!?! i don't understand
1620 /* --------------------------------------------------------------------------
1622 * ------------------------------------------------------------------------*/
1624 static Void startGHCDataDecl(line,ctx0,tycon,ktyvars,constrs0)
1626 List ctx0; /* [((QConId,VarId))] */
1627 Cell tycon; /* ConId */
1628 List ktyvars; /* [((VarId,Kind))] */
1629 List constrs0; /* [((ConId,[((Type,VarId,Int))]))] */
1630 /* The Text is an optional field name
1631 The Int indicates strictness */
1632 /* ToDo: worry about being given a decl for (->) ?
1633 * and worry about qualidents for ()
1636 Type ty, resTy, selTy, conArgTy;
1637 List tmp, conArgs, sels, constrs, fields, tyvarsMentioned;
1641 Pair conArg, ctxElem;
1643 Int conArgStrictness;
1645 Text t = textOf(tycon);
1647 fprintf(stderr, "begin startGHCDataDecl %s\n",textToStr(t));
1651 if (nonNull(findTycon(t))) {
1652 ERRMSG(line) "Repeated definition of type constructor \"%s\"",
1656 Tycon tc = newTycon(t);
1658 tycon(tc).line = line;
1659 tycon(tc).arity = length(ktyvars);
1660 tycon(tc).kind = tvsToKind(ktyvars);
1661 tycon(tc).what = DATATYPE;
1663 /* a list to accumulate selectors in :: [((VarId,Type))] */
1666 /* make resTy the result type of the constr, T v1 ... vn */
1668 for (tmp=ktyvars; nonNull(tmp); tmp=tl(tmp))
1669 resTy = ap(resTy,zfst(hd(tmp)));
1671 /* for each constructor ... */
1672 for (constrs=constrs0; nonNull(constrs); constrs=tl(constrs)) {
1673 constr = hd(constrs);
1674 conid = zfst(constr);
1675 fields = zsnd(constr);
1677 /* Build type of constr and handle any selectors found.
1678 Also collect up tyvars occurring in the constr's arg
1679 types, so we can throw away irrelevant parts of the
1683 tyvarsMentioned = NIL;
1684 /* tyvarsMentioned :: [VarId] */
1686 conArgs = reverse(fields);
1687 for (; nonNull(conArgs); conArgs=tl(conArgs)) {
1688 conArg = hd(conArgs); /* (Type,Text) */
1689 conArgTy = zfst3(conArg);
1690 conArgNm = zsnd3(conArg);
1691 conArgStrictness = intOf(zthd3(conArg));
1692 tyvarsMentioned = dupListOnto(ifTyvarsIn(conArgTy),
1694 if (conArgStrictness > 0) conArgTy = bang(conArgTy);
1695 ty = fn(conArgTy,ty);
1696 if (nonNull(conArgNm)) {
1697 /* a field name is mentioned too */
1698 selTy = fn(resTy,conArgTy);
1699 if (whatIs(tycon(tc).kind) != STAR)
1700 selTy = pair(POLYTYPE,pair(tycon(tc).kind, selTy));
1701 selTy = tvsToOffsets(line,selTy, ktyvars);
1702 sels = cons( zpair(conArgNm,selTy), sels);
1706 /* Now ty is the constructor's type, not including context.
1707 Throw away any parts of the context not mentioned in
1708 tyvarsMentioned, and use it to qualify ty.
1711 for (ctx=ctx0; nonNull(ctx); ctx=tl(ctx)) {
1713 /* ctxElem :: ((QConId,VarId)) */
1714 if (nonNull(cellIsMember(textOf(zsnd(ctxElem)),tyvarsMentioned)))
1715 ctx2 = cons(ctxElem, ctx2);
1718 ty = ap(QUAL,pair(ctx2,ty));
1720 /* stick the tycon's kind on, if not simply STAR */
1721 if (whatIs(tycon(tc).kind) != STAR)
1722 ty = pair(POLYTYPE,pair(tycon(tc).kind, ty));
1724 ty = tvsToOffsets(line,ty, ktyvars);
1726 /* Finally, stick the constructor's type onto it. */
1727 hd(constrs) = ztriple(conid,fields,ty);
1730 /* Final result is that
1731 constrs :: [((ConId,[((Type,Text))],Type))]
1732 lists the constructors and their types
1733 sels :: [((VarId,Type))]
1734 lists the selectors and their types
1736 tycon(tc).defn = startGHCConstrs(line,constrs0,sels);
1741 static List startGHCConstrs ( Int line, List cons, List sels )
1743 /* cons :: [((ConId,[((Type,Text,Int))],Type))] */
1744 /* sels :: [((VarId,Type))] */
1745 /* returns [Name] */
1747 Int conNo = length(cons)>1 ? 1 : 0;
1748 for(cs=cons; nonNull(cs); cs=tl(cs), conNo++) {
1749 Name c = startGHCConstr(line,conNo,hd(cs));
1752 /* cons :: [Name] */
1754 for(ss=sels; nonNull(ss); ss=tl(ss)) {
1755 hd(ss) = startGHCSel(line,hd(ss));
1757 /* sels :: [Name] */
1758 return appendOnto(cons,sels);
1762 static Name startGHCSel ( Int line, ZPair sel )
1764 /* sel :: ((VarId, Type)) */
1765 Text t = textOf(zfst(sel));
1766 Type type = zsnd(sel);
1768 Name n = findName(t);
1770 ERRMSG(line) "Repeated definition for selector \"%s\"",
1776 name(n).line = line;
1777 name(n).number = SELNAME;
1780 name(n).type = type;
1785 static Name startGHCConstr ( Int line, Int conNo, ZTriple constr )
1787 /* constr :: ((ConId,[((Type,Text,Int))],Type)) */
1788 /* (ADR) ToDo: add rank2 annotation and existential annotation
1789 * these affect how constr can be used.
1791 Text con = textOf(zfst3(constr));
1792 Type type = zthd3(constr);
1793 Int arity = arityFromType(type);
1794 Name n = findName(con); /* Allocate constructor fun name */
1796 n = newName(con,NIL);
1797 } else if (name(n).defn!=PREDEFINED) {
1798 ERRMSG(line) "Repeated definition for constructor \"%s\"",
1802 name(n).arity = arity; /* Save constructor fun details */
1803 name(n).line = line;
1804 name(n).number = cfunNo(conNo);
1805 name(n).type = type;
1810 static List finishGHCDataDecl ( ConId tyc )
1813 Tycon tc = findTycon(textOf(tyc));
1815 fprintf ( stderr, "begin finishGHCDataDecl %s\n",
1816 textToStr(textOf(tyc)) );
1818 if (isNull(tc)) internal("finishGHCDataDecl");
1820 for (nms=tycon(tc).defn; nonNull(nms); nms=tl(nms)) {
1822 Int line = name(n).line;
1823 assert(currentModule == name(n).mod);
1824 name(n).type = conidcellsToTycons(line,name(n).type);
1825 name(n).parent = tc; //---????
1828 return tycon(tc).defn;
1832 /* --------------------------------------------------------------------------
1834 * ------------------------------------------------------------------------*/
1836 static Void startGHCNewType ( Int line, List ctx0,
1837 ConId tycon, List tvs, Cell constr )
1839 /* ctx0 :: [((QConId,VarId))] */
1840 /* tycon :: ConId */
1841 /* tvs :: [((VarId,Kind))] */
1842 /* constr :: ((ConId,Type)) or NIL if abstract */
1845 Text t = textOf(tycon);
1847 fprintf(stderr, "begin startGHCNewType %s\n", textToStr(t) );
1852 if (nonNull(findTycon(t))) {
1853 ERRMSG(line) "Repeated definition of type constructor \"%s\"",
1857 Tycon tc = newTycon(t);
1858 tycon(tc).line = line;
1859 tycon(tc).arity = length(tvs);
1860 tycon(tc).what = NEWTYPE;
1861 tycon(tc).kind = tvsToKind(tvs);
1862 /* can't really do this until I've read in all synonyms */
1864 if (isNull(constr)) {
1865 tycon(tc).defn = NIL;
1867 /* constr :: ((ConId,Type)) */
1868 Text con = textOf(zfst(constr));
1869 Type type = zsnd(constr);
1870 Name n = findName(con); /* Allocate constructor fun name */
1872 n = newName(con,NIL);
1873 } else if (name(n).defn!=PREDEFINED) {
1874 ERRMSG(line) "Repeated definition for constructor \"%s\"",
1878 name(n).arity = 1; /* Save constructor fun details */
1879 name(n).line = line;
1880 name(n).number = cfunNo(0);
1881 name(n).defn = nameId;
1882 tycon(tc).defn = singleton(n);
1884 /* make resTy the result type of the constr, T v1 ... vn */
1886 for (tmp=tvs; nonNull(tmp); tmp=tl(tmp))
1887 resTy = ap(resTy,zfst(hd(tmp)));
1888 type = fn(type,resTy);
1890 type = ap(QUAL,pair(ctx0,type));
1891 type = tvsToOffsets(line,type,tvs);
1892 name(n).type = type;
1898 static Void finishGHCNewType ( ConId tyc )
1900 Tycon tc = findTycon(textOf(tyc));
1902 fprintf ( stderr, "begin finishGHCNewType %s\n",
1903 textToStr(textOf(tyc)) );
1906 if (isNull(tc)) internal("finishGHCNewType");
1908 if (isNull(tycon(tc).defn)) {
1909 /* it's an abstract type */
1911 else if (length(tycon(tc).defn) == 1) {
1912 /* As we expect, has a single constructor */
1913 Name n = hd(tycon(tc).defn);
1914 Int line = name(n).line;
1915 assert(currentModule == name(n).mod);
1916 name(n).type = conidcellsToTycons(line,name(n).type);
1918 internal("finishGHCNewType(2)");
1923 /* --------------------------------------------------------------------------
1924 * Class declarations
1925 * ------------------------------------------------------------------------*/
1927 static Void startGHCClass(line,ctxt,tc_name,kinded_tvs,mems0)
1929 List ctxt; /* [((QConId, VarId))] */
1930 ConId tc_name; /* ConId */
1931 List kinded_tvs; /* [((VarId, Kind))] */
1932 List mems0; { /* [((VarId, Type))] */
1934 List mems; /* [((VarId, Type))] */
1935 List tvsInT; /* [VarId] and then [((VarId,Kind))] */
1936 List tvs; /* [((VarId,Kind))] */
1937 List ns; /* [Name] */
1940 ZPair kinded_tv = hd(kinded_tvs);
1941 Text ct = textOf(tc_name);
1942 Pair newCtx = pair(tc_name, zfst(kinded_tv));
1944 fprintf ( stderr, "begin startGHCClass %s\n", textToStr(ct) );
1948 if (length(kinded_tvs) != 1) {
1949 ERRMSG(line) "Cannot presently handle multiparam type classes in ifaces"
1953 if (nonNull(findClass(ct))) {
1954 ERRMSG(line) "Repeated definition of class \"%s\"",
1957 } else if (nonNull(findTycon(ct))) {
1958 ERRMSG(line) "\"%s\" used as both class and type constructor",
1962 Class nw = newClass(ct);
1963 cclass(nw).text = ct;
1964 cclass(nw).line = line;
1965 cclass(nw).arity = 1;
1966 cclass(nw).head = ap(nw,mkOffset(0));
1967 cclass(nw).kinds = singleton( zsnd(kinded_tv) );
1968 cclass(nw).instances = NIL;
1969 cclass(nw).numSupers = length(ctxt);
1971 /* Kludge to map the single tyvar in the context to Offset 0.
1972 Need to do something better for multiparam type classes.
1974 cclass(nw).supers = tvsToOffsets(line,ctxt,
1975 singleton(kinded_tv));
1978 for (mems=mems0; nonNull(mems); mems=tl(mems)) {
1979 ZPair mem = hd(mems);
1980 Type memT = zsnd(mem);
1981 Text mnt = textOf(zfst(mem));
1984 /* Stick the new context on the member type */
1985 memT = dictapsToQualtype(memT);
1986 if (whatIs(memT)==POLYTYPE) internal("startGHCClass");
1987 if (whatIs(memT)==QUAL) {
1989 pair(cons(newCtx,fst(snd(memT))),snd(snd(memT))));
1992 pair(singleton(newCtx),memT));
1995 /* Cook up a kind for the type. */
1996 tvsInT = ifTyvarsIn(memT);
1997 /* tvsInT :: [VarId] */
1999 /* ToDo: maximally bogus. We allow the class tyvar to
2000 have the kind as supplied by the parser, but we just
2001 assume that all others have kind *. It's a kludge.
2003 for (tvs=tvsInT; nonNull(tvs); tvs=tl(tvs)) {
2005 if (textOf(hd(tvs)) == textOf(zfst(kinded_tv)))
2006 k = zsnd(kinded_tv); else
2008 hd(tvs) = zpair(hd(tvs),k);
2010 /* tvsIntT :: [((VarId,Kind))] */
2012 memT = mkPolyType(tvsToKind(tvsInT),memT);
2013 memT = tvsToOffsets(line,memT,tvsInT);
2015 /* Park the type back on the member */
2016 mem = zpair(zfst(mem),memT);
2018 /* Bind code to the member */
2022 "Repeated definition for class method \"%s\"",
2026 mn = newName(mnt,NIL);
2031 cclass(nw).members = mems0;
2032 cclass(nw).numMembers = length(mems0);
2035 for (mno=0; mno<cclass(nw).numSupers; mno++) {
2036 ns = cons(newDSel(nw,mno),ns);
2038 cclass(nw).dsels = rev(ns);
2043 static Class finishGHCClass ( Tycon cls_tyc )
2048 Class nw = findClass ( textOf(cls_tyc) );
2050 fprintf ( stderr, "begin finishGHCClass %s\n", textToStr(cclass(nw).text) );
2052 if (isNull(nw)) internal("finishGHCClass");
2054 line = cclass(nw).line;
2056 assert (currentModule == cclass(nw).mod);
2058 cclass(nw).level = 0;
2059 cclass(nw).head = conidcellsToTycons(line,cclass(nw).head);
2060 cclass(nw).supers = conidcellsToTycons(line,cclass(nw).supers);
2061 cclass(nw).members = conidcellsToTycons(line,cclass(nw).members);
2063 for (mems=cclass(nw).members; nonNull(mems); mems=tl(mems)) {
2064 Pair mem = hd(mems); /* (VarId, Type) */
2065 Text txt = textOf(fst(mem));
2067 Name n = findName(txt);
2070 name(n).line = cclass(nw).line;
2072 name(n).number = ctr--;
2073 name(n).arity = arityInclDictParams(name(n).type);
2074 name(n).parent = nw;
2082 /* --------------------------------------------------------------------------
2084 * ------------------------------------------------------------------------*/
2086 static Inst startGHCInstance (line,ktyvars,cls,var)
2088 List ktyvars; /* [((VarId,Kind))] */
2089 Type cls; /* Type */
2090 VarId var; { /* VarId */
2091 List tmp, tvs, ks, spec;
2096 Inst in = newInst();
2098 fprintf ( stderr, "begin startGHCInstance\n" );
2103 tvs = ifTyvarsIn(cls); /* :: [VarId] */
2105 The order of tvs is important for tvsToOffsets.
2106 tvs should be a permutation of ktyvars. Fish the tyvar kinds
2107 out of ktyvars and attach them to tvs.
2109 for (xs1=tvs; nonNull(xs1); xs1=tl(xs1)) {
2111 for (xs2=ktyvars; nonNull(xs2); xs2=tl(xs2))
2112 if (textOf(hd(xs1)) == textOf(zfst(hd(xs2))))
2114 if (isNull(k)) internal("startGHCInstance: finding kinds");
2115 hd(xs1) = zpair(hd(xs1),k);
2118 cls = tvsToOffsets(line,cls,tvs);
2121 spec = cons(fun(cls),spec);
2124 spec = reverse(spec);
2126 inst(in).line = line;
2127 inst(in).implements = NIL;
2128 inst(in).kinds = simpleKind(length(tvs)); /* do this right */
2129 inst(in).specifics = spec;
2130 inst(in).numSpecifics = length(spec);
2131 inst(in).head = cls;
2133 /* Figure out the name of the class being instanced, and store it
2134 at inst(in).c. finishGHCInstance will resolve it to a real Class. */
2136 Cell cl = inst(in).head;
2137 assert(whatIs(cl)==DICTAP);
2138 cl = unap(DICTAP,cl);
2140 assert ( isQCon(cl) );
2145 Name b = newName( /*inventText()*/ textOf(var),NIL);
2146 name(b).line = line;
2147 name(b).arity = length(spec); /* unused? */ /* and surely wrong */
2148 name(b).number = DFUNNAME;
2149 name(b).parent = in;
2150 inst(in).builder = b;
2151 /* bindNameToClosure(b, lookupGHCClosure(inst(in).mod,var)); */
2158 static Void finishGHCInstance ( Inst in )
2165 fprintf ( stderr, "begin finishGHCInstance\n" );
2168 assert (nonNull(in));
2169 line = inst(in).line;
2170 assert (currentModule==inst(in).mod);
2172 /* inst(in).c is, prior to finishGHCInstance, a ConId or Tuple,
2173 since startGHCInstance couldn't possibly have resolved it to
2174 a Class at that point. We convert it to a Class now.
2178 c = findQualClassWithoutConsultingExportList(c);
2182 inst(in).head = conidcellsToTycons(line,inst(in).head);
2183 inst(in).specifics = conidcellsToTycons(line,inst(in).specifics);
2184 cclass(c).instances = cons(in,cclass(c).instances);
2188 /* --------------------------------------------------------------------------
2190 * ------------------------------------------------------------------------*/
2192 /* This is called from the startGHC* functions. It traverses a structure
2193 and converts varidcells, ie, type variables parsed by the interface
2194 parser, into Offsets, which is how Hugs wants to see them internally.
2195 The Offset for a type variable is determined by its place in the list
2196 passed as the second arg; the associated kinds are irrelevant.
2198 ((t1,t2)) denotes the typed (z-)pair of t1 and t2.
2201 /* tvsToOffsets :: LineNo -> Type -> [((VarId,Kind))] -> Type */
2202 static Type tvsToOffsets(line,type,ktyvars)
2205 List ktyvars; { /* [((VarId,Kind))] */
2206 switch (whatIs(type)) {
2213 case ZTUP2: /* convert to the untyped representation */
2214 return ap( tvsToOffsets(line,zfst(type),ktyvars),
2215 tvsToOffsets(line,zsnd(type),ktyvars) );
2217 return ap( tvsToOffsets(line,fun(type),ktyvars),
2218 tvsToOffsets(line,arg(type),ktyvars) );
2222 tvsToOffsets(line,monotypeOf(type),ktyvars)
2226 return pair(QUAL,pair(tvsToOffsets(line,fst(snd(type)),ktyvars),
2227 tvsToOffsets(line,snd(snd(type)),ktyvars)));
2228 case DICTAP: /* bogus ?? */
2229 return ap(DICTAP, tvsToOffsets(line,snd(type),ktyvars));
2230 case UNBOXEDTUP: /* bogus?? */
2231 return ap(UNBOXEDTUP, tvsToOffsets(line,snd(type),ktyvars));
2232 case BANG: /* bogus?? */
2233 return ap(BANG, tvsToOffsets(line,snd(type),ktyvars));
2234 case VARIDCELL: /* Ha! some real work to do! */
2236 Text tv = textOf(type);
2237 for (; nonNull(ktyvars); i++,ktyvars=tl(ktyvars)) {
2240 assert(isZPair(hd(ktyvars)));
2241 varid = zfst(hd(ktyvars));
2243 if (tv == tt) return mkOffset(i);
2245 ERRMSG(line) "Undefined type variable \"%s\"", textToStr(tv)
2250 fprintf(stderr, "tvsToOffsets: unknown stuff %d\n", whatIs(type));
2252 fprintf(stderr,"\n");
2256 return NIL; /* NOTREACHED */
2260 /* This is called from the finishGHC* functions. It traverses a structure
2261 and converts conidcells, ie, type constructors parsed by the interface
2262 parser, into Tycons (or Classes), which is how Hugs wants to see them
2263 internally. Calls to this fn have to be deferred to the second phase
2264 of interface loading (finishGHC* rather than startGHC*) so that all relevant
2265 Tycons or Classes have been loaded into the symbol tables and can be
2268 static Type conidcellsToTycons ( Int line, Type type )
2270 switch (whatIs(type)) {
2280 { Cell t; /* Tycon or Class */
2281 Text m = qmodOf(type);
2282 Module mod = findModule(m);
2285 "Undefined module in qualified name \"%s\"",
2290 t = findQualTyconWithoutConsultingExportList(type);
2291 if (nonNull(t)) return t;
2292 t = findQualClassWithoutConsultingExportList(type);
2293 if (nonNull(t)) return t;
2295 "Undefined qualified class or type \"%s\"",
2303 cl = findQualClass(type);
2304 if (nonNull(cl)) return cl;
2305 if (textOf(type)==findText("[]"))
2306 /* a hack; magically qualify [] into PrelBase.[] */
2307 return conidcellsToTycons(line,
2308 mkQualId(mkCon(findText("PrelBase")),type));
2309 tc = findQualTycon(type);
2310 if (nonNull(tc)) return tc;
2312 "Undefined class or type constructor \"%s\"",
2318 return ap( conidcellsToTycons(line,fun(type)),
2319 conidcellsToTycons(line,arg(type)) );
2320 case ZTUP2: /* convert to std pair */
2321 return ap( conidcellsToTycons(line,zfst(type)),
2322 conidcellsToTycons(line,zsnd(type)) );
2327 conidcellsToTycons(line,monotypeOf(type))
2331 return pair(QUAL,pair(conidcellsToTycons(line,fst(snd(type))),
2332 conidcellsToTycons(line,snd(snd(type)))));
2333 case DICTAP: /* :: ap(DICTAP, pair(Class,Type))
2334 Not sure if this is really the right place to
2335 convert it to the form Hugs wants, but will do so anyway.
2337 /* return ap(DICTAP, conidcellsToTycons(line, snd(type))); */
2339 Class cl = fst(unap(DICTAP,type));
2340 List args = snd(unap(DICTAP,type));
2342 conidcellsToTycons(line,pair(cl,args));
2345 return ap(UNBOXEDTUP, conidcellsToTycons(line, snd(type)));
2347 return ap(BANG, conidcellsToTycons(line, snd(type)));
2349 fprintf(stderr, "conidcellsToTycons: unknown stuff %d\n",
2352 fprintf(stderr,"\n");
2356 return NIL; /* NOTREACHED */
2360 /* Find out if a type mentions a type constructor not present in
2361 the supplied list of qualified tycons.
2363 static Bool allTypesKnown ( Type type,
2364 List aktys /* [QualId] */,
2367 switch (whatIs(type)) {
2374 return allTypesKnown(fun(type),aktys,thisMod)
2375 && allTypesKnown(arg(type),aktys,thisMod);
2377 return allTypesKnown(zfst(type),aktys,thisMod)
2378 && allTypesKnown(zsnd(type),aktys,thisMod);
2380 return allTypesKnown(unap(DICTAP,type),aktys,thisMod);
2383 if (textOf(type)==findText("[]"))
2384 /* a hack; magically qualify [] into PrelBase.[] */
2385 type = mkQualId(mkCon(findText("PrelBase")),type); else
2386 type = mkQualId(thisMod,type);
2389 if (isNull(qualidIsMember(type,aktys))) goto missing;
2395 fprintf(stderr, "allTypesKnown: unknown stuff %d\n", whatIs(type));
2396 print(type,10);printf("\n");
2397 internal("allTypesKnown");
2398 return TRUE; /*notreached*/
2402 fprintf ( stderr,"allTypesKnown: unknown " ); print(type,10);
2403 fprintf(stderr,"\n");
2409 /* --------------------------------------------------------------------------
2412 * None of these do lookups or require that lookups have been resolved
2413 * so they can be performed while reading interfaces.
2414 * ------------------------------------------------------------------------*/
2416 /* tvsToKind :: [((VarId,Kind))] -> Kinds */
2417 static Kinds tvsToKind(tvs)
2418 List tvs; { /* [((VarId,Kind))] */
2421 for (rs=reverse(tvs); nonNull(rs); rs=tl(rs)) {
2422 if (whatIs(hd(rs)) != ZTUP2) internal("tvsToKind(1)");
2423 if (whatIs(zfst(hd(rs))) != VARIDCELL) internal("tvsToKind(2)");
2424 r = ap(zsnd(hd(rs)),r);
2430 static Int arityInclDictParams ( Type type )
2433 if (isPolyType(type)) type = monotypeOf(type);
2435 if (whatIs(type) == QUAL)
2437 arity += length ( fst(snd(type)) );
2438 type = snd(snd(type));
2440 while (isAp(type) && getHead(type)==typeArrow) {
2447 /* arity of a constructor with this type */
2448 static Int arityFromType(type)
2451 if (isPolyType(type)) {
2452 type = monotypeOf(type);
2454 if (whatIs(type) == QUAL) {
2455 type = snd(snd(type));
2457 if (whatIs(type) == EXIST) {
2458 type = snd(snd(type));
2460 if (whatIs(type)==RANK2) {
2461 type = snd(snd(type));
2463 while (isAp(type) && getHead(type)==typeArrow) {
2471 /* ifTyvarsIn :: Type -> [VarId]
2472 The returned list has no duplicates -- is a set.
2474 static List ifTyvarsIn(type)
2476 List vs = typeVarsIn(type,NIL,NIL,NIL);
2478 for (; nonNull(vs2); vs2=tl(vs2))
2479 if (whatIs(hd(vs2)) != VARIDCELL)
2480 internal("ifTyvarsIn");
2486 /* --------------------------------------------------------------------------
2487 * General object symbol query stuff
2488 * ------------------------------------------------------------------------*/
2490 #define EXTERN_SYMS_ALLPLATFORMS \
2491 Sym(stg_gc_enter_1) \
2492 Sym(stg_gc_noregs) \
2500 Sym(stg_update_PAP) \
2501 Sym(stg_error_entry) \
2502 Sym(__ap_2_upd_info) \
2503 Sym(__ap_3_upd_info) \
2504 Sym(__ap_4_upd_info) \
2505 Sym(__ap_5_upd_info) \
2506 Sym(__ap_6_upd_info) \
2507 Sym(__ap_7_upd_info) \
2508 Sym(__ap_8_upd_info) \
2509 Sym(__sel_0_upd_info) \
2510 Sym(__sel_1_upd_info) \
2511 Sym(__sel_2_upd_info) \
2512 Sym(__sel_3_upd_info) \
2513 Sym(__sel_4_upd_info) \
2514 Sym(__sel_5_upd_info) \
2515 Sym(__sel_6_upd_info) \
2516 Sym(__sel_7_upd_info) \
2517 Sym(__sel_8_upd_info) \
2518 Sym(__sel_9_upd_info) \
2519 Sym(__sel_10_upd_info) \
2520 Sym(__sel_11_upd_info) \
2521 Sym(__sel_12_upd_info) \
2523 Sym(Upd_frame_info) \
2524 Sym(seq_frame_info) \
2525 Sym(CAF_BLACKHOLE_info) \
2526 Sym(IND_STATIC_info) \
2527 Sym(EMPTY_MVAR_info) \
2528 Sym(MUT_ARR_PTRS_FROZEN_info) \
2530 Sym(putMVarzh_fast) \
2531 Sym(newMVarzh_fast) \
2532 Sym(takeMVarzh_fast) \
2537 Sym(killThreadzh_fast) \
2538 Sym(waitReadzh_fast) \
2539 Sym(waitWritezh_fast) \
2540 Sym(CHARLIKE_closure) \
2541 Sym(INTLIKE_closure) \
2542 Sym(suspendThread) \
2544 Sym(stackOverflow) \
2545 Sym(int2Integerzh_fast) \
2546 Sym(stg_gc_unbx_r1) \
2548 Sym(makeForeignObjzh_fast) \
2549 Sym(__encodeDouble) \
2550 Sym(decodeDoublezh_fast) \
2552 Sym(isDoubleInfinite) \
2553 Sym(isDoubleDenormalized) \
2554 Sym(isDoubleNegativeZero) \
2555 Sym(__encodeFloat) \
2556 Sym(decodeFloatzh_fast) \
2558 Sym(isFloatInfinite) \
2559 Sym(isFloatDenormalized) \
2560 Sym(isFloatNegativeZero) \
2561 Sym(__int_encodeFloat) \
2562 Sym(__int_encodeDouble) \
2566 Sym(gcdIntegerzh_fast) \
2567 Sym(newArrayzh_fast) \
2568 Sym(unsafeThawArrayzh_fast) \
2569 Sym(newDoubleArrayzh_fast) \
2570 Sym(newFloatArrayzh_fast) \
2571 Sym(newAddrArrayzh_fast) \
2572 Sym(newWordArrayzh_fast) \
2573 Sym(newIntArrayzh_fast) \
2574 Sym(newCharArrayzh_fast) \
2575 Sym(newMutVarzh_fast) \
2576 Sym(quotRemIntegerzh_fast) \
2577 Sym(quotIntegerzh_fast) \
2578 Sym(remIntegerzh_fast) \
2579 Sym(divExactIntegerzh_fast) \
2580 Sym(divModIntegerzh_fast) \
2581 Sym(timesIntegerzh_fast) \
2582 Sym(minusIntegerzh_fast) \
2583 Sym(plusIntegerzh_fast) \
2584 Sym(addr2Integerzh_fast) \
2585 Sym(mkWeakzh_fast) \
2588 Sym(resetNonBlockingFd) \
2590 Sym(stable_ptr_table) \
2591 Sym(createAdjThunk) \
2592 Sym(shutdownHaskellAndExit) \
2593 Sym(stg_enterStackTop) \
2594 Sym(CAF_UNENTERED_entry) \
2595 Sym(stg_yield_to_Hugs) \
2598 /* needed by libHS_cbits */ \
2637 #define EXTERN_SYMS_cygwin32 \
2638 SymX(GetCurrentProcess) \
2639 SymX(GetProcessTimes) \
2648 Sym(__imp__tzname) \
2649 Sym(__imp__timezone) \
2668 #define EXTERN_SYMS_linux \
2669 Sym(__errno_location) \
2681 #if defined(linux_TARGET_OS)
2682 #define EXTERN_SYMS_THISPLATFORM EXTERN_SYMS_linux
2685 #if defined(solaris2_TARGET_OS)
2686 #define EXTERN_SYMS_THISPLATFORM EXTERN_SYMS_solaris2
2689 #if defined(cygwin32_TARGET_OS)
2690 #define EXTERN_SYMS_THISPLATFORM EXTERN_SYMS_cygwin32
2696 /* entirely bogus claims about types of these symbols */
2697 #define Sym(vvv) extern void (vvv);
2698 #define SymX(vvv) /**/
2699 EXTERN_SYMS_ALLPLATFORMS
2700 EXTERN_SYMS_THISPLATFORM
2705 #define Sym(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
2707 #define SymX(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \
2711 EXTERN_SYMS_ALLPLATFORMS
2712 EXTERN_SYMS_THISPLATFORM
2719 /* A kludge to assist Win32 debugging. */
2720 char* nameFromStaticOPtr ( void* ptr )
2723 for (k = 0; rtsTab[k].nm; k++)
2724 if (ptr == rtsTab[k].ad)
2725 return rtsTab[k].nm;
2730 static void* lookupObjName ( char* nm )
2738 int first_real_char;
2741 strncpy(nm2,nm,200);
2743 /* first see if it's an RTS name */
2744 for (k = 0; rtsTab[k].nm; k++)
2745 if (0==strcmp(nm2,rtsTab[k].nm))
2746 return rtsTab[k].ad;
2748 /* perhaps an extra-symbol ? */
2749 a = lookupOExtraTabName ( nm );
2752 /* if not an RTS name, look in the
2753 relevant module's object symbol table
2755 # if LEADING_UNDERSCORE
2756 first_real_char = 1;
2758 first_real_char = 0;
2760 pp = strchr(nm2+first_real_char, '_');
2761 if (!pp || !isupper(nm2[first_real_char])) goto not_found;
2763 t = unZcodeThenFindText(nm2+first_real_char);
2765 if (isNull(m)) goto not_found;
2767 a = lookupOTabName ( m, nm ); /* RATIONALISE */
2772 "lookupObjName: can't resolve name `%s'\n",
2779 int is_dynamically_loaded_code_or_rodata_ptr ( char* p )
2781 OSectionKind sk = lookupSection(p);
2782 assert (sk != HUGS_SECTIONKIND_NOINFOAVAIL);
2783 return (sk == HUGS_SECTIONKIND_CODE_OR_RODATA);
2787 int is_dynamically_loaded_rwdata_ptr ( char* p )
2789 OSectionKind sk = lookupSection(p);
2790 assert (sk != HUGS_SECTIONKIND_NOINFOAVAIL);
2791 return (sk == HUGS_SECTIONKIND_RWDATA);
2795 int is_not_dynamically_loaded_ptr ( char* p )
2797 OSectionKind sk = lookupSection(p);
2798 assert (sk != HUGS_SECTIONKIND_NOINFOAVAIL);
2799 return (sk == HUGS_SECTIONKIND_OTHER);
2803 /* --------------------------------------------------------------------------
2805 * ------------------------------------------------------------------------*/
2807 Void interface(what)
2810 case POSTPREL: break;
2814 ifaces_outstanding = NIL;
2817 mark(ifaces_outstanding);
2822 /*-------------------------------------------------------------------------*/