Pyodide is a Python distribution for the browser and Node.js based on WebAssembly
This report summarizes scanner evidence for pyodide/pyodide, a Python project with 14,881 GitHub stars. SynthScan examined 103,543 lines of code across 462 source files, recording 908 pattern matches distributed across 20 syntactic categories. The legacy adjusted pattern signal is 13.4 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 443 finding(s).
Are imports declared and package/API names verified? 368 finding(s).
Are wrappers, guards, and repeated structures necessary? 463 finding(s).
Which changes need focused human review? 908 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 908 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | conftest.py | 314 | return Array.from(pyodide._module.pyproxy_alloc_map.entries(), ([x, s]) => [x.type, x.toString(), "Trace | CODE |
| HIGH | src/py/_pyodide/_core_docs.py | 1434 | result.push(convert(value.first)) | STRING |
| HIGH | src/py/_pyodide/_core_docs.py | 1435 | result.push(convert(value.second)) | STRING |
| HIGH | src/py/_pyodide/_core_docs.py | 1579 | >>> js_object.toString() | STRING |
| HIGH | src/py/_pyodide/_core_docs.py | 1638 | result.push(convert(value.first)) | STRING |
| HIGH | src/py/_pyodide/_core_docs.py | 1639 | result.push(convert(value.second)) | STRING |
| HIGH | src/py/pyodide/console.py | 253 | >>> future = console.push("print('Hello, World!')") # doctest: +SKIP | CODE |
| HIGH | src/py/pyodide/console.py | 610 | >>> future = console.push("import numpy as np; print(np.array([1, 2, 3]))") # doctest: +SKIP | CODE |
| HIGH | src/tests/test_streams.py | 140 | stdout_codes.push(code); | CODE |
| HIGH | src/tests/test_streams.py | 211 | null, | CODE |
| HIGH | src/tests/test_streams.py | 214 | null, | CODE |
| HIGH | src/tests/test_streams.py | 249 | null, | CODE |
| HIGH | src/tests/test_streams.py | 282 | null, | CODE |
| HIGH | src/tests/test_streams.py | 313 | null, | CODE |
| HIGH | src/tests/test_streams.py | 346 | null, | CODE |
| HIGH | src/tests/test_streams.py | 433 | this.writtenBuffers.push(buffer.slice()); | CODE |
| HIGH | src/tests/test_streams.py | 610 | result.push(new TextDecoder().decode(a)); | CODE |
| HIGH | src/tests/test_streams.py | 59 | stdoutStrings.push(s); | STRING |
| HIGH | src/tests/test_streams.py | 62 | stderrStrings.push(s); | STRING |
| HIGH | src/tests/test_streams.py | 191 | run_js("pyodide.setStdin({stdin: () => undefined})") | STRING |
| HIGH | src/tests/test_streams.py | 398 | "read returned undefined; a correct implementation must return a number" | STRING |
| HIGH | src/tests/test_streams.py | 421 | expected = "write returned undefined; a correct implementation must return a number" | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 563 | assert(() => d.__getitem__.prototype === undefined); | CODE |
| HIGH⚡ | src/tests/test_pyproxy.py | 567 | assert(() => d.get.type === undefined); | CODE |
| HIGH⚡ | src/tests/test_pyproxy.py | 568 | assert(() => d.set.type === undefined); | CODE |
| HIGH⚡ | src/tests/test_pyproxy.py | 1001 | result.push(a.get(1)); | CODE |
| HIGH⚡ | src/tests/test_pyproxy.py | 1002 | result.push(b.get(1)); | CODE |
| HIGH⚡ | src/tests/test_pyproxy.py | 2318 | func = run_js("(a) => a.push(1, 2, 3)") | CODE |
| HIGH | src/tests/test_pyproxy.py | 93 | pyproxy_to_string = run_js("(e) => e.toString()") | CODE |
| HIGH | src/tests/test_pyproxy.py | 591 | assert(() => Test.prototype === undefined); | CODE |
| HIGH | src/tests/test_pyproxy.py | 713 | assert(() => d.x === undefined); | CODE |
| HIGH | src/tests/test_pyproxy.py | 773 | assert(() => t.prototype === undefined); | CODE |
| HIGH | src/tests/test_pyproxy.py | 818 | assert(() => l.get.type === undefined); | CODE |
| HIGH | src/tests/test_pyproxy.py | 834 | assert(() => l.length === 2 && l.get(1) === 7); | CODE |
| HIGH | src/tests/test_pyproxy.py | 1054 | assertThrows(() => t.toString(), "PythonError", ""); | CODE |
| HIGH | src/tests/test_pyproxy.py | 1111 | assertThrows(() => t.toString(), "NoGilError", ""); | CODE |
| HIGH | src/tests/test_pyproxy.py | 2526 | const res = Object.fromEntries(Reflect.ownKeys(Function.prototype).map(k => [k.toString(), k in o])); | CODE |
| HIGH | src/tests/test_pyproxy.py | 2550 | if(x && x.destroy) { | CODE |
| HIGH | src/tests/test_pyproxy.py | 2583 | for (let i = 0; i < 100 && l.length < 3; i++) { | CODE |
| HIGH⚡ | src/tests/test_pyproxy.py | 125 | result.push(pyodide.globals.has("xxxxx")); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 126 | result.push(pyodide.globals.has("yyyyy")); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 127 | result.push(pyodide.globals.has("globals")); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 128 | result.push(pyodide.globals.has("open")); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1382 | undefined, | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1383 | null, | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1392 | assert(() => JSON.stringify(fpy.apply(undefined, input)) === JSON.stringify(fjs.apply(undefined, input))); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1396 | assertThrows(() => fjs.apply(undefined, error_input), "TypeError", ""); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1397 | assertThrows(() => fpy.apply(undefined, error_input), "TypeError", ""); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1546 | r.push(g.next()); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1547 | r.push(g.next(3)); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1548 | r.push(g.next(4)); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1549 | r.push(g.next(5)); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1595 | r.push(g.next()); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1596 | r.push(g.return(5)); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1597 | r.push(g.next()); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1662 | r.push(g.next()); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1663 | r.push(g.throw(new TypeError('hi'))); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1664 | r.push(g.next()); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1712 | r.push(await g.next()); | STRING |
| HIGH⚡ | src/tests/test_pyproxy.py | 1713 | r.push(await g.next(3)); | STRING |
| 130 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 175 | def pytest_collection_modifyitems(config, items): | STRING |
| LOW | conftest.py | 280 | def extra_checks_test_wrapper(browser, trace_hiwire_refs, trace_pyproxies, item): | STRING |
| LOW | tools/create_lockfile_diff.py | 42 | def get_lockfile_url_from_makefile(branch: str | None = None) -> str: | CODE |
| LOW | tools/pytest_wrapper.py | 10 | def remove_num_threads_option(args: list[str]) -> None: | CODE |
| LOW | tools/bump_version.py | 80 | def python_version_to_js_version(version: str) -> Constant: | CODE |
| LOW | tools/backport.py | 54 | def get_needs_backport_pr_numbers() -> tuple[int, ...]: | CODE |
| LOW | tools/backport.py | 65 | def get_needs_backport_prs_strings() -> tuple[str, ...]: | CODE |
| LOW | tools/backport.py | 456 | def remove_release_notes_from_unreleased_section( | CODE |
| LOW | tools/docker_image_tag.py | 20 | def latest_version_of_firefox() -> str: | CODE |
| LOW | tools/create_xbuildenv.py | 30 | def _check_unisolated_packages_match_dist( | CODE |
| LOW | tools/create_xbuildenv.py | 100 | def _copy_xbuild_files_from_wheel( | CODE |
| LOW | tools/deploy_s3.py | 26 | def _validate_remote_prefix_to_remove(remote_prefix: Path) -> None: | CODE |
| LOW | tools/tests/test_create_xbuildenv.py | 26 | def test_check_unisolated_packages_match_dist(tmp_path): | CODE |
| LOW | tools/tests/test_create_xbuildenv.py | 34 | def test_check_unisolated_packages_mismatched(tmp_path): | CODE |
| LOW | tools/tests/test_create_xbuildenv.py | 45 | def test_check_unisolated_packages_normalizes_names(tmp_path): | CODE |
| LOW | tools/tests/test_create_xbuildenv.py | 51 | def test_check_unisolated_packages_missing_is_not_fatal(tmp_path, caplog): | CODE |
| LOW | tools/tests/test_create_xbuildenv.py | 62 | def test_check_unisolated_packages_no_lockfile(tmp_path): | CODE |
| LOW⚡ | tools/tests/test_bump_version.py | 254 | def test_bump_version_dirty_working_tree(tmp_path): | CODE |
| LOW⚡ | tools/tests/test_bump_version.py | 268 | def test_bump_version_updates_changelog_for_minor_release(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 134 | def test_bump_version_dry_run(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 153 | def test_bump_version_check_no_changes(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 188 | def test_bump_version_check_with_changes(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 198 | def test_bump_version_updates_files(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 224 | def test_bump_version_dev_version(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 237 | def test_bump_version_prerelease(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 287 | def test_bump_version_does_not_update_changelog_for_patch_release(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 301 | def test_bump_version_check_changelog_date(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 318 | def test_bump_version_dry_run_does_not_update_changelog(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 332 | def test_check_changelog_fails_with_unreleased(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 343 | def test_check_changelog_fails_with_missing_version_header(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 372 | def test_check_changelog_fails_with_no_blank_line_after_header(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 400 | def test_check_changelog_fails_with_invalid_date_format(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 429 | def test_update_changelog_fails_with_no_unreleased_section(tmp_path): | CODE |
| LOW | tools/tests/test_bump_version.py | 458 | def test_update_changelog_fails_when_version_already_exists(tmp_path): | CODE |
| LOW | tools/tests/test_make_ghr_release.py | 48 | def test_changelog_anchor_no_changelog(tmp_path): | STRING |
| LOW | tools/tests/test_make_ghr_release.py | 59 | def test_release_body_prerelease(changelog_path): | STRING |
| LOW | tools/tests/test_make_ghr_release.py | 122 | def test_changelog_anchor_current_changelog(): | STRING |
| LOW | tools/tests/test_make_test_list.py | 27 | def test_update_tests_idempotent(): | CODE |
| LOW | tools/tests/test_make_test_list.py | 39 | def test_update_tests_adds_and_removes(): | STRING |
| LOW | tools/tests/test_make_test_list.py | 45 | def test_update_tests_preserves_annotations(): | STRING |
| LOW | tools/tests/test_make_test_list.py | 63 | def test_update_tests_preserves_header_comment(): | STRING |
| LOW | tools/tests/test_make_test_list.py | 77 | def test_update_tests_sorts_out_of_order_entry(): | STRING |
| LOW | tools/tests/test_make_test_list.py | 104 | def test_update_tests_dedupes_duplicated_block(): | STRING |
| LOW | tools/tests/test_backport.py | 180 | def test_add_backported_entries(): | CODE |
| LOW | tools/tests/test_backport.py | 269 | def test_remove_backported_entries(): | CODE |
| LOW | docs/conf.py | 208 | def prevent_parens_after_js_class_xrefs(): | CODE |
| LOW | docs/conf.py | 220 | def calculate_pyodide_version(app): | CODE |
| LOW | docs/conf.py | 348 | def prune_jsproxy_constructor_docs(): | CODE |
| LOW | docs/sphinx_pyodide/sphinx_pyodide/packages.py | 16 | def get_packages_summary_directive(app): | CODE |
| LOW | packages/test-cpp-exceptions/test_cpp_exceptions.py | 5 | def test_uncaught_cpp_exceptions(selenium): | CODE |
| LOW | packages/test-cpp-exceptions/test_cpp_exceptions.py | 35 | def test_cpp_exception_catching(selenium): | CODE |
| LOW | packages/test-cpp-exceptions/test_cpp_exceptions.py | 72 | def test_cpp_exception_catching_invoke(selenium): | CODE |
| LOW | packages/pytest-asyncio/inner_test_pytest_asyncio.py | 32 | def test_asyncio_marker_compatibility_with_xfail(pytester: Pytester): | CODE |
| LOW | packages/pytest-asyncio/inner_test_pytest_asyncio.py | 53 | async def test_asyncio_marker_with_default_param(a_param=None): | CODE |
| LOW | packages/numpy/test_numpy.py | 178 | def test_runpythonasync_numpy(selenium): | STRING |
| LOW | packages/numpy/test_numpy.py | 259 | def test_get_buffer_roundtrip(selenium, arg): | STRING |
| LOW | packages/numpy/test_numpy.py | 302 | def test_get_buffer_big_endian(selenium): | STRING |
| LOW | packages/numpy/test_numpy.py | 329 | def test_get_buffer_error_messages(selenium): | STRING |
| LOW | packages/micropip/test_micropip.py | 34 | def selenium_standalone_micropip(selenium_standalone_refresh): | CODE |
| LOW | packages/micropip/test_micropip.py | 89 | def test_install_file_protocol_node(selenium_standalone_micropip): | STRING |
| 297 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/py/ssl.py | 17 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/ssl.py | 19 | CODE | |
| LOW | src/py/_pyodide/_core_docs.py | 20 | CODE | |
| LOW | src/py/_pyodide/__init__.py | 10 | CODE | |
| LOW | src/py/_pyodide/__init__.py | 10 | CODE | |
| LOW | src/py/pyodide/code.py | 6 | CODE | |
| LOW | src/py/pyodide/code.py | 6 | CODE | |
| LOW | src/py/pyodide/code.py | 6 | CODE | |
| LOW | src/py/pyodide/code.py | 6 | CODE | |
| LOW | src/py/pyodide/code.py | 6 | CODE | |
| LOW | src/py/pyodide/__init__.py | 17 | CODE | |
| LOW | src/py/pyodide/_core.py | 1 | CODE | |
| LOW | src/py/pyodide/ffi/__init__.py | 5 | CODE | |
| LOW | src/py/pyodide/ffi/__init__.py | 6 | CODE | |
| LOW | src/py/pyodide/ffi/__init__.py | 6 | CODE | |
| LOW | src/py/pyodide/http/_pyfetch.py | 5 | CODE | |
| LOW | src/py/pyodide/http/_pyfetch.py | 22 | CODE | |
| LOW | src/py/pyodide/http/__init__.py | 5 | CODE | |
| LOW | src/py/pyodide/http/__init__.py | 6 | CODE | |
| LOW | src/py/pyodide/http/__init__.py | 6 | CODE | |
| LOW | src/py/pyodide/http/__init__.py | 6 | CODE | |
| LOW | src/py/pyodide/http/__init__.py | 11 | CODE | |
| LOW | src/py/pyodide/http/__init__.py | 11 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| LOW | src/tests/test_ssl_stub.py | 23 | CODE | |
| 115 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | conftest.py | 241 | except Exception: | CODE |
| HIGH | tools/pytest_wrapper.py | 31 | except subprocess.CalledProcessError: | CODE |
| HIGH | tools/backport.py | 519 | except ValueError: | CODE |
| HIGH | docs/sphinx_pyodide/sphinx_pyodide/util.py | 16 | except Exception: | CODE |
| HIGH | packages/scipy/scipy-conftest.py | 298 | except (ImportError, AttributeError): | CODE |
| HIGH | src/py/pyodide/console.py | 178 | except (TokenError, SyntaxError): | CODE |
| HIGH | src/py/pyodide/_nodesock_transport.py | 38 | except Exception: | CODE |
| HIGH | src/py/pyodide/_nodesock_transport.py | 42 | except Exception: | CODE |
| HIGH | src/py/pyodide/http/_pyfetch.py | 25 | except ImportError: | CODE |
| HIGH | src/py/pyodide/http/pyxhr.py | 32 | except ImportError: | CODE |
| HIGH | src/py/pyodide/http/__init__.py | 16 | except ImportError: | CODE |
| HIGH | src/tests/test_jsproxy.py | 3023 | except Exception: | CODE |
| HIGH | src/tests/test_jsproxy.py | 3057 | except Exception: | CODE |
| HIGH | src/tests/test_jsproxy.py | 3091 | except Exception: | CODE |
| HIGH | src/tests/test_webloop.py | 341 | except Exception: | CODE |
| HIGH | src/tests/test_webloop.py | 363 | except Exception: | CODE |
| HIGH | src/tests/test_webloop.py | 387 | except Exception: | CODE |
| HIGH | src/tests/test_webloop.py | 396 | except Exception: | CODE |
| HIGH | src/tests/test_webloop.py | 546 | except KeyboardInterrupt: | CODE |
| HIGH | src/tests/test_webloop.py | 567 | except SystemExit: | CODE |
| HIGH | src/tests/test_pyodide.py | 1727 | except ModuleNotFoundError: | CODE |
| HIGH | src/tests/test_python_socket.py | 612 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | benchmark/benchmarks/numpy_benchmarks/harris.py | 1 | # from: parakeet testbed | COMMENT |
| LOW | tools/constraints.txt | 1 | # This file is used to track build constraints for packages | COMMENT |
| LOW | .circleci/config.yml | 421 | npm run test:browser | COMMENT |
| LOW | src/py/_pyodide/__init__.py | 1 | # _pyodide is imported at the very beginning of the initialization process so it | COMMENT |
| LOW | src/py/_pyodide/__init__.py | 21 | # sys.excepthook **except** traceback.print_exception uses the linecache | COMMENT |
| LOW | src/py/pyodide/__init__.py | 1 | # When the pyodide package is imported, both the js and the pyodide_js modules | COMMENT |
| LOW | src/core/jsproxy.c | 41 | #include "jsproxy.h" | COMMENT |
| LOW | src/core/jsproxy.c | 61 | #define IS_ARRAY (1 << 12) | COMMENT |
| LOW | src/core/jsproxy.c | 181 | // clang-format on | COMMENT |
| LOW | src/core/jsproxy.c | 401 | // signature into one of these structs and return it. Then the call is routed to | COMMENT |
| LOW | src/core/jsproxy.c | 3861 | } | COMMENT |
| LOW | src/core/jsproxy.c | 4141 | FAIL_IF_NULL(bases); | COMMENT |
| LOW | src/core/jsproxy_call.c | 1 | #define PY_SSIZE_T_CLEAN | COMMENT |
| LOW | src/core/jsproxy_call.c | 21 | // | COMMENT |
| LOW | src/core/jsproxy_call.c | 41 | int posparams_nmandatory; | COMMENT |
| LOW | src/core/error_handling.c | 1 | // clang-format off | COMMENT |
| LOW | src/core/error_handling.c | 161 | COMMENT | |
| LOW | src/core/python2js.c | 1 | #define PY_SSIZE_T_CLEAN | COMMENT |
| LOW | src/core/python2js.c | 141 | // | COMMENT |
| LOW | src/core/python2js.c | 161 | // V8, Apple Silicon, two purpose-built binaries differing only in this file) | COMMENT |
| LOW | src/core/python2js.c | 181 | // list.join("") and see if one is faster than the other. | COMMENT |
| LOW | src/core/python2js.c | 921 | "pyproxies", | COMMENT |
| LOW | src/core/socket_syscalls.c | 1 | #include "emscripten.h" | COMMENT |
| LOW | src/core/jsbind.c | 1 | #define PY_SSIZE_T_CLEAN | COMMENT |
| LOW | src/core/pyproxy.h | 81 | COMMENT | |
| LOW | src/core/jsmemops.h | 1 | // Macros to access memory from JavaScript | COMMENT |
| LOW | src/core/jsmemops.h | 21 | #define DEREF_F64(addr, offset) HEAPF64[(addr >>> 3) + offset] | COMMENT |
| LOW | src/core/main.c | 1 | #define PY_SSIZE_T_CLEAN | COMMENT |
| LOW | src/core/error_handling.h | 1 | #ifndef ERROR_HANDLING_H | COMMENT |
| LOW | src/core/error_handling.h | 81 | } while (0) | COMMENT |
| LOW | src/core/python2js_buffer.c | 1 | #define PY_SSIZE_T_CLEAN | COMMENT |
| LOW | src/core/pyproxy.c | 1 | #define PY_SSIZE_T_CLEAN | COMMENT |
| LOW | src/core/pyproxy.c | 101 | #define HAS_SET (1 << 2) | COMMENT |
| LOW | src/core/pyproxy.c | 221 | COMMENT | |
| LOW | src/core/pyproxy.c | 321 | } | COMMENT |
| LOW | src/core/pyproxy.c | 1001 | COMMENT | |
| LOW | src/core/stack_switching/pystate_pycore.c | 1 | // Note: This file manages the Python stack / thread state when stack switching. | COMMENT |
| LOW | src/core/stack_switching/pystate_pycore.c | 81 | // _PyEval_SignalReceived and Py_AddPendingCall and related only ever add work | COMMENT |
| LOW | src/core/stack_switching/pystate.c | 1 | // Note: This file manages the Python stack / thread state when stack switching. | COMMENT |
| LOW | src/core/stack_switching/pystate.c | 21 | // TODO: Perhaps aligning with greenlet could reduce the amount of effort to | COMMENT |
| LOW | src/js/emscripten-settings.ts | 61 | API, | COMMENT |
| LOW | src/js/types.ts | 41 | export const HEAPU32: Uint32Array; | COMMENT |
| LOW | src/tests/python_tests.yaml | 1 | # This list is updated with tools/make_test_list.py script, which needs | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/py/pyodide/_nodesock_transport.py | 54 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/py/pyodide/_nodesock_transport.py | 56 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/py/pyodide/_nodesock_transport.py | 84 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/py/pyodide/_nodesock_transport.py | 86 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/py/pyodide/_nodesock_transport.py | 158 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | src/py/pyodide/_nodesock_transport.py | 160 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | src/core/socket_syscalls.c | 15 | // ──────────── | COMMENT |
| MEDIUM⚡ | src/tests/test_python_socket.py | 850 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | src/tests/test_python_socket.py | 852 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/tests/test_python_socket.py | 1133 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | src/tests/test_python_socket.py | 1135 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 241 | except Exception: | STRING |
| LOW | conftest.py | 294 | except Exception: | STRING |
| MEDIUM | tools/bump_version.py | 180 | print("Error: No '## Unreleased' section found in changelog", file=sys.stderr) | CODE |
| MEDIUM | tools/bump_version.py | 183 | print(f"Error: '{version_header}' section found in changelog", file=sys.stderr) | CODE |
| LOW | docs/sphinx_pyodide/sphinx_pyodide/util.py | 16 | except Exception: | CODE |
| LOW | docs/sphinx_pyodide/sphinx_pyodide/packages.py | 34 | except Exception: | CODE |
| LOW | packages/test-buffer/test_buffer.py | 87 | except Exception as e: | CODE |
| LOW | packages/_tests/test_packages_common.py | 43 | except Exception as e: | CODE |
| MEDIUM | packages/_tests/test_packages_common.py | 40 | def load_lockfile() -> PyodideLockSpec: | CODE |
| LOW | src/py/pyodide/_nodesock_transport.py | 38 | except Exception: | CODE |
| LOW | src/py/pyodide/_nodesock_transport.py | 42 | except Exception: | CODE |
| LOW⚡ | src/py/pyodide/_nodesock_transport.py | 149 | except Exception as exc: | CODE |
| LOW | src/py/pyodide/_nodesock_transport.py | 183 | except Exception as exc: | CODE |
| MEDIUM | src/py/pyodide/_nodesock_transport.py | 115 | def _read_loop(self) -> None: | CODE |
| LOW | src/py/pyodide/webloop.py | 126 | except Exception as result_exception: | CODE |
| LOW | src/py/pyodide/webloop.py | 162 | except Exception as e: | CODE |
| LOW | src/tests/test_console.py | 175 | except Exception: | CODE |
| MEDIUM | src/tests/test_typeconversions.py | 27 | def no_hypothesis(x): | CODE |
| LOW | src/tests/test_typeconversions.py | 31 | except Exception: | CODE |
| LOW⚡ | src/tests/test_stdlib_fixes.py | 123 | except Exception: | CODE |
| LOW⚡ | src/tests/test_stdlib_fixes.py | 132 | except Exception: | CODE |
| LOW | src/tests/test_filesystem.py | 75 | except Exception as err: | CODE |
| LOW | src/tests/test_jsproxy.py | 3023 | except Exception: | CODE |
| LOW | src/tests/test_jsproxy.py | 3057 | except Exception: | CODE |
| LOW | src/tests/test_jsproxy.py | 3091 | except Exception: | CODE |
| MEDIUM | src/tests/test_stack_switching.py | 295 | def f(): | CODE |
| LOW | src/tests/test_stack_switching.py | 298 | except Exception as e: | CODE |
| LOW | src/tests/test_webloop.py | 341 | except Exception: | STRING |
| LOW | src/tests/test_webloop.py | 363 | except Exception: | STRING |
| LOW | src/tests/test_webloop.py | 387 | except Exception: | STRING |
| LOW | src/tests/test_webloop.py | 396 | except Exception: | STRING |
| LOW | src/tests/test_pyodide.py | 1176 | except Exception as e: | CODE |
| LOW | src/tests/test_pyodide.py | 1219 | except Exception as ex: | CODE |
| LOW | src/tests/test_pyodide.py | 1277 | except Exception as e: | CODE |
| LOW | src/tests/test_pyodide.py | 1370 | except Exception as e: | CODE |
| LOW | src/tests/test_python_socket.py | 42 | except Exception as e: | CODE |
| LOW | src/tests/test_python_socket.py | 1211 | except Exception as e: | CODE |
| LOW | src/tests/test_python_socket.py | 1261 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tools/update_emscripten.py | 64 | def update_patches(newtag: str) -> None: | CODE |
| LOW⚡ | tools/update_emscripten.py | 72 | def update_makefile_envs(oldtag: str, newtag: str) -> None: | CODE |
| LOW⚡ | tools/update_emscripten.py | 80 | def update_struct_info() -> None: | CODE |
| LOW | docs/sphinx_pyodide/sphinx_pyodide/mdn_xrefs.py | 229 | __all__ = ["add_mdn_xrefs"] | CODE |
| LOW | docs/sphinx_pyodide/sphinx_pyodide/jsdoc.py | 13 | __all__ = ["ts_xref_formatter", "patch_sphinx_js"] | CODE |
| LOW | docs/sphinx_pyodide/sphinx_pyodide/jsdoc.py | 149 | def set_kind(obj: TopLevel) -> None: | CODE |
| LOW | packages/test-simd/src/test_simd/__init__.py | 17 | __all__ = [ | CODE |
| LOW | src/py/webbrowser.py | 8 | __all__ = ["open", "open_new", "open_new_tab", "get", "register", "Error"] | CODE |
| LOW | src/py/_pyodide/_core_docs.py | 1817 | __all__ = [ | CODE |
| LOW | src/py/_pyodide/__init__.py | 12 | __all__ = ["_base", "_importhook"] | CODE |
| LOW | src/py/_pyodide/docs_argspec.py | 30 | __all__ = ["docs_argspec"] | CODE |
| LOW | src/py/pyodide/console.py | 30 | __all__ = ["Console", "PyodideConsole", "BANNER", "repr_shorten", "ConsoleFuture"] | CODE |
| LOW | src/py/pyodide/code.py | 108 | __all__ = [ | CODE |
| LOW⚡ | src/py/pyodide/_nodesock_transport.py | 81 | def set_protocol(self, protocol: asyncio.BaseProtocol) -> None: | CODE |
| LOW | src/py/pyodide/__init__.py | 15 | __all__ = ["__version__", "console", "code", "ffi", "http", "webloop"] | CODE |
| LOW | src/py/pyodide/_core.py | 3 | __all__ = ["IN_PYODIDE"] | CODE |
| LOW | src/py/pyodide/_state.py | 51 | __all__ = ["save_state", "restore_state"] | CODE |
| LOW | src/py/pyodide/webloop.py | 241 | def set_debug(self, enabled: bool) -> None: | CODE |
| LOW | src/py/pyodide/webloop.py | 1118 | def set_event_loop(self, loop: Any) -> None: | CODE |
| LOW | src/py/pyodide/webloop.py | 1159 | __all__ = ["WebLoop", "WebLoopPolicy", "PyodideFuture", "PyodideTask"] | CODE |
| LOW | src/py/pyodide/ffi/__init__.py | 34 | __all__ = [ | CODE |
| LOW | src/py/pyodide/ffi/wrappers.py | 128 | __all__ = [ | CODE |
| LOW | src/py/pyodide/http/pyxhr.py | 35 | __all__ = [ | CODE |
| LOW | src/py/pyodide/http/__init__.py | 19 | __all__ = [ | CODE |
| LOW | src/tests/test_pkg/__init__.py | 3 | __all__ = ["test1"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tools/calculate_build_cache_key.py | 3 | # This file is a helper script to calculate the hash for cache key | COMMENT |
| MEDIUM⚡ | tools/tests/test_bump_version.py | 258 | # Create an uncommitted change | COMMENT |
| MEDIUM | tools/tests/test_bump_version.py | 347 | # Create a changelog without the version we're checking | COMMENT |
| MEDIUM | tools/tests/test_bump_version.py | 376 | # Create a changelog with version header but no blank line after | COMMENT |
| MEDIUM | tools/tests/test_bump_version.py | 404 | # Create a changelog with invalid date format | COMMENT |
| MEDIUM | tools/tests/test_bump_version.py | 433 | # Create a changelog without ## Unreleased section | COMMENT |
| MEDIUM | tools/tests/test_bump_version.py | 462 | # Create a changelog that already has the version we're trying to bump to | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 222 | CODE | |
| LOW | conftest.py | 280 | CODE | |
| LOW | benchmark/benchmark.py | 158 | CODE | |
| LOW | benchmark/benchmarks/pystone_benchmarks/pystone.py | 210 | CODE | |
| LOW | benchmark/benchmarks/numpy_benchmarks/growcut.py | 23 | CODE | |
| LOW | benchmark/benchmarks/numpy_benchmarks/fdtd.py | 9 | CODE | |
| LOW | benchmark/benchmarks/numpy_benchmarks/hyantes.py | 9 | CODE | |
| LOW | tools/create_lockfile_diff.py | 42 | CODE | |
| LOW | tools/backport.py | 330 | CODE | |
| LOW | tools/create_xbuildenv.py | 100 | CODE | |
| LOW | tools/deploy_s3.py | 62 | CODE | |
| LOW | src/py/ssl.py | 472 | CODE | |
| LOW | src/py/_pyodide/_base.py | 642 | CODE | |
| LOW | src/py/pyodide/_nodesock_transport.py | 115 | CODE | |
| LOW | src/py/pyodide/webloop.py | 881 | CODE | |
| LOW | src/tests/test_pyproxy.py | 420 | CODE | |
| LOW | src/tests/test_package_loading.py | 152 | CODE | |
| LOW | src/tests/test_package_loading.py | 177 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/scipy/scipy-pytest.js | 41 | print('Hoping scipy tests are included in the scipy wheel') | CODE |
| HIGH | packages/scipy/scipy-pytest.js | 44 | print(pkg_list) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 168 | CODE | |
| LOW | tools/deploy_s3.py | 62 | CODE | |
| LOW | src/py/ssl.py | 567 | CODE | |
| LOW | src/py/_pyodide/_base.py | 128 | CODE | |
| LOW | src/py/_pyodide/_base.py | 427 | CODE | |
| LOW | src/py/_pyodide/_base.py | 543 | CODE | |
| LOW | src/py/_pyodide/_base.py | 268 | CODE | |
| LOW | src/py/pyodide/console.py | 364 | CODE | |
| LOW | src/py/pyodide/webloop.py | 881 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/py/pyodide/__init__.py | 11 | # pytest mocks for js or pyodide_js, so make sure to test "if IN_PYODIDE" before | COMMENT |
| LOW | src/tests/test_ssl_stub.py | 20 | # Guardrail to ensure we don't forget to update this test when Python version changes | COMMENT |
| LOW | src/tests/test_ssl_stub.py | 20 | # Guardrail to ensure we don't forget to update this test when Python version changes | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/check_compressed_size.py | 10 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/core/pyproxy.c | 1424 | * The purpose of this function is to handle memory management when attaching | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tests/test_database_driver.py | 335 | # No extra server configuration needed — just pass ssl=True on the client. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | conftest.py | 197 | # Check if user explicitly wants to run long_running tests | STRING |
| LOW | docs/sphinx_pyodide/sphinx_pyodide/util.py | 50 | # Set wrapper to be our fake function | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/tests/test_bump_version.py | 34 | run(["git", "config", "user.email", "test@test.com"], cwd=tmp_path) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/tests/test_pyproxy.py | 294 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/tests/test_pyodide.py | 2055 | def helper(selenium): | STRING |