mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 03:27:39 +00:00
d26d7ae0e4
Building o//third_party/python now takes 5 seconds on my PC This change works towards modifying Python to use runtime dispatching when appropriate. For example, when loading the magnums in the socket module, it's a good idea to check if the magnum is zero, because that means the local system platform doesn't support it.
55 lines
1.6 KiB
Python
Executable file
55 lines
1.6 KiB
Python
Executable file
#! /usr/bin/env python
|
|
"""Generate C code for the jump table of the threaded code interpreter
|
|
(for compilers supporting computed gotos or "labels-as-values", such as gcc).
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
|
|
|
|
try:
|
|
from importlib.machinery import SourceFileLoader
|
|
except ImportError:
|
|
import imp
|
|
|
|
def find_module(modname):
|
|
"""Finds and returns a module in the local dist/checkout.
|
|
"""
|
|
modpath = os.path.join(
|
|
os.path.dirname(os.path.dirname(__file__)), "Lib")
|
|
return imp.load_module(modname, *imp.find_module(modname, [modpath]))
|
|
else:
|
|
def find_module(modname):
|
|
"""Finds and returns a module in the local dist/checkout.
|
|
"""
|
|
modpath = os.path.join(
|
|
os.path.dirname(os.path.dirname(__file__)), "Lib", modname + ".py")
|
|
return SourceFileLoader(modname, modpath).load_module()
|
|
|
|
|
|
def write_contents(f):
|
|
"""Write C code contents to the target file object.
|
|
"""
|
|
opcode = find_module('opcode')
|
|
targets = ['_unknown_opcode'] * 256
|
|
for opname, op in opcode.opmap.items():
|
|
targets[op] = "TARGET_%s" % opname
|
|
f.write("static void *opcode_targets[256] = {\n")
|
|
f.write(",\n".join([" &&%s" % s for s in targets]))
|
|
f.write("\n};\n")
|
|
|
|
|
|
def main():
|
|
if len(sys.argv) >= 3:
|
|
sys.exit("Too many arguments")
|
|
if len(sys.argv) == 2:
|
|
target = sys.argv[1]
|
|
else:
|
|
target = "third_party/python/Python/opcode_targets.inc"
|
|
with open(target, "w") as f:
|
|
write_contents(f)
|
|
print("Jump table written into %s" % target)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|