@awayfl/avm2
Version:
Virtual machine for executing AS3 code
39 lines (38 loc) • 1.6 kB
JavaScript
import { assert } from '@awayjs/graphics';
import { release, notImplemented, hasOwnGetter } from '@awayfl/swf-loader';
import { containsSymbol } from './containsSymbol';
export function linkSymbols(symbols, traits, object) {
for (var i = 0; i < traits.traits.length; i++) {
var trait = traits.traits[i];
var multiname = trait.multiname;
var name_1 = multiname.name;
var namespace = multiname.namespace;
if (!containsSymbol(symbols, name_1)) {
continue;
}
release || assert(namespace.type !== 3 /* NamespaceType.Private */, 'Why are you linking against private members?');
if (trait.isConst()) {
release || release || notImplemented('Don\'t link against const traits.');
return;
}
var qn = multiname.getMangledName();
if (trait.isSlot()) {
Object.defineProperty(object, name_1, {
get: new Function('', 'return this.' + qn +
'//# sourceURL=get-' + qn + '.as'),
set: new Function('v', 'this.' + qn + ' = v;' +
'//# sourceURL=set-' + qn + '.as')
});
}
else if (trait.isGetter()) {
release || assert(hasOwnGetter(object, qn), 'There should be an getter method for this symbol.');
Object.defineProperty(object, name_1, {
get: new Function('', 'return this.' + qn +
'//# sourceURL=get-' + qn + '.as')
});
}
else {
notImplemented(trait.toString());
}
}
}