oracle/graal · error · ExperimentParserTypeError
Failed to parse experiment {experimentId} in {resource}: exp
Error message
Failed to parse experiment {experimentId} in {resource}: expected position to be an instance of Integer but got "{actualObject}" What it means
While converting an optimization's position map, parseOptimization throws ExperimentParserTypeError when a position value is not a java.lang Integer — the optimization log encodes each inlining position as method-name -> bci, and every bci must be a JSON number that decodes to Integer. The error names the experiment, file, the 'position' property, the expected type and the offending object.
Source
Thrown at compiler/src/org.graalvm.profdiff/src/org/graalvm/profdiff/parser/CompilationUnitTreeParser.java:157
} else {
optimizationPhase.addChild(parseOptimizationPhase(childMap));
}
}
return optimizationPhase;
}
private Optimization parseOptimization(ExperimentJSONParser.JSONMap optimization) throws ExperimentParserTypeError {
String optimizationName = optimization.property(OptimizationLogImpl.OPTIMIZATION_NAME_PROPERTY).asString();
String eventName = optimization.property(OptimizationLogImpl.EVENT_NAME_PROPERTY).asString();
ExperimentJSONParser.JSONLiteral positionObject = optimization.property(OptimizationLogImpl.POSITION_PROPERTY);
Position position = Position.EMPTY;
if (!positionObject.isNull()) {
MapCursor<String, Object> cursor = positionObject.asMap().getInnerMap().getEntries();
List<String> methodNames = new ArrayList<>();
List<Integer> bcis = new ArrayList<>();
while (cursor.advance()) {
if (!(cursor.getValue() instanceof Integer)) {
throw new ExperimentParserTypeError(experimentId, fileView.getSymbolicPath(), OptimizationLogImpl.POSITION_PROPERTY, Integer.class, cursor.getValue());
}
methodNames.add(Method.removeMethodVariantKey(cursor.getKey()));
bcis.add((Integer) cursor.getValue());
}
position = Position.create(methodNames, bcis);
}
EconomicMap<String, Object> properties = optimization.getInnerMap();
properties.removeKey(OptimizationLogImpl.OPTIMIZATION_NAME_PROPERTY);
properties.removeKey(OptimizationLogImpl.EVENT_NAME_PROPERTY);
properties.removeKey(OptimizationLogImpl.POSITION_PROPERTY);
return new Optimization(optimizationName, eventName, position, properties.isEmpty() ? null : properties);
}
}
View on GitHub (pinned to a66e9ccd1d)
Solutions
- Regenerate the optimization log with the matching GraalVM/profdiff version instead of editing it by hand.
- If post-processing logs, keep bcis as unquoted JSON integers.
- Validate the file: every entry of each 'position' object must map a string method name to an integer.
Example fix
// before (log content)
{"name":"inlining","event":"...","position":{"m(int)":"7"}}
// after
{"name":"inlining","event":"...","position":{"m(int)":7}} Defensive patterns
Strategy: validation
Validate before calling
// Validate a position object before handing the log to profdiff
Object pos = optimization.get("position");
if (pos instanceof Map<?,?> m) {
for (Object v : m.values()) if (!(v instanceof Integer)) throw new IllegalArgumentException("Non-integer bci: " + v);
} Type guard
static boolean positionsAreIntegerBcis(Map<?,?> position) {
return position.values().stream().allMatch(v -> v instanceof Integer);
} Try / catch
try {
parser.parse();
} catch (ExperimentParserTypeError e) {
// message names file, 'position', expected Integer, and the actual value; fix the JSON
} Prevention
- Never hand-edit optimization logs; regenerate them.
- Match the GraalVM version that produced the logs with the profdiff that parses them.
When it happens
Trigger: An optimization log whose position map contains a non-integer bci, e.g. "position": {"m(int)": "42"} (string), a float bci, or a null. Usually produced by a hand-edited log or a mismatched/buggy optimization-log writer version.
Common situations: Editing or programmatically generating optimization logs; JSON serializers that quote numbers or emit doubles; mixing logs produced by one GraalVM version with a profdiff from another whose schema drifted.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- Failed to parse experiment {experimentId} in {resource}: exp
- Failed to parse experiment {experimentId} in compilation uni
- The provided optimization log path does not denote a directo
- Failed to parse experiment {experimentId} in {resource}: {me
- Failed to serialize ${op} due to: ${cause}
AI-assisted analysis of oracle/graal@a66e9ccd1d (2026-08-14).
Data as JSON: /api/errors/779c1f9a3498e4d3.
Report an issue: GitHub.