adlint 3.0.0 → 3.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.
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