RESOLVED FIXED 23522
Use checked casts for render tree
https://bugs.webkit.org/show_bug.cgi?id=23522
Summary Use checked casts for render tree
Darin Adler
Reported 2009-01-24 14:07:57 PST
We have a checked cast for RenderBox now, but we want to do that for other render tree types too.
Attachments
step 1 -- RenderText (82.60 KB, patch)
2009-01-24 22:50 PST, Darin Adler
no flags
work in progress (106.18 KB, patch)
2009-01-26 09:30 PST, Darin Adler
no flags
Some other work in progress (25.82 KB, patch)
2009-07-24 18:02 PDT, Darin Adler
no flags
Next step: Includes toRenderWidget (29.92 KB, patch)
2009-07-29 12:06 PDT, Darin Adler
no flags
Next step: Includes toRenderTable* (66.35 KB, patch)
2009-07-30 13:20 PDT, Darin Adler
no flags
patch (159.73 KB, patch)
2009-08-04 15:54 PDT, Darin Adler
levin: review+
Darin Adler
Comment 1 2009-01-24 14:08:55 PST
Here are stats on how much static_cast is used: 73 RenderText 44 RenderBlock 28 RenderImage 27 RenderView 26 RenderTextControl 24 RenderTableSection 24 RenderTableCell 21 RenderWidget 17 RenderFlow 11 RenderScrollbar 10 RenderListItem 9 RenderTable 8 RenderSlider 8 RenderListBox 7 RenderTextControlSingleLine 5 RenderTableRow 5 RenderMenuList 5 RenderListMarker 4 RenderTableCol 4 RenderFrameSet 4 RenderFileUploadControl 3 RenderSVGContainer 3 RenderPartObject 3 RenderInline 3 RenderBox 2 RenderPart 2 RenderObject 2 RenderMedia 2 RenderArenaDebugHeader 1 RenderVideo 1 RenderTextControlMultiLine 1 RenderSVGViewportContainer 1 RenderSVGTextPath 1 RenderSVGText 1 RenderSVGRoot 1 RenderSVGImage 1 RenderMediaControlShadowRoot 1 RenderHTMLCanvas 1 RenderFrame 1 RenderFieldset 1 RenderCounter 1 RenderContainer 1 RenderButton 1 RenderApplet I used this line to compute that: grep-r 'static_cast *< *Render\w* *\* *>' .h .cpp .mm | perl -pe 's/^.*static_cast *< *(Render\w+).*$/\1/' | sort | uniq -c | sort -r Where grep-r is a script I use to search source tree that uses perl.
Darin Adler
Comment 2 2009-01-24 22:50:35 PST
Created attachment 27007 [details] step 1 -- RenderText
Darin Adler
Comment 3 2009-01-25 12:24:37 PST
Comment on attachment 27007 [details] step 1 -- RenderText Landed as trac.webkit.org/changeset/40229 so clearing review flag.
Darin Adler
Comment 4 2009-01-26 09:30:06 PST
Created attachment 27036 [details] work in progress
Darin Adler
Comment 5 2009-01-30 13:36:02 PST
Hyatt and Sam are both working on this.
Darin Adler
Comment 6 2009-07-24 18:02:46 PDT
Created attachment 33481 [details] Some other work in progress
Darin Adler
Comment 7 2009-07-29 12:06:56 PDT
Created attachment 33729 [details] Next step: Includes toRenderWidget
David Levin
Comment 8 2009-07-29 23:56:01 PDT
Comment on attachment 33729 [details] Next step: Includes toRenderWidget Verified that it is equivalent (with the added bonus of error checking). I wish there was a way to give compile errors for instances of "static_cast<RenderWidget*>()" to prevent it from being added again (automatically), but I couldn't think of any way to do this.
Adam Barth
Comment 9 2009-07-30 00:03:47 PDT
(In reply to comment #8) > I wish there was a way to give compile errors for instances of > "static_cast<RenderWidget*>()" to prevent it from being added again > (automatically), but I couldn't think of any way to do this. I wonder if we can provide a specialized template for that with a COMPILE_ASSERT(false) in it. Not sure if that works with static_cast.
Darin Adler
Comment 10 2009-07-30 13:19:18 PDT
Comment on attachment 33729 [details] Next step: Includes toRenderWidget Landed, clearing review flag.
Darin Adler
Comment 11 2009-07-30 13:20:25 PDT
Created attachment 33821 [details] Next step: Includes toRenderTable*
David Levin
Comment 12 2009-07-30 17:41:41 PDT
Comment on attachment 33821 [details] Next step: Includes toRenderTable* > Index: WebCore/page/Frame.cpp > =================================================================== > if (cellRenderer && cellRenderer->isTableCell()) { > - RenderTableCell* cellAboveRenderer = cellRenderer->table()->cellAbove(cellRenderer); > + RenderTableCell* cellAboveRenderer = toRenderTableCell(cellRenderer)->table()->cellAbove(toRenderTableCell(cellRenderer)); Although it is no runtime expense, it is harder to read with two "toRenderTableCell(cellRenderer)" in the same line. Consider a local variable to avoid this. For example, RenderTableCell* tableCell = toRenderTableCell(cellRenderer); RenderTableCell* cellAboveRenderer = tableCell->table()->cellAbove(tableCell); > Index: WebCore/page/mac/FrameMac.mm > =================================================================== > if (cellRenderer && cellRenderer->isTableCell()) { > - RenderTableCell* cellAboveRenderer = cellRenderer->table()->cellAbove(cellRenderer); > + RenderTableCell* cellAboveRenderer = toRenderTableCell(cellRenderer)->table()->cellAbove(toRenderTableCell(cellRenderer)); Same comment as before "It is harder to read with two "toRenderTableCell(cellRenderer)" in the same line...." > Index: WebCore/rendering/RenderTable.cpp > =================================================================== 47 RenderTable::RenderTable(Node* node) ... 53 , m_tableLayout(0) This initialization may be deleted now. > Index: WebCore/rendering/RenderTable.h > =================================================================== > + virtual void paintMask(PaintInfo& paintInfo, int tx, int ty); "paintInfo" param name is redundant. (It existed before due to the move it looks like a new line so it is a good time to remove this.) > +inline RenderTable* toRenderTable(RenderObject* o) > +inline const RenderTable* toRenderTable(const RenderObject* o) Consider using renderObject instead of o (so that we have full words for the variable names). > Index: WebCore/rendering/RenderTableCell.h > =================================================================== > +inline RenderTableCell* toRenderTableCell(RenderObject* o) > +inline const RenderTableCell* toRenderTableCell(const RenderObject* o) Consider using renderObject instead of o. > Index: WebCore/rendering/RenderTableCol.h > =================================================================== > + void setSpan(int s) { m_span = s; } Consider using span instead of s. > +inline RenderTableCol* toRenderTableCol(RenderObject* o) > +inline const RenderTableCol* toRenderTableCol(const RenderObject* o) Consider using renderObject instead of o. > Index: WebCore/rendering/RenderTableRow.h > =================================================================== > +inline RenderTableRow* toRenderTableRow(RenderObject* o) > +inline const RenderTableRow* toRenderTableRow(const RenderObject* o) Consider using renderObject instead of o. > Index: WebCore/rendering/RenderTableSection.h > =================================================================== > +inline RenderTableSection* toRenderTableSection(RenderObject* o) > +inline const RenderTableSection* toRenderTableSection(const RenderObject* o) Consider using renderObject instead of o.
Darin Adler
Comment 13 2009-07-30 18:54:14 PDT
(In reply to comment #12) > > +inline RenderTableSection* toRenderTableSection(RenderObject* o) > > +inline const RenderTableSection* toRenderTableSection(const RenderObject* o) > > Consider using renderObject instead of o. I think I'll just use "object".
Darin Adler
Comment 14 2009-07-31 17:52:35 PDT
Comment on attachment 33821 [details] Next step: Includes toRenderTable* Clearing review flag since this was landed in http://trac.webkit.org/changeset/46647
Darin Adler
Comment 15 2009-08-04 15:54:11 PDT
David Levin
Comment 16 2009-08-05 02:55:48 PDT
Comment on attachment 34094 [details] patch Some things to consider changing on landing. The biggest concern is the changes in writeSVGText and writeSVGImage where the code doesn't appear to do the same thing as before (missing "\n"). > Index: WebCore/rendering/RenderFrameSet.h > + virtual void paint(PaintInfo& paintInfo, int tx, int ty); Please remove "paintInfo". > Index: WebCore/rendering/RenderInline.h > class RenderInline : public RenderBoxModelObject { > public: ... > + void paintOutline(GraphicsContext*, int tx, int ty); > + > +public: Is this suppose to be protected: instead of public: ? > + int verticalPositionFromCache(bool firstLine) const; > + void invalidateVerticalPosition() { m_verticalPosition = PositionUndefined; } > Index: WebCore/rendering/RenderMenuList.h > class RenderMenuList : public RenderFlexibleBox, private PopupMenuClient { > public: > RenderMenuList(Element*); > - ~RenderMenuList(); > + virtual~RenderMenuList(); Missing space after virtual. > Index: WebCore/rendering/RenderPartObject.h > +inline RenderPartObject* toRenderPartObject(RenderObject* object) > +{ > + ASSERT(!object || (object->isRenderPart() && !object->isFrame())); Why not use !strmp(object->renderName,"RenderPartObject") as that doesn't rely on the current object hierarchy? I guess if RenderPartObject isn't a leaf in the hierarchy, that would make sense but I didn't see any derived classes (in my cursory search). > Index: WebCore/rendering/RenderScrollbar.cpp > + case NoPart: > + case ScrollbarBGPart: > + case AllParts: > + break; If this break was "return SCROLLBAR;", there could be an ASSERT_NOT_REACHED below to check against bad values being passed in at runtime. > } > + return SCROLLBAR; > Index: WebCore/rendering/SVGRenderTreeAsText.cpp Add 2009 to Apple copyright? > @@ -36,7 +36,7 @@ > #include "NodeRenderStyle.h" > #include "RenderPath.h" > #include "RenderSVGContainer.h" > -#include "RenderSVGImage.h" > +#include "RenderImage.h" This include is out of place now (sort it). > +void writeSVGText(TextStream& ts, const RenderBlock& text, int indent) > { > writeStandardPrefix(ts, text, indent); > - ts << text << "\n"; > + writeRenderSVGTextBox(ts, text); It looks like this line should be added here: ts << "\n"; to be equivalent to the previous code. > writeChildren(ts, text, indent); > } > +void writeSVGImage(TextStream& ts, const RenderImage& image, int indent) > { > writeStandardPrefix(ts, image, indent); > - ts << image << "\n"; > + writePositionAndStyle(ts, image); It looks like this line should be added here: ts << "\n"; to be equivalent to the previous code.
Darin Adler
Comment 17 2009-08-05 09:07:39 PDT
I'll make sure to run the regression tests before landing. Those "\n" omissions make it pretty clear I didn't before posting the patch!
Darin Adler
Comment 18 2009-08-05 10:35:07 PDT
(In reply to comment #16) > > + virtual void paint(PaintInfo& paintInfo, int tx, int ty); > > Please remove "paintInfo". Done. > > class RenderInline : public RenderBoxModelObject { > > public: > ... > > + void paintOutline(GraphicsContext*, int tx, int ty); > > + > > +public: > > Is this suppose to be protected: instead of public: ? No, apparently those need to be public. I removed the extra public: I left in by accident. > > class RenderMenuList : public RenderFlexibleBox, private PopupMenuClient { > > public: > > RenderMenuList(Element*); > > - ~RenderMenuList(); > > + virtual~RenderMenuList(); > > Missing space after virtual. > > Index: WebCore/rendering/RenderPartObject.h > > +inline RenderPartObject* toRenderPartObject(RenderObject* object) > > +{ > > + ASSERT(!object || (object->isRenderPart() && !object->isFrame())); > > Why not use !strmp(object->renderName,"RenderPartObject") as that doesn't rely > on the current object hierarchy? > > I guess if RenderPartObject isn't a leaf in the hierarchy, that would make > sense but I didn't see any derived classes (in my cursory search). I thought it wasn't a leaf. But I guess that was wrong. Changed to use strcmp as you suggest. > > + case NoPart: > > + case ScrollbarBGPart: > > + case AllParts: > > + break; > > If this break was "return SCROLLBAR;", there could be an ASSERT_NOT_REACHED > below to check against bad values being passed in at runtime. I did that. But NoPart and AllParts also need ASSERT_NOT_REACHED, so I left those as break. I'm not even really sure about ScrollbarBGPart, but for now I had it return SCROLLBAR without an assertion. > > Index: WebCore/rendering/SVGRenderTreeAsText.cpp > > Add 2009 to Apple copyright? Done. > > @@ -36,7 +36,7 @@ > > #include "NodeRenderStyle.h" > > #include "RenderPath.h" > > #include "RenderSVGContainer.h" > > -#include "RenderSVGImage.h" > > +#include "RenderImage.h" > > This include is out of place now (sort it). Done. > > writeStandardPrefix(ts, text, indent); > > - ts << text << "\n"; > > + writeRenderSVGTextBox(ts, text); > > It looks like this line should be added here: > ts << "\n"; > to be equivalent to the previous code. Yes. Done. > > +void writeSVGImage(TextStream& ts, const RenderImage& image, int indent) > > { > > writeStandardPrefix(ts, image, indent); > > - ts << image << "\n"; > > + writePositionAndStyle(ts, image); > > It looks like this line should be added here: > ts << "\n"; > to be equivalent to the previous code. Done. Running regression tests now.
Darin Adler
Comment 19 2009-08-05 16:23:20 PDT
Note You need to log in before you can comment on or make changes to this bug.