UNPKG

@awayfl/avm2

Version:

Virtual machine for executing AS3 code

118 lines (117 loc) 4.17 kB
import { release } from '@awayfl/swf-loader'; import { assert } from '@awayjs/graphics'; var RuntimeTraits = /** @class */ (function () { function RuntimeTraits(superTraits, protectedNs, protectedNsMappings) { this.superTraits = superTraits; this.protectedNs = protectedNs; this.protectedNsMappings = protectedNsMappings; this.slots = []; this._nextSlotID = 1; this.multinames = {}; var traits = this._traits = Object.create(null); if (!superTraits) { return; } var superMappings = superTraits._traits; for (var key in superMappings) { traits[key] = Object.create(superMappings[key]); } } /** * Adds the given trait and returns any trait that might already exist under that name. * * See the comment for `Trait#resolveRuntimeTraits` for an explanation of the lookup scheme. */ RuntimeTraits.prototype.addTrait = function (trait) { var mn = trait.multiname; var mappings = this._traits[mn.name]; if (!mappings) { mappings = this._traits[mn.name] = Object.create(null); } var nsName = mn.namespaces[0].mangledName; var current = mappings[nsName]; mappings[nsName] = trait; return current; }; RuntimeTraits.prototype.addSlotTrait = function (trait) { var slot = trait.slot; if (!slot) { slot = trait.slot = this._nextSlotID++; } else { this._nextSlotID = slot + 1; } release || assert(!this.slots[slot]); this.slots[slot] = trait; }; RuntimeTraits.prototype.getTraitMultiname = function (mn) { if (mn.mutable) return this.getTrait(mn.namespaces, mn.name); return this.multinames[mn.id] || (this.multinames[mn.id] = this.getTrait(mn.namespaces, mn.name)); }; /** * Returns the trait matching the given multiname parts, if any. * * See the comment for `Trait#resolveRuntimeTraits` for an explanation of the lookup scheme. */ RuntimeTraits.prototype.getTrait = function (namespaces, name) { release || assert(typeof name === 'string'); var mappings = this._traits[name]; if (!mappings) { return null; } var trait; for (var i = 0; i < namespaces.length; i++) { var ns = namespaces[i]; trait = mappings[ns.mangledName]; if (trait) { return trait; } if (ns.type === 1 /* NamespaceType.Protected */) { var protectedScope = this; while (protectedScope) { if (protectedScope.protectedNs === ns) { trait = protectedScope.protectedNsMappings[name]; if (trait) { return trait; } } protectedScope = protectedScope.superTraits; } } } return null; }; RuntimeTraits.prototype.getTraitsList = function () { var list = []; var names = this._traits; for (var name_1 in names) { var mappings = names[name_1]; for (var nsName in mappings) { list.push(mappings[nsName]); } } return list; }; RuntimeTraits.prototype.getPublicTraitNames = function () { var list = []; var names = this._traits; var trait; for (var name_2 in names) { var mappings = names[name_2]; for (var nsName in mappings) { trait = mappings[nsName]; if (trait.multiname.namespace.isPublic() && (trait.kind == 0 /* TRAIT.Slot */ || trait.kind == 7 /* TRAIT.GetterSetter */)) { list.push(trait.multiname.name); } } } return list; }; RuntimeTraits.prototype.getSlot = function (i) { return this.slots[i]; }; return RuntimeTraits; }()); export { RuntimeTraits };