Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
dee631a
fix: exists(&constant_sub) and MakeMaker TESTS parameter for LWP::Use…
fglock Apr 3, 2026
1c1d3d7
feat: Socket getaddrinfo/sockaddr_family, IO::Socket::IP, File::Temp …
fglock Apr 3, 2026
2085cda
docs: update LWP::UserAgent plan with Phase 3-4 investigation results
fglock Apr 3, 2026
23b04e8
fix: utf8::downgrade on read-only scalars, openhandle/*{} overload fo…
fglock Apr 3, 2026
f25f563
fix: socket overhaul, bless with object arg, getnameinfo/sockaddr_in …
fglock Apr 3, 2026
07560cc
docs: update LWP plan with Phase 3-4 completion, Phase 5 next steps
fglock Apr 3, 2026
e701f7d
feat: implement 4-arg select() with NIO Selector for socket I/O
fglock Apr 3, 2026
7535b7e
fix: use warnWithCategory for all uninitialized value warnings
fglock Apr 3, 2026
8caa5d8
docs: update LWP plan with Phase 5 warning fix, test status
fglock Apr 3, 2026
608fefb
feat: add sysread/syswrite to SocketIO, unblocking HTTP::Daemon tests
fglock Apr 3, 2026
a655d04
fix: non-blocking socket I/O and connect for LWP compatibility
fglock Apr 3, 2026
275d6f3
fix: HTML::Parser subclass method dispatch and File::Temp path doubling
fglock Apr 3, 2026
743c453
docs: update LWP plan with Phase 7a completion and P14 encoding issue
fglock Apr 3, 2026
d3a0469
fix: HTML title UTF-8 encoding via parser utf8_mode and strict utf8::…
fglock Apr 3, 2026
c2da11f
docs: update LWP plan with Phase 7b completion — 314/316 subtests pass
fglock Apr 3, 2026
de696b1
P15: implement wide character in print warning + UTF-8 fallback
fglock Apr 3, 2026
99ef1cf
docs: update LWP plan doc with P15 fix and Phase 7c status
fglock Apr 3, 2026
7354c1e
fix: test runner counts not-ok TODO as OK per TAP spec
fglock Apr 3, 2026
df95c34
docs: mark next steps complete in LWP plan doc
fglock Apr 3, 2026
05f5952
fix: use native strerror() for platform-correct errno messages
fglock Apr 3, 2026
f859192
docs: update LWP plan with Phase 8, pre-existing/flaky issues
fglock Apr 3, 2026
4e29eec
fix: platform-correct errno constants on macOS
fglock Apr 3, 2026
9cd23ef
docs: update LWP plan with Phase 9, add pre-existing issues
fglock Apr 3, 2026
7124842
fix: implement %! errno hash and fix $! numeric warnings
fglock Apr 3, 2026
ba1c97b
docs: update LWP plan with Phase 10 (%! errno hash, $! numeric fixes)
fglock Apr 3, 2026
e34fbbd
fix: prevent closeAllHandles during require/do file exceptions
fglock Apr 3, 2026
03baaf6
fix: HTML::Parser utf8_mode preserves Latin-1 when input is not valid…
fglock Apr 3, 2026
4caa349
feat: add no-op Test::LeakTrace stub for PerlOnJava
fglock Apr 4, 2026
82adc89
fix: restore test baselines for bless, tie_fetch_count, join
fglock Apr 4, 2026
9e6a105
Fix op/stat.t failures: file test operators and backslash distribution
fglock Apr 4, 2026
f932fb4
fix: warning scope leaking and errno dualvar regression
fglock Apr 4, 2026
22495d7
fix: join() undef warnings with empty separator and tied separator op…
fglock Apr 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions dev/import-perl5/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,10 @@ imports:
target: src/main/perl/lib/IO/Socket
type: directory

# IO::Socket::IP - IPv4/IPv6 transparent socket interface (required by HTTP::Daemon)
- source: perl5/cpan/IO-Socket-IP/lib/IO/Socket/IP.pm
target: src/main/perl/lib/IO/Socket/IP.pm

# IO::Select - OO interface to select() (required by TAP::Parser::Multiplexer)
- source: perl5/dist/IO/lib/IO/Select.pm
target: src/main/perl/lib/IO/Select.pm
Expand Down
770 changes: 770 additions & 0 deletions dev/modules/lwp_useragent.md

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion dev/tools/perl_test_runner.pl
Original file line number Diff line number Diff line change
Expand Up @@ -444,8 +444,14 @@ sub parse_tap_output {
}

if ($line =~ /^not ok\s+\d+/) {
$not_ok_count++;
$actual_tests_run++;
if ($line =~ /#\s*TODO\b/i) {
# "not ok ... # TODO" = expected failure, counts as OK in TAP
$ok_count++;
$todo_count++;
} else {
$not_ok_count++;
}
next;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -372,8 +372,8 @@ private static RuntimeList executeCode(RuntimeCode runtimeCode, EmitterContext c
} catch (Throwable t) {
if (isMainProgram) {
runEndBlocks(false); // Don't reset $? on exception path
RuntimeIO.closeAllHandles();
}
RuntimeIO.closeAllHandles();
if (t instanceof RuntimeException runtimeException) {
throw runtimeException;
}
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/org/perlonjava/backend/jvm/EmitOperator.java
Original file line number Diff line number Diff line change
Expand Up @@ -1638,6 +1638,17 @@ private static boolean resultIsList(OperatorNode node) {
return true;
}
}
// Built-in functions that return lists: \stat(...), \localtime, etc.
// In Perl, \func distributes the \ over the list elements
if ("stat".equals(op) || "lstat".equals(op) ||
"localtime".equals(op) || "gmtime".equals(op) ||
"caller".equals(op) || "each".equals(op) ||
"getpwnam".equals(op) || "getpwuid".equals(op) || "getpwent".equals(op) ||
"getgrnam".equals(op) || "getgrgid".equals(op) || "getgrent".equals(op) ||
"sort".equals(op) || "reverse".equals(op) ||
"keys".equals(op) || "values".equals(op)) {
return true;
}
}

// Check for slice operations: %x{...}, @x{...}, @x[...]
Expand All @@ -1650,6 +1661,11 @@ private static boolean resultIsList(OperatorNode node) {
}
}

// Function calls with parens: \foo() distributes the \ over the returned list
if ("(".equals(binOp.operator)) {
return true;
}

// Check if it is an apply `->()`
return binOp.operator.equals("->") && binOp.right instanceof ListNode;
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/perlonjava/core/Configuration.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public final class Configuration {
* Automatically populated by Gradle/Maven during build.
* DO NOT EDIT MANUALLY - this value is replaced at build time.
*/
public static final String gitCommitId = "dc22ca34e";
public static final String gitCommitId = "f932fb45f";

/**
* Git commit date of the build (ISO format: YYYY-MM-DD).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,17 @@ public void visit(OperatorNode node) {
return;
}

// Don't fold identifiers under the & sigil operator.
// &Name refers to the subroutine itself (e.g., exists(&Errno::EINVAL), \&sub),
// not a call. Folding would replace the name with its constant value, breaking
// exists/defined checks. Calls with parens (&Name()) are handled separately
// in visit(BinaryOperatorNode) via the "(" operator.
if ("&".equals(node.operator)) {
result = node;
isConstant = false;
return;
}

Node foldedOperand = foldChild(node.operand);

// Handle unary operators on constants
Expand Down
Loading
Loading