array.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. cloneArrayOfRecords: function (from){
  21. var length = from.length;
  22. var result = new Array(length);
  23. if (length){
  24. var method = from[0] instanceof Array
  25. ? this.cloneArrayOfRecords // this is array of arrays, go deeper
  26. : this.cloneRecord;
  27. for(var i = 0; i < result.length; ++i)
  28. result[i] = method.call(this, from[i]);
  29. }
  30. return result;
  31. },
  32. cloneRecord: function (from){
  33. var Ctr = from.constructor;
  34. var result = new Ctr();
  35. this.copyRecord(from, result);
  36. return result;
  37. },
  38. copyRecord: function (from, to){
  39. for(var prop in to){
  40. if (to.hasOwnProperty(prop)){
  41. var v = from[prop];
  42. var isScalar = prop[0] != "$";
  43. if (isScalar)
  44. to[prop] = v;
  45. else
  46. to[prop] = v instanceof Array ? this.cloneArrayOfRecords(v)
  47. : this.cloneRecord(v);
  48. }
  49. }
  50. },
  51. cloneArrayOfScalars: function (from){
  52. var length = from.length;
  53. if (!length)
  54. return [];
  55. if (!(from[0] instanceof Array))
  56. return from.slice();
  57. // this is array of arrays, go deeper
  58. var result = new Array(length);
  59. for(var i = 0; i < length; ++i)
  60. result[i] = this.cloneArrayOfScalars(from[i]);
  61. return result;
  62. }
  63. };
  64. var m = function (){
  65. var arraySize = 10;
  66. var a1 = RTL$.makeArray(10, 0);var a11 = RTL$.makeArray(10, 0);
  67. var a2 = RTL$.makeArray(5, function(){return RTL$.makeArray(10, 0);});
  68. var a3 = RTL$.makeArray(5, false);
  69. var a4 = RTL$.makeArray(3, 4, false);
  70. function anonymous$1(){
  71. }
  72. var a5 = RTL$.makeArray(3, function(){return new anonymous$1();});
  73. function p(){
  74. var a3 = RTL$.makeArray(1, 0);
  75. a3[0] = 1;
  76. }
  77. function p1(a/*ARRAY 10 OF INTEGER*/){
  78. }
  79. function p2(a/*VAR ARRAY 10 OF INTEGER*/){
  80. p1(a);
  81. }
  82. function testAssign(){
  83. function T(){
  84. }
  85. var aInts1 = RTL$.makeArray(3, 0);var aInts2 = RTL$.makeArray(3, 0);
  86. var aRecords1 = RTL$.makeArray(3, function(){return new T();});var aRecords2 = RTL$.makeArray(3, function(){return new T();});
  87. var aPointers1 = RTL$.makeArray(3, null);var aPointers2 = RTL$.makeArray(3, null);
  88. var arrayOfArray1 = RTL$.makeArray(3, 5, false);var arrayOfArray2 = RTL$.makeArray(3, 5, false);
  89. aInts2 = aInts1.slice();
  90. aRecords2 = RTL$.cloneArrayOfRecords(aRecords1);
  91. aPointers2 = aPointers1.slice();
  92. arrayOfArray2 = RTL$.cloneArrayOfScalars(arrayOfArray1);
  93. }
  94. function testPassOpenArray(a/*ARRAY OF INTEGER*/){
  95. }
  96. a1[0] = 1;
  97. a3[1] = true;
  98. a4[1][2] = true;
  99. a4[1][2] = true;
  100. p1(a1);
  101. p2(a1);
  102. a1 = a11.slice();
  103. testPassOpenArray(a1);
  104. }();