cafebabe is a parser for .class
files, which are generated by the javac compiler and other compilers targeting the JVM.
It supports the class file format from Java 21 (September 2023).
There are a bunch of different class file parsers available on crates.io. Main differentiators for cafebabe
are:
cafebabe
does all this internally and returns the "primitive" type you get after doing the constant pool lookups.
Consider the example of reading a classinfo member.
With most other parsers, you get a u16 from the parser, with which you have to:
(a) do a constant pool lookup,
(b) verify it's a classinfo type,
(c) extract the u16 from the classinfo,
(d) do another constant pool lookup,
(e) verify it's a utf8 type,
(f) read the string.
With cafebabe
you just get the string right off the bat, since all the type checking and lookups were done during the parsing phase.Cow<'a, str>
which are tied to the lifetime of your input class bytes.
This means there's zero copying for strings anywhere in cafebabe
itself, except in the rare case where a string is in the subset of modified "java utf-8" that isn't regular utf-8.The main parsing code is fully implemented. All structures (including attributes) described in Chapter 4 of the JVM spec are supported.
The entire modules
file of the OpenJDK 16/17/21 distributions can be parsed without errors.
cafebabe
will do some kinds of validation/checking at parse time, but not everything described in Chapter 4 of the JVM spec.
It does all of section 4.8 validation ("Format checking") except possibly some of the attribute validations (the Signature attribute, for instance).
A reasonable goal for this project is to fully implement section 4.8, so patches would be accepted for additional format checking.
Why is the project called cafebabe
?
Because the first 4 bytes in any valid class file are a magic identifier with the value 0xCAFEBABE. ☕