unmangler 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTJiYThhZDM5Mzk5ZWVmNTJhNDgxNDEzYTVhYzhhOTU0MjNjOTQ1Ng==
4
+ NTMyYTYwYzU4MDAwYWMxZmQxOTFmYzhmMjA1YjAyZmViYmJjOWJhYw==
5
5
  data.tar.gz: !binary |-
6
- MWFiNWRjNGZiODgxOGNkZWQyYmJmMmM4MjNhMGZhOWRkMTVjNzMwZQ==
6
+ OWE2NmRhMjY2MGZkN2UxMDI4MDliYTBmZTY0NThlMDlmOWE4MDU5ZQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NGIzMGJmNjg5NzlhOTVlMWNjOTkzZTJlNzdkODcyMDZhNmQwODlmNzkwZDlk
10
- NmY0ZGE1MDdlYjY1MmUyZDk2YWNiZjkwMGJhZTZmZmVjM2M4ZjQ5MjhhYjQ5
11
- NTVlYTRjZTc0NmMwMDc4ZjY3NWViNzUzMjhjZjRlODdlYzdlZjI=
9
+ NWQwNmIzN2YyN2UwYjE4OWZiY2IxMDdhNzI2YjAyOGE1YzQ4NDE3NWU5YmNi
10
+ NzA0NDk4ODc0NDM2MTYwZTIzNmMyZTFhYmY3ZmJkYWUwMjhlODEzNGM3OTQx
11
+ ODUyMDM3ODdkMzNkNmYyMGMzODEyYTA3OGY5NGMxMjJjZmMwY2Q=
12
12
  data.tar.gz: !binary |-
13
- YTY0ZWQ0ZDExZWUzMGRhZWVjYmFjNGY1ZmVkZjgyNmI3ZDhkMGQ0NDk2MGQ0
14
- YTFiNTJiYTg3ZWM1NjI1Y2QyMWRhZTE2MWU2MmZiOTViN2FkNTg2YjZlMDA3
15
- NjA0YTBlYTM3MTcyMGYzNjVhZDYyNDhhOTgyMWMzZDBkODEyMWU=
13
+ NThiMGEzM2NkMTY5YWZmYzA2MTE2YjIwMzlkYjU5NzIzYzE5N2IxYzg5NzI3
14
+ YWVhOTQ1M2EzZWMyN2QzMmE0NTlmYzBiZjViOWE2NjUzNjIxOWRjY2U3OGQ1
15
+ MDcwMTM5MTJiOWM1ZjgyYTkyNDc4N2JlNzhmNWUxOTQ4N2M2Yzk=
data/.gitignore CHANGED
@@ -15,3 +15,7 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ samples/*.yaml
19
+ samples/*.yml
20
+ /?
21
+ /?.*
@@ -1,19 +1,21 @@
1
+ require 'unmangler/string_ptr'
2
+ require 'unmangler/base'
1
3
  require 'unmangler/version'
2
4
  require 'unmangler/borland'
5
+ require 'unmangler/msvc'
3
6
 
4
7
  module Unmangler
5
8
  class << self
6
9
  def unmangle name, args={}
7
- if name[0,1] == "@"
10
+ if name[0] == "@"
8
11
  Unmangler::Borland.safe_unmangle name, args
9
12
  # TODO: check if result is same as input
10
13
  # and try to unmangle with MS if it is
14
+ elsif name[0] == '?'
15
+ Unmangler::MSVC.safe_unmangle name, args
11
16
  elsif name[0,2] == '_Z'
12
17
  # GCC ?
13
18
  name
14
- elsif name[0,1] == '?'
15
- # MS ?
16
- name
17
19
  else
18
20
  # return original name
19
21
  name
@@ -0,0 +1,27 @@
1
+ module Unmangler
2
+ class Base
3
+ def isdigit c
4
+ c =~ /\A\d\Z/
5
+ end
6
+
7
+ def assert cond
8
+ raise unless cond
9
+ end
10
+
11
+ # same as 'unmangle', but catches all exceptions and returns original name
12
+ # if can not unmangle
13
+ def safe_unmangle name, *args
14
+ unmangle name, *args
15
+ rescue
16
+ name
17
+ end
18
+
19
+ def self.unmangle *args
20
+ new.unmangle(*args)
21
+ end
22
+
23
+ def self.safe_unmangle *args
24
+ new.safe_unmangle(*args)
25
+ end
26
+ end
27
+ end
@@ -1,6 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- require 'unmangler/string_ptr'
2
+ require File.expand_path("base", File.dirname(__FILE__))
4
3
 
5
4
  # ported from Embarcadero RAD Studio XE3
6
5
  # $(BDS)\source\cpprtl\Source\misc\unmangle.c
@@ -9,7 +8,7 @@ require 'unmangler/string_ptr'
9
8
 
10
9
  module Unmangler; end
11
10
 
12
- class Unmangler::Borland
11
+ class Unmangler::Borland < Unmangler::Base
13
12
  attr_accessor :kind
14
13
 
15
14
  UM_UNKNOWN = 0x00000000
@@ -57,11 +56,6 @@ class Unmangler::Borland
57
56
 
58
57
  MAXBUFFLEN = 8192 # maximum output length
59
58
 
60
- # The mangler, when mangling argument types, will create
61
- # backreferences if the type has already been seen. These take the
62
- # form t?, where ? can be either 0-9, or a-z.
63
-
64
-
65
59
  # New mangle scheme lengths:
66
60
  # len == 254 ==> old hash
67
61
  # len == 253 ==> new MD5 hash
@@ -86,6 +80,7 @@ class Unmangler::Borland
86
80
  end
87
81
 
88
82
  def copy_char c
83
+ #puts "[d] copy_char #{c.inspect} from #{caller[0]}"
89
84
  @target[0] = (c == 0 ? "\x00" : c)
90
85
  @target.inc!
91
86
  end
@@ -131,11 +126,13 @@ class Unmangler::Borland
131
126
  "rand"=> "&=", "rdiv"=> "/=", "rlsh"=> "<<=","rmin"=> "-=", "rmod"=> "%=",
132
127
  "rmul"=> "*=", "ror" => "|=", "rplu"=> "+=", "rrsh"=> ">>=","rsh" => ">>",
133
128
  "rxor"=> "^=", "subs"=> "[]", "sub" => "-", "xor" => "^", "arow"=> "->",
134
- "nwa" => "new[]", "dele"=> "delete", "dla" => "delete[]"
129
+ "nwa" => "new[]", "dele"=> "delete", "dla" => "delete[]",
130
+ # not in unmangle.c, but from IDA
131
+ "cctr" => "`class constructor`", "cdtr" => "`class destructor`"
135
132
  }
136
133
 
137
134
  def copy_op src
138
- copy_string(OPS[src] || src)
135
+ copy_string(OPS[src] || "?#{src}?")
139
136
  end
140
137
 
141
138
  def copy_return_type(start, callconv, regconv, process_return)
@@ -170,7 +167,7 @@ class Unmangler::Borland
170
167
  # string, it means the location of all the qualifier names is
171
168
  # about to move.
172
169
 
173
- unless [0,nil,false].include?(@adjust_quals)
170
+ if @adjust_quals
174
171
  @namebase += ret_len if @namebase
175
172
  @qualend += ret_len if @qualend
176
173
  @prevqual += ret_len if @prevqual
@@ -182,13 +179,12 @@ class Unmangler::Borland
182
179
  def copy_type(start, arglvl)
183
180
  start = start.dup if start.is_a?(StringPtr)
184
181
 
185
- tname = nil
182
+ tname = buff = nil
186
183
  c = input()
187
184
  is_const = false
188
185
  is_volatile = false
189
186
  is_signed = false
190
187
  is_unsigned = false
191
- maxloop = 101
192
188
  savedsavechar = nil
193
189
 
194
190
  arglvl =
@@ -197,6 +193,7 @@ class Unmangler::Borland
197
193
  else true
198
194
  end
199
195
 
196
+ maxloop = 101
200
197
  loop do
201
198
  assert((maxloop-=1) > 0)
202
199
  case c
@@ -220,7 +217,7 @@ class Unmangler::Borland
220
217
  i = 0
221
218
 
222
219
  begin # compute length
223
- i = i * 10 + (c.ord - '0'.ord)
220
+ i = i*10 + c.to_i
224
221
  c = advance()
225
222
  end while isdigit(c)
226
223
 
@@ -252,9 +249,8 @@ class Unmangler::Borland
252
249
  advance()
253
250
  copy_type(@target, 0)
254
251
  len = @target - name
255
- len = MAXBUFFLEN - 1 if (len > MAXBUFFLEN - 1)
256
- strncpy(buff, name, len)
257
- buff[len] = 0
252
+ #len = MAXBUFFLEN - 1 if (len > MAXBUFFLEN - 1)
253
+ buff = name[0,len]
258
254
  @target = name
259
255
  end
260
256
 
@@ -274,18 +270,17 @@ class Unmangler::Borland
274
270
 
275
271
  when 'C' # C++ wide char
276
272
  c = advance()
277
- if (c == 's')
273
+ if c == 's'
278
274
  tname = "char16_t"
279
- elsif (c == 'i')
275
+ elsif c == 'i'
280
276
  tname = "char32_t"
281
277
  else
282
- raise "Unknown type"
278
+ raise "Unknown wide char type: 'C#{c}'"
283
279
  end
284
280
 
285
281
  when 'M','r','h','p' # member pointer, reference, rvalue reference, pointer
286
282
  if (@savechar == 'M')
287
- c = input() # [BTS-??????]
288
- case c
283
+ case c = input() # [BTS-??????]
289
284
  when 'x'; is_const = true; c = advance() # [BCB-272500]
290
285
  when 'w'; is_volatile = true; c = advance()
291
286
  end
@@ -315,7 +310,7 @@ class Unmangler::Borland
315
310
  when 'h'; append('&&')
316
311
  when 'p'; append(' *')
317
312
  when 'M'
318
- assert(buff[0])
313
+ assert(buff)
319
314
  copy_char(' ')
320
315
  copy_string(buff)
321
316
  append '::*'
@@ -363,7 +358,7 @@ class Unmangler::Borland
363
358
  end
364
359
 
365
360
  save_adjqual = @adjust_quals
366
- @adjust_quals = 0
361
+ @adjust_quals = false
367
362
 
368
363
  copy_char('(')
369
364
  copy_args('$', 0)
@@ -403,7 +398,7 @@ class Unmangler::Borland
403
398
  def copy_delphi4args(_end, tmplargs)
404
399
  first = true
405
400
  _begin = start = nil
406
- termchar = 0
401
+ termchar = nil
407
402
 
408
403
  tmplargs =
409
404
  case tmplargs
@@ -438,11 +433,7 @@ class Unmangler::Borland
438
433
 
439
434
  when 'i'
440
435
  if _begin[0,5] == '4bool'
441
- if input() == '0'
442
- copy_string("false")
443
- else
444
- copy_string("true")
445
- end
436
+ copy_string( input() == '0' ? "false" : "true" )
446
437
  advance()
447
438
  break
448
439
  else
@@ -482,13 +473,16 @@ class Unmangler::Borland
482
473
  end # while c && c != _end
483
474
  end
484
475
 
485
- PEntry = Struct.new :targpos, :len
476
+ # The mangler, when mangling argument types, will create
477
+ # backreferences if the type has already been seen. These take the
478
+ # form t?, where ? can be either 0-9, or a-z.
479
+ PEntry = Struct.new :start, :len
486
480
 
487
481
  def copy_args(_end, tmplargs)
488
482
  c = input()
489
483
  first = true
490
484
  _begin = start = nil
491
- scanned = 0
485
+ scanned = false
492
486
  param_table = []
493
487
 
494
488
  tmplargs =
@@ -497,7 +491,7 @@ class Unmangler::Borland
497
491
  else true
498
492
  end
499
493
 
500
- while (c && c != _end)
494
+ while c && ![0, "\0", _end].include?(c)
501
495
  if first
502
496
  first = false
503
497
  else
@@ -507,42 +501,40 @@ class Unmangler::Borland
507
501
  _begin = @source.dup
508
502
  start = @target.dup
509
503
 
510
- param_table << PEntry.new
511
- param_table.last.targpos = @target.dup
512
-
513
- scanned = 0
504
+ param_table << PEntry.new( @target.dup )
505
+ scanned = false
514
506
 
515
- while (c == 'x' || c == 'w')
507
+ while c == 'x' || c == 'w'
516
508
  # Decode 'const'/'volatile' modifiers [BCB-265738]
517
509
  case c
518
510
  when 'x'; copy_string("const ")
519
511
  when 'w'; copy_string("volatile ")
520
512
  end
521
- scanned = 1
513
+ scanned = true
522
514
  c = advance()
523
515
  end
524
516
 
525
- if (scanned && c != 't')
517
+ if scanned && c != 't'
526
518
  @source = _begin.dup
527
519
  end
528
520
 
529
- if (c != 't')
530
- copy_type(@target, ! tmplargs)
531
- else
521
+ if c == 't'
532
522
  c = advance()
533
- ptindex = c.to_i(16) - 1
534
- assert(param_table[ptindex].targpos)
523
+ ptindex = c.to_i(36) - 1
524
+ assert(param_table[ptindex].start)
535
525
  assert(param_table[ptindex].len > 0)
536
- copy_string param_table[ptindex].targpos[0, param_table[ptindex].len]
526
+ copy_string param_table[ptindex].start[0, param_table[ptindex].len]
537
527
  advance()
528
+ else
529
+ copy_type(@target, ! tmplargs)
538
530
  end
539
531
 
540
- param_table.last.len = @target - param_table.last.targpos
532
+ param_table.last.len = @target - param_table.last.start
541
533
 
542
534
  c = input()
543
535
 
544
536
  if (tmplargs && c == '$') # non-type template argument
545
- termchar = 0
537
+ termchar = nil
546
538
  @target = start.dup
547
539
  c = advance()
548
540
  advance()
@@ -555,11 +547,7 @@ class Unmangler::Borland
555
547
 
556
548
  when 'i'
557
549
  if _begin[0,5] == "4bool"
558
- if (input() == '0')
559
- copy_string("false")
560
- else
561
- copy_string("true")
562
- end
550
+ copy_string( input() == '0' ? "false" : "true" )
563
551
  advance()
564
552
  break
565
553
  end
@@ -567,7 +555,7 @@ class Unmangler::Borland
567
555
 
568
556
  when 'j','g','e'
569
557
  copy_until('$')
570
- copy_char(termchar) if (termchar)
558
+ copy_char(termchar) if termchar
571
559
  break
572
560
 
573
561
  when 'm'
@@ -615,7 +603,7 @@ class Unmangler::Borland
615
603
  # name from a template argument, for example.
616
604
 
617
605
  save_setqual = @set_qual
618
- @set_qual = 0
606
+ @set_qual = false
619
607
 
620
608
  if isDelphi4name
621
609
  copy_delphi4args(TMPLCODE, 1)
@@ -633,27 +621,16 @@ class Unmangler::Borland
633
621
  advance()
634
622
  end
635
623
 
636
- def isdigit c
637
- c =~ /\A\d\Z/
638
- end
639
-
640
- def assert cond
641
- unless cond
642
- # puts
643
- # puts
644
- # p @source
645
- # p @source[0..-1]
646
- # puts
647
- # p @target
648
- # puts
649
- raise
650
- end
651
- end
652
-
653
624
  def copy_name tmplname
654
625
  start = save_setqual = nil
655
626
  c = input()
656
627
 
628
+ tmplname =
629
+ case tmplname
630
+ when 0, nil, false; false
631
+ else true
632
+ end
633
+
657
634
  # Start outputting the qualifier names and the base name.
658
635
 
659
636
  while true
@@ -715,7 +692,7 @@ class Unmangler::Borland
715
692
  end
716
693
 
717
694
  when ARGLIST # special name, or arglist
718
- return unless [0,nil,false].include?(tmplname)
695
+ return if tmplname
719
696
 
720
697
  c = advance()
721
698
  if c == 'x'
@@ -766,7 +743,7 @@ class Unmangler::Borland
766
743
  advance()
767
744
  copy_string("operator ")
768
745
  save_setqual = @set_qual
769
- @set_qual = 0
746
+ @set_qual = false
770
747
  copy_type(@target, 0)
771
748
  @set_qual = save_setqual
772
749
  assert(input() == ARGLIST)
@@ -902,8 +879,13 @@ class Unmangler::Borland
902
879
  # will be unmangled, and not the arguments.
903
880
 
904
881
  def unmangle src, args = {}
882
+ # all Borland mangled names start with '@' character.
905
883
  return src if !src || src.empty? || src[0] != '@'
906
884
 
885
+ # check for Microsoft compatible fastcall names, which are of the form:
886
+ # @funcName@<one or more digits indicating size of all parameters>
887
+ return src if src =~ /\A@.*@\d+\Z/
888
+
907
889
  # unmangle args? defaulting to true
908
890
  doArgs = args.fetch(:args, true)
909
891
 
@@ -927,19 +909,16 @@ class Unmangler::Borland
927
909
 
928
910
  @savechar = 0
929
911
 
930
- # All mangled names start with '@' character.
931
-
932
912
  src = src[1..-1] # skip initial '@'
933
913
 
934
- # check for Microsoft compatible fastcall names, which are of the form:
935
- # @funcName@<one or more digits indicating size of all parameters>
936
- return src if src =~ /\A@.*@\d+\Z/
937
-
938
- # Pascal names can not contain lowercase letters
939
- if src !~ /[a-z]/
940
- # convert uppercase Pascal names to lowercase
941
- src.downcase!
942
- end
914
+ # ZZZ XXX not sure if it's needed now
915
+ # if src[/[a-z]/]
916
+ # # contains lowercase letters => not Pascal
917
+ # # b/c Pascal names can not contain lowercase letters
918
+ # else
919
+ # # Pascal, convert uppercase Pascal names to lowercase
920
+ # src.downcase!
921
+ # end
943
922
 
944
923
  # This is at LEAST a member name, if not a fully mangled template
945
924
  # or function name. So, begin outputting the subnames. We set up
@@ -950,14 +929,14 @@ class Unmangler::Borland
950
929
  @source_string = src
951
930
  @source = StringPtr.new(@source_string)
952
931
  @prevqual = @qualend = @base_name = @base_end = nil
953
- @set_qual = 1
932
+ @set_qual = true
954
933
 
955
934
  # Start outputting the qualifier names and the base name.
956
935
 
957
936
  @namebase = @target.dup
958
937
 
959
938
  copy_name(0)
960
- @set_qual = 0
939
+ @set_qual = false
961
940
  @base_end = @target.dup
962
941
 
963
942
  if (@kind & UM_KINDMASK) == UM_TPDSC || (@kind & UM_SPECMASK) != 0
@@ -966,25 +945,17 @@ class Unmangler::Borland
966
945
  @namebase = p + 1
967
946
  end
968
947
 
969
- if (@kind & UM_KINDMASK) == UM_CONSTRUCTOR || (@kind & UM_KINDMASK) == UM_DESTRUCTOR
970
- start = nil
971
-
972
- if (@kind & UM_KINDMASK) == UM_DESTRUCTOR
973
- copy_char('~')
974
- end
948
+ if [UM_CONSTRUCTOR,UM_DESTRUCTOR].include?( @kind & UM_KINDMASK )
949
+ copy_char('~') if @kind & UM_KINDMASK == UM_DESTRUCTOR
975
950
 
976
- if !@qualend
951
+ if @qualend
952
+ start = @prevqual ? (@prevqual+2) : @namebase.dup
953
+ len = @qualend - start
954
+ copy_string(start, len)
955
+ else
977
956
  # It's a bcc-created static constructor??
978
957
  # give it a name.
979
958
  copy_string("unknown")
980
- else
981
- if !@prevqual
982
- start = @namebase.dup
983
- else
984
- start = @prevqual + 2
985
- end
986
- len = @qualend - start
987
- copy_string(start, len)
988
959
  end
989
960
  end
990
961
 
@@ -998,8 +969,8 @@ class Unmangler::Borland
998
969
  # Output the function parameters, and return type in the case
999
970
  # of template function specializations.
1000
971
 
1001
- @set_qual = 0
1002
- @adjust_quals = 1
972
+ @set_qual = false
973
+ @adjust_quals = true
1003
974
 
1004
975
  copy_type(@namebase, 0)
1005
976
 
@@ -1019,6 +990,9 @@ class Unmangler::Borland
1019
990
  @kind |= UM_QUALIFIED
1020
991
  end
1021
992
 
993
+ # trim unwanted result tail, if any
994
+ @target[0..-1] = ''
995
+
1022
996
  # If the user wanted the qualifier and base name saved, then do it now.
1023
997
 
1024
998
  # TODO
@@ -1050,37 +1024,29 @@ class Unmangler::Borland
1050
1024
  @result.sub! /\A__tpdsc__ /,''
1051
1025
  end
1052
1026
 
1053
- @result
1054
- end
1055
-
1056
- # same as 'unmangle', but catches all exceptions and returns original name
1057
- # if can not unmangle
1058
- def safe_unmangle name, *args
1059
- unmangle name, *args
1060
- rescue
1061
- name
1062
- end
1027
+ # copy IDA syntax for class ctor/dtor:
1028
+ # was: Classes::TThread::operator `class destructor`()
1029
+ # now: Classes::TThread::`class destructor`()
1030
+ @result.sub! '::operator `class', '::`class'
1063
1031
 
1064
- def self.unmangle *args
1065
- new.unmangle(*args)
1032
+ @result
1066
1033
  end
1067
1034
 
1068
- def self.safe_unmangle *args
1069
- new.safe_unmangle(*args)
1070
- end
1071
1035
  end # class Unmangler
1072
1036
 
1073
1037
  ###################################################################
1074
1038
 
1075
1039
  if $0 == __FILE__
1040
+ $:.unshift("./lib")
1041
+ require 'unmangler/string_ptr'
1076
1042
  require 'awesome_print'
1077
1043
  require 'pp'
1078
1044
 
1079
- def check src, want, do_args = true
1045
+ def check src, want, args = {}
1080
1046
  u = Unmangler::Borland.new
1081
1047
  got = nil
1082
1048
  begin
1083
- got = u.unmangle(src, do_args)
1049
+ got = u.unmangle(src, args)
1084
1050
  rescue
1085
1051
  pp u
1086
1052
  raise
@@ -1088,14 +1054,21 @@ if $0 == __FILE__
1088
1054
  if got == want
1089
1055
  print ".".green
1090
1056
  else
1091
- puts "[!] want: #{want.inspect}"
1092
- puts "[!] got: #{got.inspect}"
1093
- pp u
1094
1057
  puts
1058
+ puts "[!] src: #{src.inspect.gray}"
1059
+ puts "[!] want: #{want.inspect.yellow}"
1060
+ puts "[!] got: #{got.inspect.red}"
1061
+ puts
1062
+ pp u
1095
1063
  exit 1
1096
1064
  end
1097
1065
  end
1098
1066
 
1067
+ if ARGV.any?
1068
+ check ARGV[0], ARGV[1]
1069
+ exit
1070
+ end
1071
+
1099
1072
  check "@afunc$qxzcupi", "afunc(const signed char, int *)"
1100
1073
  check "@foo$qpqfi$d", "foo(double (*)(float, int))"
1101
1074
  check "@myclass@func$qil","myclass::func(int, long)"
@@ -1133,8 +1106,16 @@ if $0 == __FILE__
1133
1106
  check "@Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@IDENTIFIEROption",
1134
1107
  "__fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)"
1135
1108
 
1136
- # check "@Sysutils@Supports$qqrx45System@_DelphiInterface$t17System@IInterface_rx5_GUIDpv",
1137
- # "__fastcall Sysutils::Supports(const System::DelphiInterface<System::IInterface>, _GUID const &, void *)"
1109
+ check "@$xt$p27System@%AnsiStringT$us$i0$%", "__tpdsc__ System::AnsiStringT<0> *"
1110
+
1111
+ check "@Adomcore_4_3@TDomNamedNodeMap@$bctr$qqrpx21Adomcore_4_3@TDomNodepx13Classes@TListx54System@%Set$t25Adomcore_4_3@TDomNodeType$iuc$0$iuc$11%xo",
1112
+ "__fastcall Adomcore_4_3::TDomNamedNodeMap::TDomNamedNodeMap(Adomcore_4_3::TDomNode *, Classes::TList *, const System::Set<Adomcore_4_3::TDomNodeType, 0, 11>, const bool)"
1113
+
1114
+ check '@ATL@%CComObjectRootEx$25ATL@CComSingleThreadModel%@$bctr$qv',
1115
+ "ATL::CComObjectRootEx<ATL::CComSingleThreadModel>::CComObjectRootEx<ATL::CComSingleThreadModel>()"
1116
+
1117
+ check '@Classes@TThread@$bcdtr$qqrv', '__fastcall Classes::TThread::`class destructor`()'
1118
+ check '@Timespan@TTimeSpan@$bcctr$qqrv', '__fastcall Timespan::TTimeSpan::`class constructor`()'
1138
1119
 
1139
1120
  ####################################
1140
1121
  # w/o args
@@ -1142,11 +1123,11 @@ if $0 == __FILE__
1142
1123
 
1143
1124
  check "@Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@IDENTIFIEROption",
1144
1125
  "Dbcommon::GetTableNameFromSQLEx",
1145
- false
1126
+ :args => false
1146
1127
 
1147
1128
  check "@std@%vector$51boost@archive@detail@basic_iarchive_impl@cobject_id69std@%allocator$51boost@archive@detail@basic_iarchive_impl@cobject_id%%@$bsubs$qui",
1148
1129
  "std::vector<boost::archive::detail::basic_iarchive_impl::cobject_id, std::allocator<boost::archive::detail::basic_iarchive_impl::cobject_id> >::operator []",
1149
- false
1130
+ :args => false
1150
1131
 
1151
1132
  puts
1152
1133
  end