123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- var RTL$ = {
- makeArray: function (/*dimensions, initializer*/){
- var forward = Array.prototype.slice.call(arguments);
- var result = new Array(forward.shift());
- var i;
- if (forward.length == 1){
- var init = forward[0];
- if (typeof init == "function")
- for(i = 0; i < result.length; ++i)
- result[i] = init();
- else
- for(i = 0; i < result.length; ++i)
- result[i] = init;
- }
- else
- for(i = 0; i < result.length; ++i)
- result[i] = this.makeArray.apply(this, forward);
- return result;
- },
- copyArrayOfRecords: function (from, to){
- to.splice(0, to.length);
- var length = from.length;
- if (!length)
- return;
- var method = from[0] instanceof Array
- ? this.cloneArrayOfRecords // this is array of arrays, go deeper
- : this.cloneRecord;
- for(var i = 0; i < length; ++i)
- to.push(method.call(this, from[i]));
- },
- cloneArrayOfRecords: function (from){
- var length = from.length;
- var result = new Array(length);
- if (length){
- var method = from[0] instanceof Array
- ? this.cloneArrayOfRecords // this is array of arrays, go deeper
- : this.cloneRecord;
- for(var i = 0; i < result.length; ++i)
- result[i] = method.call(this, from[i]);
- }
- return result;
- },
- cloneRecord: function (from){
- var Ctr = from.constructor;
- var result = new Ctr();
- this.copyRecord(from, result);
- return result;
- },
- copyRecord: function (from, to){
- for(var prop in to){
- if (to.hasOwnProperty(prop)){
- var v = from[prop];
- var isScalar = prop[0] != "$";
- if (isScalar)
- to[prop] = v;
- else
- to[prop] = v instanceof Array ? this.cloneArrayOfRecords(v)
- : this.cloneRecord(v);
- }
- }
- },
- copyArrayOfScalars: function (from, to){
- to.splice(0, to.length);
- for(var i = 0; i < from.length; ++i)
- to.push(this.cloneArrayOfScalars(from[i]));
- },
- cloneArrayOfScalars: function (from){
- var length = from.length;
- if (!length)
- return [];
- if (!(from[0] instanceof Array))
- return from.slice();
- // this is array of arrays, go deeper
- var result = new Array(length);
- for(var i = 0; i < length; ++i)
- result[i] = this.cloneArrayOfScalars(from[i]);
- return result;
- },
- assert: function (condition){
- if (!condition)
- throw new Error("assertion failed");
- }
- };
- var m = function (){
- function T(){
- this.a = [];
- }
- var r = new T();
- var a = RTL$.makeArray(3, 0);
- var dynamicInt = [];
- var dynamicString = [];
- var dynamicChar = [];
- var dynamicByte = [];
- var dynamicRecord = [];
- var dynamicArrayOfStaticArrayInt = [];
- var i = 0;
- var s = '';
- var byte = 0;
- function assignDynamicArrayFromStatic(){
- var static$ = RTL$.makeArray(3, 0);
- var dynamic = [];
- Array.prototype.splice.apply(dynamic, [0, Number.MAX_VALUE].concat(static$));
- }
- function returnOuterArray(){
- return a.slice();
- }
- function passArrayBeRef(a/*VAR ARRAY * OF INTEGER*/){
- var static$ = RTL$.makeArray(3, 0);
- a[0] = 1;
- a[0] = a[1];
- Array.prototype.splice.apply(a, [0, Number.MAX_VALUE].concat(static$));
- Array.prototype.splice.apply(a, [0, Number.MAX_VALUE].concat(dynamicInt));
- }
- function passArrayOfRecordsByRef(a/*VAR ARRAY * OF T*/){
- var result = [];
- RTL$.copyArrayOfRecords(result, a);
- }
- function passArrayOfArraysByRef(a/*VAR ARRAY *, 3 OF INTEGER*/){
- var result = [];
- RTL$.copyArrayOfScalars(result, a);
- }
- dynamicInt.push(3);
- dynamicInt.push(i);
- dynamicInt.push(byte);
- dynamicString.push("abc");
- dynamicString.push("\"");
- dynamicString.push(s);
- dynamicChar.push(34);
- dynamicByte.push(byte);
- dynamicByte.push(i & 0xFF);
- dynamicRecord.push(RTL$.cloneRecord(r));
- dynamicArrayOfStaticArrayInt.push(a.slice());
- RTL$.assert(dynamicInt.indexOf(i) != -1);
- RTL$.assert(dynamicChar.indexOf(34) != -1);
- dynamicInt.splice(i, 1);
- dynamicInt.splice(0, Number.MAX_VALUE);
- passArrayBeRef(dynamicInt);
- passArrayOfRecordsByRef(dynamicRecord);
- passArrayOfArraysByRef(dynamicArrayOfStaticArrayInt);
- }();
|