KOS_OP_CALL_ATTR
Style: EXTRA. Schema: CONST (attr name), COUNT (npos), NOARG, NOARG.
Stack:
[..., obj, arg_0, ..., arg_{N-1}] → [..., result]. Attr name from constant pool (EXTRA row).obj.nameis resolved as an attribute read would resolve it, then invoked. An unbound plain function found on the class is called asfn(obj, *args); a bound method, an instance-dict callable or a descriptor’s result is called ascallable(*args).Invariants: Stack has at least 1 + N elements (obj, N args). Resolved attribute must be callable or TypeError.
Receiver: the resolution decides whether
objis passed: an unbound plain function from the class gets it as the first argument; anything else is called with the arguments alone. A Koskari callable runs in the evaluator; any other callable is called and its result pushed, awaited when awaitable.
Example: "hello".upper() (0 args). Pool: 0 = “upper”, 1 = “hello”. EXTRA row 0: a0 = cpool index of “upper”, a1 = 0 (npos).
index |
opcode |
arg |
arg view |
comment |
|---|---|---|---|---|
0 |
CONST |
1 |
1 (“hello”) |
stack: […, obj] |
1 |
CALL_ATTR |
0 |
0 (extra idx) |
resolve obj.upper; call; push result. stack: […, “HELLO”] |
2 |
RETURN |
1 |
1 |
Example: c.add_one(41) (1 arg, unbound method). Pool: 0 = “add_one”, 1 = c, 2 = 41. EXTRA row 0: a0 = cpool index of “add_one”, a1 = 1 (npos).
index |
opcode |
arg |
arg view |
comment |
|---|---|---|---|---|
0 |
CONST |
1 |
1 (c) |
stack: […, obj] |
1 |
CONST |
2 |
2 (41) |
stack: […, obj, 41] |
2 |
CALL_ATTR |
0 |
0 (extra idx) |
resolve; call add_one(c, 41); push 42. stack: […, 42] |
3 |
RETURN |
1 |
1 |