Skip to content

Commit b30377d

Browse files
authored
Merge pull request #179 from fglock/fix/exiftool-scalar-deref-and-hex-parsing
Fix ExifTool issues: scalar dereference autovivification and hexadecimal parsing
2 parents 0879102 + feff085 commit b30377d

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

src/main/java/org/perlonjava/parser/NumberParser.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,13 @@ private static Node parseSpecialNumber(Parser parser, String initialPart, Number
181181
exponentStr = String.valueOf(exponent);
182182
}
183183
} else {
184+
// Save token index for backtracking
185+
int savedTokenIndex = parser.tokenIndex;
184186
exponentStr = parseHexExponentTokens(parser);
187+
if (exponentStr.isEmpty()) {
188+
// No exponent found, backtrack
189+
parser.tokenIndex = savedTokenIndex;
190+
}
185191
}
186192
}
187193

@@ -262,8 +268,9 @@ private static String parseHexExponentTokens(Parser parser) {
262268
if (parser.tokenIndex < parser.tokens.size() &&
263269
parser.tokens.get(parser.tokenIndex).type == LexerTokenType.NUMBER) {
264270
exponentStr.append(cleanUnderscores(TokenUtils.consume(parser).text));
265-
} else if (exponentStr.length() > 0) {
266-
parser.throwError("Malformed hexadecimal floating-point exponent");
271+
} else {
272+
// Not a valid exponent - return empty string
273+
return "";
267274
}
268275

269276
return exponentStr.toString();

src/main/java/org/perlonjava/runtime/RuntimeScalar.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,13 @@ public RuntimeScalar scalarDeref() {
10681068
}
10691069

10701070
return switch (type) {
1071-
case UNDEF -> throw new PerlCompilerException("Can't use an undefined value as a SCALAR reference");
1071+
case UNDEF -> {
1072+
// Autovivify: create a new scalar reference for undefined values
1073+
RuntimeScalar newScalar = new RuntimeScalar();
1074+
this.value = newScalar;
1075+
this.type = RuntimeScalarType.REFERENCE;
1076+
yield newScalar;
1077+
}
10721078
case REFERENCE -> (RuntimeScalar) value;
10731079
case STRING, BYTE_STRING ->
10741080
throw new PerlCompilerException("Can't use string (\"" + this + "\") as a SCALAR ref while \"strict refs\" in use");

0 commit comments

Comments
 (0)