From 41de040ecfb151f37c7825d0cb0875e950fc9565 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Sat, 1 Jun 2019 08:03:42 +0000 Subject: [PATCH] Bug 1553731 - Part 3: Make nsIFrame::Is___Frame() avoid reading from memory. r=mats Differential Revision: https://phabricator.services.mozilla.com/D32605 --HG-- extra : moz-landing-system : lando --- layout/generic/GenerateFrameLists.py | 2 +- layout/generic/nsIFrame.h | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/layout/generic/GenerateFrameLists.py b/layout/generic/GenerateFrameLists.py index d1ebf061d485..51c06dd13bb3 100644 --- a/layout/generic/GenerateFrameLists.py +++ b/layout/generic/GenerateFrameLists.py @@ -36,4 +36,4 @@ def generate_frame_type_list_h(output, *ignore): groups = grouped_frame_classes() output.write(HEADER) for group in groups: - output.write("FRAME_TYPE(%s)\n" % group[0].ty) + output.write("FRAME_TYPE(%s, %s, %s)\n" % (group[0].ty, group[0].cls, group[-1].cls)) diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index 4800e8960f33..753b5155481e 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -169,7 +169,7 @@ class Selection; namespace mozilla { enum class LayoutFrameType : uint8_t { -#define FRAME_TYPE(ty_) ty_, +#define FRAME_TYPE(ty_, ...) ty_, #include "mozilla/FrameTypeList.h" #undef FRAME_TYPE }; @@ -2795,13 +2795,23 @@ class nsIFrame : public nsQueryFrame { return sLayoutFrameTypes[uint8_t(mClass)]; } -#define FRAME_TYPE(name_) \ - bool Is##name_##Frame() const { \ - return Type() == mozilla::LayoutFrameType::name_; \ +#ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wtype-limits" +#endif + +#define FRAME_TYPE(name_, first_class_, last_class_) \ + bool Is##name_##Frame() const { \ + return uint8_t(mClass) >= uint8_t(ClassID::first_class_##_id) && \ + uint8_t(mClass) <= uint8_t(ClassID::last_class_##_id); \ } #include "mozilla/FrameTypeList.h" #undef FRAME_TYPE +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif + /** * Returns a transformation matrix that converts points in this frame's * coordinate space to points in some ancestor frame's coordinate space.