adlint 3.0.0 → 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,44 @@
1
+ Thu Apr 12 10:48:11 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
2
+
3
+ * release.ga : 3.0.2
4
+ - Add missing transparency between a pointer to array and an array
5
+ variable in expression evaluation.
6
+ - Add missing transparency between a pointer function and a function
7
+ in expression evaluation.
8
+ - Clarify W0100 message text.
9
+ - Refactor memoizing utility in preparation for performance tuning.
10
+
11
+ Wed Apr 10 17:18:42 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
12
+
13
+ * lib/adlint/memo.rb : Refactor memoizing utility in preparation for
14
+ performance improvement.
15
+
16
+ Tue Apr 2 17:22:02 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
17
+
18
+ * release.rc : 3.0.1
19
+ - Add missing transparency between a pointer to array and an array
20
+ variable in expression evaluation.
21
+ - Add missing transparency between a pointer function and a function
22
+ in expression evaluation.
23
+ - Clarify W0100 message text.
24
+
25
+ Tue Apr 2 16:50:12 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
26
+
27
+ * etc/mesg.d/c_builtin/ja_JP/messages.yml : Clarify W0100 message text.
28
+ * etc/mesg.d/c_builtin/en_US/messages.yml : Ditto.
29
+
30
+ Mon Apr 1 15:55:03 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
31
+
32
+ * lib/adlint/cc1/expr.rb : Add missing transparency between a pointer
33
+ function and a function in expression evaluation.
34
+ * lib/adlint/cc1/interp.rb : Ditto.
35
+
36
+ Thu Apr 1 10:08:45 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
37
+
38
+ * lib/adlint/cc1/expr.rb : Add missing transparency between a pointer
39
+ to array and an array variable in expression evaluation.
40
+ * lib/adlint/cc1/interp.rb : Ditto.
41
+
1
42
  Tue Mar 26 17:01:16 2013 Yutaka Yanoh <yanoh@users.sourceforge.net>
2
43
 
3
44
  * release.ga : 3.0.0
data/INSTALL CHANGED
@@ -21,7 +21,7 @@
21
21
 
22
22
  ++
23
23
 
24
- === Requirements
24
+ === Requirement
25
25
 
26
26
  * Ruby 1.9.3-p0 or later for normal use [*mandatory*]
27
27
  * GNU Make 3 or later to use adlintized Makefile [optional but recommended]
data/NEWS CHANGED
@@ -21,6 +21,20 @@
21
21
 
22
22
  ++
23
23
 
24
+ === \AdLint 3.0.2 is released (2013-04-12)
25
+
26
+ ==== Changes since the 3.0.0 release
27
+
28
+ * Add missing transparency between a pointer to array and an array variable in
29
+ expression evaluation
30
+ * Add missing transparency between a pointer function and a function in
31
+ expression evaluation
32
+ * Clarify W0100 message text
33
+
34
+ See the file
35
+ {ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
36
+ for more details.
37
+
24
38
  === \AdLint 3.0.0 is released (2013-03-27)
25
39
 
26
40
  ==== Changes since the 2.6.14 release
@@ -50,10 +64,6 @@
50
64
  the terminating execution path
51
65
  * Support Ruby 2.0.0-p0
52
66
 
53
- See the file
54
- {ChangeLog}[http://adlint.sourceforge.net/pmwiki/upload.d/Main/ChangeLog]
55
- for more details.
56
-
57
67
  === \AdLint 2.6.14 is released (2012-12-17)
58
68
 
59
69
  ==== Changes since the 2.6.12 release
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "3.0.0"
52
+ version: "3.0.2"
53
53
 
54
54
  message_definition:
55
55
  W0001:
@@ -335,7 +335,7 @@ message_definition:
335
335
  W0100:
336
336
  classes:
337
337
  - "UNC:X99"
338
- format: "The value of variable `%s' is not change. It can be declarable with 'const'."
338
+ format: "The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value."
339
339
  W0101:
340
340
  classes:
341
341
  - "UNC:X99"
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "3.0.0"
52
+ version: "3.0.2"
53
53
 
54
54
  message_definition:
55
55
  W0001:
@@ -335,7 +335,7 @@ message_definition:
335
335
  W0100:
336
336
  classes:
337
337
  - "UNC:X99"
338
- format: "変数 `%s' は値が変わりません。const 付きで宣言できる可能性があります。"
338
+ format: "変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。"
339
339
  W0101:
340
340
  classes:
341
341
  - "UNC:X99"
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "3.0.0"
52
+ version: "3.0.2"
53
53
 
54
54
  message_definition:
55
55
  X0001:
@@ -49,7 +49,7 @@
49
49
  # - "ERR:X99"
50
50
  # format: "Your custom message for the error of E9999."
51
51
 
52
- version: "3.0.0"
52
+ version: "3.0.2"
53
53
 
54
54
  message_definition:
55
55
  X0001:
@@ -461,7 +461,7 @@ module Cc1 #:nodoc:
461
461
  end
462
462
 
463
463
  def eval_array_subscript_expr(node, obj, subs)
464
- unless obj.variable? && (obj.type.array? || obj.type.pointer?)
464
+ unless obj.variable? and obj.type.array? || obj.type.pointer?
465
465
  return create_tmpvar
466
466
  end
467
467
 
@@ -627,9 +627,9 @@ module Cc1 #:nodoc:
627
627
  end
628
628
 
629
629
  def eval_postfix_increment_expr(node, obj)
630
- if obj.variable? && obj.type.scalar?
631
- var = obj
632
- else
630
+ var = object_to_variable(obj)
631
+ if !var.type.scalar? && !var.type.void?
632
+ # NOTE: To detect bad value reference of `void' expressions.
633
633
  return create_tmpvar
634
634
  end
635
635
 
@@ -650,9 +650,9 @@ module Cc1 #:nodoc:
650
650
  end
651
651
 
652
652
  def eval_postfix_decrement_expr(node, obj)
653
- if obj.variable? && obj.type.scalar?
654
- var = obj
655
- else
653
+ var = object_to_variable(obj)
654
+ if !var.type.scalar? && !var.type.void?
655
+ # NOTE: To detect bad value reference of `void' expressions.
656
656
  return create_tmpvar
657
657
  end
658
658
 
@@ -673,9 +673,9 @@ module Cc1 #:nodoc:
673
673
  end
674
674
 
675
675
  def eval_prefix_increment_expr(node, obj)
676
- if obj.variable? && obj.type.scalar?
677
- var = obj
678
- else
676
+ var = object_to_variable(obj)
677
+ if !var.type.scalar? && !var.type.void?
678
+ # NOTE: To detect bad value reference of `void' expressions.
679
679
  return create_tmpvar
680
680
  end
681
681
 
@@ -696,9 +696,9 @@ module Cc1 #:nodoc:
696
696
  end
697
697
 
698
698
  def eval_prefix_decrement_expr(node, obj)
699
- if obj.variable? && obj.type.scalar?
700
- var = obj
701
- else
699
+ var = object_to_variable(obj)
700
+ if !var.type.scalar? && !var.type.void?
701
+ # NOTE: To detect bad value reference of `void' expressions.
702
702
  return create_tmpvar
703
703
  end
704
704
 
@@ -730,8 +730,9 @@ module Cc1 #:nodoc:
730
730
  end
731
731
 
732
732
  def eval_indirection_expr(node, obj)
733
- if obj.variable? && obj.type.pointer?
734
- ptr = obj
733
+ var = object_to_variable(obj)
734
+ if var.type.pointer?
735
+ ptr = var
735
736
  else
736
737
  return create_tmpvar
737
738
  end
@@ -768,12 +769,9 @@ module Cc1 #:nodoc:
768
769
 
769
770
  def eval_unary_arithmetic_expr(node, obj)
770
771
  var = object_to_variable(obj)
771
- case
772
- when !var.type.scalar? && !var.type.void?
772
+ if !var.type.scalar? && !var.type.void?
773
773
  # NOTE: To detect bad value reference of `void' expressions.
774
774
  return create_tmpvar
775
- when var != obj
776
- notify_implicit_conv_performed(node.operand, obj, var)
777
775
  end
778
776
 
779
777
  case node.operator.type
@@ -813,21 +811,15 @@ module Cc1 #:nodoc:
813
811
 
814
812
  def eval_multiplicative_expr(node, lhs_obj, rhs_obj)
815
813
  lhs_var = object_to_variable(lhs_obj)
816
- case
817
- when !lhs_var.type.scalar? && !lhs_var.type.void?
814
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
818
815
  # NOTE: To detect bad value reference of `void' expressions.
819
816
  return create_tmpvar
820
- when lhs_var != lhs_obj
821
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
822
817
  end
823
818
 
824
819
  rhs_var = object_to_variable(rhs_obj)
825
- case
826
- when !rhs_var.type.scalar? && !rhs_var.type.void?
820
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
827
821
  # NOTE: To detect bad value reference of `void' expressions.
828
822
  return create_tmpvar
829
- when rhs_var != rhs_obj
830
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
831
823
  end
832
824
 
833
825
  lhs_conved, rhs_conved =
@@ -872,21 +864,15 @@ module Cc1 #:nodoc:
872
864
 
873
865
  def eval_additive_expr(node, lhs_obj, rhs_obj)
874
866
  lhs_var = object_to_variable(lhs_obj)
875
- case
876
- when !lhs_var.type.scalar? && !lhs_var.type.void?
867
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
877
868
  # NOTE: To detect bad value reference of `void' expressions.
878
869
  return create_tmpvar
879
- when lhs_var != lhs_obj
880
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
881
870
  end
882
871
 
883
872
  rhs_var = object_to_variable(rhs_obj)
884
- case
885
- when !rhs_var.type.scalar? && !rhs_var.type.void?
873
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
886
874
  # NOTE: To detect bad value reference of `void' expressions.
887
875
  return create_tmpvar
888
- when rhs_var != rhs_obj
889
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
890
876
  end
891
877
 
892
878
  lhs_conved, rhs_conved =
@@ -923,21 +909,15 @@ module Cc1 #:nodoc:
923
909
 
924
910
  def eval_shift_expr(node, lhs_obj, rhs_obj)
925
911
  lhs_var = object_to_variable(lhs_obj)
926
- case
927
- when !lhs_var.type.scalar? && !lhs_var.type.void?
912
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
928
913
  # NOTE: To detect bad value reference of `void' expressions.
929
914
  return create_tmpvar
930
- when lhs_var != lhs_obj
931
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
932
915
  end
933
916
 
934
917
  rhs_var = object_to_variable(rhs_obj)
935
- case
936
- when !rhs_var.type.scalar? && !rhs_var.type.void?
918
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
937
919
  # NOTE: To detect bad value reference of `void' expressions.
938
920
  return create_tmpvar
939
- when rhs_var != rhs_obj
940
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
941
921
  end
942
922
 
943
923
  # NOTE: The ISO C99 standard says;
@@ -984,21 +964,15 @@ module Cc1 #:nodoc:
984
964
 
985
965
  def eval_relational_expr(node, lhs_obj, rhs_obj)
986
966
  lhs_var = object_to_variable(lhs_obj)
987
- case
988
- when !lhs_var.type.scalar? && !lhs_var.type.void?
967
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
989
968
  # NOTE: To detect bad value reference of `void' expressions.
990
969
  return create_tmpvar(int_t, scalar_value_of_arbitrary)
991
- when lhs_var != lhs_obj
992
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
993
970
  end
994
971
 
995
972
  rhs_var = object_to_variable(rhs_obj)
996
- case
997
- when !rhs_var.type.scalar? && !rhs_var.type.void?
973
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
998
974
  # NOTE: To detect bad value reference of `void' expressions.
999
975
  return create_tmpvar(int_t, scalar_value_of_arbitrary)
1000
- when rhs_var != rhs_obj
1001
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
1002
976
  end
1003
977
 
1004
978
  lhs_conved, rhs_conved =
@@ -1035,21 +1009,15 @@ module Cc1 #:nodoc:
1035
1009
 
1036
1010
  def eval_equality_expr(node, lhs_obj, rhs_obj)
1037
1011
  lhs_var = object_to_variable(lhs_obj)
1038
- case
1039
- when !lhs_var.type.scalar? && !lhs_var.type.void?
1012
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
1040
1013
  # NOTE: To detect bad value reference of `void' expressions.
1041
1014
  return create_tmpvar(int_t, scalar_value_of_arbitrary)
1042
- when lhs_var != lhs_obj
1043
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
1044
1015
  end
1045
1016
 
1046
1017
  rhs_var = object_to_variable(rhs_obj)
1047
- case
1048
- when !rhs_var.type.scalar? && !rhs_var.type.void?
1018
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
1049
1019
  # NOTE: To detect bad value reference of `void' expressions.
1050
1020
  return create_tmpvar(int_t, scalar_value_of_arbitrary)
1051
- when rhs_var != rhs_obj
1052
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
1053
1021
  end
1054
1022
 
1055
1023
  lhs_conved, rhs_conved =
@@ -1082,21 +1050,15 @@ module Cc1 #:nodoc:
1082
1050
 
1083
1051
  def eval_and_expr(node, lhs_obj, rhs_obj)
1084
1052
  lhs_var = object_to_variable(lhs_obj)
1085
- case
1086
- when !lhs_var.type.scalar? && !lhs_var.type.void?
1053
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
1087
1054
  # NOTE: To detect bad value reference of `void' expressions.
1088
1055
  return create_tmpvar
1089
- when lhs_var != lhs_obj
1090
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
1091
1056
  end
1092
1057
 
1093
1058
  rhs_var = object_to_variable(rhs_obj)
1094
- case
1095
- when !rhs_var.type.scalar? && !rhs_var.type.void?
1059
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
1096
1060
  # NOTE: To detect bad value reference of `void' expressions.
1097
1061
  return create_tmpvar
1098
- when rhs_var != rhs_obj
1099
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
1100
1062
  end
1101
1063
 
1102
1064
  lhs_conved, rhs_conved =
@@ -1124,21 +1086,15 @@ module Cc1 #:nodoc:
1124
1086
 
1125
1087
  def eval_exclusive_or_expr(node, lhs_obj, rhs_obj)
1126
1088
  lhs_var = object_to_variable(lhs_obj)
1127
- case
1128
- when !lhs_var.type.scalar? && !lhs_var.type.void?
1089
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
1129
1090
  # NOTE: To detect bad value reference of `void' expressions.
1130
1091
  return create_tmpvar
1131
- when lhs_var != lhs_obj
1132
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
1133
1092
  end
1134
1093
 
1135
1094
  rhs_var = object_to_variable(rhs_obj)
1136
- case
1137
- when !rhs_var.type.scalar? && !rhs_var.type.void?
1095
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
1138
1096
  # NOTE: To detect bad value reference of `void' expressions.
1139
1097
  return create_tmpvar
1140
- when rhs_var != rhs_obj
1141
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
1142
1098
  end
1143
1099
 
1144
1100
  lhs_conved, rhs_conved =
@@ -1166,21 +1122,15 @@ module Cc1 #:nodoc:
1166
1122
 
1167
1123
  def eval_inclusive_or_expr(node, lhs_obj, rhs_obj)
1168
1124
  lhs_var = object_to_variable(lhs_obj)
1169
- case
1170
- when !lhs_var.type.scalar? && !lhs_var.type.void?
1125
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
1171
1126
  # NOTE: To detect bad value reference of `void' expressions.
1172
1127
  return create_tmpvar
1173
- when lhs_var != lhs_obj
1174
- notify_implicit_conv_performed(node.lhs_operand, lhs_obj, lhs_var)
1175
1128
  end
1176
1129
 
1177
1130
  rhs_var = object_to_variable(rhs_obj)
1178
- case
1179
- when !rhs_var.type.scalar? && !rhs_var.type.void?
1131
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
1180
1132
  # NOTE: To detect bad value reference of `void' expressions.
1181
1133
  return create_tmpvar
1182
- when rhs_var != rhs_obj
1183
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
1184
1134
  end
1185
1135
 
1186
1136
  lhs_conved, rhs_conved =
@@ -1207,16 +1157,8 @@ module Cc1 #:nodoc:
1207
1157
  end
1208
1158
 
1209
1159
  def eval_simple_assignment_expr(node, lhs_obj, rhs_obj)
1210
- if lhs_obj.variable?
1211
- lhs_var = lhs_obj
1212
- else
1213
- return lhs_obj
1214
- end
1215
-
1160
+ lhs_var = object_to_variable(lhs_obj)
1216
1161
  rhs_var = object_to_variable(rhs_obj)
1217
- unless rhs_var == rhs_obj
1218
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
1219
- end
1220
1162
 
1221
1163
  if rhs_var.type.same_as?(lhs_var.type)
1222
1164
  rhs_conved = rhs_var
@@ -1240,19 +1182,16 @@ module Cc1 #:nodoc:
1240
1182
  end
1241
1183
 
1242
1184
  def eval_compound_assignment_expr(node, lhs_obj, rhs_obj)
1243
- if lhs_obj.variable? && lhs_obj.type.scalar?
1244
- lhs_var = lhs_obj
1245
- else
1185
+ lhs_var = object_to_variable(lhs_obj)
1186
+ if !lhs_var.type.scalar? && !lhs_var.type.void?
1187
+ # NOTE: To detect bad value reference of `void' expressions.
1246
1188
  return lhs_obj
1247
1189
  end
1248
1190
 
1249
1191
  rhs_var = object_to_variable(rhs_obj)
1250
- case
1251
- when !rhs_var.type.scalar? && !rhs_var.type.void?
1192
+ if !rhs_var.type.scalar? && !rhs_var.type.void?
1252
1193
  # NOTE: To detect bad value reference of `void' expressions.
1253
- return create_tmpvar
1254
- when rhs_var != rhs_obj
1255
- notify_implicit_conv_performed(node.rhs_operand, rhs_obj, rhs_var)
1194
+ return lhs_var
1256
1195
  end
1257
1196
 
1258
1197
  case node.operator.type
@@ -430,14 +430,22 @@ module Cc1 #:nodoc:
430
430
  def object_to_variable(obj)
431
431
  case
432
432
  when obj.function?
433
- create_tmpvar(pointer_type(obj.type), pointer_value_of(obj))
434
- when obj.type.array?
435
- create_tmpvar(pointer_type(obj.type.base_type), pointer_value_of(obj))
433
+ function_to_pointer(obj)
434
+ when obj.variable? && obj.type.array?
435
+ array_to_pointer(obj)
436
436
  else
437
437
  obj
438
438
  end
439
439
  end
440
440
 
441
+ def function_to_pointer(fun)
442
+ create_tmpvar(pointer_type(fun.type), pointer_value_of(fun))
443
+ end
444
+
445
+ def array_to_pointer(ary)
446
+ create_tmpvar(pointer_type(ary.type.base_type), pointer_value_of(ary))
447
+ end
448
+
441
449
  def value_of(obj)
442
450
  if obj.type.array? || obj.type.function?
443
451
  pointer_value_of(obj)
data/lib/adlint/memo.rb CHANGED
@@ -33,124 +33,125 @@ module AdLint #:nodoc:
33
33
 
34
34
  module Memoizable
35
35
  def memoize(name, *key_indices)
36
- var_name = name.to_s.sub("?", "Q")
37
- org_name = "_org_#{name}"
36
+ if instance_method(name).arity == 0
37
+ memoize_noarg_method(name)
38
+ else
39
+ memoize_ordinary_method(name, key_indices)
40
+ end
41
+ end
42
+
43
+ private
44
+ def memoize_noarg_method(name)
45
+ save_memoizing_method(name)
46
+ prepare_noarg_method_cache(name)
38
47
  class_eval <<-EOS
39
- alias_method("#{org_name}", "#{name}")
40
- private("#{org_name}")
41
- EOS
42
- if key_indices.empty?
43
- if instance_method("#{name}").arity == 0
44
- define_cache_manipulator(name, var_name)
45
- class_eval <<-EOS
46
- define_method("#{name}") do
47
- @_cache_of__#{var_name}_initialized ||= false
48
- if @_cache_of__#{var_name}_initialized
49
- @_cache_of__#{var_name}_forbidden = false
50
- @_cache_of__#{var_name}
51
- else
52
- @_cache_of__#{var_name}_forbidden ||= false
53
- if @_cache_of__#{var_name}_forbidden
54
- @_cache_of__#{var_name}_forbidden = false
55
- #{org_name}
56
- else
57
- @_cache_of__#{var_name}_initialized = true
58
- @_cache_of__#{var_name} = #{org_name}
59
- end
60
- end
61
- end
62
- EOS
63
- else
64
- define_cache_manipulator(name, var_name, key_indices)
65
- class_eval <<-EOS
66
- define_method("#{name}") do |*args|
67
- @_cache_of__#{var_name}_initialized ||= false
68
- if @_cache_of__#{var_name}_initialized
69
- @_cache_of__#{var_name}_forbidden = false
70
- if @_cache_of__#{var_name}.include?(args)
71
- @_cache_of__#{var_name}[args]
72
- else
73
- @_cache_of__#{var_name}[args] = #{org_name}(*args)
74
- end
75
- else
76
- @_cache_of__#{var_name}_forbidden ||= false
77
- if @_cache_of__#{var_name}_forbidden
78
- @_cache_of__#{var_name}_forbidden = false
79
- #{org_name}(*args)
80
- else
81
- @_cache_of__#{var_name}_initialized = true
82
- @_cache_of__#{var_name} = {}
83
- @_cache_of__#{var_name}[args] = #{org_name}(*args)
84
- end
85
- end
48
+ define_method(:#{name}) do
49
+ if #{cache_name_of(name)}_initialized ||= false
50
+ #{cache_name_of(name)}_forbidden = false
51
+ #{cache_name_of(name)}
52
+ else
53
+ if #{cache_name_of(name)}_forbidden ||= false
54
+ #{cache_name_of(name)}_forbidden = false
55
+ #{org_name_of(name)}
56
+ else
57
+ #{cache_name_of(name)}_initialized = true
58
+ #{cache_name_of(name)} = #{org_name_of(name)}
86
59
  end
87
- EOS
60
+ end
88
61
  end
89
- else
90
- define_cache_manipulator(name, var_name, key_indices)
91
- class_eval <<-EOS
92
- define_method("#{name}") do |*args|
93
- @_cache_of__#{var_name}_initialized ||= false
94
- key = args.values_at(#{key_indices.join(',')})
95
- if @_cache_of__#{var_name}_initialized
96
- @_cache_of__#{var_name}_forbidden = false
97
- if @_cache_of__#{var_name}.include?(key)
98
- @_cache_of__#{var_name}[key]
99
- else
100
- @_cache_of__#{var_name}[key] = #{org_name}(*args)
101
- end
62
+ EOS
63
+ end
64
+
65
+ def memoize_ordinary_method(name, key_indices)
66
+ save_memoizing_method(name)
67
+ prepare_ordinary_method_cache(name, key_indices)
68
+ class_eval <<-EOS
69
+ define_method(:#{name}) do |*args|
70
+ key = __key_for_#{name}(*args)
71
+ if #{cache_name_of(name)}_initialized ||= false
72
+ #{cache_name_of(name)}_forbidden = false
73
+ if #{cache_name_of(name)}.include?(key)
74
+ #{cache_name_of(name)}[key]
75
+ else
76
+ #{cache_name_of(name)}[key] = #{org_name_of(name)}(*args)
77
+ end
78
+ else
79
+ if #{cache_name_of(name)}_forbidden ||= false
80
+ #{cache_name_of(name)}_forbidden = false
81
+ #{org_name_of(name)}(*args)
102
82
  else
103
- @_cache_of__#{var_name}_forbidden ||= false
104
- if @_cache_of__#{var_name}_forbidden
105
- @_cache_of__#{var_name}_forbidden = false
106
- #{org_name}(*args)
107
- else
108
- @_cache_of__#{var_name}_initialized = true
109
- @_cache_of__#{var_name} = {}
110
- @_cache_of__#{var_name}[key] = #{org_name}(*args)
111
- end
83
+ #{cache_name_of(name)}_initialized = true
84
+ #{cache_name_of(name)} = {}
85
+ #{cache_name_of(name)}[key] = #{org_name_of(name)}(*args)
112
86
  end
113
87
  end
114
- EOS
115
- end
88
+ end
89
+ EOS
116
90
  end
117
91
 
118
- private
119
- def define_cache_manipulator(name, var_name, key_indices = nil)
92
+ def prepare_noarg_method_cache(name)
120
93
  class_eval <<-EOS
121
- define_method("forbid_once_memo_of__#{name}") do
122
- @_cache_of__#{var_name}_forbidden = true
94
+ define_method(:forbid_once_memo_of__#{name}) do
95
+ #{cache_name_of(name)}_forbidden = true
123
96
  end
124
- define_method("clear_memo_of__#{name}") do
125
- @_cache_of__#{var_name} = nil
126
- @_cache_of__#{var_name}_initialized = false
97
+ define_method(:clear_memo_of__#{name}) do
98
+ #{cache_name_of(name)} = nil
99
+ #{cache_name_of(name)}_initialized = false
100
+ end
101
+ define_method(:forget_memo_of__#{name}) do
102
+ clear_memo_of__#{name}
127
103
  end
128
104
  EOS
129
- case
130
- when key_indices && key_indices.empty?
131
- class_eval <<-EOS
132
- define_method("forget_memo_of__#{name}") do |*args|
133
- if @_cache_of__#{var_name}_initialized
134
- @_cache_of__#{var_name}.delete(args)
135
- end
105
+ end
106
+
107
+ def prepare_ordinary_method_cache(name, key_indices)
108
+ define_key_generator(name, key_indices)
109
+ class_eval <<-EOS
110
+ define_method(:forbid_once_memo_of__#{name}) do
111
+ #{cache_name_of(name)}_forbidden = true
112
+ end
113
+ define_method(:clear_memo_of__#{name}) do
114
+ #{cache_name_of(name)} = nil
115
+ #{cache_name_of(name)}_initialized = false
116
+ end
117
+ define_method(:forget_memo_of__#{name}) do |*args|
118
+ if #{cache_name_of(name)}_initialized
119
+ #{cache_name_of(name)}.delete(__key_for_#{name}(*args))
136
120
  end
137
- EOS
138
- when key_indices
121
+ end
122
+ EOS
123
+ end
124
+
125
+ def define_key_generator(name, key_indices)
126
+ if key_indices.empty?
139
127
  class_eval <<-EOS
140
- define_method("forget_memo_of__#{name}") do |*args|
141
- if @_cache_of__#{var_name}_initialized
142
- key = args.values_at(#{key_indices.join(',')})
143
- @_cache_of__#{var_name}.delete(key)
144
- end
128
+ define_method(:__key_for_#{name}) do |*args|
129
+ args
145
130
  end
146
131
  EOS
147
132
  else
148
133
  class_eval <<-EOS
149
- define_method("forget_memo_of__#{name}") do
150
- clear_memo_of__#{name}
134
+ define_method(:__key_for_#{name}) do |*args|
135
+ args.values_at(#{key_indices.join(',')})
151
136
  end
152
137
  EOS
153
138
  end
139
+ class_eval "private(:__key_for_#{name})"
140
+ end
141
+
142
+ def save_memoizing_method(name)
143
+ class_eval <<-EOS
144
+ alias_method(:#{org_name_of(name)}, :#{name})
145
+ private(:#{org_name_of(name)})
146
+ EOS
147
+ end
148
+
149
+ def cache_name_of(name)
150
+ "@__cache_of__#{name.to_s.sub("?", "Q")}"
151
+ end
152
+
153
+ def org_name_of(name)
154
+ "__org_#{name}"
154
155
  end
155
156
  end
156
157
 
@@ -33,8 +33,8 @@ module AdLint #:nodoc:
33
33
 
34
34
  MAJOR_VERSION = 3
35
35
  MINOR_VERSION = 0
36
- PATCH_VERSION = 0
37
- RELEASE_DATE = "2013-03-27"
36
+ PATCH_VERSION = 2
37
+ RELEASE_DATE = "2013-04-12"
38
38
 
39
39
  TRAITS_SCHEMA_VERSION = "3.0.0"
40
40
 
@@ -1,8 +1,8 @@
1
1
  <html lang="ja">
2
2
  <head>
3
- <title>AdLint 3.0.0 開発者ガイド</title>
3
+ <title>AdLint 3.0.2 開発者ガイド</title>
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
- <meta name="description" content="AdLint 3.0.0 開発者ガイド">
5
+ <meta name="description" content="AdLint 3.0.2 開発者ガイド">
6
6
  <meta name="generator" content="makeinfo 4.13">
7
7
  <link title="Top" rel="top" href="#Top">
8
8
  <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
44
44
  --></style>
45
45
  </head>
46
46
  <body>
47
- <h1 class="settitle">AdLint 3.0.0 開発者ガイド</h1>
47
+ <h1 class="settitle">AdLint 3.0.2 開発者ガイド</h1>
48
48
  <div class="contents">
49
49
  <h2>Table of Contents</h2>
50
50
  <ul>
@@ -2,7 +2,7 @@
2
2
  @setfilename developers_guide_ja.info
3
3
  @documentlanguage ja
4
4
  @documentencoding utf-8
5
- @settitle AdLint 3.0.0 開発者ガイド
5
+ @settitle AdLint 3.0.2 開発者ガイド
6
6
 
7
7
  @copying
8
8
  Copyright (C) 2010-2013, OGIS-RI Co.,Ltd.
@@ -1,8 +1,8 @@
1
1
  <html lang="en">
2
2
  <head>
3
- <title>AdLint 3.0.0 User's Guide</title>
3
+ <title>AdLint 3.0.2 User's Guide</title>
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
- <meta name="description" content="AdLint 3.0.0 User's Guide">
5
+ <meta name="description" content="AdLint 3.0.2 User's Guide">
6
6
  <meta name="generator" content="makeinfo 4.13">
7
7
  <link title="Top" rel="top" href="#Top">
8
8
  <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
44
44
  --></style>
45
45
  </head>
46
46
  <body>
47
- <h1 class="settitle">AdLint 3.0.0 User's Guide</h1>
47
+ <h1 class="settitle">AdLint 3.0.2 User's Guide</h1>
48
48
  <div class="node">
49
49
  <a name="Top"></a>
50
50
  <p><hr>
@@ -2420,7 +2420,7 @@ Up:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
2420
2420
  <li><a href="#W0093">W0093</a>: This expression may cause division-by-zero.
2421
2421
  <li><a href="#W0096">W0096</a>: It divided by a constant expression which definitely zero.
2422
2422
  <li><a href="#W0097">W0097</a>: This expression must cause division-by-zero.
2423
- <li><a href="#W0100">W0100</a>: The value of variable `%s' is not change. It can be declarable with 'const'.
2423
+ <li><a href="#W0100">W0100</a>: The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
2424
2424
  <li><a href="#W0101">W0101</a>: An address of auto variable is substituted for a pointer which has a longer life. This program is danger.
2425
2425
  <li><a href="#W0102">W0102</a>: An address of auto variable is returned via formal argument to functions. This program is danger.
2426
2426
  <li><a href="#W0103">W0103</a>: An address of auto variable is returned as return value from a function. This program is danger.
@@ -6270,7 +6270,7 @@ Up:&nbsp;<a rel="up" accesskey="u" href="#Messages">Messages</a>
6270
6270
 
6271
6271
  <h4 class="subsection">6.83.1 Message body</h4>
6272
6272
 
6273
- <p>The value of variable `%s' is not change. It can be declarable with 'const'.
6273
+ <p>The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
6274
6274
 
6275
6275
  <h4 class="subsection">6.83.2 Content</h4>
6276
6276
 
@@ -2,7 +2,7 @@
2
2
  @setfilename users_guide_en.info
3
3
  @documentlanguage en
4
4
  @documentencoding utf-8
5
- @settitle AdLint 3.0.0 User's Guide
5
+ @settitle AdLint 3.0.2 User's Guide
6
6
 
7
7
  @copying
8
8
  Copyright (C) 2010-2013, OGIS-RI Co.,Ltd.
@@ -2457,7 +2457,7 @@ context_line
2457
2457
  * W0093::This expression may cause division-by-zero.
2458
2458
  * W0096::It divided by a constant expression which definitely zero.
2459
2459
  * W0097::This expression must cause division-by-zero.
2460
- * W0100::The value of variable `%s' is not change. It can be declarable with 'const'.
2460
+ * W0100::The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
2461
2461
  * W0101::An address of auto variable is substituted for a pointer which has a longer life. This program is danger.
2462
2462
  * W0102::An address of auto variable is returned via formal argument to functions. This program is danger.
2463
2463
  * W0103::An address of auto variable is returned as return value from a function. This program is danger.
@@ -5646,7 +5646,7 @@ None.
5646
5646
 
5647
5647
  @subsection Message body
5648
5648
 
5649
- The value of variable `%s' is not change. It can be declarable with 'const'.
5649
+ The variable `%s' has not been reassigned since the initial value is assigned. It may be able to be defined as `const' with an initial value.
5650
5650
 
5651
5651
  @subsection Content
5652
5652
 
@@ -1,8 +1,8 @@
1
1
  <html lang="ja">
2
2
  <head>
3
- <title>AdLint 3.0.0 利用者ガイド</title>
3
+ <title>AdLint 3.0.2 利用者ガイド</title>
4
4
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
- <meta name="description" content="AdLint 3.0.0 利用者ガイド">
5
+ <meta name="description" content="AdLint 3.0.2 利用者ガイド">
6
6
  <meta name="generator" content="makeinfo 4.13">
7
7
  <link title="Top" rel="top" href="#Top">
8
8
  <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
@@ -44,7 +44,7 @@ td { border: 1px solid black; }
44
44
  --></style>
45
45
  </head>
46
46
  <body>
47
- <h1 class="settitle">AdLint 3.0.0 利用者ガイド</h1>
47
+ <h1 class="settitle">AdLint 3.0.2 利用者ガイド</h1>
48
48
  <div class="node">
49
49
  <a name="Top"></a>
50
50
  <p><hr>
@@ -2486,7 +2486,7 @@ Up:&nbsp;<a rel="up" accesskey="u" href="#Top">Top</a>
2486
2486
  <li><a href="#W0093">W0093</a>: ゼロで除算される恐れがあります。
2487
2487
  <li><a href="#W0096">W0096</a>: ゼロになる定数式で除算しています。
2488
2488
  <li><a href="#W0097">W0097</a>: ゼロの値で除算しています。
2489
- <li><a href="#W0100">W0100</a>: 変数 `%s' は値が変わりません。const 付きで宣言できる可能性があります。
2489
+ <li><a href="#W0100">W0100</a>: 変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
2490
2490
  <li><a href="#W0101">W0101</a>: 自動変数のアドレスが、より長い寿命を持つポインタに代入されています。このプログラムは危険です。
2491
2491
  <li><a href="#W0102">W0102</a>: 自動変数のアドレスが、関数の仮引数を介して戻されています。このプログラムは危険です。
2492
2492
  <li><a href="#W0103">W0103</a>: 自動変数のアドレスが、戻り値として関数から返されています。このプログラムは危険です。
@@ -6390,7 +6390,7 @@ Up:&nbsp;<a rel="up" accesskey="u" href="#Messages">Messages</a>
6390
6390
 
6391
6391
  <h4 class="subsection">6.83.1 メッセージ本文</h4>
6392
6392
 
6393
- <p>変数 `%s' は値が変わりません。const 付きで宣言できる可能性があります。
6393
+ <p>変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
6394
6394
 
6395
6395
  <h4 class="subsection">6.83.2 内容</h4>
6396
6396
 
@@ -2,7 +2,7 @@
2
2
  @setfilename users_guide_ja.info
3
3
  @documentlanguage ja
4
4
  @documentencoding utf-8
5
- @settitle AdLint 3.0.0 利用者ガイド
5
+ @settitle AdLint 3.0.2 利用者ガイド
6
6
 
7
7
  @copying
8
8
  Copyright (C) 2010-2013, OGIS-RI Co.,Ltd.
@@ -2517,7 +2517,7 @@ context_line
2517
2517
  * W0093::ゼロで除算される恐れがあります。
2518
2518
  * W0096::ゼロになる定数式で除算しています。
2519
2519
  * W0097::ゼロの値で除算しています。
2520
- * W0100::変数 `%s' は値が変わりません。const 付きで宣言できる可能性があります。
2520
+ * W0100::変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
2521
2521
  * W0101::自動変数のアドレスが、より長い寿命を持つポインタに代入されています。このプログラムは危険です。
2522
2522
  * W0102::自動変数のアドレスが、関数の仮引数を介して戻されています。このプログラムは危険です。
2523
2523
  * W0103::自動変数のアドレスが、戻り値として関数から返されています。このプログラムは危険です。
@@ -5753,7 +5753,7 @@ int func(int a, int b)
5753
5753
 
5754
5754
  @subsection メッセージ本文
5755
5755
 
5756
- 変数 `%s' は値が変わりません。const 付きで宣言できる可能性があります。
5756
+ 変数 `%s' は初期値を設定後に再代入されません。変数を const 付きで初期値を指定して定義できる可能性があります。
5757
5757
 
5758
5758
  @subsection 内容
5759
5759
 
@@ -52,7 +52,7 @@ project_traits:
52
52
  # - "../bar/baz"
53
53
  target_files:
54
54
  inclusion_paths:
55
- - "../../ruby-1.9.3-p0"
55
+ - "../../ruby-1.9.3-p0"
56
56
  exclusion_paths:
57
57
 
58
58
  # Pathname of the project specific initial header file.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: adlint
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-27 00:00:00.000000000 Z
12
+ date: 2013-04-12 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'AdLint is a source code static analyzer.
15
15