@awayfl/avm2
Version:
Virtual machine for executing AS3 code
80 lines (79 loc) • 2.54 kB
JavaScript
import { __assign } from "tslib";
export var IS_EXTERNAL_CLASS = Symbol('External class marker');
export var LONG_NAMES = /nape./;
export var extClasses = {
_lib: null,
set lib(v) {
v && console.debug('[AVM2] Register external lib:', __assign({}, v));
this._lib = v;
},
get lib() {
return this._lib;
}
};
export function getExtClassField(name, namespace) {
if (namespace === void 0) { namespace = undefined; }
var lib = extClasses._lib;
if (!lib || !name)
return null;
// fast check for flattened modules
if (!namespace || typeof lib[name] !== 'undefined')
return lib[name];
if (!namespace)
return null;
var trace = lib;
var path = namespace.split('.');
for (var _i = 0, path_1 = path; _i < path_1.length; _i++) {
var child = path_1[_i];
trace = trace[child];
if (!trace) {
return null;
}
}
return trace[name];
}
/**
* Try construct object from external lib, like as Box2D or Nape
* @param mn
* @param args
*/
export function extClassConstructor(mn, args) {
var _a;
if (!extClasses._lib)
return null;
var ns = (_a = mn.namespace) === null || _a === void 0 ? void 0 : _a.uri;
var name = mn.name;
var isLong = ns && LONG_NAMES.test(ns);
var Constructor = getExtClassField(name, isLong ? ns : undefined);
if (typeof Constructor !== 'function') {
return null;
}
Object.defineProperty(Constructor.prototype, IS_EXTERNAL_CLASS, {
value: true
});
var obj = Reflect.construct(Constructor, args);
// force fast mode;
// legacy
obj.__fast__ = true;
return obj;
}
export function emitIsAX(name) {
if (!extClasses._lib)
return 'true';
return "(".concat(name, " != undefined && ").concat(name, "[AX_CLASS_SYMBOL])");
}
export function needFastCheck() {
return !!extClasses._lib;
}
export function emitIsAXOrPrimitive(name, explictNull) {
if (explictNull === void 0) { explictNull = false; }
if (!extClasses._lib)
return 'true';
var nullTest = explictNull ? '' : "|| ".concat(name, " == null");
return "(_a = typeof ".concat(name, ", ((_a !== 'object' && _a !== 'function' ) ").concat(nullTest, " || ").concat(name, "[AX_CLASS_SYMBOL]))");
}
export function emitIsCallableNative(name, func) {
if (!extClasses._lib)
return 'false';
return "( !".concat(name, "[AX_CLASS_SYMBOL] && typeof ").concat(name, "['").concat(func, "'] === 'function')");
}