dynamic_array.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. var RTL$ = {
  2. makeArray: function (/*dimensions, initializer*/){
  3. var forward = Array.prototype.slice.call(arguments);
  4. var result = new Array(forward.shift());
  5. var i;
  6. if (forward.length == 1){
  7. var init = forward[0];
  8. if (typeof init == "function")
  9. for(i = 0; i < result.length; ++i)
  10. result[i] = init();
  11. else
  12. for(i = 0; i < result.length; ++i)
  13. result[i] = init;
  14. }
  15. else
  16. for(i = 0; i < result.length; ++i)
  17. result[i] = this.makeArray.apply(this, forward);
  18. return result;
  19. },
  20. copyArrayOfRecords: function (from, to){
  21. to.splice(0, to.length);
  22. var length = from.length;
  23. if (!length)
  24. return;
  25. var method = from[0] instanceof Array
  26. ? this.cloneArrayOfRecords // this is array of arrays, go deeper
  27. : this.cloneRecord;
  28. for(var i = 0; i < length; ++i)
  29. to.push(method.call(this, from[i]));
  30. },
  31. cloneArrayOfRecords: function (from){
  32. var length = from.length;
  33. var result = new Array(length);
  34. if (length){
  35. var method = from[0] instanceof Array
  36. ? this.cloneArrayOfRecords // this is array of arrays, go deeper
  37. : this.cloneRecord;
  38. for(var i = 0; i < result.length; ++i)
  39. result[i] = method.call(this, from[i]);
  40. }
  41. return result;
  42. },
  43. cloneRecord: function (from){
  44. var Ctr = from.constructor;
  45. var result = new Ctr();
  46. this.copyRecord(from, result);
  47. return result;
  48. },
  49. copyRecord: function (from, to){
  50. for(var prop in to){
  51. if (to.hasOwnProperty(prop)){
  52. var v = from[prop];
  53. var isScalar = prop[0] != "$";
  54. if (isScalar)
  55. to[prop] = v;
  56. else
  57. to[prop] = v instanceof Array ? this.cloneArrayOfRecords(v)
  58. : this.cloneRecord(v);
  59. }
  60. }
  61. },
  62. copyArrayOfScalars: function (from, to){
  63. to.splice(0, to.length);
  64. for(var i = 0; i < from.length; ++i)
  65. to.push(this.cloneArrayOfScalars(from[i]));
  66. },
  67. cloneArrayOfScalars: function (from){
  68. var length = from.length;
  69. if (!length)
  70. return [];
  71. if (!(from[0] instanceof Array))
  72. return from.slice();
  73. // this is array of arrays, go deeper
  74. var result = new Array(length);
  75. for(var i = 0; i < length; ++i)
  76. result[i] = this.cloneArrayOfScalars(from[i]);
  77. return result;
  78. },
  79. assert: function (condition){
  80. if (!condition)
  81. throw new Error("assertion failed");
  82. }
  83. };
  84. var m = function (){
  85. function T(){
  86. this.a = [];
  87. }
  88. var r = new T();
  89. var a = RTL$.makeArray(3, 0);
  90. var dynamicInt = [];
  91. var dynamicString = [];
  92. var dynamicChar = [];
  93. var dynamicByte = [];
  94. var dynamicRecord = [];
  95. var dynamicArrayOfStaticArrayInt = [];
  96. var i = 0;
  97. var s = '';
  98. var byte = 0;
  99. function assignDynamicArrayFromStatic(){
  100. var static$ = RTL$.makeArray(3, 0);
  101. var dynamic = [];
  102. Array.prototype.splice.apply(dynamic, [0, Number.MAX_VALUE].concat(static$));
  103. }
  104. function returnOuterArray(){
  105. return a.slice();
  106. }
  107. function passArrayBeRef(a/*VAR ARRAY * OF INTEGER*/){
  108. var static$ = RTL$.makeArray(3, 0);
  109. a[0] = 1;
  110. a[0] = a[1];
  111. Array.prototype.splice.apply(a, [0, Number.MAX_VALUE].concat(static$));
  112. Array.prototype.splice.apply(a, [0, Number.MAX_VALUE].concat(dynamicInt));
  113. }
  114. function passArrayOfRecordsByRef(a/*VAR ARRAY * OF T*/){
  115. var result = [];
  116. RTL$.copyArrayOfRecords(result, a);
  117. }
  118. function passArrayOfArraysByRef(a/*VAR ARRAY *, 3 OF INTEGER*/){
  119. var result = [];
  120. RTL$.copyArrayOfScalars(result, a);
  121. }
  122. dynamicInt.push(3);
  123. dynamicInt.push(i);
  124. dynamicInt.push(byte);
  125. dynamicString.push("abc");
  126. dynamicString.push("\"");
  127. dynamicString.push(s);
  128. dynamicChar.push(34);
  129. dynamicByte.push(byte);
  130. dynamicByte.push(i & 0xFF);
  131. dynamicRecord.push(RTL$.cloneRecord(r));
  132. dynamicArrayOfStaticArrayInt.push(a.slice());
  133. RTL$.assert(dynamicInt.indexOf(i) != -1);
  134. RTL$.assert(dynamicChar.indexOf(34) != -1);
  135. dynamicInt.splice(i, 1);
  136. dynamicInt.splice(0, Number.MAX_VALUE);
  137. passArrayBeRef(dynamicInt);
  138. passArrayOfRecordsByRef(dynamicRecord);
  139. passArrayOfArraysByRef(dynamicArrayOfStaticArrayInt);
  140. }();