UNPKG

@awayfl/avm2

Version:

Virtual machine for executing AS3 code

80 lines (79 loc) 2.54 kB
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')"); }