diff --git a/src/main/java/org/perlonjava/core/Configuration.java b/src/main/java/org/perlonjava/core/Configuration.java index 3e7a1a250..6e9c6d5ba 100644 --- a/src/main/java/org/perlonjava/core/Configuration.java +++ b/src/main/java/org/perlonjava/core/Configuration.java @@ -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 = "1c27ead97"; + public static final String gitCommitId = "a671eccbf"; /** * Git commit date of the build (ISO format: YYYY-MM-DD). @@ -48,7 +48,7 @@ public final class Configuration { * Parsed by App::perlbrew and other tools via: perl -V | grep "Compiled at" * DO NOT EDIT MANUALLY - this value is replaced at build time. */ - public static final String buildTimestamp = "Apr 27 2026 20:14:07"; + public static final String buildTimestamp = "Apr 27 2026 20:46:44"; // Prevent instantiation private Configuration() { diff --git a/src/main/java/org/perlonjava/frontend/parser/SubroutineParser.java b/src/main/java/org/perlonjava/frontend/parser/SubroutineParser.java index 648d72e54..505450a11 100644 --- a/src/main/java/org/perlonjava/frontend/parser/SubroutineParser.java +++ b/src/main/java/org/perlonjava/frontend/parser/SubroutineParser.java @@ -258,7 +258,14 @@ && isValidIndirectMethod(subName, parser) if ((isPackage != null && !isPackage) || (isPackage == null && !isKnownSub && token.text.equals("(") && !packageName.contains("::") && subExists) || (subExists && packageName.contains("::") && token.text.equals("(") - && !(isPackage != null && isPackage))) { + && !(isPackage != null && isPackage)) + // If packageName is not a known class and the next token is itself a + // bareword identifier, then `packageName` is more likely a method name + // (e.g. `new`) rather than a class — and the inner `packageName IDENT` + // pair is the real indirect-object call. So reject the outer form. + // Example: `myfunc new Foo (4,5)` should parse as `myfunc(Foo->new(4,5))`, + // NOT as `new->myfunc(Foo(4,5))`. + || (isPackage == null && !isKnownSub && token.type == LexerTokenType.IDENTIFIER)) { parser.tokenIndex = currentIndex2; } else { // Not a known subroutine, check if it's valid indirect object syntax