forked from LeenkxTeam/LNXSDK
205 lines
5.9 KiB
Haxe
205 lines
5.9 KiB
Haxe
|
/*
|
||
|
* Copyright (C)2005-2019 Haxe Foundation
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||
|
* copy of this software and associated documentation files (the "Software"),
|
||
|
* to deal in the Software without restriction, including without limitation
|
||
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||
|
* and/or sell copies of the Software, and to permit persons to whom the
|
||
|
* Software is furnished to do so, subject to the following conditions:
|
||
|
*
|
||
|
* The above copyright notice and this permission notice shall be included in
|
||
|
* all copies or substantial portions of the Software.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||
|
* DEALINGS IN THE SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
package neko;
|
||
|
|
||
|
/**
|
||
|
Platform-specific Neko Library. Provides some platform-specific functions
|
||
|
for the Neko target, such as conversion from Haxe types to native types
|
||
|
and vice-versa.
|
||
|
**/
|
||
|
class Lib {
|
||
|
/**
|
||
|
Load and return a Neko primitive from a NDLL library.
|
||
|
**/
|
||
|
public static function load(lib:String, prim:String, nargs:Int):Dynamic {
|
||
|
return untyped __dollar__loader.loadprim((lib + "@" + prim).__s, nargs);
|
||
|
}
|
||
|
|
||
|
public static function loadLazy(lib, prim, nargs):Dynamic {
|
||
|
try {
|
||
|
return load(lib, prim, nargs);
|
||
|
} catch (e:Dynamic) {
|
||
|
return untyped __dollar__varargs(function(_) {
|
||
|
throw e;
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Print the specified value on the default output.
|
||
|
**/
|
||
|
public static function print(v:Dynamic):Void {
|
||
|
untyped __dollar__print(v);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Print the specified value on the default output followed by a newline character.
|
||
|
**/
|
||
|
public static function println(v:Dynamic):Void {
|
||
|
untyped __dollar__print(v, "\n");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Rethrow an exception. This is useful when manually filtering an exception in order
|
||
|
to keep the previous exception stack.
|
||
|
**/
|
||
|
public static function rethrow(e:Dynamic):Dynamic {
|
||
|
return untyped __dollar__rethrow(e);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Serialize using native Neko serialization. This will return a Binary string that can be
|
||
|
stored for long term usage. The serialized data is optimized for speed and not for size.
|
||
|
**/
|
||
|
public static function serialize(v:Dynamic):haxe.io.Bytes {
|
||
|
return haxe.io.Bytes.ofData(__serialize(v));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Unserialize a string using native Neko serialization. See `serialize`.
|
||
|
**/
|
||
|
public static function unserialize(s:haxe.io.Bytes):Dynamic {
|
||
|
return untyped __unserialize(s.getData(), __dollar__loader);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Unserialize a string using native Neko serialization. See `serialize`.
|
||
|
This function assume that all the serialized data was serialized with current
|
||
|
module, even if the module name was different. This can happen if you are unserializing
|
||
|
some data into mod_neko that was serialized on a different server using a different
|
||
|
file path.
|
||
|
**/
|
||
|
public static function localUnserialize(s:haxe.io.Bytes):Dynamic {
|
||
|
return untyped __unserialize(s.getData(), {
|
||
|
loadmodule: function(m, l) {
|
||
|
return __dollar__exports;
|
||
|
},
|
||
|
loadprim: function(p, n) {
|
||
|
return __dollar__loader.loadprim(p, n);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Converts a Neko value to its Haxe equivalent. Used for wrapping String and Arrays raw values into Haxe Objects.
|
||
|
**/
|
||
|
public static function nekoToHaxe(v:Dynamic):Dynamic
|
||
|
untyped {
|
||
|
switch (__dollar__typeof(v)) {
|
||
|
case 0:
|
||
|
return v;
|
||
|
case 1:
|
||
|
return v;
|
||
|
case 2:
|
||
|
return v;
|
||
|
case 3:
|
||
|
return v;
|
||
|
case 4:
|
||
|
return new String(v);
|
||
|
case 6:
|
||
|
var a = Array.new1(v, __dollar__asize(v));
|
||
|
for (i in 0...a.length)
|
||
|
a[i] = nekoToHaxe(a[i]);
|
||
|
return a;
|
||
|
case 5:
|
||
|
var f = __dollar__objfields(v);
|
||
|
var i = 0;
|
||
|
var l = __dollar__asize(f);
|
||
|
var o = __dollar__new(v);
|
||
|
if (__dollar__objgetproto(v) != null)
|
||
|
throw "Can't convert object prototype";
|
||
|
while (i < l) {
|
||
|
__dollar__objset(o, f[i], nekoToHaxe(__dollar__objget(v, f[i])));
|
||
|
i += 1;
|
||
|
}
|
||
|
return o;
|
||
|
default:
|
||
|
throw "Can't convert " + string(v);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Converts a Haxe value to its Neko equivalent. Used to unwrap String and Arrays Objects into raw Neko values.
|
||
|
**/
|
||
|
public static function haxeToNeko(v:Dynamic):Dynamic
|
||
|
untyped {
|
||
|
switch (__dollar__typeof(v)) {
|
||
|
case 0:
|
||
|
return v;
|
||
|
case 1:
|
||
|
return v;
|
||
|
case 2:
|
||
|
return v;
|
||
|
case 3:
|
||
|
return v;
|
||
|
case 5:
|
||
|
var cl = v.__class__;
|
||
|
if (cl == String)
|
||
|
return v.__s;
|
||
|
if (cl == Array) {
|
||
|
var a = untyped __dollar__amake(v.length);
|
||
|
for (i in 0...v.length)
|
||
|
a[i] = haxeToNeko(v[i]);
|
||
|
return a;
|
||
|
}
|
||
|
if (cl != null || __dollar__objgetproto(v) != null)
|
||
|
throw "Can't convert " + string(v);
|
||
|
var f = __dollar__objfields(v);
|
||
|
var i = 0;
|
||
|
var l = __dollar__asize(f);
|
||
|
var o = __dollar__new(v);
|
||
|
while (i < l) {
|
||
|
__dollar__objset(o, f[i], haxeToNeko(__dollar__objget(v, f[i])));
|
||
|
i += 1;
|
||
|
}
|
||
|
return o;
|
||
|
default:
|
||
|
throw "Can't convert " + string(v);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns an object containing all compiled packages and classes.
|
||
|
**/
|
||
|
public static function getClasses():Dynamic {
|
||
|
return untyped neko.Boot.__classes;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns a string referencing the data contains in bytes.
|
||
|
**/
|
||
|
public inline static function stringReference(b:haxe.io.Bytes) {
|
||
|
return new String(cast b.getData());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns bytes referencing the content of a string.
|
||
|
**/
|
||
|
public inline static function bytesReference(s:String):haxe.io.Bytes {
|
||
|
return untyped new haxe.io.Bytes(s.length, s.__s);
|
||
|
}
|
||
|
|
||
|
static var __serialize = load("std", "serialize", 1);
|
||
|
static var __unserialize = load("std", "unserialize", 2);
|
||
|
}
|