88 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
.sp 1.5i
 | 
						|
.nr H1 3
 | 
						|
.NH
 | 
						|
Conformant Arrays
 | 
						|
.nh
 | 
						|
.LP
 | 
						|
.sp
 | 
						|
A fifth kind of parameter, besides the value, variable, procedure, and function
 | 
						|
parameter, is the conformant array parameter (\fBISO 6.6.3.7\fR). This
 | 
						|
parameter, undoubtedly the major addition to Pascal from the compiler writer's
 | 
						|
point of view, has been implemented. With this kind of parameter, the required
 | 
						|
bounds of the index-type of an actual parameter are not fixed, but are
 | 
						|
restricted to a specified range of values. Two types of conformant array
 | 
						|
parameters can be distinguished: variable conformant array parameters and
 | 
						|
value conformant array parameters.
 | 
						|
.sp
 | 
						|
.NH 2
 | 
						|
Variable conformant array parameters
 | 
						|
.LP
 | 
						|
.sp
 | 
						|
The treatment of variable conformant array parameters is comparable with the
 | 
						|
normal variable parameter.
 | 
						|
Both have in common that the parameter mechanism used is \fIcall by
 | 
						|
reference\fR.
 | 
						|
.br
 | 
						|
An example is:
 | 
						|
.br
 | 
						|
.in +5m
 | 
						|
to sort variable length arrays of integers, the following Pascal procedure could be used:
 | 
						|
 | 
						|
.nf
 | 
						|
\fBprocedure\fR bubblesort(\fBvar\fR A : \fBarray\fR[low..high : integer] \fBof\fR integer);
 | 
						|
\fBvar\fR i, j : integer;
 | 
						|
\fBbegin
 | 
						|
        for\fR j := high - 1 \fBdownto\fR low \fBdo
 | 
						|
                for\fR i := low \fBto\fR j \fBdo
 | 
						|
                        if\fR A[i+1] < A[i] \fBthen\fI interchange A[i] and A[i+1]
 | 
						|
\fBend\fR;
 | 
						|
.fi
 | 
						|
.in -5m
 | 
						|
 | 
						|
For every actual parameter, the base address of the array is pushed on the
 | 
						|
stack and for every index-type-specification, exactly one array descriptor
 | 
						|
is pushed.
 | 
						|
.sp
 | 
						|
.NH 2
 | 
						|
Value conformant array parameters
 | 
						|
.LP
 | 
						|
.sp
 | 
						|
The treatment of value conformant array parameters is more complex than its
 | 
						|
variable counterpart.
 | 
						|
.br
 | 
						|
An example is:
 | 
						|
.br
 | 
						|
.in +5m
 | 
						|
an unpacked array of characters could be printed as a string with the following program part:
 | 
						|
 | 
						|
.nf
 | 
						|
\fBprocedure\fR WriteAsString( A : \fBarray\fR[low..high : integer] \fBof\fR char);
 | 
						|
\fBvar\fR i : integer;
 | 
						|
\fBbegin
 | 
						|
        for\fR i := low \fBto\fR high \fBdo\fR write(A[i]);
 | 
						|
\fBend\fR;
 | 
						|
.fi
 | 
						|
.in -5m
 | 
						|
 | 
						|
The calling procedure pushes the base address of the actual parameter and
 | 
						|
the array descriptors belonging to it on the stack. Subsequently the procedure
 | 
						|
using the conformant array parameter is called. Because it is a \fIcall by
 | 
						|
value\fR, the called procedure has to create a copy of the actual parameter.
 | 
						|
This implies that the calling procedure knows how much space on the stack
 | 
						|
must be reserved for the parameters. If the actual-parameter is a conformant
 | 
						|
array, the called procedure keeps track of the size of the activation record.
 | 
						|
Hence the restrictions on the use of value conformant array parameters, as
 | 
						|
specified in \fBISO 6.6.3.7.2\fR, are dropped.
 | 
						|
 | 
						|
A description of the EM code generated by the compiler is:
 | 
						|
 | 
						|
.nf
 | 
						|
.ft I
 | 
						|
load the stack adjustment sofar
 | 
						|
load base address of array parameter
 | 
						|
compute the size in bytes of the array
 | 
						|
add this size to the stack adjustment
 | 
						|
copy the array
 | 
						|
remember the new address of the array
 | 
						|
.ft R
 | 
						|
.fi
 |