Closed
Bug 1210291
Opened 9 years ago
Closed 9 years ago
Streamline StreamingLexer's handling of terminal states
Categories
(Core :: Graphics: ImageLib, defect)
Core
Graphics: ImageLib
Tracking
()
RESOLVED
FIXED
mozilla45
People
(Reporter: n.nethercote, Assigned: n.nethercote)
Details
Attachments
(2 files, 3 obsolete files)
52.83 KB,
patch
|
seth
:
review+
|
Details | Diff | Splinter Review |
3.65 KB,
patch
|
seth
:
review+
|
Details | Diff | Splinter Review |
As a step on the way to getting rid of StreamLexer's need for state values we need to change SUCCESS and FAILURE to be their own separate things.
Assignee | ||
Comment 1•9 years ago
|
||
This patch introduces TerminalState and changes LexerTransition::mNextState to be a Variant<State, TerminalState>. This means that SUCCESS and FAILURE no longer need to be part of State. Some things to note: - This simplifies the handling of Lex()'s return value, which is nice. - The patch splits Terminate() into TerminateSuccess() and TerminateFailure(). You have to specify the State template type at every callsite, unfortunately. - |const State& aNextState| wouldn't work for the first arg to LexerTransition's ctor due to errors in Variant construction that I didn't understand. I had to change it to |State aNextState|.
Attachment #8668269 -
Flags: review?(seth)
Assignee | ||
Comment 2•9 years ago
|
||
Here's a slightly different way of structuring LexerTransition. It's nicer in that the fields which are only relevant for non-terminal states are now contained within the Variant. But it's also more verbose. I could go either way on whether to do it like this or not.
Attachment #8668270 -
Flags: review?(seth)
Assignee | ||
Comment 3•9 years ago
|
||
Updated version of part 1 to account for the recent changes to nsBMPDecoder.
Attachment #8675959 -
Flags: review?(seth)
Assignee | ||
Updated•9 years ago
|
Attachment #8668269 -
Attachment is obsolete: true
Attachment #8668269 -
Flags: review?(seth)
Comment 4•9 years ago
|
||
Comment on attachment 8675959 [details] [diff] [review] Streamline StreamingLexer's handling of terminal states Review of attachment 8675959 [details] [diff] [review]: ----------------------------------------------------------------- ::: image/StreamingLexer.h @@ +34,4 @@ > { > + SUCCESS, > + FAILURE, > + INCOMPLETE INCOMPLETE isn't a terminal state. I think we're better off continuing to return a Maybe from Lex(). ::: image/decoders/nsICODecoder.cpp @@ +230,5 @@ > nsICODecoder::ReadHeader(const char* aData) > { > // If the third byte is 1, this is an icon. If 2, a cursor. > if ((aData[2] != 1) && (aData[2] != 2)) { > + return Transition::TerminateFailure<ICOState>(); The verbosity of specifying the state type here isn't ideal. Why don't we just have Transition::TerminateFailure() / Transition::TerminateSuccess() return a TerminalState, and provide an implicit conversion from TerminalState to LexerTransition<T> for any T? (You already did, actually, since you didn't mark the new constructor you added explicit.) Such a conversion is always valid, since T doesn't matter and LexerTransition has no other state in the terminal case.
Assignee | ||
Comment 5•9 years ago
|
||
New version which makes the two requested modifications.
Attachment #8679868 -
Flags: review?(seth)
Assignee | ||
Updated•9 years ago
|
Attachment #8675959 -
Attachment is obsolete: true
Attachment #8675959 -
Flags: review?(seth)
Assignee | ||
Comment 6•9 years ago
|
||
New version of the second patch; see comment 2 for what's happening here.
Attachment #8679869 -
Flags: review?(seth)
Assignee | ||
Updated•9 years ago
|
Attachment #8668270 -
Attachment is obsolete: true
Attachment #8668270 -
Flags: review?(seth)
Assignee | ||
Comment 7•9 years ago
|
||
Seth: 13 day review ping.
Comment 8•9 years ago
|
||
Comment on attachment 8679868 [details] [diff] [review] Streamline StreamingLexer's handling of terminal states Review of attachment 8679868 [details] [diff] [review]: ----------------------------------------------------------------- Really nice, Nick! r+, with some nits below. ::: image/StreamingLexer.h @@ +146,5 @@ > BufferingStrategy::BUFFERED); > } > > /** > + * Terminate lexing, ending up in terminal state FAILURE. (The implicit You have FAILURE in the comment for TerminateSuccess() and SUCCESS in the comment for TerminateFailure(). Should switch those. =) @@ +260,5 @@ > size_t toRead = std::min(mToReadUnbuffered, aLength); > > + // Call aFunc with the unbuffered state to indicate that we're in the > + // middle of an unbuffered read. We enforce that any state transition > + // passed back to us is either a terminal states or takes us back to the Nit: This was my typo, but s/terminal states/terminal state. ::: image/decoders/nsBMPDecoder.cpp @@ +445,4 @@ > } > }); > > + if (terminalState && *terminalState == TerminalState::FAILURE) { This can be written as just |if (terminalState == Some(TerminalState::FAILURE))|. ::: image/decoders/nsICODecoder.cpp @@ +644,4 @@ > } > }); > > + if (terminalState && *terminalState == TerminalState::FAILURE) { See above. ::: image/decoders/nsIconDecoder.cpp @@ +57,4 @@ > } > }); > > + if (terminalState && *terminalState == TerminalState::FAILURE) { See above. ::: image/test/gtest/TestStreamingLexer.cpp @@ +88,5 @@ > char data[9] = { 1, 2, 3, 1, 2, 3, 1, 2, 3 }; > > // Test delivering all the data at once. > + Maybe<TerminalState> result = lexer.Lex(data, sizeof(data), DoLex); > + EXPECT_TRUE(result.isSome() && *result == TerminalState::SUCCESS); I'd prefer not to make this change (and same for the other places where it appears); this way we can immediately tell the difference in the logs between the lexer *not finishing at all* (indicated by result.isNothing()) and the lexer *finishing, but failing* (indicated by result != Some(TerminalState::SUCCESS). I really should've written |EXPECT_EQ(Some(TestState::SUCCESS), result);|, though. I'm not sure why I didn't; maybe it was a slipup, or maybe there's some issue with GTest's macro magic.
Attachment #8679868 -
Flags: review?(seth) → review+
Comment 9•9 years ago
|
||
Comment on attachment 8679869 [details] [diff] [review] tweak LexerTransition Review of attachment 8679869 [details] [diff] [review]: ----------------------------------------------------------------- I like it. Should make it harder to introduce bugs in LexerTransition when further maintenance happens down the line. (The only negative is the verbosity, as you say, but that's C++ for you.)
Attachment #8679869 -
Flags: review?(seth) → review+
Assignee | ||
Comment 10•9 years ago
|
||
https://hg.mozilla.org/integration/mozilla-inbound/rev/793133ff5233a8e2cd0a6864b9984f5a9bb31c05 Bug 1210291 - Streamline StreamingLexer's handling of terminal states. r=seth.
Comment 11•9 years ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/793133ff5233
Status: ASSIGNED → RESOLVED
Closed: 9 years ago
status-firefox45:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla45
You need to log in
before you can comment on or make changes to this bug.
Description
•