2 /* --------------------------------------------------------------------------
3 * Load symbols required from the Prelude
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
11 * $Date: 1999/03/09 14:51:08 $
12 * ------------------------------------------------------------------------*/
19 #include "Assembler.h" /* for asmPrimOps and AsmReps */
23 ////Module modulePreludeHugs;
26 Type typeArrow =BOGUS(1); /* Function spaces */
28 Type typeChar =BOGUS(2);
29 Type typeInt =BOGUS(3);
31 Type typeInt64 =BOGUS(4);
33 #ifdef PROVIDE_INTEGER
34 Type typeInteger =BOGUS(5);
37 Type typeWord =BOGUS(6);
40 Type typeAddr =BOGUS(7);
43 Type typePrimArray =BOGUS(8);
44 Type typePrimByteArray =BOGUS(9);
45 Type typeRef =BOGUS(10);
46 Type typePrimMutableArray =BOGUS(11);
47 Type typePrimMutableByteArray =BOGUS(12);
49 Type typeFloat =BOGUS(13);
50 Type typeDouble =BOGUS(14);
52 Type typeStable =BOGUS(15);
55 Type typeWeak =BOGUS(16);
57 #ifdef PROVIDE_FOREIGN
58 Type typeForeign =BOGUS(17);
60 #ifdef PROVIDE_CONCURRENT
61 Type typeThreadId =BOGUS(18);
62 Type typeMVar =BOGUS(19);
65 Type typeList =BOGUS(20);
66 Type typeUnit =BOGUS(21);
67 Type typeString =BOGUS(22);
68 Type typeBool =BOGUS(23);
69 Type typeST =BOGUS(24);
70 Type typeIO =BOGUS(25);
71 Type typeException =BOGUS(26);
73 Class classEq =BOGUS(27); /* `standard' classes */
74 Class classOrd =BOGUS(28);
75 Class classShow =BOGUS(29);
76 Class classRead =BOGUS(30);
77 Class classIx =BOGUS(31);
78 Class classEnum =BOGUS(32);
79 Class classBounded =BOGUS(33);
81 Class classEval =BOGUS(34);
84 Class classReal =BOGUS(35); /* `numeric' classes */
85 Class classIntegral =BOGUS(36);
86 Class classRealFrac =BOGUS(37);
87 Class classRealFloat =BOGUS(38);
88 Class classFractional =BOGUS(39);
89 Class classFloating =BOGUS(40);
90 Class classNum =BOGUS(41);
92 Class classMonad =BOGUS(42); /* Monads and monads with a zero */
93 /*Class classMonad0 =BOGUS();*/
95 List stdDefaults =BOGUS(43); /* standard default values */
97 Name nameTrue =BOGUS(44),
98 nameFalse =BOGUS(45); /* primitive boolean constructors */
99 Name nameNil =BOGUS(46),
100 nameCons =BOGUS(47); /* primitive list constructors */
101 Name nameUnit =BOGUS(48); /* primitive Unit type constructor */
103 Name nameEq =BOGUS(49);
104 Name nameFromInt =BOGUS(50),
105 nameFromDouble =BOGUS(51); /* coercion of numerics */
106 Name nameFromInteger =BOGUS(52);
107 Name nameReturn =BOGUS(53),
108 nameBind =BOGUS(54); /* for translating monad comps */
109 Name nameZero =BOGUS(55); /* for monads with a zero */
111 Name nameStrict =BOGUS(56); /* Members of class Eval */
112 Name nameSeq =BOGUS(57);
115 Name nameId =BOGUS(58);
116 Name nameRunIO =BOGUS(59);
117 Name namePrint =BOGUS(60);
119 Name nameOtherwise =BOGUS(61);
120 Name nameUndefined =BOGUS(62); /* generic undefined value */
122 Name namePmSub =BOGUS(63);
124 Name namePMFail =BOGUS(64);
125 Name namePMFailBUG = BOGUS(666);
126 Name nameEqChar =BOGUS(65);
127 Name nameEqInt =BOGUS(66);
128 #if !OVERLOADED_CONSTANTS
129 Name nameEqInteger =BOGUS(67);
131 Name nameEqDouble =BOGUS(68);
132 Name namePmInt =BOGUS(69);
133 Name namePmInteger =BOGUS(70);
134 Name namePmDouble =BOGUS(71);
135 Name namePmLe =BOGUS(72);
136 Name namePmSubtract =BOGUS(73);
137 Name namePmFromInteger =BOGUS(74);
138 Name nameMkIO =BOGUS(75);
139 Name nameUnpackString =BOGUS(76);
140 Name nameError =BOGUS(77);
141 Name nameInd =BOGUS(78);
143 Name nameAnd =BOGUS(80);
144 Name nameConCmp =BOGUS(82);
145 Name nameCompAux =BOGUS(83);
146 Name nameEnFrTh =BOGUS(84);
147 Name nameEnFrTo =BOGUS(85);
148 Name nameEnFrom =BOGUS(86);
149 Name nameEnFrEn =BOGUS(87);
150 Name nameEnToEn =BOGUS(88);
151 Name nameEnInRng =BOGUS(89);
152 Name nameEnIndex =BOGUS(90);
153 Name nameEnRange =BOGUS(91);
154 Name nameRangeSize =BOGUS(92);
155 Name nameComp =BOGUS(93);
156 Name nameShowField =BOGUS(94);
157 Name nameApp =BOGUS(95);
158 Name nameShowParen =BOGUS(96);
159 Name nameReadParen =BOGUS(97);
160 Name nameLex =BOGUS(98);
161 Name nameReadField =BOGUS(99);
162 Name nameFlip =BOGUS(100);
164 Name namePrimSeq =BOGUS(1000);
165 Name namePrimCatch =BOGUS(1001);
166 Name namePrimRaise =BOGUS(1002);
168 Name nameFromTo =BOGUS(101);
169 Name nameFromThen =BOGUS(102);
170 Name nameFrom =BOGUS(103);
171 Name nameFromThenTo =BOGUS(104);
172 Name nameNegate =BOGUS(105);
174 /* these names are required before we've had a chance to do the right thing */
175 Name nameSel =BOGUS(106);
176 Name nameUnsafeUnpackCString =BOGUS(107);
178 /* constructors used during translation and codegen */
179 Name nameMkC =BOGUS(108); /* Char# -> Char */
180 Name nameMkI =BOGUS(109); /* Int# -> Int */
182 Name nameMkInt64 =BOGUS(110); /* Int64# -> Int64 */
184 #ifdef PROVIDE_INTEGER
185 Name nameMkInteger =BOGUS(111); /* Integer# -> Integer */
188 Name nameMkW =BOGUS(112); /* Word# -> Word */
191 Name nameMkA =BOGUS(113); /* Addr# -> Addr */
193 Name nameMkF =BOGUS(114); /* Float# -> Float */
194 Name nameMkD =BOGUS(115); /* Double# -> Double */
196 Name nameMkPrimArray =BOGUS(116);
197 Name nameMkPrimByteArray =BOGUS(117);
198 Name nameMkRef =BOGUS(118);
199 Name nameMkPrimMutableArray =BOGUS(119);
200 Name nameMkPrimMutableByteArray =BOGUS(120);
202 #ifdef PROVIDE_STABLE
203 Name nameMkStable =BOGUS(121); /* StablePtr# a -> StablePtr a */
206 Name nameMkWeak =BOGUS(122); /* Weak# a -> Weak a */
208 #ifdef PROVIDE_FOREIGN
209 Name nameMkForeign =BOGUS(123); /* ForeignObj# -> ForeignObj */
211 #ifdef PROVIDE_CONCURRENT
212 Name nameMkThreadId =BOGUS(124); /* ThreadId# -> ThreadId */
213 Name nameMkMVar =BOGUS(125); /* MVar# -> MVar */
218 Name nameMinBnd =BOGUS(400);
219 Name nameMaxBnd =BOGUS(401);
220 Name nameCompare =BOGUS(402);
221 Name nameShowsPrec =BOGUS(403);
222 Name nameIndex =BOGUS(404);
223 Name nameReadsPrec =BOGUS(405);
224 Name nameRange =BOGUS(406);
225 Name nameEQ =BOGUS(407);
226 Name nameInRange =BOGUS(408);
227 Name nameGt =BOGUS(409);
228 Name nameLe =BOGUS(410);
229 Name namePlus =BOGUS(411);
230 Name nameMult =BOGUS(412);
231 Name nameMFail =BOGUS(413);
232 Type typeOrdering =BOGUS(414);
233 Module modulePrelude =BOGUS(415);
234 Name nameMap = BOGUS(416);
235 Name nameMinus = BOGUS(417);
237 #define QQ(lval) assert(lval != 0); assert(lval <= -900000); lval
239 /* --------------------------------------------------------------------------
240 * Frequently used type skeletons:
241 * ------------------------------------------------------------------------*/
243 /* ToDo: move these to link.c and call them 'typeXXXX' */
244 Type arrow=BOGUS(500); /* mkOffset(0) -> mkOffset(1) */
245 Type boundPair=BOGUS(500);; /* (mkOffset(0),mkOffset(0)) */
246 Type listof=BOGUS(500);; /* [ mkOffset(0) ] */
247 Type typeVarToVar=BOGUS(500);; /* mkOffset(0) -> mkOffset(0) */
249 Cell predNum=BOGUS(500);; /* Num (mkOffset(0)) */
250 Cell predFractional=BOGUS(500);; /* Fractional (mkOffset(0)) */
251 Cell predIntegral=BOGUS(500);; /* Integral (mkOffset(0)) */
252 Kind starToStar=BOGUS(500);; /* Type -> Type */
253 Cell predMonad=BOGUS(500);; /* Monad (mkOffset(0)) */
255 /* --------------------------------------------------------------------------
257 * ------------------------------------------------------------------------*/
259 static Tycon linkTycon ( String s );
260 static Tycon linkClass ( String s );
261 static Name linkName ( String s );
262 static Void mkTypes ( void );
263 static Name predefinePrim ( String s );
266 static Tycon linkTycon( String s )
268 Tycon tc = findTycon(findText(s));
272 ERRMSG(0) "Prelude does not define standard type \"%s\"", s
276 static Class linkClass( String s )
278 Class cc = findClass(findText(s));
282 ERRMSG(0) "Prelude does not define standard class \"%s\"", s
286 static Name linkName( String s )
288 Name n = findName(findText(s));
292 ERRMSG(0) "Prelude does not define standard name \"%s\"", s
296 static Name predefinePrim ( String s )
299 Text t = findText(s);
302 //fprintf(stderr, "predefinePrim: %s already exists\n", s );
305 name(nm).defn=PREDEFINED;
310 Void linkPreludeTC(void) { /* Hook to tycons and classes in */
311 static Bool initialised = FALSE; /* prelude when first loaded */
315 setCurrModule(modulePrelude);
317 QQ(typeChar ) = linkTycon("Char");
318 QQ(typeInt ) = linkTycon("Int");
320 QQ(typeInt64 ) = linkTycon("Int64");
322 #ifdef PROVIDE_INTEGER
323 QQ(typeInteger ) = linkTycon("Integer");
326 QQ(typeWord ) = linkTycon("Word");
329 QQ(typeAddr ) = linkTycon("Addr");
332 QQ(typePrimArray ) = linkTycon("PrimArray");
333 QQ(typePrimByteArray) = linkTycon("PrimByteArray");
334 QQ(typeRef ) = linkTycon("Ref");
335 QQ(typePrimMutableArray) = linkTycon("PrimMutableArray");
336 QQ(typePrimMutableByteArray) = linkTycon("PrimMutableByteArray");
338 QQ(typeFloat ) = linkTycon("Float");
339 QQ(typeDouble ) = linkTycon("Double");
340 #ifdef PROVIDE_STABLE
341 QQ(typeStable ) = linkTycon("StablePtr");
344 QQ(typeWeak ) = linkTycon("Weak");
346 #ifdef PROVIDE_FOREIGN
347 QQ(typeForeign ) = linkTycon("ForeignObj");
349 #ifdef PROVIDE_CONCURRENT
350 QQ(typeThreadId ) = linkTycon("ThreadId");
351 QQ(typeMVar ) = linkTycon("MVar");
354 QQ(typeBool ) = linkTycon("Bool");
355 QQ(typeST ) = linkTycon("ST");
356 QQ(typeIO ) = linkTycon("IO");
357 QQ(typeException ) = linkTycon("Exception");
358 //qqfail QQ(typeList ) = linkTycon("[]");
359 //qqfail QQ(typeUnit ) = linkTycon("()");
360 QQ(typeString ) = linkTycon("String");
361 QQ(typeOrdering ) = linkTycon("Ordering");
363 QQ(classEq ) = linkClass("Eq");
364 QQ(classOrd ) = linkClass("Ord");
365 QQ(classIx ) = linkClass("Ix");
366 QQ(classEnum ) = linkClass("Enum");
367 QQ(classShow ) = linkClass("Show");
368 QQ(classRead ) = linkClass("Read");
369 QQ(classBounded ) = linkClass("Bounded");
371 classEval = linkClass("Eval");
373 QQ(classReal ) = linkClass("Real");
374 QQ(classIntegral ) = linkClass("Integral");
375 QQ(classRealFrac ) = linkClass("RealFrac");
376 QQ(classRealFloat) = linkClass("RealFloat");
377 QQ(classFractional) = linkClass("Fractional");
378 QQ(classFloating ) = linkClass("Floating");
379 QQ(classNum ) = linkClass("Num");
380 QQ(classMonad ) = linkClass("Monad");
383 stdDefaults = cons(typeDouble,stdDefaults);
385 stdDefaults = cons(typeBignum,stdDefaults);
387 stdDefaults = cons(typeInt,stdDefaults);
391 QQ(nameMkC ) = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
392 QQ(nameMkI ) = addPrimCfunREP(findText("I#"),1,0,INT_REP);
394 QQ(nameMkInt64 ) = addPrimCfunREP(findText("Int64#"),1,0,INT64_REP);
397 QQ(nameMkW ) = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
400 QQ(nameMkA ) = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
402 QQ(nameMkF ) = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
403 QQ(nameMkD ) = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
404 #ifdef PROVIDE_STABLE
405 QQ(nameMkStable ) = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
408 #ifdef PROVIDE_INTEGER
409 QQ(nameMkInteger ) = addPrimCfunREP(findText("Integer#"),1,0,0);
411 #ifdef PROVIDE_FOREIGN
412 QQ(nameMkForeign ) = addPrimCfunREP(findText("Foreign#"),1,0,0);
415 QQ(nameMkWeak ) = addPrimCfunREP(findText("Weak#"),1,0,0);
418 QQ(nameMkPrimArray ) = addPrimCfunREP(findText("PrimArray#"),1,0,0);
419 QQ(nameMkPrimByteArray ) = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
420 QQ(nameMkRef ) = addPrimCfunREP(findText("Ref#"),1,0,0);
421 QQ(nameMkPrimMutableArray ) = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
422 QQ(nameMkPrimMutableByteArray) = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
424 #ifdef PROVIDE_CONCURRENT
425 QQ(nameMkThreadId) = addPrimCfun(findTextREP("ThreadId#"),1,0,0);
426 QQ(nameMkMVar ) = addPrimCfun(findTextREP("MVar#"),1,0,0);
428 /* The following primitives are referred to in derived instances and
429 * hence require types; the following types are a little more general
430 * than we might like, but they are the closest we can get without a
431 * special datatype class.
433 name(nameConCmp).type
434 = mkPolyType(starToStar,fn(aVar,fn(aVar,typeOrdering)));
435 name(nameEnRange).type
436 = mkPolyType(starToStar,fn(boundPair,listof));
437 name(nameEnIndex).type
438 = mkPolyType(starToStar,fn(boundPair,fn(aVar,typeInt)));
439 name(nameEnInRng).type
440 = mkPolyType(starToStar,fn(boundPair,fn(aVar,typeBool)));
441 name(nameEnToEn).type
442 = mkPolyType(starToStar,fn(aVar,fn(typeInt,aVar)));
443 name(nameEnFrEn).type
444 = mkPolyType(starToStar,fn(aVar,typeInt));
445 name(nameEnFrom).type
446 = mkPolyType(starToStar,fn(aVar,listof));
447 name(nameEnFrTo).type
448 = name(nameEnFrTh).type
449 = mkPolyType(starToStar,fn(aVar,fn(aVar,listof)));
451 name(namePrimSeq).type
452 = primType(MONAD_Id, "ab", "b");
453 name(namePrimCatch).type
454 = primType(MONAD_Id, "aH", "a");
455 name(namePrimRaise).type
456 = primType(MONAD_Id, "E", "a");
458 addEvalInst(0,typeArrow,2,NIL); /* Add Eval instances for (->) */
461 for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
463 addEvalInst(0,mkTuple(i),i,NIL);
466 addTupInst(classEq,i);
469 addTupInst(classOrd,i);
472 addTupInst(classIx,i);
475 addTupInst(classShow,i);
478 addTupInst(classRead,i);
481 addTupInst(classBounded,i);
487 static Void mkTypes ( void )
489 //qqfail QQ(arrow ) = fn(aVar,mkOffset(1));
490 //qqfail QQ(listof ) = ap(typeList,aVar);
491 QQ(predNum ) = ap(classNum,aVar);
492 QQ(predFractional) = ap(classFractional,aVar);
493 QQ(predIntegral ) = ap(classIntegral,aVar);
494 QQ(predMonad ) = ap(classMonad,aVar);
497 Void linkPreludeCM(void) { /* Hook to cfuns and mfuns in */
498 static Bool initialised = FALSE; /* prelude when first loaded */
502 ////setCurrModule(modulePreludeHugs);
503 setCurrModule(modulePrelude);
505 QQ(nameFalse ) = linkName("False");
506 QQ(nameTrue ) = linkName("True");
507 //qqfail QQ(nameNil ) = linkName("[]");
508 //qqfail QQ(nameCons ) = linkName(":");
509 //qqfail QQ(nameUnit ) = linkName("()");
511 QQ(nameEq ) = linkName("==");
512 QQ(nameFromInt ) = linkName("fromInt");
513 QQ(nameFromInteger) = linkName("fromInteger");
514 QQ(nameFromDouble) = linkName("fromDouble");
516 nameStrict = linkName("strict");
517 nameSeq = linkName("seq");
519 QQ(nameReturn ) = linkName("return");
520 QQ(nameBind ) = linkName(">>=");
522 QQ(nameLe ) = linkName("<=");
523 QQ(nameGt ) = linkName(">");
524 QQ(nameShowsPrec ) = linkName("showsPrec");
525 QQ(nameReadsPrec ) = linkName("readsPrec");
526 QQ(nameEQ ) = linkName("EQ");
527 QQ(nameCompare ) = linkName("compare");
528 QQ(nameMinBnd ) = linkName("minBound");
529 QQ(nameMaxBnd ) = linkName("maxBound");
530 QQ(nameRange ) = linkName("range");
531 QQ(nameIndex ) = linkName("index");
532 QQ(namePlus ) = linkName("+");
533 QQ(nameMult ) = linkName("*");
534 QQ(nameRangeSize ) = linkName("rangeSize");
535 QQ(nameInRange ) = linkName("inRange");
536 QQ(nameMinus ) = linkName("-");
537 /* These come before calls to implementPrim */
538 for(i=0; i<NUM_TUPLES; ++i) {
544 Void linkPreludeNames(void) { /* Hook to names defined in Prelude */
545 static Bool initialised = FALSE;
550 setCurrModule(modulePrelude);
553 QQ(nameMkIO) = linkName("primMkIO");
554 for (i=0; asmPrimOps[i].name; ++i) {
555 Text t = findText(asmPrimOps[i].name);
556 Name n = findName(t);
562 name(n).type = primType(asmPrimOps[i].monad,
564 asmPrimOps[i].results);
565 name(n).arity = strlen(asmPrimOps[i].args);
566 name(n).primop = &(asmPrimOps[i]);
570 /* static(tidyInfix) */
571 QQ(nameNegate ) = linkName("negate");
573 QQ(nameRunIO ) = linkName("primRunIO");
574 QQ(namePrint ) = linkName("print");
575 /* typechecker (undefined member functions) */
576 //qqfail QQ(nameError ) = linkName("error");
578 //qqfail QQ(nameId ) = linkName("id");
579 QQ(nameOtherwise ) = linkName("otherwise");
580 QQ(nameUndefined ) = linkName("undefined");
583 namePmSub = linkName("primPmSub");
586 ////nameUnpackString = linkName("primUnpackString");
587 ////namePMFail = linkName("primPmFail");
588 QQ(nameEqChar ) = linkName("primEqChar");
589 QQ(nameEqInt ) = linkName("primEqInt");
590 #if !OVERLOADED_CONSTANTS
591 QQ(nameEqInteger ) = linkName("primEqInteger");
592 #endif /* !OVERLOADED_CONSTANTS */
593 QQ(nameEqDouble ) = linkName("primEqDouble");
594 QQ(namePmInt ) = linkName("primPmInt");
595 ////namePmInteger = linkName("primPmInteger");
596 ////namePmDouble = linkName("primPmDouble");
597 ////namePmLe = linkName("primPmLe");
598 ////namePmSubtract = linkName("primPmSubtract");
599 ////namePmFromInteger = linkName("primPmFromInteger");
600 ////QQ(nameMap ) = linkName("map");
605 /* ToDo: fix pFun (or eliminate its use) */
606 #define pFun(n,s) QQ(n) = predefinePrim(s)
608 Void linkControl(what)
615 case INSTALL : linkControl(RESET);
617 modulePrelude = newModule(textPrelude);
618 setCurrModule(modulePrelude);
620 typeArrow = addPrimTycon(findText("(->)"),
621 pair(STAR,pair(STAR,STAR)),
624 /* newtype and USE_NEWTYPE_FOR_DICTS */
628 pFun(nameInd, "_indirect");
629 name(nameInd).number = DFUNNAME;
632 pFun(nameSel, "_SEL");
634 /* strict constructors */
635 pFun(nameFlip, "flip" );
638 pFun(nameFromTo, "enumFromTo");
639 pFun(nameFromThenTo, "enumFromThenTo");
640 pFun(nameFrom, "enumFrom");
641 pFun(nameFromThen, "enumFromThen");
645 pFun(nameReadParen, "readParen");
646 pFun(nameShowParen, "showParen");
647 pFun(nameLex, "lex");
648 pFun(nameEnToEn, "toEnumPR"); //not sure
649 pFun(nameEnFrEn, "fromEnum"); //not sure
650 pFun(nameEnFrom, "enumFrom"); //not sure
651 pFun(nameEnFrTh, "enumFromThen"); //not sure
652 pFun(nameEnFrTo, "enumFromTo"); //not sure
653 pFun(nameEnRange, "range"); //not sure
654 pFun(nameEnIndex, "index"); //not sure
655 pFun(nameEnInRng, "inRange"); //not sure
656 pFun(nameConCmp, "_concmp"); //very not sure
659 pFun(nameCompAux, "primCompAux");
660 pFun(nameMap, "map");
662 /* implementTagToCon */
663 pFun(namePMFail, "primPmFail");
664 pFun(namePMFailBUG, "primPmFailBUG");
665 pFun(nameError, "error");
666 pFun(nameUnpackString, "primUnpackString");
668 /* hooks for handwritten bytecode */
669 pFun(namePrimSeq, "primSeq");
670 pFun(namePrimCatch, "primCatch");
671 pFun(namePrimRaise, "primRaise");
673 StgVar vv = mkStgVar(NIL,NIL);
674 Name n = namePrimSeq;
678 vv = mkStgVar(NIL,NIL);
679 stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
681 stgGlobals=cons(pair(n,vv),stgGlobals);
685 StgVar vv = mkStgVar(NIL,NIL);
686 Name n = namePrimCatch;
690 stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
692 stgGlobals=cons(pair(n,vv),stgGlobals);
695 StgVar vv = mkStgVar(NIL,NIL);
696 Name n = namePrimRaise;
700 stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
702 stgGlobals=cons(pair(n,vv),stgGlobals);
711 /*-------------------------------------------------------------------------*/