OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2017 The Chromium Authors. All rights reserved. | 2 # Copyright 2017 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 import logging | 6 import logging |
| 7 import re |
7 import unittest | 8 import unittest |
8 | 9 |
9 import function_signature | 10 import function_signature |
10 | 11 |
11 | 12 |
12 class AnalyzeTest(unittest.TestCase): | 13 class AnalyzeTest(unittest.TestCase): |
13 | 14 |
14 def testParseFunctionSignature(self): | 15 def testParseFunctionSignature(self): |
15 def check(ret_part, name_part, params_part, after_part=''): | 16 def check(ret_part, name_part, params_part, after_part='', |
| 17 name_without_templates=None): |
| 18 if name_without_templates is None: |
| 19 name_without_templates = re.sub(r'<.*?>', '', name_part) + after_part |
| 20 |
16 signature = ''.join((name_part, params_part, after_part)) | 21 signature = ''.join((name_part, params_part, after_part)) |
17 got_full, got_name = function_signature.Parse(signature) | 22 got_full_name, got_template_name, got_name = ( |
18 self.assertEqual(name_part + after_part, got_name) | 23 function_signature.Parse(signature)) |
19 self.assertEqual(name_part + params_part + after_part, got_full) | 24 self.assertEqual(name_without_templates, got_name) |
| 25 self.assertEqual(name_part + after_part, got_template_name) |
| 26 self.assertEqual(name_part + params_part + after_part, got_full_name) |
20 if ret_part: | 27 if ret_part: |
21 signature = ''.join((ret_part, name_part, params_part, after_part)) | 28 signature = ''.join((ret_part, name_part, params_part, after_part)) |
22 got_full, got_name = function_signature.Parse(signature) | 29 got_full_name, got_template_name, got_name = ( |
23 self.assertEqual(name_part + after_part, got_name) | 30 function_signature.Parse(signature)) |
24 self.assertEqual(name_part + params_part + after_part, got_full) | 31 self.assertEqual(name_without_templates, got_name) |
| 32 self.assertEqual(name_part + after_part, got_template_name) |
| 33 self.assertEqual(name_part + params_part + after_part, got_full_name) |
25 | 34 |
26 check('bool ', | 35 check('bool ', |
27 'foo::Bar<unsigned int, int>::Do<unsigned int>', | 36 'foo::Bar<unsigned int, int>::Do<unsigned int>', |
28 '(unsigned int)') | 37 '(unsigned int)') |
29 check('base::internal::CheckedNumeric<int>& ', | 38 check('base::internal::CheckedNumeric<int>& ', |
30 'base::internal::CheckedNumeric<int>::operator+=<int>', | 39 'base::internal::CheckedNumeric<int>::operator+=<int>', |
31 '(int)') | 40 '(int)') |
32 check('base::internal::CheckedNumeric<int>& ', | 41 check('base::internal::CheckedNumeric<int>& ', |
33 'b::i::CheckedNumeric<int>::MathOp<b::i::CheckedAddOp, int>', | 42 'b::i::CheckedNumeric<int>::MathOp<b::i::CheckedAddOp, int>', |
34 '(int)') | 43 '(int)') |
35 check('', '(anonymous namespace)::GetBridge', '(long long)') | 44 check('', '(anonymous namespace)::GetBridge', '(long long)') |
36 check('', 'operator delete', '(void*)') | 45 check('', 'operator delete', '(void*)') |
37 check('', 'b::i::DstRangeRelationToSrcRangeImpl<long long, long long, ' | 46 check('', 'b::i::DstRangeRelationToSrcRangeImpl<long long, long long, ' |
38 'std::__ndk1::numeric_limits, (b::i::Integer)1>::Check', | 47 'std::__ndk1::numeric_limits, (b::i::Integer)1>::Check', |
39 '(long long)') | 48 '(long long)') |
40 check('', 'cc::LayerIterator::operator cc::LayerIteratorPosition const', | 49 check('', 'cc::LayerIterator::operator cc::LayerIteratorPosition const', |
41 '()', | 50 '()', |
42 ' const') | 51 ' const') |
43 check('decltype ({parm#1}((SkRecords::NoOp)())) ', | 52 check('decltype ({parm#1}((SkRecords::NoOp)())) ', |
44 'SkRecord::Record::visit<SkRecords::Draw&>', | 53 'SkRecord::Record::visit<SkRecords::Draw&>', |
45 '(SkRecords::Draw&)', | 54 '(SkRecords::Draw&)', |
46 ' const') | 55 ' const') |
47 check('', 'base::internal::BindStateBase::BindStateBase', | 56 check('', 'base::internal::BindStateBase::BindStateBase', |
48 '(void (*)(), void (*)(base::internal::BindStateBase const*))') | 57 '(void (*)(), void (*)(base::internal::BindStateBase const*))') |
49 check('int ', 'std::__ndk1::__c11_atomic_load<int>', | 58 check('int ', 'std::__ndk1::__c11_atomic_load<int>', |
50 '(std::__ndk1::<int> volatile*, std::__ndk1::memory_order)') | 59 '(std::__ndk1::<int> volatile*, std::__ndk1::memory_order)') |
51 check('std::basic_ostream<char, std::char_traits<char> >& ', | 60 check('std::basic_ostream<char, std::char_traits<char> >& ', |
52 'std::operator<< <std::char_traits<char> >', | 61 'std::operator<< <std::char_traits<char> >', |
53 '(std::basic_ostream<char, std::char_traits<char> >&, char)') | 62 '(std::basic_ostream<char, std::char_traits<char> >&, char)', |
| 63 name_without_templates='std::operator<<') |
54 check('v8::internal::SlotCallbackResult ', | 64 check('v8::internal::SlotCallbackResult ', |
55 'v8::internal::UpdateTypedSlotHelper::UpdateCodeTarget' | 65 'v8::internal::UpdateTypedSlotHelper::UpdateCodeTarget' |
56 '<v8::PointerUpdateJobTraits<(v8::Direction)1>::Foo(v8::Heap*, ' | 66 '<v8::PointerUpdateJobTraits<(v8::Direction)1>::Foo(v8::Heap*, ' |
57 'v8::MemoryChunk*)::{lambda(v8::SlotType, unsigned char*)#2}::' | 67 'v8::MemoryChunk*)::{lambda(v8::SlotType, unsigned char*)#2}::' |
58 'operator()(v8::SlotType, unsigned char*, unsigned char*) ' | 68 'operator()(v8::SlotType, unsigned char*, unsigned char*) ' |
59 'const::{lambda(v8::Object**)#1}>', | 69 'const::{lambda(v8::Object**)#1}>', |
60 '(v8::RelocInfo, v8::Foo<(v8::PointerDirection)1>::Bar(v8::Heap*)::' | 70 '(v8::RelocInfo, v8::Foo<(v8::PointerDirection)1>::Bar(v8::Heap*)::' |
61 '{lambda(v8::SlotType)#2}::operator()(v8::SlotType) const::' | 71 '{lambda(v8::SlotType)#2}::operator()(v8::SlotType) const::' |
62 '{lambda(v8::Object**)#1})') | 72 '{lambda(v8::Object**)#1})', |
| 73 name_without_templates=( |
| 74 'v8::internal::UpdateTypedSlotHelper::UpdateCodeTarget')) |
63 check('', | 75 check('', |
64 'WTF::StringAppend<WTF::String, WTF::String>::operator WTF::String', | 76 'WTF::StringAppend<WTF::String, WTF::String>::operator WTF::String', |
65 '()', | 77 '()', |
66 ' const') | 78 ' const') |
67 # Make sure []s are not removed from the name part. | 79 # Make sure []s are not removed from the name part. |
68 check('', 'Foo', '()', ' [virtual thunk]') | 80 check('', 'Foo', '()', ' [virtual thunk]') |
69 # Template function that accepts an anonymous lambda. | 81 # Template function that accepts an anonymous lambda. |
70 check('', | 82 check('', |
71 'blink::FrameView::ForAllNonThrottledFrameViews<blink::FrameView::Pre' | 83 'blink::FrameView::ForAllNonThrottledFrameViews<blink::FrameView::Pre' |
72 'Paint()::{lambda(FrameView&)#2}>', | 84 'Paint()::{lambda(FrameView&)#2}>', |
73 '(blink::FrameView::PrePaint()::{lambda(FrameView&)#2} const&)', '') | 85 '(blink::FrameView::PrePaint()::{lambda(FrameView&)#2} const&)', '') |
74 | 86 |
| 87 # Test with multiple template args. |
| 88 check('int ', 'Foo<int()>::bar<a<b> >', '()', |
| 89 name_without_templates='Foo::bar') |
| 90 |
75 # SkArithmeticImageFilter.cpp has class within function body. e.g.: | 91 # SkArithmeticImageFilter.cpp has class within function body. e.g.: |
76 # ArithmeticFP::onCreateGLSLInstance() looks like: | 92 # ArithmeticFP::onCreateGLSLInstance() looks like: |
77 # class ArithmeticFP { | 93 # class ArithmeticFP { |
78 # GrGLSLFragmentProcessor* onCreateGLSLInstance() const { | 94 # GrGLSLFragmentProcessor* onCreateGLSLInstance() const { |
79 # class GLSLFP { | 95 # class GLSLFP { |
80 # void emitCode(EmitArgs& args) { ... } | 96 # void emitCode(EmitArgs& args) { ... } |
81 # }; | 97 # }; |
82 # ... | 98 # ... |
83 # } | 99 # } |
84 # }; | 100 # }; |
85 SIG = '(anonymous namespace)::Foo::Baz() const::GLSLFP::onData(Foo, Bar)' | 101 SIG = '(anonymous namespace)::Foo::Baz() const::GLSLFP::onData(Foo, Bar)' |
86 got_full, got_name = function_signature.Parse(SIG) | 102 got_full_name, got_template_name, got_name = ( |
| 103 function_signature.Parse(SIG)) |
87 self.assertEqual('(anonymous namespace)::Foo::Baz', got_name) | 104 self.assertEqual('(anonymous namespace)::Foo::Baz', got_name) |
88 self.assertEqual(SIG, got_full) | 105 self.assertEqual('(anonymous namespace)::Foo::Baz', got_template_name) |
| 106 self.assertEqual(SIG, got_full_name) |
89 | 107 |
90 # Top-level lambda. | 108 # Top-level lambda. |
91 # Note: Inline lambdas do not seem to be broken into their own symbols. | 109 # Note: Inline lambdas do not seem to be broken into their own symbols. |
92 SIG = 'cc::{lambda(cc::PaintOp*)#63}::_FUN(cc::PaintOp*)' | 110 SIG = 'cc::{lambda(cc::PaintOp*)#63}::_FUN(cc::PaintOp*)' |
93 got_full, got_name = function_signature.Parse(SIG) | 111 got_full_name, got_template_name, got_name = ( |
| 112 function_signature.Parse(SIG)) |
94 self.assertEqual('cc::{lambda#63}', got_name) | 113 self.assertEqual('cc::{lambda#63}', got_name) |
95 self.assertEqual('cc::{lambda#63}(cc::PaintOp*)', got_full) | 114 self.assertEqual('cc::{lambda#63}', got_template_name) |
| 115 self.assertEqual('cc::{lambda#63}(cc::PaintOp*)', got_full_name) |
96 | 116 |
| 117 # Data members |
| 118 check('', 'blink::CSSValueKeywordsHash::findValueImpl', '(char const*)', |
| 119 '::value_word_list') |
| 120 check('', 'foo::Bar<Z<Y> >::foo<bar>', '(abc)', '::var<baz>', |
| 121 name_without_templates='foo::Bar::foo::var') |
97 | 122 |
98 if __name__ == '__main__': | 123 if __name__ == '__main__': |
99 logging.basicConfig(level=logging.DEBUG, | 124 logging.basicConfig(level=logging.DEBUG, |
100 format='%(levelname).1s %(relativeCreated)6d %(message)s') | 125 format='%(levelname).1s %(relativeCreated)6d %(message)s') |
101 unittest.main() | 126 unittest.main() |
OLD | NEW |