RFR: 8377427: Reduce substring allocations in Color.web(String, double) [v2]
Andy Goryachev
angorya at openjdk.org
Wed Feb 11 09:56:44 UTC 2026
On Tue, 10 Feb 2026 15:09:55 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:
>> Color.web(string, double) parses a color string by creating substrings of the input. These string allocations can be removed.
>>
>> There are no new tests for the `Color` class, since the existing tests already cover all relevant code paths.
>
> Michael Strauß has updated the pull request incrementally with one additional commit since the last revision:
>
> CSS-compliant double parser
The JavaFX CSS spec states (under <number>):
Real numbers and integers are specified in decimal notation only. ... A <number> can either be an <integer>, or it can be zero or more digits followed by a dot (.) followed by one or more digits. Both integers and real numbers may be preceded by a "-" or "+" to indicate the sign. -0 is equivalent to 0 and is not a negative number.
[+|-]? [[0-9]+|[0-9]*"."[0-9]+]
it looks to me like exponential notation should not be supported.
Mandatory disclaimer: W3C is not a real standard.
I am not sure if we want to change the CSS spec to allow scientific notation in all the <number>s, I don't even sure we want to add this support in `Color.web()`. If we do though, I think we would need to update the javadoc and possibly the CSS Reference, right?
I must admit I don't know how much changes in `Color.web()` impact CSS parsing.
For example, it looks like `Color.web()` is being called from `CssParser.colorValueOfString(String)` but a simple css like `-fx-background-color: rgb(1);` won't trigger that code.
it's not a real standard in a sense that it is an attempt to write a spec for something that every browser manufacturer want to change to make their browser "better". maybe the situation changed recently, I don't know.
But I do agree with you - the majority of developers are familiar with it, so it might make sense to adapt in some cases (while keeping in mind possible regressions).
> JavaFX contradicts its own specification, but the specification is (and has always been) wrong anyway.
This is hilarious and concerning at the same time. I wonder whether we need to update the javadoc / create a CSR since we are changing the behavior. What do you think?
modules/javafx.graphics/src/main/java/javafx/scene/paint/Color.java line 437:
> 435:
> 436: if (len == 3) {
> 437: r = Integer.parseInt(colorString, offset, offset + 1, 16);
would a switch statement be better in this case (e.g. case when len == 1)?
modules/javafx.graphics/src/test/java/test/com/sun/javafx/css/parser/CssNumberParserTest.java line 40:
> 38: @Test
> 39: public void parseIntegerAndSignedInteger() {
> 40: assertEquals(0.0, parseDouble("0"), 0.0);
The JavaFX CSS spec also states
-0 is equivalent to 0 and is not a negative number.
How should we test this?
modules/javafx.graphics/src/test/java/test/com/sun/javafx/css/parser/CssNumberParserTest.java line 79:
> 77: assertNumberFormatException("1 ");
> 78: assertNumberFormatException("xx1e2yy", 2, 6); // slice is "1e2y"
> 79: }
maybe add another test for malformed numbers such as `++0`, `1e--2`, etc.?
modules/javafx.graphics/src/test/java/test/com/sun/javafx/css/parser/CssNumberParserTest.java line 270:
> 268: return rawBits >= 0 ? rawBits : (0x8000_0000_0000_0000L - rawBits);
> 269: }
> 270: }
missing newline
-------------
PR Review: https://git.openjdk.org/jfx/pull/2069#pullrequestreview-3780071461
PR Comment: https://git.openjdk.org/jfx/pull/2069#issuecomment-3880094916
PR Comment: https://git.openjdk.org/jfx/pull/2069#issuecomment-3880191468
PR Comment: https://git.openjdk.org/jfx/pull/2069#issuecomment-3880669134
PR Review Comment: https://git.openjdk.org/jfx/pull/2069#discussion_r2789907975
PR Review Comment: https://git.openjdk.org/jfx/pull/2069#discussion_r2789129871
PR Review Comment: https://git.openjdk.org/jfx/pull/2069#discussion_r2789098613
PR Review Comment: https://git.openjdk.org/jfx/pull/2069#discussion_r2788929245
More information about the openjfx-dev
mailing list