KOS_OP_IMPORT
Style: EXTRA (
CONST,COUNT,COUNT,CONST). Row:a0= cpool module name str (or None for a bare relative import),a1= level (leading dots; 0 = absolute),a2= leaf flag (0 = bind root, 1 = bind leaf),a3= cpool binding name str.Stack: no effect.
Semantics: Import the module (root or leaf per the flag) and store it into the current frame namespace under the binding name. With the leaf flag clear the root package is bound while the full dotted chain is still imported – plain
(import foo.bar)bindsfoo; with it set the deepest submodule is bound – the(import [foo.bar as: fbar])member form. Relative imports are always leaf-style. Self-contained: no stack effect, no separate VAR_BIND.Leaf behaviour: a NULL fromlist to
PyImport_ImportModuleLevelObjectreturns the root while importing the whole chain; the sentinel_import_fromlist = ("*",)returns the leaf submodule.Compiler form: Pre-compile extra operand is a 4-tuple
(name, level, leaf_flag, bind_name).Implementation:
koskari/lib/opcode/IMPORT.c
Example: (import os.path) – import the os.path chain, bind the root os. Extra row: ("os.path", 0, 0, "os").
index |
opcode |
arg |
arg view |
comment |
|---|---|---|---|---|
0 |
IMPORT |
0 |
0 (“os.path”, 0, 0, “os”) |
bind “os”; stack: […] |
1 |
CONST |
1 |
1 (None) |
statement value; stack: […, None] |
2 |
RETURN |
1 |
1 |
Member form (import [os.path as: p]) uses row ("os.path", 0, 1, "p") to bind the leaf; relative (import .foo) uses ("foo", 1, 1, "foo").