@awayfl/avm2
Version:
Virtual machine for executing AS3 code
75 lines (74 loc) • 3.08 kB
JavaScript
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
};
}