parseStackMapFrame = flatMapOverSlices(u1, (frameType) => {
const frameTypeValue = frameType.value.value;
if (frameTypeValue >= 0 && frameTypeValue <= 63) {
return mapParser(acceptAndDoNothing, (_) => {
return tagMap(_, (t, v) => [
"same_frame",
{ offset_delta: frameTypeValue }
]);
});
} else if (frameTypeValue >= 64 && frameTypeValue <= 127) {
let offset_delta = frameTypeValue - 64;
return mapParser(parseVerificationTypeInfo, (_) => {
console.log(_);
return tagMap(_, (t, v) => [
"same_locals_1_stack_item_frame",
{ offset_delta, stack: v }
]);
});
} else if (frameTypeValue === 247) {
return createConstantInfoParser("same_locals_1_stack_item_frame_extended", [
[u2be, "offset_delta"],
[parseVerificationTypeInfo, "stack"]
]);
} else if (frameTypeValue >= 248 && frameTypeValue <= 250) {
const k = 251 - frameTypeValue;
return mapParser(
createConstantInfoParser("chop_frame", [[u2be, "offset_delta"]]),
(_) => tagMap(_, (t, v) => [t, { offset_delta: v.offset_delta, k }])
);
} else if (frameTypeValue === 251) {
return createConstantInfoParser("same_frame_extended", [
[u2be, "offset_delta"]
]);
} else if (frameTypeValue >= 252 && frameTypeValue <= 254) {
const k = frameTypeValue - 251;
return createConstantInfoParser("append_frame", [
[u2be, "offset_delta"],
[applyNTimes(parseVerificationTypeInfo, k), "locals"]
]);
} else if (frameTypeValue === 255) {
return createConstantInfoParser("full_frame", [
[u2be, "offset_delta"],
[u2be, "number_of_locals"],
[
flatMapParser(u2be, (number_of_locals) =>
applyNTimes(parseVerificationTypeInfo, number_of_locals.value.value)
),
"locals"
],
[
flatMapParser(u2be, (number_of_stack_items) =>
applyNTimes(
parseVerificationTypeInfo,
number_of_stack_items.value.value
)
),
"stack"
]
]);
} else {
return (_index, _bytes) =>
Result.error(`Invalid stack_map_frame type: ${frameTypeValue}`);
}
})