UNPKG

@awayfl/avm2

Version:

Virtual machine for executing AS3 code

75 lines (74 loc) 3.08 kB
import { emitInlineLocal } from './emitInlineVars'; import { emitPrimitiveCoerce } from './emitPrimitiveCoerce'; export function emitAnnotation(state) { var methodInfo = state.methodInfo; var params = state.methodInfo.parameters; var abc = state.methodInfo.abc; var methodName = state.methodInfo.meta.name; var paramsShift = 0; var args = []; var js0 = []; for (var i = 0; i < params.length; i++) { var p = params[i]; var arg = { name: emitInlineLocal(state, i + 1), value: null, type: null }; if (p.hasOptionalValue()) { switch (p.optionalValueKind) { case 1 /* CONSTANT.Utf8 */: arg.value = "".concat(JSON.stringify(abc.getString(p.optionalValueIndex))); break; default: arg.value = "".concat(p.getOptionalValue()); } } arg.type = p.typeName; args[i] = arg; } if (methodInfo.needsRest()) { args.push({ name: '...args' }); } var argsFilled = args .map(function (e) { return e.value ? "".concat(e.name, " /* ").concat(e.type ? e.type.name : '*', " */ = ").concat(e.value) : "".concat(e.name, " /* ").concat(e.type ? e.type.name : '*', " */"); }) .join(', '); var mname = methodName.replace(/([^a-z0-9]+)/gi, '_'); js0.push("".concat(state.indent, "return function compiled_").concat(mname, "(").concat(argsFilled, ") {")); state.moveIndent(1); var thisAlias = emitInlineLocal(state, 0); if (thisAlias !== 'this') { if (state.isPossibleGlobalThis) { // eslint-disable-next-line max-len js0.push("".concat(state.indent, "let ").concat(thisAlias, " = this === context.jsGlobal ? context.savedScope.global.object : this;")); } else { js0.push("".concat(state.indent, "let ").concat(thisAlias, " = this;")); } } else { js0.push("".concat(state.indent, "// Possible use a real \"this\"")); } for (var _i = 0, args_1 = args; _i < args_1.length; _i++) { var a = args_1[_i]; var argCoerce = emitPrimitiveCoerce(state, a.name, a.type, false); if (argCoerce) { js0.push("".concat(state.indent, "/* Force ").concat(a.type.name, " coerce */")); js0.push("".concat(state.indent).concat(a.name, " = ").concat(argCoerce, ";")); } } if (methodInfo.needsRest()) { // eslint-disable-next-line max-len js0.push("".concat(state.indent, "let ").concat(emitInlineLocal(state, params.length + 1), " = context.sec.createArrayUnsafe(args);")); paramsShift += 1; } if (methodInfo.needsArguments()) { // eslint-disable-next-line max-len js0.push("".concat(state.indent, "let ").concat(emitInlineLocal(state, params.length + 1), " = context.sec.createArrayUnsafe(Array.from(arguments));")); paramsShift += 1; } return { annotation: js0.join('\n'), paramsShift: paramsShift }; }