adlint 3.0.8 → 3.0.10
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 +295 -0
- data/MANIFEST +9 -0
- data/NEWS +25 -4
- data/etc/mesg.d/c_builtin/en_US/messages.yml +1 -1
- data/etc/mesg.d/c_builtin/ja_JP/messages.yml +1 -1
- data/etc/mesg.d/core/en_US/messages.yml +1 -1
- data/etc/mesg.d/core/ja_JP/messages.yml +1 -1
- data/features/code_check/E0008.feature +20 -0
- data/features/code_check/W0093.feature +1 -1
- data/features/code_check/W0097.feature +30 -0
- data/features/code_check/W0100.feature +66 -0
- data/features/code_check/W0422.feature +157 -0
- data/features/code_check/W0459.feature +118 -0
- data/features/code_check/W0461.feature +115 -0
- data/features/code_check/W0610.feature +59 -0
- data/features/code_check/W0612.feature +29 -0
- data/features/code_check/W0613.feature +33 -0
- data/features/code_check/W0704.feature +25 -0
- data/features/code_check/W0705.feature +33 -0
- data/features/code_check/W1050.feature +43 -0
- data/features/code_check/W1071.feature +30 -0
- data/features/code_check/W9001.feature +24 -0
- data/lib/adlint/cc1/branch.rb +32 -9
- data/lib/adlint/cc1/builtin.rb +2 -2
- data/lib/adlint/cc1/conv.rb +33 -33
- data/lib/adlint/cc1/ctrlexpr.rb +30 -30
- data/lib/adlint/cc1/domain.rb +12 -4
- data/lib/adlint/cc1/environ.rb +2 -1
- data/lib/adlint/cc1/expr.rb +135 -125
- data/lib/adlint/cc1/format.rb +3 -3
- data/lib/adlint/cc1/interp.rb +123 -109
- data/lib/adlint/cc1/lexer.rb +44 -40
- data/lib/adlint/cc1/mediator.rb +2 -2
- data/lib/adlint/cc1/object.rb +121 -36
- data/lib/adlint/cc1/option.rb +1 -0
- data/lib/adlint/cc1/parser.rb +874 -845
- data/lib/adlint/cc1/parser.y +22 -2
- data/lib/adlint/cc1/syntax.rb +37 -18
- data/lib/adlint/cc1/type.rb +3 -3
- data/lib/adlint/cc1/value.rb +58 -50
- data/lib/adlint/cpp/lexer.rb +5 -1
- data/lib/adlint/cpp/macro.rb +30 -30
- data/lib/adlint/cpp/subst.rb +4 -4
- data/lib/adlint/exam/c_builtin/cc1_check.rb +172 -172
- data/lib/adlint/exam/c_builtin/cc1_check_shima.rb +11 -11
- data/lib/adlint/exam/c_builtin/cpp_check.rb +2 -2
- data/lib/adlint/memo.rb +13 -13
- data/lib/adlint/prelude.rb +2 -2
- data/lib/adlint/version.rb +2 -2
- data/share/doc/developers_guide_ja.html +7 -5
- data/share/doc/developers_guide_ja.texi +5 -3
- data/share/doc/users_guide_en.html +3 -3
- data/share/doc/users_guide_en.texi +1 -1
- data/share/doc/users_guide_ja.html +3 -3
- data/share/doc/users_guide_ja.texi +1 -1
- metadata +11 -2
data/lib/adlint/cc1/parser.y
CHANGED
@@ -985,6 +985,9 @@ enum_specifier
|
|
985
985
|
result = EnumSpecifier.new(create_anon_tag_name(val[0]), val[2])
|
986
986
|
result.head_token = val[0]
|
987
987
|
result.tail_token = val[3]
|
988
|
+
result.enumerators.each do |enum|
|
989
|
+
@lexer.add_enumerator_name(enum.identifier)
|
990
|
+
end
|
988
991
|
}
|
989
992
|
| ENUM IDENTIFIER "{" enumerator_list "}"
|
990
993
|
{
|
@@ -992,6 +995,9 @@ enum_specifier
|
|
992
995
|
result = EnumSpecifier.new(val[1], val[3])
|
993
996
|
result.head_token = val[0]
|
994
997
|
result.tail_token = val[4]
|
998
|
+
result.enumerators.each do |enum|
|
999
|
+
@lexer.add_enumerator_name(enum.identifier)
|
1000
|
+
end
|
995
1001
|
}
|
996
1002
|
| ENUM "{" enumerator_list "," "}"
|
997
1003
|
{
|
@@ -1000,6 +1006,9 @@ enum_specifier
|
|
1000
1006
|
val[2], val[3])
|
1001
1007
|
result.head_token = val[0]
|
1002
1008
|
result.tail_token = val[4]
|
1009
|
+
result.enumerators.each do |enum|
|
1010
|
+
@lexer.add_enumerator_name(enum.identifier)
|
1011
|
+
end
|
1003
1012
|
}
|
1004
1013
|
| ENUM IDENTIFIER "{" enumerator_list "," "}"
|
1005
1014
|
{
|
@@ -1007,6 +1016,9 @@ enum_specifier
|
|
1007
1016
|
result = EnumSpecifier.new(val[1], val[3], val[4])
|
1008
1017
|
result.head_token = val[0]
|
1009
1018
|
result.tail_token = val[5]
|
1019
|
+
result.enumerators.each do |enum|
|
1020
|
+
@lexer.add_enumerator_name(enum.identifier)
|
1021
|
+
end
|
1010
1022
|
}
|
1011
1023
|
| ENUM IDENTIFIER
|
1012
1024
|
{
|
@@ -1031,14 +1043,14 @@ enumerator_list
|
|
1031
1043
|
;
|
1032
1044
|
|
1033
1045
|
enumerator
|
1034
|
-
:
|
1046
|
+
: enumerator_name
|
1035
1047
|
{
|
1036
1048
|
checkpoint(val[0].location)
|
1037
1049
|
sym = @sym_tbl.create_new_symbol(EnumeratorName, val[0])
|
1038
1050
|
result = Enumerator.new(val[0], nil, sym)
|
1039
1051
|
result.head_token = result.tail_token = val[0]
|
1040
1052
|
}
|
1041
|
-
|
|
1053
|
+
| enumerator_name "=" constant_expression
|
1042
1054
|
{
|
1043
1055
|
checkpoint(val[0].location)
|
1044
1056
|
val[2].full = true
|
@@ -1049,6 +1061,14 @@ enumerator
|
|
1049
1061
|
}
|
1050
1062
|
;
|
1051
1063
|
|
1064
|
+
enumerator_name
|
1065
|
+
: IDENTIFIER
|
1066
|
+
| TYPEDEF_NAME
|
1067
|
+
{
|
1068
|
+
result = val[0].class.new(:IDENTIFIER, val[0].value, val[0].location)
|
1069
|
+
}
|
1070
|
+
;
|
1071
|
+
|
1052
1072
|
type_qualifier
|
1053
1073
|
: CONST
|
1054
1074
|
| VOLATILE
|
data/lib/adlint/cc1/syntax.rb
CHANGED
@@ -3619,10 +3619,17 @@ module Cc1 #:nodoc:
|
|
3619
3619
|
|
3620
3620
|
private
|
3621
3621
|
def deduct_controlling_expression_candidates(rough_cands)
|
3622
|
-
|
3623
|
-
rough_cands.
|
3624
|
-
|
3625
|
-
|
3622
|
+
case
|
3623
|
+
when rough_cands.empty?
|
3624
|
+
[[nil, nil]]
|
3625
|
+
when rough_cands.size == 1
|
3626
|
+
rough_cands
|
3627
|
+
else
|
3628
|
+
varying_var_names = varying_variable_names
|
3629
|
+
rough_cands.select do |expr_pair|
|
3630
|
+
collect_object_specifiers(expr_pair.first).any? do |os|
|
3631
|
+
varying_var_names.include?(os.identifier.value)
|
3632
|
+
end
|
3626
3633
|
end
|
3627
3634
|
end
|
3628
3635
|
end
|
@@ -3726,7 +3733,8 @@ module Cc1 #:nodoc:
|
|
3726
3733
|
|
3727
3734
|
def deduct_controlling_expression
|
3728
3735
|
sels = collect_loop_breaking_selection_statements(@statement)
|
3729
|
-
|
3736
|
+
expr = @expression
|
3737
|
+
rough_cands = [[expr, expr.to_normalized_logical]] + sels.map { |stmt|
|
3730
3738
|
[stmt.expression,
|
3731
3739
|
stmt.expression.to_normalized_logical.to_complemental_logical]
|
3732
3740
|
}
|
@@ -3765,7 +3773,8 @@ module Cc1 #:nodoc:
|
|
3765
3773
|
|
3766
3774
|
def deduct_controlling_expression
|
3767
3775
|
sels = collect_loop_breaking_selection_statements(@statement)
|
3768
|
-
|
3776
|
+
expr = @expression
|
3777
|
+
rough_cands = [[expr, expr.to_normalized_logical]] + sels.map { |stmt|
|
3769
3778
|
[stmt.expression,
|
3770
3779
|
stmt.expression.to_normalized_logical.to_complemental_logical]
|
3771
3780
|
}
|
@@ -3806,12 +3815,17 @@ module Cc1 #:nodoc:
|
|
3806
3815
|
|
3807
3816
|
def deduct_controlling_expression
|
3808
3817
|
sels = collect_loop_breaking_selection_statements(@body_statement)
|
3809
|
-
|
3810
|
-
[
|
3811
|
-
|
3812
|
-
|
3813
|
-
|
3814
|
-
|
3818
|
+
if expr = @condition_statement.expression
|
3819
|
+
rough_cands = [[expr, expr.to_normalized_logical]] + sels.map { |stmt|
|
3820
|
+
[stmt.expression,
|
3821
|
+
stmt.expression.to_normalized_logical.to_complemental_logical]
|
3822
|
+
}
|
3823
|
+
else
|
3824
|
+
rough_cands = sels.map { |stmt|
|
3825
|
+
[stmt.expression,
|
3826
|
+
stmt.expression.to_normalized_logical.to_complemental_logical]
|
3827
|
+
}
|
3828
|
+
end
|
3815
3829
|
|
3816
3830
|
# FIXME: When many loop breaking selection-statements are found, how can
|
3817
3831
|
# I select one selection-statement?
|
@@ -3852,12 +3866,17 @@ module Cc1 #:nodoc:
|
|
3852
3866
|
|
3853
3867
|
def deduct_controlling_expression
|
3854
3868
|
sels = collect_loop_breaking_selection_statements(@body_statement)
|
3855
|
-
|
3856
|
-
[
|
3857
|
-
|
3858
|
-
|
3859
|
-
|
3860
|
-
|
3869
|
+
if expr = @condition_statement.expression
|
3870
|
+
rough_cands = [[expr, expr.to_normalized_logical]] + sels.map { |stmt|
|
3871
|
+
[stmt.expression,
|
3872
|
+
stmt.expression.to_normalized_logical.to_complemental_logical]
|
3873
|
+
}
|
3874
|
+
else
|
3875
|
+
rough_cands = sels.map { |stmt|
|
3876
|
+
[stmt.expression,
|
3877
|
+
stmt.expression.to_normalized_logical.to_complemental_logical]
|
3878
|
+
}
|
3879
|
+
end
|
3861
3880
|
|
3862
3881
|
# FIXME: When many loop breaking selection-statements are found, how can
|
3863
3882
|
# I select one selection-statement?
|
data/lib/adlint/cc1/type.rb
CHANGED
@@ -5646,15 +5646,15 @@ module Cc1 #:nodoc:
|
|
5646
5646
|
end
|
5647
5647
|
|
5648
5648
|
def const?
|
5649
|
-
|
5649
|
+
@base_type.const?
|
5650
5650
|
end
|
5651
5651
|
|
5652
5652
|
def volatile?
|
5653
|
-
|
5653
|
+
@base_type.volatile?
|
5654
5654
|
end
|
5655
5655
|
|
5656
5656
|
def restrict?
|
5657
|
-
|
5657
|
+
@base_type.restrict?
|
5658
5658
|
end
|
5659
5659
|
|
5660
5660
|
def bitfield?
|
data/lib/adlint/cc1/value.rb
CHANGED
@@ -440,9 +440,9 @@ module Cc1 #:nodoc:
|
|
440
440
|
def narrow_domain!(op, ope_val)
|
441
441
|
case ope_single_val = ope_val.to_single_value
|
442
442
|
when ScalarValue
|
443
|
-
|
443
|
+
orig_dom = @domain
|
444
444
|
@domain = @domain.narrow(op, ope_single_val.domain)
|
445
|
-
!@domain.equal?(
|
445
|
+
!@domain.equal?(orig_dom)
|
446
446
|
else
|
447
447
|
raise TypeError, "cannot narrow scalar value domain with non-scalar."
|
448
448
|
end
|
@@ -451,9 +451,9 @@ module Cc1 #:nodoc:
|
|
451
451
|
def widen_domain!(op, ope_val)
|
452
452
|
case ope_single_val = ope_val.to_single_value
|
453
453
|
when ScalarValue
|
454
|
-
|
454
|
+
orig_dom = @domain
|
455
455
|
@domain = @domain.widen(op, ope_single_val.domain)
|
456
|
-
!@domain.equal?(
|
456
|
+
!@domain.equal?(orig_dom)
|
457
457
|
else
|
458
458
|
raise TypeError, "cannot widen scalar value domain with non-scalar."
|
459
459
|
end
|
@@ -997,8 +997,8 @@ module Cc1 #:nodoc:
|
|
997
997
|
when ArrayValue
|
998
998
|
if @values.size == rhs_single_val.values.size
|
999
999
|
zipped = @values.zip(rhs_single_val.values)
|
1000
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1001
|
-
|
1000
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1001
|
+
rslt_val.single_value_unified_with(lhs < rhs)
|
1002
1002
|
end
|
1003
1003
|
else
|
1004
1004
|
scalar_value_of_false
|
@@ -1017,8 +1017,8 @@ module Cc1 #:nodoc:
|
|
1017
1017
|
when ArrayValue
|
1018
1018
|
if @values.size == rhs_single_val.values.size
|
1019
1019
|
zipped = @values.zip(rhs_single_val.values)
|
1020
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1021
|
-
|
1020
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1021
|
+
rslt_val.single_value_unified_with(lhs > rhs)
|
1022
1022
|
end
|
1023
1023
|
else
|
1024
1024
|
scalar_value_of_false
|
@@ -1037,8 +1037,8 @@ module Cc1 #:nodoc:
|
|
1037
1037
|
when ArrayValue
|
1038
1038
|
if @values.size == rhs_single_value.values.size
|
1039
1039
|
zipped = @values.zip(rhs_single_val.values)
|
1040
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1041
|
-
|
1040
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1041
|
+
rslt_val.single_value_unified_with(lhs == rhs)
|
1042
1042
|
end
|
1043
1043
|
else
|
1044
1044
|
scalar_value_of_false
|
@@ -1057,8 +1057,8 @@ module Cc1 #:nodoc:
|
|
1057
1057
|
when ArrayValue
|
1058
1058
|
if @values.size == rhs_single_val.values.size
|
1059
1059
|
zipped = @values.zip(rhs_single_val.values)
|
1060
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1061
|
-
|
1060
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1061
|
+
rslt_val.single_value_unified_with(lhs != rhs)
|
1062
1062
|
end
|
1063
1063
|
else
|
1064
1064
|
scalar_value_of_false
|
@@ -1077,8 +1077,8 @@ module Cc1 #:nodoc:
|
|
1077
1077
|
when ArrayValue
|
1078
1078
|
if @values.size == rhs_single_val.values.size
|
1079
1079
|
zipped = @values.zip(rhs_single_val.values)
|
1080
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1081
|
-
|
1080
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1081
|
+
rslt_val.single_value_unified_with(lhs <= rhs)
|
1082
1082
|
end
|
1083
1083
|
else
|
1084
1084
|
scalar_value_of_false
|
@@ -1097,8 +1097,8 @@ module Cc1 #:nodoc:
|
|
1097
1097
|
when ArrayValue
|
1098
1098
|
if @values.size == rhs_single_value.values.size
|
1099
1099
|
zipped = @values.zip(rhs_single_val.values)
|
1100
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1101
|
-
|
1100
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1101
|
+
rslt_val.single_value_unified_with(lhs >= rhs)
|
1102
1102
|
end
|
1103
1103
|
else
|
1104
1104
|
scalar_value_of_false
|
@@ -1117,8 +1117,8 @@ module Cc1 #:nodoc:
|
|
1117
1117
|
when ArrayValue
|
1118
1118
|
if @values.size == rhs_single_val.values.size
|
1119
1119
|
zipped = @values.zip(rhs_single_val.values)
|
1120
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1121
|
-
|
1120
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1121
|
+
rslt_val.single_value_unified_with(lhs.logical_and(rhs))
|
1122
1122
|
end
|
1123
1123
|
else
|
1124
1124
|
scalar_value_of_false
|
@@ -1137,8 +1137,8 @@ module Cc1 #:nodoc:
|
|
1137
1137
|
when ArrayValue
|
1138
1138
|
if @values.size == rhs_single_val.values.size
|
1139
1139
|
zipped = @values.zip(rhs_single_val.values)
|
1140
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1141
|
-
|
1140
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1141
|
+
rslt_val.single_value_unified_with(lhs.logical_or(rhs))
|
1142
1142
|
end
|
1143
1143
|
else
|
1144
1144
|
scalar_value_of_false
|
@@ -1484,8 +1484,8 @@ module Cc1 #:nodoc:
|
|
1484
1484
|
when CompositeValue
|
1485
1485
|
if @values.size == rhs_single_val.values.size
|
1486
1486
|
zipped = @values.zip(rhs_single_val.values)
|
1487
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1488
|
-
|
1487
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1488
|
+
rslt_val.single_value_unified_with(lhs < rhs)
|
1489
1489
|
end
|
1490
1490
|
else
|
1491
1491
|
scalar_value_of_false
|
@@ -1502,8 +1502,8 @@ module Cc1 #:nodoc:
|
|
1502
1502
|
when CompositeValue
|
1503
1503
|
if @values.size == rhs_single_val.values.size
|
1504
1504
|
zipped = @values.zip(rhs_single_val.values)
|
1505
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1506
|
-
|
1505
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1506
|
+
rslt_val.single_value_unified_with(lhs > rhs)
|
1507
1507
|
end
|
1508
1508
|
else
|
1509
1509
|
scalar_value_of_false
|
@@ -1520,8 +1520,8 @@ module Cc1 #:nodoc:
|
|
1520
1520
|
when CompositeValue
|
1521
1521
|
if @values.size == rhs_single_val.values.size
|
1522
1522
|
zipped = @values.zip(rhs_single_val.values)
|
1523
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1524
|
-
|
1523
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1524
|
+
rslt_val.single_value_unified_with(lhs == rhs)
|
1525
1525
|
end
|
1526
1526
|
else
|
1527
1527
|
scalar_value_of_false
|
@@ -1538,8 +1538,8 @@ module Cc1 #:nodoc:
|
|
1538
1538
|
when CompositeValue
|
1539
1539
|
if @values.size == rhs_single_val.values.size
|
1540
1540
|
zipped = @values.zip(rhs_single_val.values)
|
1541
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1542
|
-
|
1541
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1542
|
+
rslt_val.single_value_unified_with(lhs != rhs)
|
1543
1543
|
end
|
1544
1544
|
else
|
1545
1545
|
scalar_value_of_false
|
@@ -1556,8 +1556,8 @@ module Cc1 #:nodoc:
|
|
1556
1556
|
when CompositeValue
|
1557
1557
|
if @values.size == rhs_single_val.values.size
|
1558
1558
|
zipped = @values.zip(rhs_single_val.values)
|
1559
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1560
|
-
|
1559
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1560
|
+
rslt_val.single_value_unified_with(lhs <= rhs)
|
1561
1561
|
end
|
1562
1562
|
else
|
1563
1563
|
scalar_value_of_false
|
@@ -1574,8 +1574,8 @@ module Cc1 #:nodoc:
|
|
1574
1574
|
when CompositeValue
|
1575
1575
|
if @values.size == rhs_single_val.values.size
|
1576
1576
|
zipped = @values.zip(rhs_single_val.values)
|
1577
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1578
|
-
|
1577
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1578
|
+
rslt_val.single_value_unified_with(lhs >= rhs)
|
1579
1579
|
end
|
1580
1580
|
else
|
1581
1581
|
scalar_value_of_false
|
@@ -1592,8 +1592,8 @@ module Cc1 #:nodoc:
|
|
1592
1592
|
when CompositeValue
|
1593
1593
|
if @values.size == rhs_single_val.values.size
|
1594
1594
|
zipped = @values.zip(rhs_single_val.values)
|
1595
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1596
|
-
|
1595
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1596
|
+
rslt_val.single_value_unified_with(lhs.logical_and(rhs))
|
1597
1597
|
end
|
1598
1598
|
else
|
1599
1599
|
scalar_value_of_false
|
@@ -1610,8 +1610,8 @@ module Cc1 #:nodoc:
|
|
1610
1610
|
when CompositeValue
|
1611
1611
|
if @values.size == rhs_single_val.values.size
|
1612
1612
|
zipped = @values.zip(rhs_single_val.values)
|
1613
|
-
zipped.reduce(scalar_value_of_nil) do |
|
1614
|
-
|
1613
|
+
zipped.reduce(scalar_value_of_nil) do |rslt_val, (lhs, rhs)|
|
1614
|
+
rslt_val.single_value_unified_with(lhs.logical_or(rhs))
|
1615
1615
|
end
|
1616
1616
|
else
|
1617
1617
|
scalar_value_of_false
|
@@ -2120,10 +2120,10 @@ module Cc1 #:nodoc:
|
|
2120
2120
|
end
|
2121
2121
|
|
2122
2122
|
class VersionedValue < MultipleValue
|
2123
|
-
def initialize(
|
2124
|
-
# NOTE: `
|
2123
|
+
def initialize(orig_val)
|
2124
|
+
# NOTE: `orig_val.to_single_value' will be done in
|
2125
2125
|
# MultipleValue#initialize.
|
2126
|
-
super(
|
2126
|
+
super(orig_val, nil)
|
2127
2127
|
|
2128
2128
|
@version_controller = ValueVersionController.new(self)
|
2129
2129
|
end
|
@@ -2155,22 +2155,30 @@ module Cc1 #:nodoc:
|
|
2155
2155
|
|
2156
2156
|
def rollback_all_versions!
|
2157
2157
|
delete_descendants!
|
2158
|
-
|
2158
|
+
orig_val = @version_controller.original_value
|
2159
2159
|
@version_controller = nil
|
2160
|
-
|
2160
|
+
_orig_overwrite!(orig_val)
|
2161
2161
|
@version_controller = ValueVersionController.new(self)
|
2162
2162
|
invalidate_memo!
|
2163
2163
|
end
|
2164
2164
|
|
2165
|
-
alias :
|
2165
|
+
alias :_orig_overwrite! :overwrite!
|
2166
2166
|
|
2167
2167
|
def overwrite!(val)
|
2168
2168
|
@version_controller.fork_current_version
|
2169
|
-
super
|
2169
|
+
super
|
2170
2170
|
@version_controller.mark_current_versioning_group_as_sticky
|
2171
2171
|
invalidate_memo!
|
2172
2172
|
end
|
2173
2173
|
|
2174
|
+
def force_overwrite!(val)
|
2175
|
+
# NOTE: This method will be invoked only from VariableTable#define.
|
2176
|
+
single_val = val.to_single_value
|
2177
|
+
@version_controller.original_value.overwrite!(single_val)
|
2178
|
+
_orig_overwrite!(single_val)
|
2179
|
+
invalidate_memo!
|
2180
|
+
end
|
2181
|
+
|
2174
2182
|
def narrow_domain!(op, ope_val)
|
2175
2183
|
@version_controller.fork_current_version
|
2176
2184
|
super
|
@@ -2212,8 +2220,8 @@ module Cc1 #:nodoc:
|
|
2212
2220
|
end
|
2213
2221
|
|
2214
2222
|
class ValueVersionController
|
2215
|
-
def initialize(
|
2216
|
-
@versioning_group_stack = [RootVersioningGroup.new(
|
2223
|
+
def initialize(orig_val)
|
2224
|
+
@versioning_group_stack = [RootVersioningGroup.new(orig_val)]
|
2217
2225
|
end
|
2218
2226
|
|
2219
2227
|
def original_value
|
@@ -2255,8 +2263,8 @@ module Cc1 #:nodoc:
|
|
2255
2263
|
current_versioning_group.delete_current_version_completely
|
2256
2264
|
base_vals = current_versioning_group.base_values
|
2257
2265
|
base_vals.zip(initial_vals).each do |multi_val, initial_val|
|
2258
|
-
|
2259
|
-
|
2266
|
+
multi_val.rollback! if forked
|
2267
|
+
multi_val.overwrite!(initial_val) if initial_val
|
2260
2268
|
end
|
2261
2269
|
begin_forking
|
2262
2270
|
else
|
@@ -2316,7 +2324,7 @@ module Cc1 #:nodoc:
|
|
2316
2324
|
vals.each do |base_multi_val, initial_single_val|
|
2317
2325
|
base_multi_val.delete_descendants!
|
2318
2326
|
if base_multi_val.kind_of?(VersionedValue)
|
2319
|
-
base_multi_val.
|
2327
|
+
base_multi_val._orig_overwrite!(initial_single_val)
|
2320
2328
|
else
|
2321
2329
|
base_multi_val.overwrite!(initial_single_val)
|
2322
2330
|
end
|
@@ -2415,8 +2423,8 @@ module Cc1 #:nodoc:
|
|
2415
2423
|
private_constant :VersioningGroup
|
2416
2424
|
|
2417
2425
|
class RootVersioningGroup < VersioningGroup
|
2418
|
-
def initialize(
|
2419
|
-
super(Version.new([
|
2426
|
+
def initialize(orig_val)
|
2427
|
+
super(Version.new([orig_val], true), true)
|
2420
2428
|
end
|
2421
2429
|
end
|
2422
2430
|
private_constant :RootVersioningGroup
|