.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