@awayfl/avm2
Version:
Virtual machine for executing AS3 code
33 lines (31 loc) • 992 B
text/typescript
import { Multiname } from '../abc/lazy/Multiname';
import { axCoerceString } from '../run/axCoerceString';
import { AXSecurityDomain } from '../run/AXSecurityDomain';
export function walk(sec: AXSecurityDomain, holder: any, name: string, reviver: Function) {
const val = holder[name];
if (Array.isArray(val)) {
const v: any[] = <any>val;
for (let i = 0, limit = v.length; i < limit; i++) {
const newElement = walk(sec, v, axCoerceString(i), reviver);
if (newElement === undefined) {
delete v[i];
} else {
v[i] = newElement;
}
}
} else if (val !== null && typeof val !== 'boolean' && typeof val !== 'number' &&
typeof val !== 'string') {
for (const p in val) {
if (!val.hasOwnProperty(p) || !Multiname.isPublicQualifiedName(p)) {
break;
}
const newElement = walk(sec, val, p, reviver);
if (newElement === undefined) {
delete val[p];
} else {
val[p] = newElement;
}
}
}
return reviver.call(holder, name, val);
}