@awayfl/avm2
Version:
Virtual machine for executing AS3 code
49 lines (48 loc) • 2.12 kB
JavaScript
import { emitInlineMultiname } from './emitInlineMultiname';
export function emitOpenCatchConditions(state, catchBlocks) {
// catch push Error on stack top
state.popAnyAlias('stack0');
state.emitBeginMain('catch(e) {');
state.emitMain('// in case this is a error coming from stack0.__fast when stack0 is undefined,');
state.emitMain('// we convert it to a ASError, so that avm2 can still catch it');
state.emitMain('if (e instanceof TypeError) {');
state.emitMain(' var _e = context.sec.createError("TypeError", {code:1065, message:e.message})');
state.emitMain(' _e.source = e; e = _e;');
state.emitMain('}');
state.emitMain('stack0 = e;');
var lastCatchItem = '';
for (var i = 0; i < catchBlocks.length; i++) {
var typeName = catchBlocks[i].type;
if (!typeName) {
lastCatchItem = "{ p = ".concat(catchBlocks[i].target, "; continue; };");
continue;
}
else {
/*
let n = names.indexOf(typeName);
if (n < 0) {
n = names.length;
names.push(typeName);
js0.push(` let name${n} = context.names[${n}];`);
}*/
var index = state.getMultinameIndex(typeName);
// eslint-disable-next-line max-len
state.emitMain("const errorClass$".concat(i, " = context.sec.application.getClass(").concat(emitInlineMultiname(state, index), ");"));
state.emitMain("if(errorClass$".concat(i, " && errorClass$").concat(i, ".axIsType(e))"));
state.emitMain(" { p = ".concat(catchBlocks[i].target, "; continue; };"));
}
}
if (lastCatchItem)
state.emitMain(lastCatchItem);
// if error was not catched by now, we throw it
state.emitMain('throw e;');
state.emitEndMain();
}
// reopen all try-catch blocks. used when entering a new case-block
export function emitOpenTryCatch(state, _group) {
state.emitBeginMain('try {');
}
export function emitCloseTryCatch(state, group) {
state.emitEndMain();
emitOpenCatchConditions(state, group);
}