Commit 9d88063
Fix local package variable bug - our variables now see local changes (#333)
* Document implementation attempt findings for local package variable bug
Added notes about an attempted approach (skipping our variables from
closure capture) that partially worked but broke Test::More due to
constructor signature mismatches. Documented that the fix needs to
happen at the variable access level, not closure capture level.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <noreply@cognition.ai>
* Add test cases and document investigation for local package variable bug
- Added test cases in local.t (in __END__ section) for cross-package
our/local scenarios that currently fail
- Updated design doc with detailed findings from implementation attempts:
- Approach 1 (skip our from closures) broke constructor signatures
- Approach 2 (non-lexical our) breaks Test::More/Test2 due to
BEGIN block interactions
- The fix requires further investigation into how BEGIN blocks
interact with lexical closure capture
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <noreply@cognition.ai>
* Fix local package variable bug - our variables now see local changes
This fixes the bug where subroutines don't see 'local'ized values
of 'our' variables set from outside their package.
Root cause: 'our' variables were treated as lexical (stored in JVM
local variable slots), capturing values at subroutine definition time.
This meant 'local $Pkg::Var' changes weren't visible inside subroutines.
The fix:
1. EmitVariable.java: Distinguish between BEGIN-captured 'our' variables
(in PerlOnJava::_BEGIN_* packages, which should remain lexical for
compile-to-runtime persistence) and regular 'our' variables (which
should look up from GlobalVariable at runtime).
2. EmitSubroutine.java and SubroutineParser.java: Use 4-argument
addVariable() to preserve the original perlPackage when copying
variables to subroutine scopes.
3. ScopedSymbolTable.java: Add 4-argument addVariable() overload to
allow explicit package specification.
Test results:
- All existing tests pass
- New cross-package our/local tests pass (54 tests in local.t)
- Test::More/Test2 modules work correctly
- BEGIN block lexical persistence works correctly
See dev/design/local-package-variable-fix.md for detailed analysis.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <noreply@cognition.ai>
* Fix exit() inside BEGIN blocks to exit program instead of causing compilation error
In Perl, calling exit() inside a BEGIN block terminates the program immediately.
Previously, jperl would catch the PerlExitException and convert it to a
"BEGIN failed--compilation aborted" error, then continue parsing and fail.
This fix re-throws PerlExitException so it propagates to Main.main() which
converts it to System.exit().
Fixes tests that use `plan skip_all` in BEGIN blocks (e.g., Log4perl's
t/056SyncApp2.t and t/066SQLite.t) - they now skip cleanly without errors.
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <noreply@cognition.ai>
* Update log4perl-compatibility.md with exit() in BEGIN fix and status updates
- Document PR #331 fix for exit() inside BEGIN blocks
- Update test results (now 700 tests, 26 failures)
- Mark 'local' package variable bug as verified fixed
- Update t/020Easy.t issue category
Generated with [Devin](https://cli.devin.ai/docs)
Co-Authored-By: Devin <noreply@cognition.ai>
---------
Co-authored-by: Devin <noreply@cognition.ai>1 parent fce1177 commit 9d88063
9 files changed
Lines changed: 241 additions & 35 deletions
File tree
- dev/design
- src
- main/java/org/perlonjava
- backend/jvm
- core
- frontend
- parser
- semantic
- test/resources/unit
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
288 | 288 | | |
289 | 289 | | |
290 | 290 | | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
291 | 406 | | |
292 | 407 | | |
293 | 408 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | | - | |
14 | | - | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | | - | |
| 22 | + | |
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| |||
67 | 67 | | |
68 | 68 | | |
69 | 69 | | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
70 | 90 | | |
71 | 91 | | |
72 | 92 | | |
| |||
169 | 189 | | |
170 | 190 | | |
171 | 191 | | |
172 | | - | |
| 192 | + | |
173 | 193 | | |
174 | | - | |
| 194 | + | |
175 | 195 | | |
176 | | - | |
| 196 | + | |
177 | 197 | | |
178 | 198 | | |
179 | 199 | | |
180 | | - | |
| 200 | + | |
181 | 201 | | |
182 | 202 | | |
183 | 203 | | |
184 | | - | |
| 204 | + | |
185 | 205 | | |
186 | 206 | | |
187 | | - | |
188 | | - | |
189 | | - | |
190 | | - | |
191 | | - | |
192 | | - | |
193 | | - | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
198 | | - | |
199 | | - | |
| 207 | + | |
200 | 208 | | |
201 | | - | |
| 209 | + | |
202 | 210 | | |
203 | 211 | | |
204 | 212 | | |
| |||
Lines changed: 4 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
121 | 124 | | |
122 | | - | |
| 125 | + | |
123 | 126 | | |
124 | 127 | | |
125 | 128 | | |
| |||
Lines changed: 17 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
378 | 378 | | |
379 | 379 | | |
380 | 380 | | |
381 | | - | |
382 | | - | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
383 | 390 | | |
384 | 391 | | |
385 | 392 | | |
386 | | - | |
387 | | - | |
388 | | - | |
| 393 | + | |
| 394 | + | |
389 | 395 | | |
390 | 396 | | |
391 | 397 | | |
| |||
430 | 436 | | |
431 | 437 | | |
432 | 438 | | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
433 | 442 | | |
434 | 443 | | |
435 | 444 | | |
| |||
440 | 449 | | |
441 | 450 | | |
442 | 451 | | |
443 | | - | |
| 452 | + | |
| 453 | + | |
444 | 454 | | |
445 | 455 | | |
446 | 456 | | |
447 | 457 | | |
448 | 458 | | |
449 | | - | |
| 459 | + | |
450 | 460 | | |
451 | 461 | | |
452 | 462 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
36 | | - | |
| 36 | + | |
37 | 37 | | |
38 | 38 | | |
39 | 39 | | |
| |||
Lines changed: 4 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
250 | 250 | | |
251 | 251 | | |
252 | 252 | | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
253 | 257 | | |
254 | 258 | | |
255 | 259 | | |
| |||
Lines changed: 4 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
771 | 771 | | |
772 | 772 | | |
773 | 773 | | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
774 | 777 | | |
775 | 778 | | |
776 | 779 | | |
| |||
782 | 785 | | |
783 | 786 | | |
784 | 787 | | |
785 | | - | |
| 788 | + | |
786 | 789 | | |
787 | 790 | | |
788 | 791 | | |
| |||
Lines changed: 16 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
237 | 237 | | |
238 | 238 | | |
239 | 239 | | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
240 | 256 | | |
241 | 257 | | |
242 | 258 | | |
| |||
0 commit comments