NEW147773
Make RenderElement the CachedImageClient, rather than RenderObject
https://bugs.webkit.org/show_bug.cgi?id=147773
Summary Make RenderElement the CachedImageClient, rather than RenderObject
Simon Fraser (smfr)
Reported 2015-08-06 23:26:18 PDT
Make RenderElement the CachedImageClient, rather than RenderObject
Attachments
Patch for EWS (19.88 KB, patch)
2015-08-06 23:27 PDT, Simon Fraser (smfr)
no flags
Patch (20.39 KB, patch)
2015-08-08 12:20 PDT, Simon Fraser (smfr)
no flags
Simon Fraser (smfr)
Comment 1 2015-08-06 23:27:05 PDT
Created attachment 258463 [details] Patch for EWS
Andreas Kling
Comment 2 2015-08-06 23:29:38 PDT
Does this regress the sizeof(RenderElement) due to extra vtable ptr?
Simon Fraser (smfr)
Comment 3 2015-08-08 12:20:05 PDT
Simon Fraser (smfr)
Comment 4 2015-08-08 12:54:03 PDT
Before: sizeof RenderObject is 48 sizeof RenderText is 88 sizeof RenderElement is 72 sizeof RenderBoxModelObject is 80 sizeof RenderBox is 136 After: sizeof RenderObject is 48 sizeof RenderText is 88 sizeof RenderElement is 88 sizeof RenderBoxModelObject is 96 sizeof RenderBox is 152 Hrmm, maybe we can improve packing into RenderObject to eliminate this change.
Darin Adler
Comment 5 2015-08-08 17:51:31 PDT
Comment on attachment 258571 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258571&action=review Not saying review+ yet because of the question in HTMLImageElement::width. > Source/WebCore/html/HTMLImageElement.cpp:290 > - return m_imageLoader.image()->imageSizeForRenderer(renderer(), 1.0f).width(); > + return m_imageLoader.image()->imageSizeForRenderer(nullptr, 1.0f).width(); Change log doesn’t make clear why we want to pass nullptr here instead of renderer. > Source/WebCore/page/EventHandler.cpp:1446 > + RenderElement* renderElement = is<RenderElement>(renderer) ? downcast<RenderElement>(renderer) : (renderer->isText() ? renderer->parent() : nullptr); Why is the isText check needed? Which non-RenderElement, non-text RenderObject has a requirement that we use null instead of a pointer to the object’s parent?
Darin Adler
Comment 6 2015-08-08 17:53:01 PDT
(In reply to comment #4) > Before: > > sizeof RenderObject is 48 > sizeof RenderText is 88 > sizeof RenderElement is 72 > sizeof RenderBoxModelObject is 80 > sizeof RenderBox is 136 > > After: > > sizeof RenderObject is 48 > sizeof RenderText is 88 > sizeof RenderElement is 88 > sizeof RenderBoxModelObject is 96 > sizeof RenderBox is 152 > > Hrmm, maybe we can improve packing into RenderObject to eliminate this > change. That’s bizarre. Why on earth do we see that big increase in RenderBox? I suspect the problem is that this makes it multiple inheritance and before it was single inheritance.
Antti Koivisto
Comment 7 2015-08-10 08:24:03 PDT
This adds vptr to RenderElement, the results are exactly as expected.
Antti Koivisto
Comment 8 2015-08-10 08:29:53 PDT
A good strategy might be to have a separate non-renderer object that is a CachedImageClient and keep those in a global RenderElement->ImageClient map. The client object would only be constructed when needed. Most renderers don't load any images.
Antti Koivisto
Comment 9 2015-08-10 08:31:21 PDT
RenderElementImageLoader or something.
alan
Comment 10 2015-08-10 08:32:36 PDT
(In reply to comment #8) > A good strategy might be to have a separate non-renderer object that is a > CachedImageClient and keep those in a global RenderElement->ImageClient map. > The client object would only be constructed when needed. Most renderers > don't load any images. I'd like to see something like that!
Simon Fraser (smfr)
Comment 11 2015-08-10 09:11:09 PDT
Comment on attachment 258571 [details] Patch Sounds like a plan.
Antti Koivisto
Comment 12 2015-08-10 09:16:25 PDT
I thought we already had static_asserts against growth of common renderers. We should add some!
Note You need to log in before you can comment on or make changes to this bug.