@awayfl/avm2
Version:
Virtual machine for executing AS3 code
118 lines (117 loc) • 4.17 kB
JavaScript
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 };