345 lines
8.2 KiB
JavaScript
345 lines
8.2 KiB
JavaScript
// Class: haxe.Serializer
|
|
|
|
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
|
|
|
|
$global.Object.defineProperty(exports, "__esModule", {value: true});
|
|
|
|
var __map_reserved = {};
|
|
|
|
// Imports
|
|
|
|
var $hxClasses = require("./../hxClasses_stub").default;
|
|
var $import = require("./../import_stub").default;
|
|
function StringTools() {return require("./../StringTools");}
|
|
function Reflect() {return require("./../Reflect");}
|
|
function Type() {return require("./../Type");}
|
|
function Std() {return require("./../Std");}
|
|
function js__$Boot_HaxeError() {return require("./../js/_Boot/HaxeError");}
|
|
function List() {return require("./../List");}
|
|
function haxe_ds_IntMap() {return require("./../haxe/ds/IntMap");}
|
|
function haxe_ds_ObjectMap() {return require("./../haxe/ds/ObjectMap");}
|
|
function haxe_ds_StringMap() {return require("./../haxe/ds/StringMap");}
|
|
function haxe_io_Bytes() {return require("./../haxe/io/Bytes");}
|
|
function HxOverrides() {return require("./../HxOverrides");}
|
|
function StringBuf() {return require("./../StringBuf");}
|
|
|
|
// Constructor
|
|
|
|
var Serializer = function() {
|
|
this.buf = new (StringBuf().default)();
|
|
this.cache = [];
|
|
this.useCache = Serializer.USE_CACHE;
|
|
this.useEnumIndex = Serializer.USE_ENUM_INDEX;
|
|
this.shash = new (haxe_ds_StringMap().default)();
|
|
this.scount = 0;
|
|
}
|
|
|
|
// Meta
|
|
|
|
Serializer.__name__ = ["haxe","Serializer"];
|
|
Serializer.prototype = {
|
|
toString: function() {
|
|
return this.buf.toString();
|
|
},
|
|
serializeString: function(s) {
|
|
var x = this.shash.get(s);
|
|
if(x != null) {
|
|
this.buf.add("R");
|
|
this.buf.add(x);
|
|
return;
|
|
}
|
|
this.shash.set(s,this.scount++);
|
|
this.buf.add("y");
|
|
s = (StringTools().default).urlEncode(s);
|
|
this.buf.add(s.length);
|
|
this.buf.add(":");
|
|
this.buf.add(s);
|
|
},
|
|
serializeRef: function(v) {
|
|
var vt = typeof(v);
|
|
var _g1 = 0;
|
|
var _g = this.cache.length;
|
|
while(_g1 < _g) {
|
|
var i = _g1++;
|
|
var ci = this.cache[i];
|
|
if(typeof(ci) == vt && ci == v) {
|
|
this.buf.add("r");
|
|
this.buf.add(i);
|
|
return true;
|
|
}
|
|
}
|
|
this.cache.push(v);
|
|
return false;
|
|
},
|
|
serializeFields: function(v) {
|
|
var _g = 0;
|
|
var _g1 = (Reflect().default).fields(v);
|
|
while(_g < _g1.length) {
|
|
var f = _g1[_g];
|
|
++_g;
|
|
this.serializeString(f);
|
|
this.serialize((Reflect().default).field(v,f));
|
|
}
|
|
this.buf.add("g");
|
|
},
|
|
serialize: function(v) {
|
|
var _g = (Type().default)["typeof"](v);
|
|
switch((Type().default).enumIndex(_g)) {
|
|
case 0:
|
|
this.buf.add("n");
|
|
break;
|
|
case 1:
|
|
var v1 = v;
|
|
if(v1 == 0) {
|
|
this.buf.add("z");
|
|
return;
|
|
}
|
|
this.buf.add("i");
|
|
this.buf.add(v1);
|
|
break;
|
|
case 2:
|
|
var v2 = v;
|
|
if(isNaN(v2)) {
|
|
this.buf.add("k");
|
|
} else if(!isFinite(v2)) {
|
|
this.buf.add(v2 < 0 ? "m" : "p");
|
|
} else {
|
|
this.buf.add("d");
|
|
this.buf.add(v2);
|
|
}
|
|
break;
|
|
case 3:
|
|
this.buf.add(v ? "t" : "f");
|
|
break;
|
|
case 4:
|
|
if((Std().default)["is"](v,$hxClasses["Class"])) {
|
|
var className = (Type().default).getClassName(v);
|
|
this.buf.add("A");
|
|
this.serializeString(className);
|
|
} else if((Std().default)["is"](v,$hxClasses["Enum"])) {
|
|
this.buf.add("B");
|
|
this.serializeString((Type().default).getEnumName(v));
|
|
} else {
|
|
if(this.useCache && this.serializeRef(v)) {
|
|
return;
|
|
}
|
|
this.buf.add("o");
|
|
this.serializeFields(v);
|
|
}
|
|
break;
|
|
case 5:
|
|
throw new (js__$Boot_HaxeError().default)("Cannot serialize function");
|
|
break;
|
|
case 6:
|
|
var c = _g[2];
|
|
if(c == String) {
|
|
this.serializeString(v);
|
|
return;
|
|
}
|
|
if(this.useCache && this.serializeRef(v)) {
|
|
return;
|
|
}
|
|
switch(c) {
|
|
case Array:
|
|
var ucount = 0;
|
|
this.buf.add("a");
|
|
var l = v["length"];
|
|
var _g1 = 0;
|
|
var _g2 = l;
|
|
while(_g1 < _g2) {
|
|
var i = _g1++;
|
|
if(v[i] == null) {
|
|
++ucount;
|
|
} else {
|
|
if(ucount > 0) {
|
|
if(ucount == 1) {
|
|
this.buf.add("n");
|
|
} else {
|
|
this.buf.add("u");
|
|
this.buf.add(ucount);
|
|
}
|
|
ucount = 0;
|
|
}
|
|
this.serialize(v[i]);
|
|
}
|
|
}
|
|
if(ucount > 0) {
|
|
if(ucount == 1) {
|
|
this.buf.add("n");
|
|
} else {
|
|
this.buf.add("u");
|
|
this.buf.add(ucount);
|
|
}
|
|
}
|
|
this.buf.add("h");
|
|
break;
|
|
case Date:
|
|
var d = v;
|
|
this.buf.add("v");
|
|
this.buf.add(d.getTime());
|
|
break;
|
|
case (List().default):
|
|
this.buf.add("l");
|
|
var v3 = v;
|
|
var i1 = v3.iterator();
|
|
while(i1.hasNext()) {
|
|
var i2 = i1.next();
|
|
this.serialize(i2);
|
|
}
|
|
this.buf.add("h");
|
|
break;
|
|
case (haxe_ds_IntMap().default):
|
|
this.buf.add("q");
|
|
var v4 = v;
|
|
var k = v4.keys();
|
|
while(k.hasNext()) {
|
|
var k1 = k.next();
|
|
this.buf.add(":");
|
|
this.buf.add(k1);
|
|
this.serialize(v4.get(k1));
|
|
}
|
|
this.buf.add("h");
|
|
break;
|
|
case (haxe_ds_ObjectMap().default):
|
|
this.buf.add("M");
|
|
var v5 = v;
|
|
var k2 = v5.keys();
|
|
while(k2.hasNext()) {
|
|
var k3 = k2.next();
|
|
var id = (Reflect().default).field(k3,"__id__");
|
|
(Reflect().default).deleteField(k3,"__id__");
|
|
this.serialize(k3);
|
|
(Reflect().default).setField(k3,"__id__",id);
|
|
this.serialize(v5.get(k3));
|
|
}
|
|
this.buf.add("h");
|
|
break;
|
|
case (haxe_ds_StringMap().default):
|
|
this.buf.add("b");
|
|
var v6 = v;
|
|
var k4 = v6.keys();
|
|
while(k4.hasNext()) {
|
|
var k5 = k4.next();
|
|
this.serializeString(k5);
|
|
this.serialize(v6.get(k5));
|
|
}
|
|
this.buf.add("h");
|
|
break;
|
|
case (haxe_io_Bytes().default):
|
|
var v7 = v;
|
|
this.buf.add("s");
|
|
this.buf.add(Math.ceil(v7.get_length() * 8 / 6));
|
|
this.buf.add(":");
|
|
var i3 = 0;
|
|
var max = v7.get_length() - 2;
|
|
var b64 = Serializer.BASE64_CODES;
|
|
if(b64 == null) {
|
|
var length = Serializer.BASE64.length;
|
|
var this1 = new Array(length);
|
|
b64 = this1;
|
|
var _g11 = 0;
|
|
var _g3 = Serializer.BASE64.length;
|
|
while(_g11 < _g3) {
|
|
var i4 = _g11++;
|
|
b64[i4] = (HxOverrides().default).cca(Serializer.BASE64,i4);
|
|
}
|
|
Serializer.BASE64_CODES = b64;
|
|
}
|
|
while(i3 < max) {
|
|
var b1 = v7.get(i3++);
|
|
var b2 = v7.get(i3++);
|
|
var b3 = v7.get(i3++);
|
|
this.buf.addChar(b64[b1 >> 2]);
|
|
this.buf.addChar(b64[(b1 << 4 | b2 >> 4) & 63]);
|
|
this.buf.addChar(b64[(b2 << 2 | b3 >> 6) & 63]);
|
|
this.buf.addChar(b64[b3 & 63]);
|
|
}
|
|
if(i3 == max) {
|
|
var b11 = v7.get(i3++);
|
|
var b21 = v7.get(i3++);
|
|
this.buf.addChar(b64[b11 >> 2]);
|
|
this.buf.addChar(b64[(b11 << 4 | b21 >> 4) & 63]);
|
|
this.buf.addChar(b64[b21 << 2 & 63]);
|
|
} else if(i3 == max + 1) {
|
|
var b12 = v7.get(i3++);
|
|
this.buf.addChar(b64[b12 >> 2]);
|
|
this.buf.addChar(b64[b12 << 4 & 63]);
|
|
}
|
|
break;
|
|
default:
|
|
if(this.useCache) {
|
|
this.cache.pop();
|
|
}
|
|
if(v.hxSerialize != null) {
|
|
this.buf.add("C");
|
|
this.serializeString((Type().default).getClassName(c));
|
|
if(this.useCache) {
|
|
this.cache.push(v);
|
|
}
|
|
v.hxSerialize(this);
|
|
this.buf.add("g");
|
|
} else {
|
|
this.buf.add("c");
|
|
this.serializeString((Type().default).getClassName(c));
|
|
if(this.useCache) {
|
|
this.cache.push(v);
|
|
}
|
|
this.serializeFields(v);
|
|
}
|
|
}
|
|
break;
|
|
case 7:
|
|
var e = _g[2];
|
|
if(this.useCache) {
|
|
if(this.serializeRef(v)) {
|
|
return;
|
|
}
|
|
this.cache.pop();
|
|
}
|
|
this.buf.add(this.useEnumIndex ? "j" : "w");
|
|
this.serializeString((Type().default).getEnumName(e));
|
|
if(this.useEnumIndex) {
|
|
this.buf.add(":");
|
|
this.buf.add(v[1]);
|
|
} else {
|
|
this.serializeString(v[0]);
|
|
}
|
|
this.buf.add(":");
|
|
var l1 = v["length"];
|
|
this.buf.add(l1 - 2);
|
|
var _g12 = 2;
|
|
var _g4 = l1;
|
|
while(_g12 < _g4) {
|
|
var i5 = _g12++;
|
|
this.serialize(v[i5]);
|
|
}
|
|
if(this.useCache) {
|
|
this.cache.push(v);
|
|
}
|
|
break;
|
|
default:
|
|
throw new (js__$Boot_HaxeError().default)("Cannot serialize " + (Std().default).string(v));
|
|
}
|
|
}
|
|
};
|
|
Serializer.prototype.__class__ = $hxClasses["haxe.Serializer"] = Serializer;
|
|
|
|
// Init
|
|
|
|
|
|
|
|
// Statics
|
|
|
|
Serializer.run = function(v) {
|
|
var s = new Serializer();
|
|
s.serialize(v);
|
|
return s.toString();
|
|
}
|
|
Serializer.USE_CACHE = false
|
|
Serializer.USE_ENUM_INDEX = false
|
|
Serializer.BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789%:"
|
|
Serializer.BASE64_CODES = null
|
|
|
|
// Export
|
|
|
|
exports.default = Serializer; |