Please enable JavaScript to view this site.

This is an older version of the compiler edit history, which differs from the main version in that it omits minor changes and bug fixes. It extends back to compiler edit 624 and A-Shell version 6.1.1339 of March 2013.

A-Shell 6.3/6.4 below here

2017 March, A-Shell 6.4.1547, edit 803:  The line marking the end of a ++INCLUDE now also indicates the module that we are returning to.

2017 March, A-Shell 6.4.1546, edit 797:  Maximum nesting levels for ++INCLUDE and ++IF conditions increased from 20 to 40. Improve messaging/recovery for the overflow condition.

2016 November, A-Shell 6.3.1538, edit 792:  Add new Dot Functions .LINENO and .LOCATION.

2016 October, A-Shell 6.3.1534, edit 790:  Use of .ARGCNT within a PRIVATE_BEGIN / PRIVATE_END block now generates a compile error. Although the expression wouldn't technically be illegal, because the PRIVATE block is essentially called for initialization by whatever function or procedure in the module gets called first, there's really no good way to predict in advance what the .ARGCNT value will represent, and thus it is almost certain to create a discrepancy between the expected and actual behavior.

2016 September, A-Shell 6.3.1528, edit 779:  Add pragma  ++pragma INCLUDE_GLOBAL_ONCE_ONLY <boolean> . When enabled, ++INCLUDE is treated as ++INCLUDE'ONCE, except when it occurs inside a function or procedure. In such cases, it is likely that you are intentionally including an extra copy of some map statements.

2016 September, A-Shell 6.3.1528, edit 778:  Add auto-defined macros ABC_CURRENT_ROUTINE$ and ABC_CURRENT_MODULE$. These equate to the current function/procedure name (or "" if none), and the current module filename (file.ext). Both may be useful in standardized error reporting.

2016 September, A-Shell 6.3.1528, edit 777:  Add three pragmas: +PRAGMA ASHELL_EXTENSIONS <boolean>, ++PRAGMA PRE_PROCESS <boolean>, and ++PRAGMA EXTENDED_PRE_PROCESS <boolean>

2016 September, A-Shell 6.3.1528, edit 776:  Add indirect function calls.

2016 September, A-Shell 6.3.1527, edit 774:  Add .INSTRR function

2016 September, A-Shell 6.3.1526, edit 773:  Add IFELSE functions

2016 August, A-Shell 6.3.1523, edit 770:  Add Private Attribute for Functions and Procedures

2016 July, A-Shell 6.3.1517, edit 764:  Enhancement to recognize the new random generator functions RND() and SRND() in /X:2 mode.

2016 April, A-Shell 6.3.1508, edit 761:  Optimization of PRIVATE_BEGIN/END logic so that the initialization is effectively "lazy", i.e. delayed until code within the module is executed. This eliminates unnecessary initializations that would otherwise occur if the ++INCLUDE for the module is placed near the top of the parent program.

A-Shell 6.1/6.2 below here, A-Shell 6.3/6.4 above

2015 October, A-Shell 6.1.1420, edit 756 & 758: Compiler/APN change/refinement (edits 756 & 758): ++IF, ++IFDEF and ++IFNDEF directives are now being "obeyed". Previously, all of the ++IFxxx directives were being ignored, resulting in both the True and False sections being included in the tags. This was harmless in some cases, but in others it was resulting in duplicate tags, which interferes with the ^ALT+G command. Note however, that since neither MAPs nor labels are "compiled" by the tagger, ++IFMAP, ++IFNMAP, ++IFLBL and ++IFNLBL directives continue to be ignored—i.e. no source code is excluded by them or their associated ++ELSE and ++ELIF directives. Also, SIZEOF(var) will evaluate to zero. Hopefully this represents the sweet spot on the compromise between file loading/tagging speed and accuracy.

2015 September, A-Shell 6.1.1418, edit 751: Compiler now generates the tag output used by APN, eliminating the need to call the external tagger and speeding up file loads substantially. Note that this only applies to the standalone compil.exe and APN.

2015 August, A-Shell 6.1.1416, edit 748: MAP2+ statements are now flagged as illegal if not preceded by a finalized MAP1 statement.

2015 August, A-Shell 6.1.1416, edit 747: Compiler bug fix ***SERIOUS***: Referencing a variable in a MAP statement initializer was causing the side-effect of finalizing the parent MAP1 definition, which was then causing it be encoded in the RUN file with the wrong size.

2015 August, A-Shell 6.1.1414, edit 744: Attempting to define a local dimx byref array without the required initial subscript value of -1 is now flagged as an error. Previously, no error was generate but the pass-by-reference mechanism would not have worked correctly.

2015 August, A-Shell 6.1.1414, edit 743: MAP Statements with initial values, when part of a DEFSTRUCT, were generating improper assignments in the RUN file. Typically these were benign, but in some cases they were causing the program to abort with a nonsensical error code during the initialization.

2015 August, A-Shell 6.1.1414, edit 742: Add new Dot Function .ISNULL for use with ordered maps to test for the .NULL condition.

2015 February, A-Shell 6.1.1401, edit 740: DEFXCALL now allows all named parameters to be optional, i.e. to be enclosed in braces, e.g.: DEFXCALL MYSBR {,one=1, two=2, three$="3"}. Previously there had to be at least one mandatory parameter prior to the "{" marking the start of the optional parameters.

2014 November, A-Shell 6.1.1398, edit 734: When passing an entire ordmap to a subroutine, you can now use the more natural syntax with a pair of empty (), rather than having to specify a null string, e.g. (""). For example, in the CGIUTL opcode CGIOP_GETPARARY (see edit 1394 below), you can now specify the ordmap using () as in this example:  xcall CGIUTL, CGIOP_GETPARARY, status, $req() {,stdin$}  The old syntax is still supported, but is now deprecated and any existing programs using it should probably be changed after updating to this version.

2014 October, A-Shell 6.1.1396, edit 730: LSM files (/LSM compiler switch) no longer limited to Windows.

2014 October, A-Shell 6.1.1392, edit 718: You may now optionally use procedure-style syntax with the subroutine statement. In other words, instead of: XCALL NAME,ARG1,...ARGN, you can instead use XCALL NAME(ARG1,...ARGN). The advantage of the alternate syntax is perhaps mainly aesthetic, but will seem more natural to programmers coming from other language backgrounds. Another potential advantage is that it would allow APN call tips to be set up for common subroutines, since the feature is triggered by typing the "(" which normally signals the start of a procedure parameter list.

2014 October, A-Shell 6.1.1392, edit 717: Add pragmas GLOBAL_BEGIN and _END.

2014 October, A-Shell 6.1.1391, edit 714: ++MESSAGE and ++ERROR output is now captured when executing in background mode—i.e. from within APN.

2014 October, A-Shell 6.1.1391, edit 713: ++INCLUDE files without a line terminator on the last line should no longer generate syntax errors.

2014 October, A-Shell 6.1.1391, edit 711: New auto-defined COMPILER_VERSION macro equates to the compiler edit.

2014 October, A-Shell 6.1.1391a, edit 710: New  .TRUE and .FALSE may be used as self-documenting replacements for -1 and 0.

2014 October, A-Shell 6.1.1391b, edit 710: New statement DEFTYPE may be used to define an alias for a data type.

2014 October, A-Shell 6.1.1391, edit 708: It is no longer required that function names start with fn'.

2014 July, A-Shell 6.1.1387, edit 685: LSX file now shows offsets for members within instances of structures.

2014 July, A-Shell 6.1.1387, edit 679: ++PRAGMA ERROR_IF_NOT_MAPPED "FALSE" may now be used to override /M or a previous "TRUE". Previously it was only possible to enable the /M switch, not disable it. Note that you can now turn the option on and off multiple times within a program, allowing you to get the benefit of the for new sections of code without being forced to clean up the unmapped variables in all of your code—i.e. in all of your include modules.

2014 July, A-Shell 6.1.1387, edit 678: Improve error reporting on missing ++endif; now lists all of the unmatched ++if statements in the stack.

2014 July, A-Shell 6.1.1387, edit 675: On first $COPY, attempt to also include <prog>.VER if it exists.

2014 July, A-Shell 6.1.1387, edit 672, 674: Support Madics $COPY directive. Similar to ++INCLUDE but with default extension .cpy and different search paths.

2014 July, A-Shell 6.1.1387, edit 673: Compiler now allows a locally defined structure variable with same name as a module or global variable provided they are same type of structure.

2014 July, A-Shell 6.1.1387, edit 669-671: APN-related internal adjustments.

2014 June, A-Shell 6.1.1387, edit 668: Compiler now flags as an error an attempt to define a local structure whose name matches an auto-externed global or private (module) structure. Although this would be technically legal, it invites confusion likely to lead to difficult-to-detect bugs, especially when the local and module/global structures aren't even the same layout.

2014 June, A-Shell 6.1.1387, edit 668: Added support for -so switch to output errors to stdout rather than to a file or window. This makes it easier to interface with certain editors and IDEs.

2014 March, A-Shell 6.1.1381, edit 663: When using /P and /L, the LSX file now contains a list of all the procedures and functions, along with an indicator of how many times they were called.

2014 March, A-Shell 6.1.1381, edit 655: New statements ++IFLBL label, ++IFNLBL label and ++ELIFLBL label areanalogous to the existing ++IFDEF, ++IFNDEF, and ++ELIFDEF statements, as well as ++IFMAP, ++IFNMAP and ++ELIFMAP, except that instead of referring to defined symbols or mapped variables, they refer to labels—used by GOTO and GOSUB—as well as procedure and function names. Note however that when the specified label is meant to refer to a function or procedure name, it must be terminated by an empty pair of parentheses.

2014 March, A-Shell 6.1.1380, edit 654: The new UNDEF statement causes the specified symbol to be undefined, allowing it to be redefined or to fail a ++IFDEF symbol test.

2014 February, A-Shell 6.1.1373, edit 651: Two new Dot Functions, .ARGTYP(argno) and .ARGSIZ(argno), return the type and size of the specified argument passed to the current SBX, function, or procedure. If the specified argno is invalid, the return value will be -1.

2014 February, A-Shell 6.1.1373, edit 652/653: Subroutines, both internal and SBX, may now use named parameters for functions and procedures. Parameter passing to subroutines is nearly identical to that for procedures and functions, so the implementation details are nearly the same. The main difference is that since subroutines do not have definition statements like functions and procedures, a new statement had been introduced to allow you to define their parameter names and default values: DEFXCALL xcallname{+|,}pname{|alias}{=defval},pname{|alias}{=defval}...

2013 October, A-Shell 6.1.1363, edit 647: When a function or procedure definition occurs (illegally) within an extended IF or FOR statement, the compiler now reports the location of the unterminated IF or FOR statement. Otherwise, it may have occured countless lines or even modules previously, since there otherwise no limit to the size of the body of a FOR or IF statement, making it very difficult to find the problem.

2013 August, A-Shell 6.1.1358, edit 642: New variations of ++INCLUDE: ++INCLUDE'IF'EXISTS <filespec> and ++INCLUDE'ONCE'IF'EXISTS <filespec>. As the name implies, these operate just like ++INCLUDE and ++INCLUDE'ONCE except that if the file is not found in the normal search path, it is just skipped.

2013 April, A-Shell 6.1.1350, edit 633: New compile-time function .OFFSIZ$(struct.member) is a variation of the .OFFSET() function which returns the combination of the specified structure member's offset and size, as a string formatted as "offset~size". While the combination of the two values in a string may seem unusual, since the offset and size are often used together, the combined format eliminates the need to specify the struct.member name twice, which invites discrepancy, and lends itself to use in runtime functions that may parse out the two values and combine them with other information.

Also: SIZEOF(VAR) now handles a much wider variety of VAR arguments, including structure names, DIMX structure variables, etc. Also, for symmetry with .OFFSET(), .SIZEOF() may be used interchangeablywith SIZEOF()—i.e. with or without the leading dot.

2013 April, A-Shell 6.1.1350, edit 632: The new compile-time function .OFFSET(struct.member) is similar to SIZEOF(var) except that it returns the offset to the specified member variable within the specified structure, starting from 1, rather than the size of the variable, and it only works on fields within structures. Also, in the case of arrays, .OFFSET only returns the offset to the base of the array, and doesn't actually allow the use of subscripts. The specified structure name can either be a defined structure name, or a MAP'd or DIMX'd instance of it.

2013 March, A-Shell 6.1.1346, edit 627: Add new conditional compilation statements ++ELIFDEF <symbol> and ++ELIFMAP <var>. ++ELIFDEF is to ++IFDEF, and ++ELIFMAP is to ++IFMAP, as ++ELIF is to ++IF.

2013 March, A-Shell 6.1.1339, edit 624: The new pragmas PRIVATE_BEGIN ... PRIVATE_END may be used within ++INCLUDE files to ensure that the module's private variables (MAP and DIMX) are initialized once and only once before they are used, regardless of the position of the ++INCLUDE in the main program.

For compiler changes prior to the release of A-Shell 6.1 and compiler edit 600, refer to the A-Shell Development History documentation.

Created with Help+Manual 9 and styled with Premium Pack Version 5 © by EC Software