1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/*
* obcommon.h
*
* This file is part of the Oxford Oberon-2 compiler
* Copyright (c) 2006--2016 J. M. Spivey
* All rights reserved
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef EXTERN
#define EXTERN extern
#endif
typedef unsigned char uchar;
typedef int mybool;
#define TRUE 1
#define FALSE 0
#ifndef min
#define min(x, y) ((x) <= (y) ? (x) : (y))
#endif
#ifndef max
#define max(x, y) ((x) <= (y) ? (y) : (x))
#endif
#define align(x, k) (((x)+((k)-1)) & ~((k)-1))
#ifdef WORDS_BIGENDIAN
#define align_byte(x) (((unsigned) (x))>>24)
#define align_short(x) ((x)>>16)
#else
#define align_byte(x) (x)
#define align_short(x) (x)
#endif
#include <stdint.h>
typedef int64_t longint;
typedef union {
#ifdef WORDS_BIGENDIAN
struct { int hi, lo; } n;
#else
struct { int lo, hi; } n;
#endif
double d;
longint q;
} dblbuf;
/* Stack frame layout */
#define BP 0 /* Saved base pointer */
#define PC 1 /* Saved program counter */
#define CP 2 /* Saved context pointer */
#define SL -1 /* Static link */
#define HEAD 3
#define FRAME_SHIFT 16 /* Shift for pointer map of stack frame */
/* Constant pool layout */
#define CP_PRIM 0 /* Primitive address (64 bits) */
#define CP_CODE 1 /* Bytecode address */
#define CP_SIZE 2 /* Size of bytecode */
#define CP_FRAME 3 /* Frame size */
#define CP_STACK 4 /* Stack size */
#define CP_MAP 5 /* Frame map */
#define CP_STKMAP 6 /* Stack map table */
#define CP_CONST 7 /* First constant */
/* Descriptor layout */
#define DESC_MAP 0 /* Pointer map */
#define DESC_DEPTH 1 /* Inheritance depth of record */
#define DESC_ANCES 2 /* Ancestor list of record */
#define DESC_BOUND 1 /* First bound for flex array */
/* Tokens used in pointer maps: all must be congruent to 2 modulo 4 */
#define GC_BASE 2
#define GC_REPEAT 6
#define GC_END 10
#define GC_MAP 14
#define GC_FLEX 18
#define GC_BLOCK 22
#define GC_MARK 26
#define GC_POINTER 30
/* Error codes */
#define E_CAST 1
#define E_ASSIGN 2
#define E_CASE 3
#define E_WITH 4
#define E_ASSERT 5
#define E_RETURN 6
#define E_BOUND 7
#define E_NULL 8
#define E_DIV 9
#define E_FDIV 10
#define E_STACK 11
#define E_GLOB 12
|