| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #define DEFINE_TYPE_CASTS(thisType, argumentType, argumentName, predicate) \ |
| inline thisType* To##thisType(argumentType* argumentName) { \ |
| if (!predicate) \ |
| asm("int 3"); \ |
| return static_cast<thisType*>(argumentName); \ |
| } \ |
| inline long long ToInt(argumentType* argumentName) { \ |
| return reinterpret_cast<long long>(argumentName); \ |
| } |
| |
| #define LIKELY(x) x |
| |
| namespace blink { |
| |
| struct Base {}; |
| struct Derived : public Base {}; |
| |
| DEFINE_TYPE_CASTS(Derived, Base, the_object, true); |
| |
| void F() { |
| Base* base_ptr = new Derived; |
| Derived* derived_ptr = ToDerived(base_ptr); |
| long long as_int = ToInt(base_ptr); |
| // 'derivedPtr' should be renamed: it's a reference to a declaration defined |
| // outside a macro invocation. |
| if (LIKELY(derived_ptr)) { |
| delete derived_ptr; |
| } |
| } |
| |
| #define CALL_METHOD_FROM_MACRO() \ |
| void CallMethodFromMacro() { Method(); } \ |
| void Pmethod() override {} |
| |
| struct WithMacroP { |
| virtual void Pmethod() {} |
| }; |
| |
| struct WithMacro : public WithMacroP { |
| void Method() {} |
| CALL_METHOD_FROM_MACRO(); |
| }; |
| |
| #define DEFINE_WITH_TOKEN_CONCATENATION2(arg1, arg2) \ |
| void arg1##arg2() {} |
| // We definitely don't want to rewrite |arg1| on the previous line into |
| // either |Arg1| or |Frg1| or |Brg1| or |Foo| or |Baz|. |
| |
| // We might or might not want to rewrite |foo|->|Foo| and |baz|->|Baz| below. |
| // The test below just spells out the current behavior of the tool (which one |
| // can argue is accidental). |
| DEFINE_WITH_TOKEN_CONCATENATION2(foo, Bar1) |
| DEFINE_WITH_TOKEN_CONCATENATION2(baz, Bar2) |
| |
| void TokenConcatenationTest2() { |
| // We might or might not want to rewrite |foo|->|Foo| and |baz|->|Baz| below. |
| // The test below just spells out the current behavior of the tool (which one |
| // can argue is accidental). |
| fooBar1(); |
| bazBar2(); |
| } |
| |
| class FieldsMacro { |
| public: |
| // We shouldn't rewrite |m_fooBar| -> |foo_bar_|, because we cannot rewrite |
| // |m_##name| -> |???|. |
| FieldsMacro() : m_fooBar(123), m_barBaz(456) {} |
| |
| #define DECLARE_FIELD(name, Name) \ |
| private: \ |
| int m_##name; \ |
| \ |
| public: \ |
| int name() { return m_##name; } \ |
| void Set##Name(int name) { m_##name = name; } |
| |
| DECLARE_FIELD(FooBar, FooBar) |
| DECLARE_FIELD(BarBaz, BarBaz) |
| }; |
| |
| int FieldsMacroTest() { |
| FieldsMacro fm; |
| fm.SetFooBar(789); |
| return fm.FooBar() + fm.BarBaz(); |
| } |
| |
| } // namespace blink |