Added upstream version.
[vlp.git] / int / genint1.h
1 /*     Loglan82 Compiler&Interpreter
2      Copyright (C) 1993 Institute of Informatics, University of Warsaw
3      Copyright (C)  1993, 1994 LITA, Pau
4      
5      This program is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published by
7      the Free Software Foundation; either version 2 of the License, or
8      (at your option) any later version.
9      
10      This program is distributed in the hope that it will be useful,
11      but WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13      GNU General Public License for more details.
14      
15              You should have received a copy of the GNU General Public License
16              along with this program; if not, write to the Free Software
17              Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
19  contacts:  Andrzej.Salwicki@univ-pau.fr
20
21 or             Andrzej Salwicki
22                 LITA   Departement d'Informatique
23                 Universite de Pau
24                 Avenue de l'Universite
25                 64000 Pau   FRANCE
26                  tel.  ++33 59923154    fax. ++33 59841696
27
28 =======================================================================
29 */
30
31 #if GEN
32 #define word address
33 #endif
34
35
36 /* Appetites of values : */
37 #define APINT           1     /* integer,boolean,string,char */
38 #define APREAL          sizeof(real)/sizeof(word)    /* real */
39 #define APVIRT          4     /*  TO TELL APART A VIRTUAL ADDRESS            */
40                               /*   (ANY REFERENCE TYPE)  FROM ANY OTHER TYPE */
41 #define APREF           2     /* ACTUAL SIZE OF REFERENCE TYPE               */
42 #define APFMTYPE        2     /* FORMAL TYPE VALUE                           */
43 #define APFMPROC        3     /* FORMAL PROCEURE OR FUNCTION VALUE, = APREF+1*/
44 #define APOPCODE        (sizeof(extopcode)+sizeof(word)-1)/sizeof(word)
45
46
47 typedef int bool;
48 #define FALSE           0
49 #define TRUE            1
50
51
52 /* Values identifying types and formal parameters : */
53
54 #define FORMFUNC        7       /* parameter "function" */
55 #define FORMPROC        8       /* parameter "procedure" */
56 #define FORMTYPE        9       /* parameter "type", also formal type */
57 #define PARIN           11      /* parameter "input" */
58 #define PAROUT          12      /* parameter "output" */
59 #define PARINOUT        16      /* parameter "inout" */
60 #define PUREPROCESS     13      /* type PROCESS */
61 #define PURECOROUTINE   14      /* type COROUTINE */
62 #define PRIMITIVETYPE   15      /* simple type */
63 #define CLASSTYPE       17      /* class type */
64 #define FILETYPE        18      /* file type */
65
66
67 /* Values to identify kinds of array elements : */
68
69 #define AINT            -1      /* arrayof integer */
70 #define AREAL           -3      /* arrayof real */
71 #define AVIRT           -2      /* arrayof reference */
72 #define APROCESS        -4      /* process reference implemented as arrayof */
73 #define FILEOBJECT      -11     /* file object */
74 #define SKILLED         -99     /* killed object, only for compactification */
75
76
77 #define DUMMY           -1      /* dummy unit or prefix : SL for main block */
78 #define MAINBLOCK       0       /* main block prototype number */
79 #define MAXPROT         500     /* limit for the number of prototypes */
80
81
82 /* L-code instruction addressing modes : */
83
84 #define GLOBAL          0       /* M[ N ]                */
85 #define LOCAL           1       /* M[ c1+N ]             */
86 #define TEMPLOCAL       2       /* M[ c2+N ]             */
87 #define REMOTE          3       /* M[ M[ K ]+N ]         */
88 #define INDIRECT        4       /* M[ M[ N ] ]           */
89 #define IMMEDIATE       5       /* N                     */
90 #define CONSTANT        6       /* M[ N ]                */
91 #define DOTACCESS       7       /* M[ M[ display+K ]+N ] */
92 #define NOARGUMENT      8       /* ------                */
93
94
95 /* Prototype kind : */
96
97 #define CLASS           0
98 #define RECORD          1
99 #define COROUTINE       2
100 #define PROCESS         3
101 #define BLOCK           4
102 #define PREFBLOCK       5
103 #define FUNCTION        6
104 #define PROCEDURE       7
105 #define HANDLER         8
106
107 #if GEN
108 #define LRECORD    RECORD
109 #define LFUNCTION  FUNCTION
110 #define LPROCEDURE PROCEDURE
111 #endif
112
113
114 #if GEN
115 typedef   int   protaddr ;   /* mainblock..maxprot ; mainblock = 0; */
116                              /* INDIRECT ADDRESS OF PROTOTYPE       */
117 typedef   int   dprotaddr ;  /* PROTADDR + DUMMY                    */
118 typedef   int   protkind ;
119 #else
120 #define protaddr  int
121 #define dprotaddr int
122 #define protkind  int
123 #endif
124
125
126 /* Prototype : */
127
128 typedef struct {
129     dprotaddr slprototype ;   /* PROTOTYPE OF SYNTACTIC FATHER */
130                               /* OR DUMMY FOR THE MAIN BLOCK   */
131     word codeaddr;            /* address of code */
132     word appetite;            /* object's total length */
133     word span;                /* distance from beginning of object to */
134                               /* temporary reference variables */
135     word reflist;             /* beginning and length of table with */
136
137     int lthreflist;           /* offsets of reference values in object; */
138                               /* without SL, DL, CL and temporary values */
139     word parlist;             /* beginning and length of table with */
140     int lthparlist;           /* offsets of parameters */
141
142     word preflist;            /* beginning and length of table with */
143     int lthpreflist;          /* prototype numbers of prefix sequence */
144
145     word lastwill;            /* lastwill code address */
146     word handlerlist;         /* list of handlers, 0 if empty */
147     word virtlist;            /* address of table for conversion: */
148                               /*     virtual number --> prototype */
149
150     /* only for processes : */
151     protaddr  maskbase ;      /* lowest procedure prototype number */
152     int       masksize ;      /* size of RPC mask for that process */
153
154     /* for procedures and functions */
155     int virtnumber;           /* virtual number or -1 if not virtual */
156
157     /* for all : */
158     protkind  kind ;          /* kind of unit */
159
160     /* only for procedures, functions and processes : */
161     word pfdescr;             /* address of table with parameters descr. addresses */
162
163     /* only for functions : */
164     int nrarray;
165     word finaltype;  /* type of result */
166
167 } protdescr,*pointprdsc;
168
169