@awayfl/avm2
Version:
Virtual machine for executing AS3 code
85 lines (73 loc) • 2.59 kB
text/typescript
import { Info } from './Info';
import { ClassInfo } from './ClassInfo';
import { RuntimeTraits } from './RuntimeTraits';
import { AXClass } from '../../run/AXClass';
import { ABCFile } from './ABCFile';
import { Multiname } from './Multiname';
import { MethodInfo } from './MethodInfo';
import { Traits } from './Traits';
import { IndentingWriter } from '@awayfl/swf-loader';
import { CONSTANT } from './CONSTANT';
import { Namespace } from './Namespace';
import { ILocalInfo } from './ILocalInfo';
export class InstanceInfo extends Info implements ILocalInfo {
public classInfo: ClassInfo = null;
public runtimeTraits: RuntimeTraits = null;
private _interfaces: Set<AXClass> = null;
constructor(
public readonly abc: ABCFile,
public readonly multiname: Multiname,
public readonly superName: Multiname,
public readonly flags: number,
public readonly protectedNs: Namespace,
public readonly interfaceNames: Multiname [],
public readonly methodInfo: MethodInfo,
public readonly traits: Traits
) {
super(traits);
this.methodInfo.instanceInfo = this;
this.methodInfo.isConstructor = true;
}
public getClassName(): string {
const namespace = this.multiname.namespaces[0];
return namespace.uri ? namespace.uri + '.' + this.multiname.name : this.multiname.name;
}
public getInterfaces(ownerClass: AXClass): Set<AXClass> {
if (this._interfaces) {
return this._interfaces;
}
let superClassInterfaces;
const superClass = ownerClass.superClass;
if (superClass) {
superClassInterfaces = superClass.classInfo.instanceInfo.getInterfaces(superClass);
}
const SetCtor: any = Set;
const interfaces = this._interfaces = new SetCtor(superClassInterfaces);
for (let i = 0; i < this.interfaceNames.length; i++) {
const mn = this.interfaceNames[i];
const type = this.abc.applicationDomain.getClass(mn);
interfaces.add(type);
const implementedInterfaces = type.classInfo.instanceInfo.getInterfaces(type);
implementedInterfaces.forEach((iface) => interfaces.add(iface));
}
return interfaces;
}
public toString() {
return 'InstanceInfo ' + this.multiname.name;
}
public trace(writer: IndentingWriter) {
writer.enter('InstanceInfo: ' + this.multiname);
this.superName && writer.writeLn('Super: ' + this.superName);
this.traits.trace(writer);
writer.outdent();
}
public isInterface(): boolean {
return !!(this.flags & CONSTANT.ClassInterface);
}
public isSealed(): boolean {
return !!(this.flags & CONSTANT.ClassSealed);
}
public isFinal(): boolean {
return !!(this.flags & CONSTANT.ClassFinal);
}
}