Thankfully this was a lot easier than tracing hiwire keys. 

I located one actual leak: if an error is thrown during `to_js` it would forget to free `proxies`. Other than that, I fixed a few "dumb leaks" in `api.js` where we leak the methods like `eval_code` or `find_imports`. So the code was already in surprisingly good shape in this way.

It's still possible that we leak some Python objects somehow, but this is as good as we can do for systematic checks short of compiling Python itself with `TRACE_MALLOC`.
Eliminate pyproxy leaks. Thankfully this was a lot easier than tracing hiwire keys. 

I located one actual leak: if an error is thrown during `to_js` it would forget to free `proxies`. Other than that, I fixed a few "dumb leaks" in `api.js` where we leak the methods like `eval_code` or `find_imports`. So the code was already in surprisingly good shape in this way.

It's still possible that we leak some Python objects somehow, but this is as good as we can do for systematic checks short of compiling Python itself with `TRACE_MALLOC`.
export PYODIDE_EMSCRIPTEN_VERSION ?= 2.0.15
export PYODIDE_BINARYEN_VERSION ?= version_100

# BASH_ENV tells bash to run pyodide_env.sh on startup, whcih sets various
# environment variables. The next line instructs make to use bash to run each
# command.
export BASH_ENV := $(PYODIDE_ROOT)/pyodide_env.sh
SHELL := /bin/bash

export TOOLSDIR=$(PYODIDE_ROOT)/tools
export PYVERSION=3.8.2
export PYMINOR=$(basename $(PYVERSION))
export HOSTPYTHONROOT=$(shell python3.8 -c "import sys; print(sys.prefix)")
export HOSTPYTHON=$(HOSTPYTHONROOT)/bin/python3.8
export TARGETPYTHONROOT=$(PYODIDE_ROOT)/cpython/installs/python-$(PYVERSION)
export PYTHONINCLUDE=$(PYODIDE_ROOT)/cpython/installs/python-$(PYVERSION)/include/python$(PYMINOR)

# Use env variable if defined, otherwise fallback to './'
export PYODIDE_BASE_URL?=./

# This environment variable is used for packages to detect if they are built
# for pyodide during build time
export PYODIDE=1
# This is the legacy environment variable used for the aforementioned purpose
export PYODIDE_PACKAGE_ABI=1
export EM_COMPILER_WRAPPER=ccache

export OPTFLAGS=-O2
export CFLAGS_BASE=\
	$(OPTFLAGS) \
	-g \
	-fPIC \
	$(EXTRA_CFLAGS)

export LDFLAGS_BASE=\
	-s BINARYEN_EXTRA_PASSES="--pass-arg=max-func-params@61" \
	$(OPTFLAGS) \
	-s MODULARIZE=1 \
	-s EMULATE_FUNCTION_POINTER_CASTS=1 \
	-s LINKABLE=1 \
	-s EXPORT_ALL=1 \
	-s WASM=1 \
	-std=c++14 \
	-s LZ4=1 \
	$(EXTRA_LDFLAGS)

export CXXFLAGS_BASE=

export SIDE_MODULE_LDFLAGS=	$(LDFLAGS_BASE) -s SIDE_MODULE=1
export MAIN_MODULE_LDFLAGS= $(LDFLAGS_BASE) -s MAIN_MODULE=1 \
	-s EXPORTED_FUNCTIONS='["___cxa_guard_acquire", "__ZNSt3__28ios_base4initEPv", "_main"]' \
	$(CPYTHONROOT)/installs/python-$(PYVERSION)/lib/libpython$(PYMINOR).a \
	-s TOTAL_MEMORY=20971520 \
	-s ALLOW_MEMORY_GROWTH=1 \
    --use-preload-plugins \
	-s USE_FREETYPE=1 \
	-s USE_LIBPNG=1 \
	-L$(wildcard $(CPYTHONROOT)/build/sqlite*/.libs) -lsqlite3 \
	$(wildcard $(CPYTHONROOT)/build/bzip2*/libbz2.a) \
	-lstdc++ \
	--memory-init-file 0 \

export SIDE_MODULE_CXXFLAGS = $(CXXFLAGS_BASE)

export SIDE_MODULE_CFLAGS= $(CFLAGS_BASE)
export MAIN_MODULE_CFLAGS= $(CFLAGS_BASE) \
    	-Wall \
    	-Wno-warn-absolute-paths \
    	-Werror=unused-variable \
    	-Werror=sometimes-uninitialized \
    	-Werror=int-conversion \
    	-Werror=incompatible-pointer-types \
		-I$(PYTHONINCLUDE) 


.output_vars:
	set

export PYODIDE_EMSCRIPTEN_VERSION ?= 2.0.15
export PYODIDE_BINARYEN_VERSION ?= version_100

# BASH_ENV tells bash to run pyodide_env.sh on startup, whcih sets various
# environment variables. The next line instructs make to use bash to run each
# command.
export BASH_ENV := $(PYODIDE_ROOT)/pyodide_env.sh
SHELL := /bin/bash

export TOOLSDIR=$(PYODIDE_ROOT)/tools
export PYVERSION=3.8.2
export PYMINOR=$(basename $(PYVERSION))
export HOSTPYTHONROOT=$(shell python3.8 -c "import sys; print(sys.prefix)")
export HOSTPYTHON=$(HOSTPYTHONROOT)/bin/python3.8
export TARGETPYTHONROOT=$(PYODIDE_ROOT)/cpython/installs/python-$(PYVERSION)
export PYTHONINCLUDE=$(PYODIDE_ROOT)/cpython/installs/python-$(PYVERSION)/include/python$(PYMINOR)

# Use env variable if defined, otherwise fallback to './'
export PYODIDE_BASE_URL?=./

# This environment variable is used for packages to detect if they are built
# for pyodide during build time
export PYODIDE=1
# This is the legacy environment variable used for the aforementioned purpose
export PYODIDE_PACKAGE_ABI=1
export EM_COMPILER_WRAPPER=ccache

export OPTFLAGS=-O2
export CFLAGS_BASE=\
	$(OPTFLAGS) \
	-g \
	-fPIC \
	$(EXTRA_CFLAGS)

export LDFLAGS_BASE=\
	-s BINARYEN_EXTRA_PASSES="--pass-arg=max-func-params@61" \
	$(OPTFLAGS) \
	-s MODULARIZE=1 \
	-s EMULATE_FUNCTION_POINTER_CASTS=1 \
	-s LINKABLE=1 \
	-s EXPORT_ALL=1 \
	-s WASM=1 \
	-std=c++14 \
	-s LZ4=1 \
	$(EXTRA_LDFLAGS)

export CXXFLAGS_BASE=

export SIDE_MODULE_LDFLAGS=	$(LDFLAGS_BASE) -s SIDE_MODULE=1
export MAIN_MODULE_LDFLAGS= $(LDFLAGS_BASE) -s MAIN_MODULE=1 \
	-s EXPORTED_FUNCTIONS='["___cxa_guard_acquire", "__ZNSt3__28ios_base4initEPv", "_main"]' \
	$(CPYTHONROOT)/installs/python-$(PYVERSION)/lib/libpython$(PYMINOR).a \
	-s TOTAL_MEMORY=20971520 \
	-s ALLOW_MEMORY_GROWTH=1 \
    --use-preload-plugins \
	-s USE_FREETYPE=1 \
	-s USE_LIBPNG=1 \
	-L$(wildcard $(CPYTHONROOT)/build/sqlite*/.libs) -lsqlite3 \
	$(wildcard $(CPYTHONROOT)/build/bzip2*/libbz2.a) \
	-lstdc++ \
	--memory-init-file 0 \

export SIDE_MODULE_CXXFLAGS = $(CXXFLAGS_BASE)

export SIDE_MODULE_CFLAGS= $(CFLAGS_BASE)
export MAIN_MODULE_CFLAGS= $(CFLAGS_BASE) \
    	-Wall \
    	-Wno-warn-absolute-paths \
    	-Werror=unused-variable \
    	-Werror=sometimes-uninitialized \
    	-Werror=int-conversion \
    	-Werror=incompatible-pointer-types \
		-I$(PYTHONINCLUDE) 


.output_vars:
	set
