structseq.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. Sk.builtin.structseq_types = {};
  2. Sk.builtin.make_structseq = function (module, name, fields, doc) {
  3. var nm = module + "." + name;
  4. var flds = [];
  5. var docs = [];
  6. var i;
  7. for (var key in fields) {
  8. flds.push(key);
  9. docs.push(fields[key]);
  10. }
  11. var cons = function structseq_constructor(arg) {
  12. Sk.builtin.pyCheckArgs(nm, arguments, 1, 1);
  13. var o;
  14. var it, i, v;
  15. if (!(this instanceof Sk.builtin.structseq_types[nm])) {
  16. o = Object.create(Sk.builtin.structseq_types[nm].prototype);
  17. o.constructor.apply(o, arguments);
  18. return o;
  19. }
  20. if (Object.prototype.toString.apply(arg) === "[object Array]") {
  21. v = arg;
  22. } else {
  23. v = [];
  24. for (it = Sk.abstr.iter(arg), i = it.tp$iternext(); i !== undefined; i = it.tp$iternext()) {
  25. v.push(i);
  26. }
  27. if (v.length != flds.length) {
  28. throw new Sk.builtin.TypeError(nm + "() takes a " + flds.length + "-sequence (" + v.length + "-sequence given)");
  29. }
  30. }
  31. Sk.builtin.tuple.call(this, v);
  32. this.__class__ = Sk.builtin.structseq_types[nm];
  33. };
  34. Sk.builtin.structseq_types[nm] = cons;
  35. goog.inherits(cons, Sk.builtin.tuple);
  36. if (doc) {
  37. cons.prototype.__doc__ = doc;
  38. }
  39. cons.prototype.tp$name = nm;
  40. cons.prototype.ob$type = Sk.builtin.type.makeIntoTypeObj(nm, Sk.builtin.structseq_types[nm]);
  41. cons.prototype.ob$type["$d"] = new Sk.builtin.dict([]);
  42. cons.prototype.ob$type["$d"].mp$ass_subscript(Sk.builtin.type.basesStr_, new Sk.builtin.tuple([Sk.builtin.tuple]));
  43. //var mro = Sk.builtin.type.buildMRO(cons.prototype.ob$type);
  44. //cons.prototype.ob$type["$d"].mp$ass_subscript(Sk.builtin.type.mroStr_, mro);
  45. //cons.prototype.ob$type.tp$mro = mro;
  46. cons.prototype.__getitem__ = new Sk.builtin.func(function (self, index) {
  47. return Sk.builtin.tuple.prototype.mp$subscript.call(self, index);
  48. });
  49. cons.prototype.__reduce__ = new Sk.builtin.func(function (self) {
  50. throw new Sk.builtin.Exception("__reduce__ is not implemented");
  51. });
  52. cons.prototype["$r"] = function () {
  53. var ret;
  54. var i;
  55. var bits;
  56. if (this.v.length === 0) {
  57. return new Sk.builtin.str(nm + "()");
  58. }
  59. bits = [];
  60. for (i = 0; i < this.v.length; ++i) {
  61. bits[i] = flds[i] + "=" + Sk.misceval.objectRepr(this.v[i]).v;
  62. }
  63. ret = bits.join(", ");
  64. if (this.v.length === 1) {
  65. ret += ",";
  66. }
  67. return new Sk.builtin.str(nm + "(" + ret + ")");
  68. };
  69. cons.prototype.tp$setattr = function (name, value) {
  70. throw new Sk.builtin.AttributeError("readonly property");
  71. };
  72. cons.prototype.tp$getattr = function (name) {
  73. var i = flds.indexOf(name);
  74. if (i >= 0) {
  75. return this.v[i];
  76. } else {
  77. return Sk.builtin.object.prototype.GenericGetAttr(name);
  78. }
  79. };
  80. return cons;
  81. };
  82. goog.exportSymbol("Sk.builtin.make_structseq", Sk.builtin.make_structseq);