Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/gc/build-literals.c
ViewVC logotype

Annotation of /sml/trunk/src/runtime/gc/build-literals.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (view) (download) (as text)

1 : monnier 2 /* build-literals.c
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     */
5 :    
6 :     #include "ml-base.h"
7 :     #include "ml-objects.h"
8 :     #include "heap.h"
9 :    
10 :     /* codes for literals:
11 :     * 0-251 a short string (code is length)
12 :     * 252 a long string (next four bytes are length)
13 :     * 253 a 32-bit float (not used yet)
14 :     * 254 a 64-bit float
15 :     * 255 a 128-bit float (not used yet)
16 :     */
17 :     #define STR0 ((Byte_t)0)
18 :     #define STR1 ((Byte_t)1)
19 :     #define LONG_STR ((Byte_t)252)
20 :     #define REAL32 ((Byte_t)253)
21 :     #define REAL64 ((Byte_t)254)
22 :     #define REAL128 ((Byte_t)255)
23 :    
24 :    
25 :     #define ALLOC_STRING(ap, res, n) { \
26 :     arena_t *__ap = (ap); \
27 :     int __n = (n); \
28 :     int __nwords = BYTES_TO_WORDS(__n); \
29 :     int __allocSz = (((__n & 0x3) == 0) ? __nwords+1 : __nwords); \
30 :     *(__ap->nextw++) = MAKE_DESC(__n, DTAG_string); \
31 :     (res) = PTR_CtoML(__ap->nextw); \
32 :     __ap->nextw += __allocSz; \
33 :     }
34 :    
35 :     /* BuildLiterals:
36 :     *
37 :     * NOTE: we allocate all of the objects in the first generation, and allocate
38 :     * the vector of literals in the allocation space.
39 :     */
40 :     ml_val_t BuildLiterals (ml_state_t *msp, ml_val_t start)
41 :     {
42 :     int nLits = REC_SELINT(start, 0);
43 :     Byte_t b, *p = PTR_MLtoC(Byte_t, start) + WORD_SZB;
44 :     int i;
45 :     ml_val_t *lits, lit, res;
46 :     gen_t *gen1 = msp->ml_heap->gen[0];
47 :     arena_t *ap = gen1->arena[STRING_INDX];
48 :    
49 :     /** Should check the amount of space needed and the amount that is available **/
50 :    
51 :     lits = NEW_VEC(ml_val_t, nLits);
52 :     for (i = 0; i < nLits; i++) {
53 :     switch (b = (*p++)) {
54 :     case STR0:
55 :     lit = ML_string0;
56 :     break;
57 :     #ifdef CHAR_TABLE
58 :     case STR1:
59 :     lit = CharTbl[*p++];
60 :     break;
61 :     #endif
62 :     case LONG_STR: {
63 :     int len;
64 :     len = p[0]<<24 + p[1]<<16 + p[2]<<8 + p[3];
65 :     p += 4;
66 :     ALLOC_STRING(ap, lit, len);
67 :     strncpy (PTR_MLtoC(char, lit), p, len);
68 :     p += len;
69 :     } break;
70 :     case REAL32:
71 :     Die ("Real32 not supported");
72 :     break;
73 :     case REAL64: {
74 :     #ifdef ALIGN_REALDS
75 :     /* Force REALD_SZB alignment (descriptor is off by one word) */
76 :     ap->nextw = (ml_val_t *)((Addr_t)(ap->nextw) | WORD_SZB);
77 :     #endif
78 :     *ap->nextw++ = DESC_reald;
79 :     memcpy (ap->nextw, p, REALD_SZB);
80 :     ap->nextw += REALD_SZB;
81 :     } break;
82 :     case REAL128:
83 :     Die ("Real128 not supported");
84 :     break;
85 :     default:
86 :     ASSERT ((0 <= b) && (b < LONG_STR));
87 :     ALLOC_STRING(ap, lit, b);
88 :     strncpy (PTR_MLtoC(char, lit), p, b);
89 :     p += b;
90 :     break;
91 :     }
92 :     lits[i] = lit;
93 :     }
94 :    
95 :     ML_AllocWrite(msp, 0, MAKE_DESC(nLits, DTAG_record));
96 :     for (i = 0; i < nLits; i++) {
97 :     ML_AllocWrite(msp, i+1, lits[i]);
98 :     }
99 :     res = ML_Alloc(msp, nLits);
100 :    
101 :     FREE(lits);
102 :    
103 :     return res;
104 :    
105 :     } /* end of BuildLiterals */
106 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0