// 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(argumentName); \ } \ inline long long ToInt(argumentType* argumentName) { \ return reinterpret_cast(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