fixes, added some standard functions to handle LONGREAL, LONGINT
This commit is contained in:
parent
86c5c56a38
commit
bb9b16ab50
17 changed files with 210 additions and 48 deletions
62
lang/m2/comp/.distr
Normal file
62
lang/m2/comp/.distr
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
LLlex.c
|
||||||
|
LLlex.h
|
||||||
|
LLmessage.c
|
||||||
|
Makefile
|
||||||
|
Parameters
|
||||||
|
Resolve
|
||||||
|
SYSTEM.h
|
||||||
|
Version.c
|
||||||
|
casestat.C
|
||||||
|
char.tab
|
||||||
|
chk_expr.c
|
||||||
|
chk_expr.h
|
||||||
|
class.h
|
||||||
|
code.c
|
||||||
|
const.h
|
||||||
|
cstoper.c
|
||||||
|
debug.h
|
||||||
|
declar.g
|
||||||
|
def.H
|
||||||
|
def.c
|
||||||
|
defmodule.c
|
||||||
|
desig.c
|
||||||
|
desig.h
|
||||||
|
em_m2.6
|
||||||
|
enter.c
|
||||||
|
error.c
|
||||||
|
expression.g
|
||||||
|
f_info.h
|
||||||
|
idf.c
|
||||||
|
idf.h
|
||||||
|
input.c
|
||||||
|
input.h
|
||||||
|
lookup.c
|
||||||
|
main.c
|
||||||
|
main.h
|
||||||
|
make.allocd
|
||||||
|
make.hfiles
|
||||||
|
make.next
|
||||||
|
make.tokcase
|
||||||
|
make.tokfile
|
||||||
|
misc.c
|
||||||
|
misc.h
|
||||||
|
modula-2.1
|
||||||
|
nmclash.c
|
||||||
|
node.H
|
||||||
|
node.c
|
||||||
|
options.c
|
||||||
|
program.g
|
||||||
|
scope.C
|
||||||
|
scope.h
|
||||||
|
standards.h
|
||||||
|
statement.g
|
||||||
|
tab.c
|
||||||
|
tmpvar.C
|
||||||
|
tokenname.c
|
||||||
|
tokenname.h
|
||||||
|
type.H
|
||||||
|
type.c
|
||||||
|
typequiv.c
|
||||||
|
walk.c
|
||||||
|
walk.h
|
||||||
|
warning.h
|
|
@ -59,7 +59,8 @@ SkipComment()
|
||||||
/* Foreign; This definition module has an
|
/* Foreign; This definition module has an
|
||||||
implementation in another language.
|
implementation in another language.
|
||||||
In this case, don't generate prefixes in front
|
In this case, don't generate prefixes in front
|
||||||
of the names
|
of the names. Also, don't generate call to
|
||||||
|
initialization routine.
|
||||||
*/
|
*/
|
||||||
ForeignFlag = 1;
|
ForeignFlag = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -359,7 +360,7 @@ again:
|
||||||
have to read the number with the help of a rather
|
have to read the number with the help of a rather
|
||||||
complex finite automaton.
|
complex finite automaton.
|
||||||
*/
|
*/
|
||||||
enum statetp {Oct,Hex,Dec,OctEndOrHex,End,OptReal,Real};
|
enum statetp {Oct,OptHex,Hex,Dec,OctEndOrHex,End,OptReal,Real};
|
||||||
register enum statetp state;
|
register enum statetp state;
|
||||||
register int base;
|
register int base;
|
||||||
register char *np = &buf[1];
|
register char *np = &buf[1];
|
||||||
|
@ -390,7 +391,8 @@ again:
|
||||||
}
|
}
|
||||||
LoadChar(ch);
|
LoadChar(ch);
|
||||||
}
|
}
|
||||||
if (is_hex(ch)) state = Hex;
|
if (ch == 'D') state = OptHex;
|
||||||
|
else if (is_hex(ch)) state = Hex;
|
||||||
else if (ch == '.') state = OptReal;
|
else if (ch == '.') state = OptReal;
|
||||||
else {
|
else {
|
||||||
state = End;
|
state = End;
|
||||||
|
@ -400,6 +402,15 @@ again:
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OptHex:
|
||||||
|
LoadChar(ch);
|
||||||
|
if (is_hex(ch)) {
|
||||||
|
if (np < &buf[NUMSIZE]) *np++ = 'D';
|
||||||
|
state = Hex;
|
||||||
|
}
|
||||||
|
else state = End;
|
||||||
|
break;
|
||||||
|
|
||||||
case Hex:
|
case Hex:
|
||||||
while (is_hex(ch)) {
|
while (is_hex(ch)) {
|
||||||
if (np < &buf[NUMSIZE]) *np++ = ch;
|
if (np < &buf[NUMSIZE]) *np++ = ch;
|
||||||
|
@ -454,6 +465,9 @@ lexwarning(W_ORDINARY, "overflow in constant");
|
||||||
lexwarning(W_ORDINARY, "character constant out of range");
|
lexwarning(W_ORDINARY, "character constant out of range");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (ch == 'D' && base == 10) {
|
||||||
|
toktype = longint_type;
|
||||||
|
}
|
||||||
else if (tk->TOK_INT>=0 &&
|
else if (tk->TOK_INT>=0 &&
|
||||||
tk->TOK_INT<=max_int) {
|
tk->TOK_INT<=max_int) {
|
||||||
toktype = intorcard_type;
|
toktype = intorcard_type;
|
||||||
|
@ -485,6 +499,8 @@ lexwarning(W_ORDINARY, "character constant out of range");
|
||||||
/* a real real constant */
|
/* a real real constant */
|
||||||
if (np < &buf[NUMSIZE]) *np++ = '.';
|
if (np < &buf[NUMSIZE]) *np++ = '.';
|
||||||
|
|
||||||
|
toktype = real_type;
|
||||||
|
|
||||||
while (is_dig(ch)) {
|
while (is_dig(ch)) {
|
||||||
/* Fractional part
|
/* Fractional part
|
||||||
*/
|
*/
|
||||||
|
@ -492,9 +508,15 @@ lexwarning(W_ORDINARY, "character constant out of range");
|
||||||
LoadChar(ch);
|
LoadChar(ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ch == 'E') {
|
if (ch == 'E' || ch == 'D') {
|
||||||
/* Scale factor
|
/* Scale factor
|
||||||
*/
|
*/
|
||||||
|
if (ch == 'D') {
|
||||||
|
toktype = longreal_type;
|
||||||
|
LoadChar(ch);
|
||||||
|
if (!(ch == '+' || ch == '-' || is_dig(ch)))
|
||||||
|
goto noscale;
|
||||||
|
}
|
||||||
if (np < &buf[NUMSIZE]) *np++ = 'E';
|
if (np < &buf[NUMSIZE]) *np++ = 'E';
|
||||||
LoadChar(ch);
|
LoadChar(ch);
|
||||||
if (ch == '+' || ch == '-') {
|
if (ch == '+' || ch == '-') {
|
||||||
|
@ -514,6 +536,7 @@ lexwarning(W_ORDINARY, "character constant out of range");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
noscale:
|
||||||
*np++ = '\0';
|
*np++ = '\0';
|
||||||
if (ch == EOI) eofseen = 1;
|
if (ch == EOI) eofseen = 1;
|
||||||
else PushBack();
|
else PushBack();
|
||||||
|
@ -523,7 +546,6 @@ lexwarning(W_ORDINARY, "character constant out of range");
|
||||||
lexerror("floating constant too long");
|
lexerror("floating constant too long");
|
||||||
}
|
}
|
||||||
else tk->TOK_REL = Salloc(buf, (unsigned) (np - buf)) + 1;
|
else tk->TOK_REL = Salloc(buf, (unsigned) (np - buf)) + 1;
|
||||||
toktype = real_type;
|
|
||||||
return tk->tk_symb = REAL;
|
return tk->tk_symb = REAL;
|
||||||
|
|
||||||
/*NOTREACHED*/
|
/*NOTREACHED*/
|
||||||
|
|
|
@ -840,7 +840,7 @@ ChkUnOper(expp)
|
||||||
|
|
||||||
case '-':
|
case '-':
|
||||||
if (tpr->tp_fund & T_INTORCARD) {
|
if (tpr->tp_fund & T_INTORCARD) {
|
||||||
if (tpr == intorcard_type) {
|
if (tpr == intorcard_type || tpr == card_type) {
|
||||||
expp->nd_type = int_type;
|
expp->nd_type = int_type;
|
||||||
}
|
}
|
||||||
if (right->nd_class == Value) {
|
if (right->nd_class == Value) {
|
||||||
|
@ -849,7 +849,6 @@ ChkUnOper(expp)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (tpr->tp_fund == T_REAL) {
|
else if (tpr->tp_fund == T_REAL) {
|
||||||
expp->nd_type = tpr;
|
|
||||||
if (right->nd_class == Value) {
|
if (right->nd_class == Value) {
|
||||||
if (*(right->nd_REL) == '-') (right->nd_REL)++;
|
if (*(right->nd_REL) == '-') (right->nd_REL)++;
|
||||||
else (right->nd_REL)--;
|
else (right->nd_REL)--;
|
||||||
|
@ -939,11 +938,47 @@ ChkStandard(expp, left)
|
||||||
if (left->nd_class == Value) cstcall(expp, S_CHR);
|
if (left->nd_class == Value) cstcall(expp, S_CHR);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_FLOATD:
|
||||||
case S_FLOAT:
|
case S_FLOAT:
|
||||||
expp->nd_type = real_type;
|
expp->nd_type = real_type;
|
||||||
|
if (std == S_FLOATD) expp->nd_type = longreal_type;
|
||||||
if (!(left = getarg(&arg, T_INTORCARD, 0, edf))) return 0;
|
if (!(left = getarg(&arg, T_INTORCARD, 0, edf))) return 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_LONG: {
|
||||||
|
struct type *tp;
|
||||||
|
|
||||||
|
if (!(left = getarg(&arg, 0, 0, edf))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tp = BaseType(left->nd_type);
|
||||||
|
if (tp == int_type) expp->nd_type = longint_type;
|
||||||
|
else if (tp == real_type) expp->nd_type = longreal_type;
|
||||||
|
else {
|
||||||
|
expp->nd_type = error_type;
|
||||||
|
Xerror(left, "unexpected parameter type", edf);
|
||||||
|
}
|
||||||
|
if (left->nd_class == Value) cstcall(expp, S_LONG);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case S_SHORT: {
|
||||||
|
struct type *tp;
|
||||||
|
|
||||||
|
if (!(left = getarg(&arg, 0, 0, edf))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
tp = BaseType(left->nd_type);
|
||||||
|
if (tp == longint_type) expp->nd_type = int_type;
|
||||||
|
else if (tp == longreal_type) expp->nd_type = real_type;
|
||||||
|
else {
|
||||||
|
expp->nd_type = error_type;
|
||||||
|
Xerror(left, "unexpected parameter type", edf);
|
||||||
|
}
|
||||||
|
if (left->nd_class == Value) cstcall(expp, S_SHORT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case S_HIGH:
|
case S_HIGH:
|
||||||
if (!(left = getarg(&arg, T_ARRAY|T_STRING|T_CHAR, 0, edf))) {
|
if (!(left = getarg(&arg, T_ARRAY|T_STRING|T_CHAR, 0, edf))) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1053,8 +1088,10 @@ ChkStandard(expp, left)
|
||||||
expp->nd_left->nd_def->df_idf->id_text);
|
expp->nd_left->nd_def->df_idf->id_text);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_TRUNCD:
|
||||||
case S_TRUNC:
|
case S_TRUNC:
|
||||||
expp->nd_type = card_type;
|
expp->nd_type = card_type;
|
||||||
|
if (std == S_TRUNCD) expp->nd_type = longint_type;
|
||||||
if (!(left = getarg(&arg, T_REAL, 0, edf))) return 0;
|
if (!(left = getarg(&arg, T_REAL, 0, edf))) return 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -456,11 +456,6 @@ CodeStd(nd)
|
||||||
RangeCheck(char_type, tp);
|
RangeCheck(char_type, tp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_FLOAT:
|
|
||||||
CodePExpr(left);
|
|
||||||
CodeCoercion(tp, real_type);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_HIGH:
|
case S_HIGH:
|
||||||
assert(IsConformantArray(tp));
|
assert(IsConformantArray(tp));
|
||||||
DoHIGH(left->nd_def);
|
DoHIGH(left->nd_def);
|
||||||
|
@ -493,9 +488,14 @@ CodeStd(nd)
|
||||||
CodePExpr(left);
|
CodePExpr(left);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_TRUNCD:
|
||||||
case S_TRUNC:
|
case S_TRUNC:
|
||||||
|
case S_FLOAT:
|
||||||
|
case S_FLOATD:
|
||||||
|
case S_LONG:
|
||||||
|
case S_SHORT:
|
||||||
CodePExpr(left);
|
CodePExpr(left);
|
||||||
CodeCoercion(tp, card_type);
|
CodeCoercion(tp, nd->nd_type);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_VAL:
|
case S_VAL:
|
||||||
|
|
|
@ -386,14 +386,19 @@ cstcall(expp, call)
|
||||||
CutSize(expp);
|
CutSize(expp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case S_LONG:
|
||||||
|
case S_SHORT: {
|
||||||
|
struct type *tp = expp->nd_type;
|
||||||
|
|
||||||
|
*expp = *expr;
|
||||||
|
expp->nd_type = tp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
case S_CAP:
|
case S_CAP:
|
||||||
if (expr->nd_INT >= 'a' && expr->nd_INT <= 'z') {
|
if (expr->nd_INT >= 'a' && expr->nd_INT <= 'z') {
|
||||||
expp->nd_INT = expr->nd_INT + ('A' - 'a');
|
expr->nd_INT = expr->nd_INT + ('A' - 'a');
|
||||||
}
|
}
|
||||||
else expp->nd_INT = expr->nd_INT;
|
/* fall through */
|
||||||
CutSize(expp);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case S_CHR:
|
case S_CHR:
|
||||||
expp->nd_INT = expr->nd_INT;
|
expp->nd_INT = expr->nd_INT;
|
||||||
CutSize(expp);
|
CutSize(expp);
|
||||||
|
|
|
@ -34,7 +34,7 @@ long sys_filesize();
|
||||||
|
|
||||||
struct idf *DefId;
|
struct idf *DefId;
|
||||||
|
|
||||||
STATIC char *
|
char *
|
||||||
getwdir(fn)
|
getwdir(fn)
|
||||||
register char *fn;
|
register char *fn;
|
||||||
{
|
{
|
||||||
|
@ -65,7 +65,6 @@ GetFile(name)
|
||||||
*/
|
*/
|
||||||
char buf[15];
|
char buf[15];
|
||||||
char *strncpy(), *strcat();
|
char *strncpy(), *strcat();
|
||||||
static char *WorkingDir = ".";
|
|
||||||
|
|
||||||
strncpy(buf, name, 10);
|
strncpy(buf, name, 10);
|
||||||
buf[10] = '\0'; /* maximum length */
|
buf[10] = '\0'; /* maximum length */
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
|
||||||
extern int proclevel;
|
extern int proclevel;
|
||||||
struct desig InitDesig = {DSG_INIT, 0, 0};
|
struct desig InitDesig = {DSG_INIT, 0, 0, 0};
|
||||||
|
|
||||||
int C_ste_dnam(), C_sde_dnam(), C_loe_dnam(), C_lde_dnam();
|
int C_ste_dnam(), C_sde_dnam(), C_loe_dnam(), C_lde_dnam();
|
||||||
int C_stl(), C_sdl(), C_lol(), C_ldl();
|
int C_stl(), C_sdl(), C_lol(), C_ldl();
|
||||||
|
@ -54,6 +54,7 @@ static int (*ext_ld_and_str[2][2])() = {
|
||||||
int
|
int
|
||||||
DoLoadOrStore(ds, size, LoadOrStoreFlag)
|
DoLoadOrStore(ds, size, LoadOrStoreFlag)
|
||||||
register struct desig *ds;
|
register struct desig *ds;
|
||||||
|
arith size;
|
||||||
{
|
{
|
||||||
int sz;
|
int sz;
|
||||||
|
|
||||||
|
@ -223,8 +224,8 @@ CodeMove(rhs, left, rtp)
|
||||||
switch(rhs->dsg_kind) {
|
switch(rhs->dsg_kind) {
|
||||||
case DSG_LOADED:
|
case DSG_LOADED:
|
||||||
CodeDesig(left, lhs);
|
CodeDesig(left, lhs);
|
||||||
CodeAddress(lhs);
|
|
||||||
if (rtp->tp_fund == T_STRING) {
|
if (rtp->tp_fund == T_STRING) {
|
||||||
|
CodeAddress(lhs);
|
||||||
C_loc(rtp->tp_size);
|
C_loc(rtp->tp_size);
|
||||||
C_loc(tp->tp_size);
|
C_loc(tp->tp_size);
|
||||||
C_cal("_StringAssign");
|
C_cal("_StringAssign");
|
||||||
|
@ -315,6 +316,7 @@ CodeMove(rhs, left, rtp)
|
||||||
lhs->dsg_offset = tmp;
|
lhs->dsg_offset = tmp;
|
||||||
lhs->dsg_name = 0;
|
lhs->dsg_name = 0;
|
||||||
lhs->dsg_kind = DSG_PFIXED;
|
lhs->dsg_kind = DSG_PFIXED;
|
||||||
|
lhs->dsg_def = 0;
|
||||||
C_stl(tmp); /* address of lhs */
|
C_stl(tmp); /* address of lhs */
|
||||||
}
|
}
|
||||||
CodeValue(rhs, tp->tp_size, tp->tp_align);
|
CodeValue(rhs, tp->tp_size, tp->tp_align);
|
||||||
|
@ -347,6 +349,7 @@ CodeAddress(ds)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
C_lal(ds->dsg_offset);
|
C_lal(ds->dsg_offset);
|
||||||
|
if (ds->dsg_def) ds->dsg_def->df_flags |= D_NOREG;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DSG_PFIXED:
|
case DSG_PFIXED:
|
||||||
|
@ -489,7 +492,8 @@ CodeVarDesig(df, ds)
|
||||||
ds->dsg_kind = DSG_PFIXED;
|
ds->dsg_kind = DSG_PFIXED;
|
||||||
}
|
}
|
||||||
else ds->dsg_kind = DSG_FIXED;
|
else ds->dsg_kind = DSG_FIXED;
|
||||||
ds->dsg_offset =df->var_off;
|
ds->dsg_offset = df->var_off;
|
||||||
|
ds->dsg_def = df;
|
||||||
}
|
}
|
||||||
|
|
||||||
CodeDesig(nd, ds)
|
CodeDesig(nd, ds)
|
||||||
|
|
|
@ -40,6 +40,9 @@ struct desig {
|
||||||
char *dsg_name; /* name of global variable, used for
|
char *dsg_name; /* name of global variable, used for
|
||||||
FIXED and PFIXED
|
FIXED and PFIXED
|
||||||
*/
|
*/
|
||||||
|
struct def *dsg_def; /* def structure associated with this
|
||||||
|
designator, or 0
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The next structure describes the designator in a with-statement.
|
/* The next structure describes the designator in a with-statement.
|
||||||
|
|
|
@ -79,16 +79,16 @@ ConstExpression(struct node **pnd;)
|
||||||
* Check that the expression is a constant expression and evaluate!
|
* Check that the expression is a constant expression and evaluate!
|
||||||
*/
|
*/
|
||||||
{ nd = *pnd;
|
{ nd = *pnd;
|
||||||
DO_DEBUG(options['X'], print("CONSTANT EXPRESSION\n"));
|
DO_DEBUG(options['C'], print("CONSTANT EXPRESSION\n"));
|
||||||
DO_DEBUG(options['X'], PrNode(nd, 0));
|
DO_DEBUG(options['C'], PrNode(nd, 0));
|
||||||
|
|
||||||
if (ChkExpression(nd) &&
|
if (ChkExpression(nd) &&
|
||||||
((nd)->nd_class != Set && (nd)->nd_class != Value)) {
|
((nd)->nd_class != Set && (nd)->nd_class != Value)) {
|
||||||
error("constant expression expected");
|
error("constant expression expected");
|
||||||
}
|
}
|
||||||
|
|
||||||
DO_DEBUG(options['X'], print("RESULTS IN\n"));
|
DO_DEBUG(options['C'], print("RESULTS IN\n"));
|
||||||
DO_DEBUG(options['X'], PrNode(nd, 0));
|
DO_DEBUG(options['C'], PrNode(nd, 0));
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
@ -18,3 +18,4 @@ struct f_info {
|
||||||
extern struct f_info file_info;
|
extern struct f_info file_info;
|
||||||
#define LineNumber file_info.f_lineno
|
#define LineNumber file_info.f_lineno
|
||||||
#define FileName file_info.f_filename
|
#define FileName file_info.f_filename
|
||||||
|
#define WorkingDir file_info.f_workingdir
|
||||||
|
|
|
@ -74,6 +74,7 @@ Compile(src, dst)
|
||||||
char *src, *dst;
|
char *src, *dst;
|
||||||
{
|
{
|
||||||
extern struct tokenname tkidf[];
|
extern struct tokenname tkidf[];
|
||||||
|
extern char *getwdir();
|
||||||
|
|
||||||
if (! InsertFile(src, (char **) 0, &src)) {
|
if (! InsertFile(src, (char **) 0, &src)) {
|
||||||
fprint(STDERR,"%s: cannot open %s\n", ProgName, src);
|
fprint(STDERR,"%s: cannot open %s\n", ProgName, src);
|
||||||
|
@ -81,6 +82,7 @@ Compile(src, dst)
|
||||||
}
|
}
|
||||||
LineNumber = 1;
|
LineNumber = 1;
|
||||||
FileName = src;
|
FileName = src;
|
||||||
|
WorkingDir = getwdir(src);
|
||||||
init_idf();
|
init_idf();
|
||||||
InitCst();
|
InitCst();
|
||||||
reserve(tkidf);
|
reserve(tkidf);
|
||||||
|
@ -171,6 +173,10 @@ static struct stdproc {
|
||||||
{ "MAX", S_MAX },
|
{ "MAX", S_MAX },
|
||||||
{ "MIN", S_MIN },
|
{ "MIN", S_MIN },
|
||||||
{ "INCL", S_INCL },
|
{ "INCL", S_INCL },
|
||||||
|
{ "LONG", S_LONG },
|
||||||
|
{ "SHORT", S_SHORT },
|
||||||
|
{ "TRUNCD", S_TRUNCD },
|
||||||
|
{ "FLOATD", S_FLOATD },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -246,3 +252,13 @@ cnt_scope, cnt_scopelist, cnt_tmpvar);
|
||||||
print("\nNumber of lines read: %d\n", cntlines);
|
print("\nNumber of lines read: %d\n", cntlines);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
No_Mem()
|
||||||
|
{
|
||||||
|
fatal("out of memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
C_failed()
|
||||||
|
{
|
||||||
|
fatal("write failed");
|
||||||
|
}
|
||||||
|
|
|
@ -84,7 +84,13 @@ printnode(nd, lvl)
|
||||||
register struct node *nd;
|
register struct node *nd;
|
||||||
{
|
{
|
||||||
indnt(lvl);
|
indnt(lvl);
|
||||||
print("C: %d; T: %s\n", nd->nd_class, symbol2str(nd->nd_symb));
|
print("Class: %d; Symbol: %s\n", nd->nd_class, symbol2str(nd->nd_symb));
|
||||||
|
if (nd->nd_type) {
|
||||||
|
indnt(lvl);
|
||||||
|
print("Type: ");
|
||||||
|
DumpType(nd->nd_type);
|
||||||
|
print("\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PrNode(nd, lvl)
|
PrNode(nd, lvl)
|
||||||
|
|
|
@ -28,6 +28,10 @@
|
||||||
#define S_VAL 17
|
#define S_VAL 17
|
||||||
#define S_NEW 18
|
#define S_NEW 18
|
||||||
#define S_DISPOSE 19
|
#define S_DISPOSE 19
|
||||||
|
#define S_LONG 20
|
||||||
|
#define S_SHORT 21
|
||||||
|
#define S_TRUNCD 22
|
||||||
|
#define S_FLOATD 23
|
||||||
|
|
||||||
/* Standard procedures and functions defined in the SYSTEM module ... */
|
/* Standard procedures and functions defined in the SYSTEM module ... */
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,7 @@ struct type
|
||||||
#define bounded(tpx) ((tpx)->tp_fund & T_INDEX)
|
#define bounded(tpx) ((tpx)->tp_fund & T_INDEX)
|
||||||
#define complex(tpx) ((tpx)->tp_fund & (T_RECORD|T_ARRAY))
|
#define complex(tpx) ((tpx)->tp_fund & (T_RECORD|T_ARRAY))
|
||||||
#define WA(sz) (align(sz, (int) word_size))
|
#define WA(sz) (align(sz, (int) word_size))
|
||||||
|
#ifdef DEBUG
|
||||||
#define ResultType(tpx) (assert((tpx)->tp_fund == T_PROCEDURE),\
|
#define ResultType(tpx) (assert((tpx)->tp_fund == T_PROCEDURE),\
|
||||||
(tpx)->next)
|
(tpx)->next)
|
||||||
#define ParamList(tpx) (assert((tpx)->tp_fund == T_PROCEDURE),\
|
#define ParamList(tpx) (assert((tpx)->tp_fund == T_PROCEDURE),\
|
||||||
|
@ -160,6 +161,13 @@ struct type
|
||||||
(tpx)->next)
|
(tpx)->next)
|
||||||
#define PointedtoType(tpx) (assert((tpx)->tp_fund == T_POINTER),\
|
#define PointedtoType(tpx) (assert((tpx)->tp_fund == T_POINTER),\
|
||||||
(tpx)->next)
|
(tpx)->next)
|
||||||
|
#else DEBUG
|
||||||
|
#define ResultType(tpx) ((tpx)->next)
|
||||||
|
#define ParamList(tpx) ((tpx)->prc_params)
|
||||||
|
#define IndexType(tpx) ((tpx)->next)
|
||||||
|
#define ElementType(tpx) ((tpx)->next)
|
||||||
|
#define PointedtoType(tpx) ((tpx)->next)
|
||||||
|
#endif DEBUG
|
||||||
#define BaseType(tpx) ((tpx)->tp_fund == T_SUBRANGE ? (tpx)->next : \
|
#define BaseType(tpx) ((tpx)->tp_fund == T_SUBRANGE ? (tpx)->next : \
|
||||||
(tpx))
|
(tpx))
|
||||||
#define IsConstructed(tpx) ((tpx)->tp_fund & T_CONSTRUCTED)
|
#define IsConstructed(tpx) ((tpx)->tp_fund & T_CONSTRUCTED)
|
||||||
|
|
|
@ -652,8 +652,7 @@ DumpType(tp)
|
||||||
print(" fund:");
|
print(" fund:");
|
||||||
switch(tp->tp_fund) {
|
switch(tp->tp_fund) {
|
||||||
case T_RECORD:
|
case T_RECORD:
|
||||||
print("RECORD\n");
|
print("RECORD");
|
||||||
DumpScope(tp->rec_scope->sc_def);
|
|
||||||
break;
|
break;
|
||||||
case T_ENUMERATION:
|
case T_ENUMERATION:
|
||||||
print("ENUMERATION; ncst:%d", tp->enm_ncst); break;
|
print("ENUMERATION; ncst:%d", tp->enm_ncst); break;
|
||||||
|
|
|
@ -63,7 +63,7 @@ TstParEquiv(tp1, tp2)
|
||||||
|
|
||||||
int
|
int
|
||||||
TstProcEquiv(tp1, tp2)
|
TstProcEquiv(tp1, tp2)
|
||||||
register struct type *tp1, *tp2;
|
struct type *tp1, *tp2;
|
||||||
{
|
{
|
||||||
/* Test if two procedure types are equivalent. This routine
|
/* Test if two procedure types are equivalent. This routine
|
||||||
may also be used for the testing of assignment compatibility
|
may also be used for the testing of assignment compatibility
|
||||||
|
@ -105,31 +105,24 @@ TstCompat(tp1, tp2)
|
||||||
|
|
||||||
tp1 = BaseType(tp1);
|
tp1 = BaseType(tp1);
|
||||||
tp2 = BaseType(tp2);
|
tp2 = BaseType(tp2);
|
||||||
|
if (tp2 != intorcard_type &&
|
||||||
|
(tp1 == intorcard_type || tp1 == address_type)) {
|
||||||
|
struct type *tmp = tp2;
|
||||||
|
|
||||||
|
tp2 = tp1;
|
||||||
|
tp1 = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
return tp1 == tp2
|
return tp1 == tp2
|
||||||
||
|
|
||||||
( tp1 == intorcard_type
|
|
||||||
&&
|
|
||||||
(tp2 == int_type || tp2 == card_type || tp2 == address_type)
|
|
||||||
)
|
|
||||||
||
|
||
|
||||||
( tp2 == intorcard_type
|
( tp2 == intorcard_type
|
||||||
&&
|
&&
|
||||||
(tp1 == int_type || tp1 == card_type || tp1 == address_type)
|
(tp1 == int_type || tp1 == card_type || tp1 == address_type)
|
||||||
)
|
)
|
||||||
||
|
|
||||||
( tp1 == address_type
|
|
||||||
&&
|
|
||||||
( tp2 == card_type
|
|
||||||
|| tp2->tp_fund == T_POINTER
|
|
||||||
)
|
|
||||||
)
|
|
||||||
||
|
||
|
||||||
( tp2 == address_type
|
( tp2 == address_type
|
||||||
&&
|
&&
|
||||||
( tp1 == card_type
|
( tp1 == card_type || tp1->tp_fund == T_POINTER)
|
||||||
|| tp1->tp_fund == T_POINTER
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -151,6 +144,9 @@ TstAssCompat(tp1, tp2)
|
||||||
if ((tp1->tp_fund & T_INTORCARD) &&
|
if ((tp1->tp_fund & T_INTORCARD) &&
|
||||||
(tp2->tp_fund & T_INTORCARD)) return 1;
|
(tp2->tp_fund & T_INTORCARD)) return 1;
|
||||||
|
|
||||||
|
if ((tp1->tp_fund == T_REAL) &&
|
||||||
|
(tp2->tp_fund == T_REAL)) return 1;
|
||||||
|
|
||||||
if (tp1->tp_fund == T_PROCEDURE &&
|
if (tp1->tp_fund == T_PROCEDURE &&
|
||||||
tp2->tp_fund == T_PROCEDURE) {
|
tp2->tp_fund == T_PROCEDURE) {
|
||||||
return TstProcEquiv(tp1, tp2);
|
return TstProcEquiv(tp1, tp2);
|
||||||
|
|
|
@ -141,8 +141,8 @@ WalkModule(module)
|
||||||
}
|
}
|
||||||
MkCalls(sc->sc_def);
|
MkCalls(sc->sc_def);
|
||||||
proclevel++;
|
proclevel++;
|
||||||
DO_DEBUG(options['X'], PrNode(module->mod_body, 0));
|
|
||||||
WalkNode(module->mod_body, NO_EXIT_LABEL);
|
WalkNode(module->mod_body, NO_EXIT_LABEL);
|
||||||
|
DO_DEBUG(options['X'], PrNode(module->mod_body, 0));
|
||||||
C_df_ilb(RETURN_LABEL);
|
C_df_ilb(RETURN_LABEL);
|
||||||
EndPriority();
|
EndPriority();
|
||||||
C_ret((arith) 0);
|
C_ret((arith) 0);
|
||||||
|
@ -293,8 +293,8 @@ WalkProcedure(procedure)
|
||||||
|
|
||||||
text_label = 1; /* label at end of procedure */
|
text_label = 1; /* label at end of procedure */
|
||||||
|
|
||||||
DO_DEBUG(options['X'], PrNode(procedure->prc_body, 0));
|
|
||||||
WalkNode(procedure->prc_body, NO_EXIT_LABEL);
|
WalkNode(procedure->prc_body, NO_EXIT_LABEL);
|
||||||
|
DO_DEBUG(options['X'], PrNode(procedure->prc_body, 0));
|
||||||
C_df_ilb(RETURN_LABEL); /* label at end */
|
C_df_ilb(RETURN_LABEL); /* label at end */
|
||||||
tp = func_type;
|
tp = func_type;
|
||||||
if (func_res_label) {
|
if (func_res_label) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue