|
| 1 | +bpp (0.8.12) unstable; urgency=medium |
| 2 | + |
| 3 | + * Correct and clarify spec page on dynamic casts |
| 4 | + Previously, the spec page was incorrect: it claimed that the result |
| 5 | + of the cast (i.e., the value to which the directive expands) would be |
| 6 | + 'an exact copy of INPUT' if valid. This is not and never was accurate, |
| 7 | + although it happened to be correct for the majority of actual cases. |
| 8 | + The truth of it is this: pointers in Bash++ are implicitly |
| 9 | + dereferenced as needed, and the dynamic cast would chase any |
| 10 | + arbitrarily long chain of pointers until it arrived finally at the |
| 11 | + actual object itself. Then, if the cast was valid, the result would be |
| 12 | + the actual address of that object. Obviously, for the vast majority |
| 13 | + of real-world cases, the INPUT to a dynamic cast will be, directly, |
| 14 | + the address of the object to be cast, so this small difference might |
| 15 | + never have been noticed. |
| 16 | + * bpp-lsp: Update LSP to 3.18 standard |
| 17 | + Now that the LSP spec v3.18 has been finalized, upgrade our local |
| 18 | + metaModel (used to generate the LSP implementation) to the 3.18 |
| 19 | + version from 3.17 |
| 20 | + This does not result in any functional changes. |
| 21 | + * Minor optimization: no need to allocate when retrieving source file |
| 22 | + lists |
| 23 | + Previously, bpp_program::get_source_files() concatenated all keys |
| 24 | + from the std::unordered_map to return a new vector |
| 25 | + We can skip all that using C++23's fancy "range views", which means |
| 26 | + no copies and no allocations |
| 27 | + * Bug fix: calling 'delete' on pointers |
| 28 | + Previously, the generated reference code for the pointer was |
| 29 | + duplicated |
| 30 | + Fix this by guarding the first portion of codegen under the |
| 31 | + condition that the second portion will not run (which in this case |
| 32 | + is a check for whether the object is explicitly a nonprimitive vs |
| 33 | + if it's a pointer) |
| 34 | + Relevant test case ('delete') was amended to check this |
| 35 | + * Codegen: remove global object counter |
| 36 | + The object counter was a relic from earlier versions of the compiler. |
| 37 | + In the current implementation (that is, the latest-released version), |
| 38 | + the counter is completely unnecessary. |
| 39 | + This change makes an object's (or pointer's) address completely |
| 40 | + determined by properties of the Object entity, without reference to |
| 41 | + any mutable state at the time of code generation (e.g., the number |
| 42 | + of objects we've already instantiated, etc) |
| 43 | + This, incidentally, is also a bug fix. |
| 44 | + - File A instantiates object 1 |
| 45 | + - File A dynamically includes file B |
| 46 | + - File B instantiates object 2 |
| 47 | + Since file B is dynamically included, the two units are compiled |
| 48 | + separately. When File B is compiled, its object counter never goes |
| 49 | + higher than 1 -- it only ever instantiates a single object. When |
| 50 | + File A is compiled, by the time we reach object 2, our object |
| 51 | + counter has already been incremented once by an earlier object |
| 52 | + instantiation. Therefore the two counters disagree with each other, |
| 53 | + and when File A later references object 2, it guesses the *wrong |
| 54 | + address*. Removing any dependency on mutable codegen state for |
| 55 | + address determination means that the two units, despite being |
| 56 | + independently compiled, will always agree on an object's address. |
| 57 | + * bpp-lsp: Remove dependency on libfrozen |
| 58 | + We can use a simple std::array and linear searches, libfrozen was |
| 59 | + overkill for this |
| 60 | + |
| 61 | + -- rail5 <andrew@rail5.org> Sun, 05 Jul 2026 09:04:45 +0800 |
| 62 | + |
1 | 63 | bpp (0.8.11) unstable; urgency=medium |
2 | 64 |
|
3 | 65 | * Performance: |
|
0 commit comments