Skip to content

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 19 Jun 10:51
8d0b43a

JuliaInterpreter v0.11.0

Diff since v0.10.12

JuliaInterpreter v0.11.0

This release overhauls world-age handling so that interpretation matches
compiled-code semantics. It is a breaking release.

Breaking

  • Interpreted calls now run in the caller's task world, not the latest
    committed world. Previously every interpreted call behaved like
    Base.invokelatest, so a method or binding defined newer than the calling
    code's world was visible. Now, like compiled code, an interpreted call sees
    only its fixed task world and will raise a world-age error for a method
    defined too recently. This is the intended behavior, but code that relied on
    the old always-latest semantics may now error or dispatch differently.
    (#715, #732; fixes #617)
  • @interpret gains a world=w keyword for the legitimate case of reaching
    a method newer than the caller's world (e.g. one just brought in by include
    within the same function). Pass world=Base.get_world_counter() or
    world=:latest (the two differ subtly, see docstrings) to recover the old
    latest-world behavior. (#732)
  • World age is threaded through the public API. The following gained a
    world argument (keyword or positional): FrameCode, Frame,
    prepare_call, prepare_framecode, get_call_framecode, optimize!,
    lookup_stmt, whichtt, and to_function. Existing calls that omit it get
    the latest committed world by default, but downstream code that constructed
    these directly may need updating. (#715)
  • Frame(mod, ex) now interprets :toplevel and :module expressions
    directly
    , creating a driver frame that steps through the surface statements
    one at a time and raises the world age between them so each statement sees
    earlier definitions. Previously this required ExprSplitter. ExprSplitter
    remains available for fine-grained control (Revise.jl still uses it). (#719)
  • enter_call / enter_call_expr no longer call clear_caches() on every
    entry.
    Framecodes are now individually invalidated by world age, so the
    per-entry reset is unnecessary. clear_caches is retained for debugging.
    (#733)

Added

  • Julia 1.13 support: syntactic ccall, updated print_stackframe. (#737)
  • New public helpers finish_latestworld! and framecode_valid_world. (#727)

Fixed

  • Expanded invokelatest now runs all targets (builtin and generic) uniformly
    in the latest world, fixing spurious stale-world warnings. (#729)
  • Fixed stale-world binding-access warnings at several read-side sites. (#738)
  • Resolve getproperty-chains in cglobal / ccall tuple syntax. (#718)
  • Arg-quoting in qualified evaluation. (#735)
  • Skip nothing files when collecting framecode files. (#736)
  • Make StackFrame total when line info is missing. (#723)

Internal / testing

  • Added Aqua.jl quality checks and ExplicitImports.jl as test dependencies.
    (#724, #725)
  • Dropped PyCall and HTTP test dependencies by vendoring the relevant
    regression tests (#455, #354). (#716, #717)
  • Improved docstrings and documentation for the new world-age handling.
    (#726, #727)

Merged pull requests:

Closed issues:

  • Testing Revise asserts in JuliaInterpreter on 1.9 (#570)
  • wrong world age for everything (#617)
  • @interpret(x == 2) and @interpret(x) == 2 lead to different execution world ages (#666)
  • RFC: major rewrite for world age and possibly inference? (#676)
  • memhash is to be deleted in 1.13 (#696)
  • Cannot handle file: Nothing LineNumberNodes (#701)
  • Remove the defensive clear_caches() from entry points (#722)