-
Notifications
You must be signed in to change notification settings - Fork 35
/
ReleaseNotes.html
371 lines (354 loc) · 22.8 KB
/
ReleaseNotes.html
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Inform Release Notes</title>
</head>
<body>
<h1>Inform 6.4 Release Notes</h1>
<h2>Introduction</h2>
This is a maintenance release of the Inform 6 compiler for creating interactive fiction. Although just about
all known bugs are fixed, the approach to enhancing Inform is more conservative. The selection of suggestions
to implement has been governed by two factors:
<ul>
<li><p>Avoidance of changes which might cause existing games to misbehave; and
<li><p>Minimisation of features which would require updates to the <i>Inform Designer’s Manual</i>.
</ul>
Older release notes (Inform 6.30 through 6.36) are <a href="https://inform-fiction.org/manual/ReleaseNotes-6.3x.html">archived here</a>.
<p>Since the first release of the Inform 6.3 compiler, the Inform 6 library has been split into a separate project,
maintained at <a href="https://gitlab.com/DavidGriffith/inform6lib">https://gitlab.com/DavidGriffith/inform6lib</a>.
<h2>Acknowledgements</h2>
Far too many people contributed towards this release — reporting and resolving bugs, making helpful
suggestions, providing support and facilities, testing, and so on — for their names to be individually
listed. So instead, this is a general thank-you to everybody who has made this release happen, and
specific ones to Graham Nelson for permitting it in the first place, and to Andrew Plotkin, who is responsible
for most of the actual changes to the compiler code.
<h2>Inform 6.43</h2>
These are the changes delivered in version 6.43 of the Inform compiler.
<h3>Features added</h3>
<ul>
<li><p>A new dictionary word flag has been introduced, "singular", which is set for any noun that is not a plural.
This can be explicitly set or not set in a dictionary word with the <tt>'//s'</tt> syntax, i.e. <tt>'word//s'</tt> to set it,
or <tt>'word//~s'</tt> to not set it.
<li><p>A new setting <tt>$DICT_TRUNCATE_FLAG</tt> has been added. If this is set to 1, then bit 6 of the dictionary
word flag is set for any word whose source code definition is truncated to fit in the dictionary. In <tt>--trace dict</tt>
listings, this is shown as "tr" when the flag is set.
Without this option, bit 6 of the dictionary word flag is set for all verbs (which is the old behavior, redundant with bit 1).
If the compiler truncates only the <tt>//p</tt> flag (as in <tt>$LONG_DICT_FLAG_BUG</tt>), that does not count as truncating
the dictionary word: the only relevant test is whether or not characters were dropped.
<li><p>A new setting <tt>$GRAMMAR_VERSION</tt> has been added. Setting this has the same effect as the existing <tt>Grammar__Version</tt>
constant, but provides a more standard way to set the grammar table version number.
<li><p>An experimental new grammar version 3 can be enabled with the <tt>$GRAMMAR_VERSION</tt> setting (or the <tt>Grammar__Version</tt>
constant). This is a variation on grammar version 2 with a more compact data structure, and is only available for Z-code.
Note that using this grammar version will require library changes that are not currently in the Inform 6 library.
<li><p>A new setting <tt>$GRAMMAR_META_FLAG</tt> has been added. If set to 1, there is a new way to declare meta actions.
Previously, meta actions were defined by writing lines like
<pre>
Verb meta 'score' * -> Score;
</pre>
This associates the <tt>meta</tt> flag with the dictionary word "score". This is not ideal as we could have verbs which are
meta in some phrasings but not others. If <tt>$GRAMMAR_META_FLAG</tt> is set the old syntax is still supported, but there is
also a new syntax:
<pre>
Verb 'load'
* noun -> Push
* 'game' -> Restore meta;
</pre>
In this new approach, actions are sorted, with meta actions coming first. Game or library code can detect a meta action by
comparing the action number with the new system constant <tt>#highest_meta_action_number</tt>, which is the highest meta action
number after sorting all the actions.
<li><p>It is now legal to have multiple <tt>Verb</tt> declarations for the same verb. This is now treated as if the subsequent
declarations had been made with <tt>Extend</tt>, and a warning is produced to this effect.
<li><p>The output of the <tt>--trace-verbs</tt> option now shows all verb synonyms, rather than just the first one.
<li><p>It is now an error to declare two verbs that refer to the same dictionary word. Previously this was accepted, but generated
an incorrect story file.
<li><p>A new setting <tt>$ZCODE_FILE_END_PADDING</tt> has been added. By default it is set to 1, but if it is set to 0, then
when outputting a Z-code game file Inform 6 will no longer pad the file to be a multiple of 512 bytes.
</ul>
<h3>Bugs fixed</h3>
<ul>
<li><p>Dictionary flags were being set incorrectly when <tt>$DICT_WORD_SIZE</tt> was set sufficiently large.
<li><p>In <tt>--trace asm</tt> output, when a Z-string has abbreviation marks, <tt><ABBR></tt> is printed, rather
than Ctrl-A characters.
<li><p>Dictionary words in UTF-8 encoded source files are now printed correctly in <tt>--trace dict</tt> and <tt>-r</tt>
(gametext.txt) output.
</ul>
<h2>Inform 6.42</h2>
These are the changes delivered in version 6.42 of the Inform compiler.
<h3>Features added</h3>
<ul>
<li><p>The compiler can now handle switch cases which are expressions, rather than just looking for bare literals
and symbols. The expression must still evaluate to a constant, but now parentheses and constant-folded arithmetic
are handled:
<pre>
Constant CONST = 5;
! These have always worked.
switch (x) {
0: return 0;
1: return 1;
-2: return -2;
}
! These now also work.
switch (x) {
(0): return 0;
(-(1)): return -1;
(CONST): return 5;
(CONST+1): return 6;
}
</pre>
For backwards compatibility, the expression must be wrapped in parens, so <tt>-(1):</tt> is not a valid case. Lists
of expressions are also supported. Expression parsing applies as long as the first value is wrapped in parens.
Wrapping the entire list in parens also works:
<pre>
switch (x) {
1, 2, 3: return 0; ! old style
(4), (CONST), (CONST+1): return 1; ! new style
(10), CONST+6, CONST+7: return 2; ! this also works
(20, CONST+16, CONST+17): return 3; ! as does this
}
</pre>
Note that the <tt>to</tt> keyword does not support expressions. You cannot say <tt>(CONST) to (CONST+5):</tt>
as a case. Also, case expressions only work within a switch statement. Top-level action cases must still be bare
action names.
<li><p>Inform identifiers can now be any length, and the entire identifier is significant. Dictionary words can also
be any length. The DICT_WORD_SIZE limit still applies, but now dictionary words are silently trimmed to DICT_WORD_SIZE.
For Glulx, DICT_WORD_SIZE can now be increased without limit.
<li><p>Arbitrary bytes and words can be compiled into the game, using two new statements:
<pre>
@ -> BYTE BYTE BYTE ...;
@ --> WORD WORD WORD ...;
</pre>
The given bytes or words are directly copied out into the function. (Words are two bytes in Z-code, and four bytes in
Glulx.) The compiler assumes that the data forms valid opcodes, but does nothing to verify this. Bytes must be numeric
constants, while words are either numeric constants or symbols, such as the name of a function.
<li><p>A new setting exists to omit the symbol names table, <tt>$OMIT_SYMBOL_TABLE</tt>. The symbol names table
contains the names of all properties, attributes, fake actions, and arrays as strings, and is generally only used by
debug library code and debug veneer error messages. When <tt>$OMIT_SYMBOL_TABLE=1</tt> is set:
<ul>
<li>The symbol names table is omitted from the game file, for both Glulx and Z-code.
<li>The <tt>print (property) p</tt> statement will print <tt><number 72></tt> (etc.) instead of the property name.
<li>The runtime error for a non-existent property <tt>(obj has no property prop to read)</tt> will similarly print
a number instead of the property name.
<li>The runtime error for array overflow <tt>(tried to read from -->5 in the array "arr"...)</tt> will omit the
array name.
<li>The following system constants are not available, and trying to use one is a compile-time error:
<tt>#identifiers_table</tt>, <tt>#attribute_names_array</tt>, <tt>#property_names_array</tt>, <tt>#action_names_array</tt>,
<tt>#fake_action_names_array</tt>, <tt>#array_names_offset</tt>, <tt>#global_names_array</tt>, <tt>#routine_names_array</tt>,
<tt>#constant_names_array</tt>.
</ul><br>
Note that the Inform 6 library uses <tt>#identifiers_table</tt> for some debugging verbs, and the Infix library
extension uses all the affected constants. To update such code, the relevant logic that uses these symbol names and
constants would be put in a <tt>#Ifndef OMIT_SYMBOL_TABLE;</tt> block.
<li><p>A new setting <tt>$ZCODE_MAX_INLINE_STRING</tt> has been added to determine how long a string can be and still
be compiled to a <tt>@print</tt> opcode, rather than be added to the string segment and compiled to a <tt>@print_paddr</tt>
opcode. This setting has a default value of 32, which matches the previous behaviour of the compiler, where this limit
was hard-coded at 32 characters.
<li><p>The <tt>Abbreviate</tt> directive now accepts abbreviations of any length.
<li><p>The <tt>-u</tt> option, which computes abbreviations, can now generate abbreviations of any length.
<li><p>Inform is now able to correctly set the plural flag on long dictionary words (e.g. <tt>'directions//p'</tt>).
However, due to the way Inform 7 has defined plural kind names in the past, fixing this will affect the parsing of
Inform 7 games if the output Inform 6 code is then compiled with a version of Inform 6 that fixes this issue. As a result,
there is a new setting <tt>$LONG_DICT_FLAG_BUG</tt>, which defaults to 1. The new behaviour is only enabled if this setting
is set to 0.
<li><p>Flags for dictionary words now include setting the NOUN flag, and also provides a way to explicitly not set a
flag. The possible choices are:
<ul>
<li><tt>//p</tt> sets the PLURAL flag (bit 2)
<li><tt>//n</tt> sets the NOUN flag (bit 7)
<li><tt>//~p</tt> means do not set the PLURAL flag at this point
<li><tt>//~n</tt> means do not set the NOUN flag at this point
</ul>
<br>Dictionary words used in most contexts default to <tt>//n</tt>.
<li><p>The <tt>--trace PROPS</tt> and <tt>--trace SYMDEF</tt> options now display the line number that each property
or symbol is defined at.
<li><p>The <tt>--trace ASM=2</tt> option now shows backpatch markers as a short descriptive string, rather than as a
number.
<li><p>The statement <tt>print "^";</tt> now compiles to a single opcode (<tt>@new_line</tt> for Z-code, or
<tt>@streamchar 10</tt> for Glulx) rather than printing a one character string.
<li><p>For Glulx, with strict mode turned off, <tt>print (char) X;</tt> compiles to either <tt>@streamchar X</tt> or
<tt>@streamunichar X</tt>, depending on whether X is a compile-time constant less than 256, or not.
<li><p>Grammar table lines entries which have no verb are now omitted. When this occurs a warning is printed, as this
most likely indicates an oversight in the game's source code.
<li><p>Error messages about invalid tokens are now more informative.
<li><p>Inform now handles line breaks itself, rather than relying on the C standard library. This gives consistent
handling of Windows and Unix style line breaks on all platforms.
<li><p>The output file "gametext.txt" now includes the Z-code or Glulx version being compiled to.
<li><p>The Z-Machine opcodes added in revision 1.1 of the Z-Machine Specification Standard, <tt>set_true_colour</tt>
and <tt>buffer_screen</tt>, are now supported.
</ul>
<h3>Bugs fixed</h3>
<ul>
<li><p>The Glulx <b>random(x)</b> built-in function now follows the DM4 specification: if <b>x</b>
is positive, the function returns the result of <tt>1+(@random x)</tt>; if zero or negative, <tt>@setrandom x</tt> is called.
<li><p>In several places (local variable declarations, action names and the <tt>Switches</tt> directive) the compiler would
accept quoted strings and then ignore the quotes. This is now an error.
<li><p>The case of a property having too many entries is now always an error, and is checked correctly in the case
of compiling to Z-code V3.
<li><p>An unclosed double quote at the end of a source file no longer causes the compiler to hang.
<li><p>A number of issues relating to error messages giving incorrect information have been fixed by improving how the
compiler handles backtracking through parsed symbols in some tricky cases.
<li><p>The Z-code version of the veneer function <tt>Box__Routine</tt> (which is used in the implementation of the
<tt>box</tt> statement) now contains a check to prevent calling the <tt>@set_cursor</tt> opcode with negative
co-ordinates.
<li><p>The veneer functions <tt>RA__Pr()</tt>, <tt>RL__Pr()</tt> and <tt>CP__Tab()</tt> are now correct for Z-code V3.
<li><p>Errors in the declaration of arrays could sometimes cause the compiler to emit a large number of error messages,
this is now fixed so that only the initial error is printed.
<li><p>Invalid expressions like <tt>(a++ b)</tt>, <tt>(a ~b)</tt>, <tt>(a++ ~b)</tt>, and <tt>(a++ --b)</tt> previously
caused an internal compiler error, but now produce a sensible error message.
<li><p>When computing abbreviations, the space character is now correctly treated as only occupying one byte, not four.
<li><p>The argument supplied to the Z-machine opcode <tt>@jump</tt> is now interpreted correctly. Previously this was
only done properly for the <tt>jump</tt> statement, not the opcode.
</ul>
<h2>Inform 6.41</h2>
These are the changes delivered in version 6.41 of the Inform compiler.
<h3>Features added</h3>
<ul>
<li><p>The dead code elimination logic now allows forward jumps to labels that would be otherwise unreachable, like this:
<pre>
if (condition) {
jump MiddleLabel;
}
if (0) {
while (condition) {
...
.MiddleLabel;
...
}
}
</pre>
<li><p>The error that occurs when the compiler encounters a jump to an unknown label now includes the name of that label.
</ul>
<h2>Inform 6.40</h2>
These are the changes delivered in version 6.40 of the Inform compiler.
<h3>Features added</h3>
<ul>
<li><p>The various command line arguments that produce tracing or statistical information have been consolidated in a new
argument: <tt>$!TRACEOPT</tt> or <tt>$!TRACEOPT=N</tt>. The Unix-style equivalent is <tt>--trace TRACEOPT</tt> or
<tt>--trace TRACEOPT=N</tt>. You can also use <tt>$!</tt> by itself (or <tt>--helptrace</tt>) to list all available trace options.
Trace option names are case-insensitive.
<p>
The optional <tt>N</tt> is always an integer. 0 always means off, 1 is the base level, 2 or more may increase verbosity.
As a general rule, setting <tt>N</tt> to a high number is not an error; it just does the same thing as the highest supported
number for that option. (This lets us add more verbosity levels to any option without worrying about compatibility errors.)
<p>
Four trace settings can be changed in mid-compile with the <tt>Trace</tt> directive. (This has always been true but now it is handled
consistently.) <tt>Trace assembly</tt>, <tt>Trace expressions</tt>, <tt>Trace tokens</tt> and <tt>Trace linker</tt> are
equivalent to <tt>--trace asm</tt>, <tt>--trace expr</tt>, <tt>--trace tokens</tt> and <tt>--trace linker</tt>, respectively.
As with the command-line versions, you can optionally specify 0 to turn off that setting or 2 or more for more verbosity.
<p>
Four more trace directives do an immediate information dump: <tt>Trace dictionary</tt>, <tt>Trace objects</tt>,
<tt>Trace symbols</tt> and <tt>Trace verbs</tt>. The command-line equivalents <tt>--trace dict</tt>, <tt>--trace objects</tt>,
<tt>--trace symbols</tt> and <tt>--trace verbs</tt> do the same at the end of compilation.
<p>
The following single-letter options have been removed and replaced with trace options:
<ul>
<li><tt>-j</tt>: Replaced by <tt>--trace OBJECTS</tt>
<li><tt>-m</tt>: Replaced by <tt>--trace MEM</tt>
<li><tt>-n</tt>: Replaced by <tt>--trace PROPS</tt> (for property information) and <tt>--trace ACTIONS</tt> (for action numbers)
<li><tt>-p</tt>: Replaced by <tt>--trace MAP=2</tt>
<li><tt>-t</tt>: Replaced by <tt>--trace ASM=2</tt>
<li><tt>-y</tt>: Replaced by <tt>--trace LINKER</tt>
</ul><br>
The following single-letter options still exist, but are now aliases for trace options:
<ul><br>
<li><tt>-a</tt>: Same as <tt>--trace ASM</tt>
<li><tt>-f</tt>: Same as <tt>--trace FREQ</tt>
<li><tt>-g</tt>: Same as <tt>--trace RUNTIME</tt>
<li><tt>-s</tt>: Same as <tt>--trace STATS</tt>
<li><tt>-z</tt>: Same as <tt>--trace MAP</tt>
</ul><br>
The following single-letter options have been removed entirely:
<ul><br>
<li><tt>-b</tt>: Has not done anything since at least Inform 5.
<li><tt>-l</tt>: Was supposed to list all statements compiled, but it was never implemented.
<li><tt>-o</tt>: Showed the same information as <tt>-z</tt> or <tt>--trace MAP</tt>.
</ul><br>
The <tt>-l</tt> option did show include files being opened; this is now a separate trace setting, <tt>--trace FILES</tt>.
<p>
Some of the information that used to be under <tt>-a4</tt> is now a separate trace setting, <tt>--trace BPATCH</tt>.
<li><p>The <tt>-u</tt> option now just outputs computed abbreviations. If you want the verbose calculation information that
it used to print, use <tt>--trace FINDABBREVS</tt> or <tt>--trace FINDABBREVS=2</tt>.
<li><p>The compiler is now capable of dead code elimination, allowing it to:
<ul>
<li>Discard unreachable opcodes and strings.
<li>Minimize generated code for dead branches (<tt>if (0)</tt>, <tt>if (1)</tt>).
<li>Detect <tt>if</tt> and <tt>switch</tt> statements where every branch returns.
<li>Detect loops that never exit (or always return).
<li>Discard <tt>@jz constant</tt> opcodes where the constant is non-zero.
<li>Convert <tt>@jz 0</tt> to an unconditional <tt>@jump</tt>.
<li>Discard a <tt>@jump</tt> to the very next instruction.
<li>Discard store opcodes when computing a logical expression as a value, if one case (0 or 1) is impossible.
<li>Fold expressions like <tt>(0 && expr)</tt> and <tt>(1 || expr)</tt>, even when <tt>expr</tt> is not a constant.
</ul><br>
When statements that can never be reached are eliminated, a warning is produced, where appropriate.
<p>
Dead code elimination does mean that theoretically possible (though very odd) valid code will now
result in a compilation error. For example,
<pre>
if (DOSTUFF) {
while (condition) {
...
.MiddleLabel;
...
}
}
jump MiddleLabel; ! error
</pre>
This will fail with a compilation error if <tt>DOSTUFF</tt> is defined as a constant zero. This optimization
can be turned off by setting the compiler setting <tt>$STRIP_UNREACHABLE_LABELS</tt> to zero (its default is one).
<li><p>There are now further warnings if the compiler detects that the type used in certain expressions is not correct:
<ul>
<li><tt>X()</tt>, <tt>indirect(X)</tt>: X must be a routine
<li><tt>X.Y</tt>, <tt>X.&Y</tt>, <tt>X.#Y</tt>: X must be a class or an object; Y must be a property (the Y checks already existed)
<li><tt>X.Y()</tt>: X must be a class, object, string or routine; Y must be a property
<li><tt>X.Y++</tt>, <tt>X.Y--</tt>, <tt>++X.Y</tt>, <tt>--X.Y</tt>: X must be a class or an object; Y must be a property
</ul>
<li><p>There is a new syntax for dynamic-string interpolations: <tt>"@(N)"</tt>. The original syntax was <tt>"@NN"</tt>,
which is still supported. In the new syntax <tt>"N"</tt> can be a number, or an already defined numeric constant.
As a result of this, under Glulx the limit on <tt>$MAX_DYNAMIC_STRINGS</tt> being less than 100 has been removed.
<li><p>The constants <tt>#dictionary_table</tt> and <tt>#grammar_table</tt> are now available when compiling to
Z-code, as well as Glulx.
<li><p>The command line switch to display percentages (<tt>-p</tt>) now works with Glulx, and acts as an
extension to the <tt>-z</tt> switch.
<li><p>The double precision floating point related opcodes added to the Glulx 3.1.3 specification (that is,
<tt>@numtod</tt>, <tt>@dtonumz</tt>, <tt>@dtonumn</tt>, <tt>@ftod</tt>, <tt>@dtof</tt>, <tt>@dceil</tt>, <tt>@dfloor</tt>,
<tt>@dadd</tt>, <tt>@dsub</tt>, <tt>@dmul</tt>, <tt>@ddiv</tt>, <tt>@dmodr</tt>, <tt>@dmodq</tt>, <tt>@dsqrt</tt>,
<tt>@dexp</tt>, <tt>@dlog</tt>, <tt>@dpow</tt>, <tt>@dsin</tt>, <tt>@dcos</tt>, <tt>@dtan</tt>, <tt>@dasin</tt>,
<tt>@dacos</tt>, <tt>@datan</tt>, <tt>@datan2</tt>, <tt>@jdeq</tt>, <tt>@jdne</tt>, <tt>@jdlt</tt>, <tt>@jdle</tt>,
<tt>@jdgt</tt>, <tt>@jdge</tt>, <tt>@jdisnan</tt>, <tt>@jdisinf</tt>) are now supported. In addition there are also
two new macros <tt>@dload</tt> and <tt>@dstore</tt>, to load and store double precision floating point values.
<li><p>The undo related opcodes added to the Glulx 3.1.3 specification (that is, <tt>@hasundo</tt> and <tt>@discardundo</tt>)
are now supported.
<li><p>The <tt>Version</tt> and <tt>Switches</tt> directives are now deprecated, and produce a warning if used. The recommended way to
set the Z-code version and any other switches is to use the command line, or <tt>!%</tt> comments at the top of the source file.
<li><p>The ability to compile Inform source code as modules, and then later link it, has been removed. This functionality always had
significant restrictions and was never widely used. The <tt>-M</tt> and <tt>-U</tt> command line options have been removed, along with
the <tt>+module_path</tt> option. The <tt>Link</tt> and <tt>Import</tt> directives now just produce errors.
<li><p>The ability to use temporary files for internal storage (the <tt>-F</tt> switch and the <tt>+temporary_path</tt> option)
have been removed.
<li><p>The <tt>=</tt> sign in the <tt>Global</tt> directive is now optional, just as it is in the <tt>Constant</tt> directive. So all
of these are now legal:
<pre>
Constant c1 11;
Constant c2 = 22;
Global g1 33;
Global g2 = 44;
</pre>
<li><p>The long deprecated forms of the <tt>Global</tt> directive that could define arrays have been removed. All these are now no
longer legal:
<pre>
Global array --> size;
Global array data ...;
Global array initial ...;
Global array initstr ...;
</pre>
</ul>
<h3>Bugs fixed</h3>
<ul>
<li><p><tt>Abbreviation</tt> directives now only add abbreviations to the output file if economy mode (<tt>-e</tt>) is set.
<li><p>An array overrun when the <tt>$ZCODE_LESS_DICT_DATA</tt> setting is enabled has been fixed.
<li><p>The logic that allows a test for the compiler version of the form <tt>#IfDef VN_1640</tt> now requires what follows
the "VN_" to be a number.
</ul>
</body>
</html>