{"abstract":"After calling a function with no arguments the caller loses all pending operands and faults.","category":"Bytecode virtual machines","checks":7,"contract":"Instructions: push v, load k, store k, add/sub/mul (second-from-top op top), jz t, jmp t, call t nargs nlocals, ret, halt. call pops nargs values (the first pushed becomes local 0), appends zero locals up to nlocals, records return pc = call pc + 1, and raises [\"StackOverflowError\", frames] when the frame count already equals max_depth. ret pops the result, discards the callee frame, pushes the result on the caller stack and resumes at the saved pc. Each executed instruction costs one fuel; running out returns [\"fuel\", pc]; host faults are [\"vm-fault\"].","evaluation_group":"w2-bytecode-virtual-machines-call-frame-stack","failed_approach":"Slicing to [:-nargs] has the same -0 trap and empties the stack for zero-arity calls.","family":"w2-bytecode-virtual-machines-call-frame-stack-zero-argument-operand-removal","id":"FA-89931","implementations":{"attempt":{"sha256":"d3699a77eed2633ab4940c981befb206a2244ac5628f52c683e11337244a23e2","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(code, max_depth, fuel):\n    def run():\n        frames = [{'locals': [0] * 4, 'stack': [], 'ret': None}]\n        pc = 0\n        for _ in range(fuel):\n            f = frames[-1]\n            ins = code[pc]\n            op = ins[0]\n            if op == 'push':\n                f['stack'].append(ins[1])\n                pc += 1\n            elif op == 'load':\n                f['stack'].append(f['locals'][ins[1]])\n                pc += 1\n            elif op == 'store':\n                f['locals'][ins[1]] = f['stack'].pop()\n                pc += 1\n            elif op in ('add', 'sub', 'mul'):\n                b = f['stack'].pop()\n                a = f['stack'].pop()\n                f['stack'].append(a + b if op == 'add' else a - b if op == 'sub' else a * b)\n                pc += 1\n            elif op == 'jz':\n                pc = ins[1] if f['stack'].pop() == 0 else pc + 1\n            elif op == 'jmp':\n                pc = ins[1]\n            elif op == 'call':\n                target, nargs, nlocals = ins[1], ins[2], ins[3]\n                if len(frames) >= max_depth:\n                    return ['StackOverflowError', len(frames)]\n                args = f['stack'][len(f['stack']) - nargs:]\n                f['stack'] = f['stack'][:-nargs]\n                frames.append({'locals': args + [0] * (nlocals - nargs), 'stack': [], 'ret': pc + 1})\n                pc = target\n            elif op == 'ret':\n                value = f['stack'].pop()\n                frames.pop()\n                frames[-1]['stack'].append(value)\n                pc = f['ret']\n            else:\n                return ['halt', f['stack']]\n        return ['fuel', pc]\n    try:\n        return run()\n    except (IndexError, TypeError):\n        return ['vm-fault']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('two-argument call binds first argument to slot 0',\n   ([['push', 21], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [18]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 8], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']], 10, 100),\n   ['halt', [3]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 1],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [4]]),\n  ('regression: recursive factorial',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [6]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['halt', [6]]),\n  ('recursion one frame over the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['StackOverflowError', 4]),\n  ('control: fuel exhaustion',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 22], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [19]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 9], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']], 10, 100),\n   ['halt', [4]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 2],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [10]]),\n  ('regression: recursive factorial',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [24]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    6,\n    500),\n   ['halt', [24]]),\n  ('recursion one frame over the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['StackOverflowError', 5]),\n  ('control: fuel exhaustion',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 23], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [20]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 10], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [5]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 3],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [18]]),\n  ('regression: recursive factorial',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [2]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['halt', [2]]),\n  ('recursion one frame over the limit',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    3,\n    500),\n   ['StackOverflowError', 3]),\n  ('control: fuel exhaustion',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 24], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [21]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 11], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [6]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 4],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [28]]),\n  ('regression: recursive factorial',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [6]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['halt', [6]]),\n  ('recursion one frame over the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['StackOverflowError', 4]),\n  ('control: fuel exhaustion',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 25], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [22]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 12], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [7]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 5],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [40]]),\n  ('regression: recursive factorial',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [24]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    6,\n    500),\n   ['halt', [24]]),\n  ('recursion one frame over the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['StackOverflowError', 5]),\n  ('control: fuel exhaustion',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"broken":{"sha256":"b52bee78840b8e42adf753100fb5becb1a959095475527636656817021288e0a","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(code, max_depth, fuel):\n    def run():\n        frames = [{'locals': [0] * 4, 'stack': [], 'ret': None}]\n        pc = 0\n        for _ in range(fuel):\n            f = frames[-1]\n            ins = code[pc]\n            op = ins[0]\n            if op == 'push':\n                f['stack'].append(ins[1])\n                pc += 1\n            elif op == 'load':\n                f['stack'].append(f['locals'][ins[1]])\n                pc += 1\n            elif op == 'store':\n                f['locals'][ins[1]] = f['stack'].pop()\n                pc += 1\n            elif op in ('add', 'sub', 'mul'):\n                b = f['stack'].pop()\n                a = f['stack'].pop()\n                f['stack'].append(a + b if op == 'add' else a - b if op == 'sub' else a * b)\n                pc += 1\n            elif op == 'jz':\n                pc = ins[1] if f['stack'].pop() == 0 else pc + 1\n            elif op == 'jmp':\n                pc = ins[1]\n            elif op == 'call':\n                target, nargs, nlocals = ins[1], ins[2], ins[3]\n                if len(frames) >= max_depth:\n                    return ['StackOverflowError', len(frames)]\n                args = f['stack'][len(f['stack']) - nargs:]\n                del f['stack'][-nargs:]\n                frames.append({'locals': args + [0] * (nlocals - nargs), 'stack': [], 'ret': pc + 1})\n                pc = target\n            elif op == 'ret':\n                value = f['stack'].pop()\n                frames.pop()\n                frames[-1]['stack'].append(value)\n                pc = f['ret']\n            else:\n                return ['halt', f['stack']]\n        return ['fuel', pc]\n    try:\n        return run()\n    except (IndexError, TypeError):\n        return ['vm-fault']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('two-argument call binds first argument to slot 0',\n   ([['push', 21], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [18]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 8], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']], 10, 100),\n   ['halt', [3]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 1],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [4]]),\n  ('regression: recursive factorial',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [6]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['halt', [6]]),\n  ('recursion one frame over the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['StackOverflowError', 4]),\n  ('control: fuel exhaustion',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 22], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [19]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 9], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']], 10, 100),\n   ['halt', [4]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 2],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [10]]),\n  ('regression: recursive factorial',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [24]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    6,\n    500),\n   ['halt', [24]]),\n  ('recursion one frame over the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['StackOverflowError', 5]),\n  ('control: fuel exhaustion',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 23], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [20]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 10], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [5]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 3],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [18]]),\n  ('regression: recursive factorial',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [2]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['halt', [2]]),\n  ('recursion one frame over the limit',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    3,\n    500),\n   ['StackOverflowError', 3]),\n  ('control: fuel exhaustion',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 24], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [21]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 11], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [6]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 4],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [28]]),\n  ('regression: recursive factorial',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [6]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['halt', [6]]),\n  ('recursion one frame over the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['StackOverflowError', 4]),\n  ('control: fuel exhaustion',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 25], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [22]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 12], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [7]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 5],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [40]]),\n  ('regression: recursive factorial',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [24]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    6,\n    500),\n   ['halt', [24]]),\n  ('recursion one frame over the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['StackOverflowError', 5]),\n  ('control: fuel exhaustion',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"},"fixed":{"sha256":"46e90c26af1d5cdadeb3e297f7dd35c41af9d8906abf21ecbd5c2a67744c0384","source":"\"\"\"Failure Map reference implementation. Python standard library only.\"\"\"\nimport json\n\nN = 1\nobservations = []\ndef solve(code, max_depth, fuel):\n    def run():\n        frames = [{'locals': [0] * 4, 'stack': [], 'ret': None}]\n        pc = 0\n        for _ in range(fuel):\n            f = frames[-1]\n            ins = code[pc]\n            op = ins[0]\n            if op == 'push':\n                f['stack'].append(ins[1])\n                pc += 1\n            elif op == 'load':\n                f['stack'].append(f['locals'][ins[1]])\n                pc += 1\n            elif op == 'store':\n                f['locals'][ins[1]] = f['stack'].pop()\n                pc += 1\n            elif op in ('add', 'sub', 'mul'):\n                b = f['stack'].pop()\n                a = f['stack'].pop()\n                f['stack'].append(a + b if op == 'add' else a - b if op == 'sub' else a * b)\n                pc += 1\n            elif op == 'jz':\n                pc = ins[1] if f['stack'].pop() == 0 else pc + 1\n            elif op == 'jmp':\n                pc = ins[1]\n            elif op == 'call':\n                target, nargs, nlocals = ins[1], ins[2], ins[3]\n                if len(frames) >= max_depth:\n                    return ['StackOverflowError', len(frames)]\n                args = f['stack'][len(f['stack']) - nargs:]\n                del f['stack'][len(f['stack']) - nargs:]\n                frames.append({'locals': args + [0] * (nlocals - nargs), 'stack': [], 'ret': pc + 1})\n                pc = target\n            elif op == 'ret':\n                value = f['stack'].pop()\n                frames.pop()\n                frames[-1]['stack'].append(value)\n                pc = f['ret']\n            else:\n                return ['halt', f['stack']]\n        return ['fuel', pc]\n    try:\n        return run()\n    except (IndexError, TypeError):\n        return ['vm-fault']\ndef check(label, actual, expected):\n    observations.append({\"check\": label, \"actual\": actual, \"expected\": expected, \"passed\": actual == expected})\ncases = [[('two-argument call binds first argument to slot 0',\n   ([['push', 21], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [18]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 8], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']], 10, 100),\n   ['halt', [3]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 1],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [4]]),\n  ('regression: recursive factorial',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [6]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['halt', [6]]),\n  ('recursion one frame over the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['StackOverflowError', 4]),\n  ('control: fuel exhaustion',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 22], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [19]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 9], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']], 10, 100),\n   ['halt', [4]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 2],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [10]]),\n  ('regression: recursive factorial',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [24]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    6,\n    500),\n   ['halt', [24]]),\n  ('recursion one frame over the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['StackOverflowError', 5]),\n  ('control: fuel exhaustion',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 23], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [20]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 10], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [5]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 3],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [18]]),\n  ('regression: recursive factorial',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [2]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['halt', [2]]),\n  ('recursion one frame over the limit',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    3,\n    500),\n   ['StackOverflowError', 3]),\n  ('control: fuel exhaustion',\n   ([['push', 2],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 24], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [21]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 11], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [6]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 4],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [28]]),\n  ('regression: recursive factorial',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [6]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['halt', [6]]),\n  ('recursion one frame over the limit',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    4,\n    500),\n   ['StackOverflowError', 4]),\n  ('control: fuel exhaustion',\n   ([['push', 3],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])],\n [('two-argument call binds first argument to slot 0',\n   ([['push', 25], ['push', 3], ['call', 4, 2, 2], ['halt'], ['load', 0], ['load', 1], ['sub'], ['ret']],\n    10,\n    100),\n   ['halt', [22]]),\n  ('zero-argument call keeps caller operand stack',\n   ([['push', 12], ['call', 4, 0, 1], ['sub'], ['halt'], ['load', 0], ['push', 5], ['add'], ['ret']],\n    10,\n    100),\n   ['halt', [7]]),\n  ('extra locals are zero-initialised after arguments',\n   ([['push', 5],\n     ['call', 3, 1, 2],\n     ['halt'],\n     ['load', 0],\n     ['push', 3],\n     ['add'],\n     ['store', 1],\n     ['load', 1],\n     ['load', 0],\n     ['mul'],\n     ['ret']],\n    10,\n    100),\n   ['halt', [40]]),\n  ('regression: recursive factorial',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    500),\n   ['halt', [24]]),\n  ('recursion depth exactly at the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    6,\n    500),\n   ['halt', [24]]),\n  ('recursion one frame over the limit',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    5,\n    500),\n   ['StackOverflowError', 5]),\n  ('control: fuel exhaustion',\n   ([['push', 4],\n     ['call', 3, 1, 1],\n     ['halt'],\n     ['load', 0],\n     ['jz', 12],\n     ['load', 0],\n     ['load', 0],\n     ['push', 1],\n     ['sub'],\n     ['call', 3, 1, 1],\n     ['mul'],\n     ['ret'],\n     ['push', 1],\n     ['ret']],\n    20,\n    3),\n   ['fuel', 4])]]\nfor label, args, expected in cases[N - 1]:\n    check(label, solve(*args), expected)\nprint(json.dumps({\"observations\": observations, \"passed\": all(x[\"passed\"] for x in observations)}, ensure_ascii=False))\nraise SystemExit(0 if all(x[\"passed\"] for x in observations) else 1)\n"}},"limitations":"A deterministic, bounded teaching model of one bytecode virtual machine mechanism with a stipulated instruction encoding; it is not a production VM and claims no conformance to any real specification. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.","method":"Deterministic executable model with adversarial boundary fixtures.","provenance":{"created_by":"Failure Map","dependencies":"Python standard library","family":"w2-bytecode-virtual-machines-call-frame-stack-zero-argument-operand-removal","generated_at":"2026-09-29T14:51:21.943816+00:00","license":"CC0-1.0","python":"3.12.14","seed":1,"split":"open-access"},"relevance":"Frame setup and teardown decide argument binding, return values and recursion limits in every stack VM.","repair":"Delete from len(stack) - nargs so that zero arguments removes nothing.","root_cause":"Negative slicing with -nargs becomes [-0:] which is the whole list when nargs is 0.","sha256":"41f65b61525404921f559e363bcc3e3b9353a93a4d8a2ce533aa28dbce560497","title":"Call frames: zero-argument call clears the caller stack · case 01","variant":1,"variant_policy":"Five numbered records share a model and may reuse boundary fixtures.","verification":{"attempt":{"elapsed_ms":40.463,"exit_code":1,"observations":[{"actual":["halt",[18]],"check":"two-argument call binds first argument to slot 0","expected":["halt",[18]],"passed":true},{"actual":["vm-fault"],"check":"zero-argument call keeps caller operand stack","expected":["halt",[3]],"passed":false},{"actual":["halt",[4]],"check":"extra locals are zero-initialised after arguments","expected":["halt",[4]],"passed":true},{"actual":["halt",[6]],"check":"regression: recursive factorial","expected":["halt",[6]],"passed":true},{"actual":["halt",[6]],"check":"recursion depth exactly at the limit","expected":["halt",[6]],"passed":true},{"actual":["StackOverflowError",4],"check":"recursion one frame over the limit","expected":["StackOverflowError",4],"passed":true},{"actual":["fuel",4],"check":"control: fuel exhaustion","expected":["fuel",4],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two-argument call binds first argument to slot 0\", \"actual\": [\"halt\", [18]], \"expected\": [\"halt\", [18]], \"passed\": true}, {\"check\": \"zero-argument call keeps caller operand stack\", \"actual\": [\"vm-fault\"], \"expected\": [\"halt\", [3]], \"passed\": false}, {\"check\": \"extra locals are zero-initialised after arguments\", \"actual\": [\"halt\", [4]], \"expected\": [\"halt\", [4]], \"passed\": true}, {\"check\": \"regression: recursive factorial\", \"actual\": [\"halt\", [6]], \"expected\": [\"halt\", [6]], \"passed\": true}, {\"check\": \"recursion depth exactly at the limit\", \"actual\": [\"halt\", [6]], \"expected\": [\"halt\", [6]], \"passed\": true}, {\"check\": \"recursion one frame over the limit\", \"actual\": [\"StackOverflowError\", 4], \"expected\": [\"StackOverflowError\", 4], \"passed\": true}, {\"check\": \"control: fuel exhaustion\", \"actual\": [\"fuel\", 4], \"expected\": [\"fuel\", 4], \"passed\": true}], \"passed\": false}\n"},"broken":{"elapsed_ms":41.63,"exit_code":1,"observations":[{"actual":["halt",[18]],"check":"two-argument call binds first argument to slot 0","expected":["halt",[18]],"passed":true},{"actual":["vm-fault"],"check":"zero-argument call keeps caller operand stack","expected":["halt",[3]],"passed":false},{"actual":["halt",[4]],"check":"extra locals are zero-initialised after arguments","expected":["halt",[4]],"passed":true},{"actual":["halt",[6]],"check":"regression: recursive factorial","expected":["halt",[6]],"passed":true},{"actual":["halt",[6]],"check":"recursion depth exactly at the limit","expected":["halt",[6]],"passed":true},{"actual":["StackOverflowError",4],"check":"recursion one frame over the limit","expected":["StackOverflowError",4],"passed":true},{"actual":["fuel",4],"check":"control: fuel exhaustion","expected":["fuel",4],"passed":true}],"passed":false,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two-argument call binds first argument to slot 0\", \"actual\": [\"halt\", [18]], \"expected\": [\"halt\", [18]], \"passed\": true}, {\"check\": \"zero-argument call keeps caller operand stack\", \"actual\": [\"vm-fault\"], \"expected\": [\"halt\", [3]], \"passed\": false}, {\"check\": \"extra locals are zero-initialised after arguments\", \"actual\": [\"halt\", [4]], \"expected\": [\"halt\", [4]], \"passed\": true}, {\"check\": \"regression: recursive factorial\", \"actual\": [\"halt\", [6]], \"expected\": [\"halt\", [6]], \"passed\": true}, {\"check\": \"recursion depth exactly at the limit\", \"actual\": [\"halt\", [6]], \"expected\": [\"halt\", [6]], \"passed\": true}, {\"check\": \"recursion one frame over the limit\", \"actual\": [\"StackOverflowError\", 4], \"expected\": [\"StackOverflowError\", 4], \"passed\": true}, {\"check\": \"control: fuel exhaustion\", \"actual\": [\"fuel\", 4], \"expected\": [\"fuel\", 4], \"passed\": true}], \"passed\": false}\n"},"fixed":{"elapsed_ms":43.818,"exit_code":0,"observations":[{"actual":["halt",[18]],"check":"two-argument call binds first argument to slot 0","expected":["halt",[18]],"passed":true},{"actual":["halt",[3]],"check":"zero-argument call keeps caller operand stack","expected":["halt",[3]],"passed":true},{"actual":["halt",[4]],"check":"extra locals are zero-initialised after arguments","expected":["halt",[4]],"passed":true},{"actual":["halt",[6]],"check":"regression: recursive factorial","expected":["halt",[6]],"passed":true},{"actual":["halt",[6]],"check":"recursion depth exactly at the limit","expected":["halt",[6]],"passed":true},{"actual":["StackOverflowError",4],"check":"recursion one frame over the limit","expected":["StackOverflowError",4],"passed":true},{"actual":["fuel",4],"check":"control: fuel exhaustion","expected":["fuel",4],"passed":true}],"passed":true,"stderr":"","stdout":"{\"observations\": [{\"check\": \"two-argument call binds first argument to slot 0\", \"actual\": [\"halt\", [18]], \"expected\": [\"halt\", [18]], \"passed\": true}, {\"check\": \"zero-argument call keeps caller operand stack\", \"actual\": [\"halt\", [3]], \"expected\": [\"halt\", [3]], \"passed\": true}, {\"check\": \"extra locals are zero-initialised after arguments\", \"actual\": [\"halt\", [4]], \"expected\": [\"halt\", [4]], \"passed\": true}, {\"check\": \"regression: recursive factorial\", \"actual\": [\"halt\", [6]], \"expected\": [\"halt\", [6]], \"passed\": true}, {\"check\": \"recursion depth exactly at the limit\", \"actual\": [\"halt\", [6]], \"expected\": [\"halt\", [6]], \"passed\": true}, {\"check\": \"recursion one frame over the limit\", \"actual\": [\"StackOverflowError\", 4], \"expected\": [\"StackOverflowError\", 4], \"passed\": true}, {\"check\": \"control: fuel exhaustion\", \"actual\": [\"fuel\", 4], \"expected\": [\"fuel\", 4], \"passed\": true}], \"passed\": true}\n"}},"verified":true,"visibility":"public"}