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; |