UNPKG

@awayfl/avm2

Version:

Virtual machine for executing AS3 code

49 lines (48 loc) 2.12 kB
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); }