diff options
Diffstat (limited to 'lib/compiler/test/compilation_SUITE_data')
58 files changed, 5067 insertions, 0 deletions
diff --git a/lib/compiler/test/compilation_SUITE_data/bad_functional_value.erl b/lib/compiler/test/compilation_SUITE_data/bad_functional_value.erl new file mode 100644 index 0000000000..126a573e83 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/bad_functional_value.erl @@ -0,0 +1,28 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(bad_functional_value). + +-export([?MODULE/0,a/0]). + +?MODULE() -> + ok. + +a() -> + .list_to_atom("ok"). + diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_1.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_1.erl new file mode 100644 index 0000000000..d6c9c869c8 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_1.erl @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_1). +-export([beam_compiler_1/0]). + +beam_compiler_1() -> + ok. + +-record(foo,{a,b}). + +try_me() -> + X = #foo{}, + Y = #foo{}, + {X#foo.a == Y#foo.a,X#foo.b}. + diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_10.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_10.erl new file mode 100644 index 0000000000..a1264055bd --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_10.erl @@ -0,0 +1,27 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_10). +-export([?MODULE/0,start_timer/0]). + +?MODULE() -> + ok. + +start_timer() -> + Self = self(), + spawn(fun() -> receive after 1000 -> Self ! show end end). diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_11.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_11.erl new file mode 100644 index 0000000000..4be32ab505 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_11.erl @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_11). + +-export([?MODULE/0,a/0]). + +?MODULE() -> + ok. + +a() -> + case foo:bar() of + A -> ok + end, + A = 3. + diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_12.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_12.erl new file mode 100644 index 0000000000..baee6b9bce --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_12.erl @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_12). + +-export([?MODULE/0,t/1]). + +?MODULE() -> + ok. + +t(Name) -> + {ok = {file_info,_,regular,_,AccTime1,ModTime1,_,_,_,_,_,_,_,_}} = + prim_file:read_file_info(Name). + diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_2.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_2.erl new file mode 100644 index 0000000000..0c094d584a --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_2.erl @@ -0,0 +1,35 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_2). +-export([beam_compiler_2/0]). + +beam_compiler_2() -> + ok. + +-record(foo,{a,b}). + +try_me() -> + try_me({foo,x,z},{foo,y,z}). + +try_me(X,Y) -> + f(X#foo.a =/= Y#foo.a,X#foo.b =/= X#foo.b). + +f(A,B) -> + A. + diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_3.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_3.erl new file mode 100644 index 0000000000..aced49b69c --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_3.erl @@ -0,0 +1,29 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_3). +-export([beam_compiler_3/0, f/0]). + +%% From Ulf Wiger. + +beam_compiler_3() -> + ok. + +f() -> + [_|T] = lists:reverse("xxx"), + T. diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_4.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_4.erl new file mode 100644 index 0000000000..5e74d3cd3c --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_4.erl @@ -0,0 +1,150 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_4). +-export([beam_compiler_4/0]). + +%% From Ulf Wiger. + +beam_compiler_4() -> + ok. + +selected_alarm(_Env, Parameters) -> + UnWebParam = x, + [Time, Severity, Info, Cause, + Type, Sender, Name, FaultId] = bar:foo(), + + %% The following case generates no test heap instructions, + %% but the test heap generated before the call to bar:foo(), + %% will be moved to here. And the number of words to allocate + %% will be ridicously big (> 65535) and will not fit in a 16 big + %% word. + + SenderLink = case Name of + "pchScheduledConnectionAlarm" -> + Sender; + "pchVpVcAlarm" -> + Sender; + "pchSystemMemoryAlarm" -> + Sender; + "uniProtocolRestartFailureAlarm" -> + Sender; + "spvcScheduledConnectionAlarm" -> + Sender; + "eqmSwitchCoreInterfaceAlarm" -> + Sender; + "atmPhysicalLayerAlarm" -> + Sender; + "atmBufferCongestionAlarm" -> + Sender; + "sdhLinkAlarm" -> + Sender; + "sdhFarEndAlarm" -> + Sender; + "sdhUpperQosAlarm" -> + Sender; + "sdhLowerQosAlarm" -> + Sender; + "eqmSwitchCoreAlarm" -> + Sender; + "eqmEtAlarm" -> + Sender; + "eqmHwIdentityFaultAlarm" -> + Sender; + "eqmOperatorBlockedEquipmentAlarm" -> + Sender; + "pdh34PathAlarm" -> + Sender; + "pdh34ObservationAlarm" -> + Sender; + "pdh34UpperQosAlarm" -> + Sender; + "pdh34LowerQosAlarm" -> + Sender; + "nsySynchRefAlarm" -> + Sender; + "nsySynchRefBlockedAlarm" -> + Sender; + "nsySynchNodeHoldoverAlarm" -> + Sender; + "nsySynchNodeNotWorkingAlarm" -> + Sender; + "eqmAtbAlarm" -> + Sender; + "eqmCbEtAlarm" -> + Sender; + "eqmCpAlarm" -> + Sender; + "eqmCpInterfaceAlarm" -> + Sender; + "eqmCbClkAlarm" -> + Sender; + "eqmCbClkInterfaceAlarm" -> + Sender; + "eqmCbClkVelocityAlarm" -> + Sender; + "eqmCbClkPhaseDiffAlarm" -> + Sender; + "eqmHwNotFoundAlarm" -> + Sender; + "eqmPduAlarm" -> + Sender; + "eqmFanAlarm" -> + Sender; + "eqmLocAlarm" -> + Sender; + "eqmCustomerDefined1Alarm" -> + Sender; + "eqmCustomerDefined2Alarm" -> + Sender; + "eqmCustomerDefined3Alarm" -> + Sender; + "eqmCustomerDefined4Alarm" -> + Sender; + "eqmOperatorBlockedLinkAlarm" -> + Sender; + "eqmPowerFilterAlarm" -> + Sender; + "eqmCbAbrAlarm" -> + Sender; + "eqmAlarmCutOffAlarm" -> + Sender; + OtherAlarm -> + Sender + end, + + %% The testHeap instruction generated here will move up to before + %% the case. + + bar:foo("<TABLE> + <TR><TD ALIGN=LEFT>Fault id: + <TD>" ++ FaultId ++ " + <TR><TD ALIGN=LEFT>Name: + <TD>" ++ Name ++ " + <TR><TD ALIGN=LEFT>Sender: + <TD>" ++ SenderLink ++ " + <TR><TD ALIGN=LEFT>Class: + <TD>" ++ Type ++ " + <TR><TD ALIGN=LEFT>Cause: + <TD>" ++ Cause ++ " + <TR><TD ALIGN=LEFT>Severity: + <TD>" ++ Severity ++ " + <TR><TD ALIGN=LEFT>Information: + <TD>" ++ Info ++ " + <TR><TD ALIGN=LEFT>Time: + <TD>" ++ Time). diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_5.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_5.erl new file mode 100644 index 0000000000..a23a0d518c --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_5.erl @@ -0,0 +1,28 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_5). +-export([beam_compiler_5/0]). + +-compile(export_all). + +beam_compiler_5() -> + ok. + +t() -> + [_|_] = x. diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_6.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_6.erl new file mode 100644 index 0000000000..f263fd75b2 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_6.erl @@ -0,0 +1,153 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_6). +-export([beam_compiler_6/0]). + +%% From Ulf Wiger, modified by Bjorn Gustavsson to provoke the +%% same error with partly corrected compiler in P3A. + +beam_compiler_6() -> + ok. + +selected_alarm(_Env, Parameters) -> + UnWebParam = x, + [Time, Severity, Info, Cause, + Type, Sender, Name, FaultId] = bar:foo(), + + %% Each branch of the case needs two words of heap, + %% but the test heap generated before the call to bar:foo(), + %% will be merged to the testHeap of each branch, summed and + %% moved before the branch. And the number of words to allocate + %% will be ridiculously big (> 65535) and will not fit in a + %% 16 bit word. + + SenderLink = + case Name of + "pchScheduledConnectionAlarm" -> + [Sender]; + "pchVpVcAlarm" -> + [Sender]; + "pchSystemMemoryAlarm" -> + [Sender]; + "uniProtocolRestartFailureAlarm" -> + [Sender]; + "spvcScheduledConnectionAlarm" -> + [Sender]; + "eqmSwitchCoreInterfaceAlarm" -> + [Sender]; + "atmPhysicalLayerAlarm" -> + [Sender]; + "atmBufferCongestionAlarm" -> + [Sender]; + "sdhLinkAlarm" -> + [Sender]; + "sdhFarEndAlarm" -> + [Sender]; + "sdhUpperQosAlarm" -> + [Sender]; + "sdhLowerQosAlarm" -> + [Sender]; + "eqmSwitchCoreAlarm" -> + [Sender]; + "eqmEtAlarm" -> + [Sender]; + "eqmHwIdentityFaultAlarm" -> + [Sender]; + "eqmOperatorBlockedEquipmentAlarm" -> + [Sender]; + "pdh34PathAlarm" -> + [Sender]; + "pdh34ObservationAlarm" -> + [Sender]; + "pdh34UpperQosAlarm" -> + [Sender]; + "pdh34LowerQosAlarm" -> + [Sender]; + "nsySynchRefAlarm" -> + [Sender]; + "nsySynchRefBlockedAlarm" -> + [Sender]; + "nsySynchNodeHoldoverAlarm" -> + [Sender]; + "nsySynchNodeNotWorkingAlarm" -> + [Sender]; + "eqmAtbAlarm" -> + [Sender]; + "eqmCbEtAlarm" -> + [Sender]; + "eqmCpAlarm" -> + [Sender]; + "eqmCpInterfaceAlarm" -> + [Sender]; + "eqmCbClkAlarm" -> + [Sender]; + "eqmCbClkInterfaceAlarm" -> + [Sender]; + "eqmCbClkVelocityAlarm" -> + [Sender]; + "eqmCbClkPhaseDiffAlarm" -> + [Sender]; + "eqmHwNotFoundAlarm" -> + [Sender]; + "eqmPduAlarm" -> + [Sender]; + "eqmFanAlarm" -> + [Sender]; + "eqmLocAlarm" -> + [Sender]; + "eqmCustomerDefined1Alarm" -> + [Sender]; + "eqmCustomerDefined2Alarm" -> + [Sender]; + "eqmCustomerDefined3Alarm" -> + [Sender]; + "eqmCustomerDefined4Alarm" -> + [Sender]; + "eqmOperatorBlockedLinkAlarm" -> + [Sender]; + "eqmPowerFilterAlarm" -> + [Sender]; + "eqmCbAbrAlarm" -> + [Sender]; + "eqmAlarmCutOffAlarm" -> + [Sender]; + OtherAlarm -> + [Sender] + end, + + %% The testHeap instruction generated here will move up to before + %% the case. + + bar:foo("<TABLE> + <TR><TD ALIGN=LEFT>Fault id: + <TD>" ++ FaultId ++ " + <TR><TD ALIGN=LEFT>Name: + <TD>" ++ Name ++ " + <TR><TD ALIGN=LEFT>Sender: + <TD>" ++ SenderLink ++ " + <TR><TD ALIGN=LEFT>Class: + <TD>" ++ Type ++ " + <TR><TD ALIGN=LEFT>Cause: + <TD>" ++ Cause ++ " + <TR><TD ALIGN=LEFT>Severity: + <TD>" ++ Severity ++ " + <TR><TD ALIGN=LEFT>Information: + <TD>" ++ Info ++ " + <TR><TD ALIGN=LEFT>Time: + <TD>" ++ Time). diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_8.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_8.erl new file mode 100644 index 0000000000..f1f4839798 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_8.erl @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_8). + +-compile(export_all). + +beam_compiler_8() -> + ok. + +t(Key, Me) -> + Fun = fun(X) -> + me_rec:key_values(X, Key) < me_rec:key_values(Me, Key) + end. + + diff --git a/lib/compiler/test/compilation_SUITE_data/beam_compiler_9.erl b/lib/compiler/test/compilation_SUITE_data/beam_compiler_9.erl new file mode 100644 index 0000000000..581b908753 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/beam_compiler_9.erl @@ -0,0 +1,67 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(beam_compiler_9). + +-export([compile/2, test/0, ?MODULE/0]). + +?MODULE() -> + ok. + +test() -> + Failures = failures(), + compile_files([hd(Failures)]). + +compile_files([File | Files]) -> + Pid = spawn(?MODULE, compile, [File, self()]), + Time = infinity, + receive + done -> + compile_files(Files) + after + Time -> + io:fwrite("Compilation not completed within ~w ms~n", [Time]), + exit(Pid, die), + compile_files(Files) + end; + +compile_files([]) -> + done. + + + +compile(File, Parent) -> + io:fwrite("Compiling: ~s~n", [File]), + statistics(runtime), + statistics(wall_clock), + statistics(reductions), + Result = c:c(File), + {_, Rslc} = statistics(runtime), + {_, Tslc} = statistics(wall_clock), + {_, Reds} = statistics(reductions), + io:fwrite("Result: ~w~n", [Result]), + io:fwrite("Reductions: ~w~n", [Reds]), + io:fwrite("Time: ~w~n", [Tslc]), + io:fwrite("Cpu time: ~w~n", [Rslc]), + io:nl(), + Parent ! done. + + + +failures() -> + [test]. diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_1.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_1.erl new file mode 100644 index 0000000000..7df1543d83 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_1.erl @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(bin_syntax_1). + +-export([f/2,?MODULE/0]). + +?MODULE() -> + ok. + +f(X, Y) -> + case X of + a -> + Y2 = 8 + end, + <<5:Y2>> = Y. diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_2.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_2.erl new file mode 100644 index 0000000000..dcf7b0f8bd --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_2.erl @@ -0,0 +1,41 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(bin_syntax_2). + +-export([?MODULE/0]). + +%% This module tests that constant propagation is done properly. + +?MODULE() -> + 258 = b(<<1,2>>), + F = c(), + 259 = F(<<1,3>>), + ok. + +b(B) -> + Sz = 16, + <<X:Sz/integer>> = B, + X. + +c() -> + Size = 16, + fun(Bin) -> + <<X:Size/integer>> = Bin, + X + end. diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_3.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_3.erl new file mode 100644 index 0000000000..93d35d5628 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_3.erl @@ -0,0 +1,35 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(bin_syntax_3). +-export([?MODULE/0,decode_integer/3]). + +?MODULE() -> + ok. + +decode_integer(Len, <<B1:1,B2:7,Bs/binary>>, RemovedBytes) when B1 == 0 -> + Bin = <<Skip:Len/unit:8, Buffer2/binary>> = <<B1:1,B2:7,Bs/binary>>, + Size = size(Bin), + <<Int:Size/unit:8>> = Bin, + {Int,Buffer2,RemovedBytes}; +decode_integer(Len,<<B1:1,B2:7,Bs/binary>>,RemovedBytes) -> + Bin = <<Skip:Len/unit:8,Buffer2/binary>> = <<B1:1,B2:7,Bs/binary>>, + Size = size(Bin), + <<N:Size/unit:8>> = <<B2,Bs/binary>>, + Int = N - (1 bsl (8 * size(Bin) -1)), + {Int,Buffer2,RemovedBytes}. diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_4.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_4.erl new file mode 100644 index 0000000000..fe0ce80270 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_4.erl @@ -0,0 +1,32 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(bin_syntax_4). +-export([?MODULE/0,f4b/2,f4c/2]). + +?MODULE() -> + ok. + +f4b(X, Y) -> + fun (<< A:Y >>, Y, B) -> fum(A, X, Y, B) end. + +f4c(X, Y) -> + fun (Y, << A:Y >>, B) -> fum(A, X, Y, B) end. + +fum(A, B, C, D) -> + {A,B,C,D}. diff --git a/lib/compiler/test/compilation_SUITE_data/bin_syntax_6.erl b/lib/compiler/test/compilation_SUITE_data/bin_syntax_6.erl new file mode 100644 index 0000000000..8de3a9094f --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/bin_syntax_6.erl @@ -0,0 +1,39 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(bin_syntax_6). +-export([?MODULE/0,x/1,y/1]). + +?MODULE() -> + ok. + +x(X) -> + blurf(), + B = {X,"OK",<<>>}, + catch b({a,B}). + +y(X) -> + blurf(), + B = {X,"OK",<<42>>}, + catch b({a,B}). + +blurf() -> + ok. + +b(_) -> + ok. diff --git a/lib/compiler/test/compilation_SUITE_data/catch_in_catch.erl b/lib/compiler/test/compilation_SUITE_data/catch_in_catch.erl new file mode 100644 index 0000000000..c732a912f0 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/catch_in_catch.erl @@ -0,0 +1,51 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(catch_in_catch). + +-export([?MODULE/0,do_start/1]). + +?MODULE() -> + process_flag(trap_exit, true), + Pid = spawn_link(?MODULE, do_start, [x]), + receive + {'EXIT',Pid,good_exit} -> ok; + Other -> + io:format("Unexpected: ~p\n", [Other]), + error + after 32000 -> + io:format("No message received\n"), + error + end. + +do_start(Param) -> + init(Param), + exit(good_exit). + +init(Param) -> + process_flag(trap_exit, true), + %% The catches were improperly nested, causing a "No catch found" crash. + (catch begin + foo(Param), + (catch exit(bar)) + end + ), + ignore. + +foo(_) -> + ok. diff --git a/lib/compiler/test/compilation_SUITE_data/compiler_1.erl b/lib/compiler/test/compilation_SUITE_data/compiler_1.erl new file mode 100644 index 0000000000..6dbd80d962 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/compiler_1.erl @@ -0,0 +1,742 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(compiler_1). +-compile([export_all]). + +compiler_1() -> ok. + +-define(log(Format,Args),mnesia_test_lib:log(Format,Args,?FILE,?LINE)). +-define(warning(Format,Args),?log("<WARNING> " ++ Format,Args)). +-define(error(Format,Args), + mnesia_test_lib:note_error(Format,Args,?FILE,?LINE), + ?log("<ERROR> " ++ Format,Args)). + +-define(match(ExpectedRes,Expr), + fun() -> + AcTuAlReS = (catch (Expr)), + case AcTuAlReS of + ExpectedRes -> + ?log("ok, result as expected: ~p~n",[AcTuAlReS]), + {success,AcTuAlReS}; + _ -> + ?error("actual result was: ~p~n",[AcTuAlReS]), + {fail,AcTuAlReS} + end + end()). + +-define(match_inverse(NotExpectedRes,Expr), + fun() -> + AcTuAlReS = (catch (Expr)), + case AcTuAlReS of + NotExpectedRes -> + ?error("actual result was: ~p~n",[AcTuAlReS]), + {fail,AcTuAlReS}; + _ -> + ?log("ok, result as expected: ~p~n",[AcTuAlReS]), + {success,AcTuAlReS} + end + end()). + +-define(match_receive(ExpectedMsg), + ?match(ExpectedMsg,mnesia_test_lib:pick_msg())). + +%% ExpectedMsgs must be completely bound +-define(match_multi_receive(ExpectedMsgs), + fun() -> + TmPeXpCtEdMsGs = lists:sort(ExpectedMsgs), + ?match(TmPeXpCtEdMsGs, + lists:sort(lists:map(fun(_) -> + mnesia_test_lib:pick_msg() + end, + TmPeXpCtEdMsGs))) + end()). + +-define(setup(), mnesia_test_lib:setup(?FILE,?LINE)). + +-define(start_activities(Nodes), + fun() -> + AcTiViTyPiDs = + lists:map(fun(Node) -> + spawn_link(Node, + mnesia_test_lib, + activity_evaluator, + [self()]) + end, + Nodes), + ?match_multi_receive(AcTiViTyPiDs) + end()). + +-define(start_transactions(Pids), + ?match_multi_receive(lists:map(fun(Pid) -> + Pid ! begin_trans, + {Pid,begin_trans} + end, + Pids))). + +-define(acquire_nodes(N,Nodes), + mnesia_test_lib:acquire_nodes(N,Nodes,?FILE,?LINE)). + + + +%%% Copyright (C) 1996, Ellemtel Telecommunications Systems Laboratories +%%% Author: Hakan Mattsson [email protected] +%%% Purpose: Evil usage of the API +%%% +%%% Invoke all functions in the API and try to cover all legal uses +%%% cases as well the illegal dito. This is a complement to the +%%% other more explicit test cases. +%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% +%%% show/0 +%%% +%%% Prints out the complete test case structure +%%% +%%% show/1 +%%% +%%% Prints out parts of the test case structure +%%% +%%% test/0 +%%% +%%% Run the complete test suite. +%%% Reads Nodes from nodes.profile and starts them if neccessary. +%%% Kills Mnesia and wipes out the Mnesia directories as a starter. +%%% +%%% test/1 +%%% +%%% Run parts of the test suite. +%%% Reads Nodes from nodes.profile and starts them if neccessary. +%%% Kills Mnesia and wipes out the Mnesia directories as a starter. +%%% +%%% test/2 +%%% +%%% Run parts of the test suite on the given Nodes, +%%% assuming that the nodes are up and running. +%%% Kills Mnesia and wipes out the Mnesia directories as a starter. +%%% +%%% test/3 +%%% +%%% Run parts of the test suite on permutations of the given Nodes, +%%% assuming that the nodes are up and running. Uses test/2. +%%% Kills Mnesia and wipes out the Mnesia directories as a starter. +%%% +%%% See the module mnesia_test_lib for further information. +%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +show() -> mnesia_test_lib:show([{?MODULE,all}]). +show(TestCases) -> mnesia_test_lib:show([{?MODULE,TestCases}]). +test() -> mnesia_test_lib:test([{?MODULE,all}]). +test(TestCases) -> mnesia_test_lib:test([{?MODULE,TestCases}]). +test(TestCases,Nodes) -> mnesia_test_lib:test([{?MODULE,TestCases}],Nodes). +test(TestCases,Nodes,Config) -> mnesia_test_lib:test([{?MODULE,TestCases}],Nodes,Config). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +old_all(suite) -> + [ + system_info, table_info, error_description, + db_node_lifecycle, start_and_stop, transaction, checkpoint, backup, + table_lifecycle, replica_management, replica_location, index_lifecycle, + trans_access, dirty_access, table_sync, snmp_access, debug_support + ]. + +trans_access(suite) -> + [ {mnesia_dirty_access_test,all} ]. + +dirty_access(suite) -> + [ {mnesia_trans_access_test,all} ]. + +%% Get meta info about Mnesia +system_info(suite) -> []; +system_info(Nodes) -> + ?match(yes,mnesia:system_info(is_running)), + ?match(Nodes,mnesia:system_info(db_nodes)), + ?match(Nodes,mnesia:system_info(running_db_nodes)), + ?match(true,mnesia:system_info(have_disc)), + ?match(A when atom(A),mnesia:system_info(debug)), + ?match(L when list(L),mnesia:system_info(directory)), + ?match(L when list(L),mnesia:system_info(log_version)), + ?match({_,_},mnesia:system_info(schema_version)), + ?match(L when list(L),mnesia:system_info(tables)), + ?match(L when list(L),mnesia:system_info(local_tables)), + ?match(L when list(L),mnesia:system_info(held_locks)), + ?match(L when list(L),mnesia:system_info(lock_queue)), + ?match(L when list(L),mnesia:system_info(transactions)), + ?match(I when integer(I),mnesia:system_info(transaction_failures)), + ?match(I when integer(I),mnesia:system_info(transaction_commits)), + ?match(I when integer(I),mnesia:system_info(transaction_restarts)), + ?match(L when list(L),mnesia:system_info(checkpoints)), + ?match(A when atom(A),mnesia:system_info(backup_module)), + ?match(true,mnesia:system_info(auto_repair)), + ?match({_,_},mnesia:system_info(dump_log_interval)), + ?match(A when atom(A),mnesia:system_info(dump_log_update_in_place)), + ?match(I when integer(I),mnesia:system_info(transaction_log_writes)), + ?match({'EXIT',{aborted,badarg}},mnesia:system_info(ali_baba)), + done. + +%% Get meta info about table +table_info(suite) -> []; +table_info(Nodes) -> + [Node1,Node2,Node3] = ?acquire_nodes(3,Nodes), + + Tab = table_info, + Type = bag, + ValPos = 3, + Attrs = [k,v], + Arity = length(Attrs) +1, + Schema = [{name,Tab},{type,Type},{attributes,Attrs},{index,[ValPos]}, + {disc_only_copies,[Node1]},{ram_copies,[Node2]},{disc_copies,[Node3]}], + ?match({atomic,ok}, mnesia:create_table(Schema)), + + Size = 10, + Keys = lists:seq(1,Size), + Records = [{Tab,A,7} || A <- Keys], + lists:foreach(fun(Rec) -> ?match(ok,mnesia:dirty_write(Rec)) end,Records), + ?match(Mem when integer(Mem),mnesia:table_info(Tab,memory)), + ?match(Size,mnesia:table_info(Tab,size)), + ?match(Type,mnesia:table_info(Tab,type)), + ?match([Node3],mnesia:table_info(Tab,disc_copies)), + ?match([Node2],mnesia:table_info(Tab,ram_copies)), + ?match([Node1],mnesia:table_info(Tab,disc_only_copies)), + Read = [Node1,Node2,Node3], + ?match(true,lists:member(mnesia:table_info(Tab,where_to_read),Read)), + Write = lists:sort([Node1,Node2,Node3]), + ?match(Write,lists:sort(mnesia:table_info(Tab,where_to_write))), + WriteLock = lists:sort([Node2,Node3]), + ?match([ValPos],mnesia:table_info(Tab,index)), + ?match(Arity,mnesia:table_info(Tab,arity)), + ?match(Attrs,mnesia:table_info(Tab,attributes)), + ?match({Tab,'_','_'},mnesia:table_info(Tab,wild_pattern)), + ?match({atomic,Attrs}, mnesia:transaction(fun() -> + mnesia:table_info(Tab,attributes) end)), + + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add and drop db nodes + +db_node_lifecycle(suite) -> []; +db_node_lifecycle(Nodes) -> + [Node1,Node2] = ?acquire_nodes(2,Nodes), + Tab = db_node_lifecycle, + + Schema = [{name,Tab},{ram_copies,[Node1,Node2]}], + ?match({atomic,ok}, mnesia:create_table(Schema)), + ?match({aborted,active}, rpc:call(Node1,mnesia,del_db_node,[Node2])), + + ?match([], mnesia_test_lib:stop_mnesia(Nodes)), + ?match(ok, mnesia:delete_schema(Nodes)), + ?match({error,_}, mnesia:create_schema(foo)), + ?match({error,_}, mnesia:create_schema([foo])), + ?match({error,_}, mnesia:create_schema([foo@bar])), + ?match({error,_}, mnesia:start()), + + ?match(ok, mnesia:create_schema(Nodes)), + ?match([],mnesia_test_lib:start_mnesia(Nodes)), + ?match({atomic,ok}, rpc:call(Node1,mnesia,del_db_node,[Node2])), + ?match({aborted,no_exists}, rpc:call(Node1,mnesia,del_db_node,[Node2])), + ?match({aborted,no_exists}, rpc:call(Node1,mnesia,del_db_node,[foo])), + ?match({aborted,no_exists}, rpc:call(Node1,mnesia,del_db_node,[foo@bar])), + + ?match([], mnesia_test_lib:stop_mnesia([Node2])), + ?match(ok,mnesia:delete_schema([Node2])), + AddFun = fun() -> ?match({aborted,nested_transaction}, + mnesia:add_db_node(Node2)), ok end, + ?match({atomic,ok},rpc:call(Node1,mnesia,transaction,[AddFun])), + DelFun = fun() -> ?match({aborted,nested_transaction}, + mnesia:del_db_node(Node2)), ok end, + ?match({atomic,ok},rpc:call(Node1,mnesia,transaction,[DelFun])), + + ?match({atomic,ok}, rpc:call(Node1,mnesia,add_db_node,[Node2])), + ?match({aborted,already_exists}, rpc:call(Node1,mnesia,add_db_node,[Node2])), + ?match([],mnesia_test_lib:start_mnesia([Node2])), + ?match({atomic,ok}, mnesia:create_table(Schema)), + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Start and stop the system + +start_and_stop(suite) -> []; +start_and_stop(Nodes) -> + [Node1] = ?acquire_nodes(1,Nodes), + + ?match(stopped, rpc:call(Node1,mnesia,stop,[])), + ?match(stopped, rpc:call(Node1,mnesia,stop,[])), + ?match({started,_}, rpc:call(Node1,mnesia,start,[])), + ?match({started,_}, rpc:call(Node1,mnesia,start,[])), + ?match(stopped, rpc:call(Node1,mnesia,stop,[])), + ?match([],mnesia_test_lib:start_mnesia(Nodes)), + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Checkpoints and backup management + +checkpoint(suite) -> []; +checkpoint(Nodes) -> + OneNode = ?acquire_nodes(1,Nodes), + checkpoint(OneNode,Nodes), + TwoNodes = ?acquire_nodes(2,Nodes), + checkpoint(TwoNodes,Nodes). + +checkpoint(TabNodes,Nodes) -> + [Node1] = ?acquire_nodes(1,TabNodes), + CreateTab = fun(Type,N,Ns) -> + Tab0 = lists:concat(["local_checkpoint_",Type,N]), + Tab = list_to_atom(Tab0), + Schema = [{name,Tab},{Type,Ns}], + ?match({atomic,ok},mnesia:delete_table(Tab)), + ?match({atomic,ok},mnesia:create_table(Schema)), + Tab + end, + CreateTabs = fun(Type) -> + CreateTab(Type,1,hd(TabNodes)), + CreateTab(Type,2,TabNodes), + CreateTab(Type,3,lists:last(TabNodes)) + end, + Types = [ram_copies,disc_copies,disc_only_copies], + Tabs = lists:append(lists:map(CreateTabs,Types)), + Recs = lists:sort([{T,N,N} || T <- Tabs,N <- lists:seq(1,10)]), + lists:foreach(fun(R) -> ?match(ok,mnesia:dirty_write(R)) end,Recs), + + CpName = a_checkpoint_name, + MinArgs = [{name,CpName},{min,Tabs},{allow_remote,false}], + ?match({ok,CpName,[Node1]}, + rpc:call(Node1,mnesia,activate_checkpoint,[MinArgs])), + ?match(ok,rpc:call(Node1,mnesia,deactivate_checkpoint,[CpName])), + + MaxArgs = [{name,CpName},{max,Tabs},{allow_remote,true}], + ?match({ok,CpName,[Node1]}, + rpc:call(Node1,mnesia,activate_checkpoint,[MaxArgs])), + ?match(ok,rpc:call(Node1,mnesia,deactivate_checkpoint,[CpName])), + + Args = [{name,CpName},{min,Tabs},{allow_remote,false}], + ?match({ok,CpName,[Node1]}, + rpc:call(Node1,mnesia,activate_checkpoint,[Args])), + Recs2 = lists:sort([{T,K,0} || {T,K,_} <- Recs]), + lists:foreach(fun(R) -> ?match(ok,mnesia:dirty_write(R)) end,Recs2), + ?match({atomic,ok},rpc:call(Node1,mnesia,deactivate_checkpoint,[CpName])), + + ?match({error,no_exists},mnesia:deactivate_checkpoint(CpName)), + ?match({error,badarg},mnesia:activate_checkpoint(foo)), + ?match({error,badarg},mnesia:activate_checkpoint([{foo,foo}])), + ?match({error,badarg},mnesia:activate_checkpoint([{max,foo}])), + ?match({error,badarg},mnesia:activate_checkpoint([{min,foo}])), + ?match({error,no_exists},mnesia:activate_checkpoint([{min,[foo@bar]}])), + ?match({error,badarg},mnesia:activate_checkpoint([{allow_remote,foo}])), + + Fun = fun(Tab) -> ?match({atomic,ok},mnesia:delete_table(Tab)) end, + lists:foreach(Fun,Tabs), + done. + +backup(suite) -> + [ + backup_schema, restore_schema, backup_checkpoint, restore_tables + ]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Use and misuse transactions + +transaction(suite) -> []; +transaction(Nodes) -> + [Node1] = ?acquire_nodes(1,Nodes), + ?match({atomic,ali_baba}, mnesia:transaction(fun() -> ali_baba end)), + ?match({aborted,_}, mnesia:transaction(no_fun)), + ?match({aborted,_}, mnesia:transaction(?MODULE,no_fun,[foo])), + + {success,[A,B,C,D,E,F,G,H]} = ?start_activities(lists:duplicate(8,Node1)), + ?start_transactions([A,B,C,D,E,F,G,H]), + + A ! fun() -> mnesia:abort(abort_bad_trans) end, + ?match_receive({A,{aborted,abort_bad_trans}}), + + B ! fun() -> 1 = 2 end, + ?match_receive({B,{aborted,_}}), + + C ! fun() -> throw(throw_bad_trans) end, + ?match_receive({C,{aborted,{throw,throw_bad_trans}}}), + + D ! fun() -> exit(exit_bad_trans) end, + ?match_receive({D,{aborted,exit_bad_trans}}), + + E ! fun() -> exit(normal) end, + ?match_receive({E,{aborted,normal}}), + + F ! fun() -> exit(abnormal) end, + ?match_receive({F,{aborted,abnormal}}), + + G ! fun() -> exit(G,abnormal) end, + ?match_receive({'EXIT',G,abnormal}), + + H ! fun() -> exit(H,kill) end, + ?match_receive({'EXIT',H,killed}), + + ?match({atomic,ali_baba}, + mnesia:transaction(fun() -> ali_baba end,infinity)), + ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,1)), + ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,0)), + ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,-1)), + ?match({atomic,ali_baba},mnesia:transaction(fun() -> ali_baba end,foo)), + Fun = fun() -> ?match({aborted,nested_transaction}, + mnesia:transaction(fun() -> ok end)), ok end, + ?match({atomic,ok},mnesia:transaction(Fun)), + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Create and delete tables + +%% Get meta info about table + +replica_location(suite) -> []; +replica_location(Nodes) -> + [Node1,Node2,Node3] = ?acquire_nodes(3,Nodes), + Tab = replica_location, + + %% Create three replicas + Schema = [{name,Tab},{disc_only_copies,[Node1]}, + {ram_copies,[Node2]},{disc_copies,[Node3]}], + ?match({atomic,ok}, mnesia:create_table(Schema)), + mnesia_test_lib:verify_replica_location(Tab,[Node1],[Node2],[Node3],Nodes), + + %% Delete one replica + ?match({atomic,ok}, mnesia:del_table_copy(Tab, Node2)), + mnesia_test_lib:verify_replica_location(Tab,[Node1],[],[Node3],Nodes), + + %% Move one replica + ?match({atomic,ok}, mnesia:move_table_copy(Tab, Node1, Node2)), + mnesia_test_lib:verify_replica_location(Tab,[Node2],[],[Node3],Nodes), + + %% Change replica type + ?match({atomic,ok}, mnesia:change_table_copy_type(Tab, Node2,ram_copies)), + mnesia_test_lib:verify_replica_location(Tab,[],[Node2],[Node3],Nodes), + + done. + +table_lifecycle(suite) -> []; +table_lifecycle(Nodes) -> + [Node1,Node2] = ?acquire_nodes(2,Nodes), + + ?match({atomic,ok}, mnesia:create_table([{type,bag}, + {ram_copies,[Node1]}, + {attributes,[rajtan,tajtan]}, + {name,order_of_args}])), + ?match([],mnesia:dirty_read({order_of_args,4711})), + ?match({atomic,ok}, mnesia:create_table([{name,already_exists}, + {ram_copies,[Node1]}])), + ?match({aborted,already_exists}, + mnesia:create_table([{name,already_exists},{ram_copies,[Node1]}])), + ?match({aborted,not_a_db_node}, + mnesia:create_table([{name,no_node},{ram_copies,[foo]}])), + ?match({aborted,not_a_db_node}, + mnesia:create_table([{name,no_host},{ram_copies,[foo@bar]}])), + ?match({aborted,badarg}, + mnesia:create_table([{name,zero_arity},{attributes,[]}])), + ?match({aborted,badarg}, mnesia:create_table([])), + ?match({aborted,badarg}, mnesia:create_table(atom)), + ?match({aborted,badarg}, + mnesia:create_table({cstruct,table_name_as_atom})), + ?match({aborted,bad_type}, + mnesia:create_table([{name,no_host},{ram_copies,foo}])), + ?match({aborted,bad_type}, + mnesia:create_table([{name,no_host},{disc_only_copies,foo}])), + ?match({aborted,bad_type}, + mnesia:create_table([{name,no_host},{disc_copies,foo}])), + + CreateFun = + fun() -> ?match({aborted,nested_transaction}, + mnesia:create_table([{name,nested_trans}])), ok + end, + ?match({atomic,ok},mnesia:transaction(CreateFun)), + ?match({atomic,ok},mnesia:create_table([{name,remote_tab}, + {ram_copies,[Node2]}])), + + ?match({atomic,ok}, mnesia:create_table([{name,a_brand_new_tab}, + {ram_copies,[Node1]}])), + ?match([],mnesia:dirty_read({a_brand_new_tab,4711})), + ?match({atomic,ok}, mnesia:delete_table(a_brand_new_tab)), + ?match({'EXIT',{aborted,no_exists}}, + mnesia:dirty_read({a_brand_new_tab,4711})), + ?match({aborted,no_exists}, mnesia:delete_table(a_brand_new_tab)), + ?match({aborted,badarg}, mnesia:create_table([])), + + ?match({atomic,ok}, mnesia:create_table([{name,nested_del_trans}, + {ram_copies,[Node1]}])), + DeleteFun = fun() -> ?match({aborted,nested_transaction}, + mnesia:delete_table(nested_del_trans)), ok end, + ?match({atomic,ok}, mnesia:transaction(DeleteFun)), + + ?match({aborted,bad_type}, + mnesia:create_table([{name,create_with_index},{index,2}])), + ?match({aborted,bad_index}, + mnesia:create_table([{name,create_with_index},{index,[-1]}])), + ?match({aborted,bad_index}, + mnesia:create_table([{name,create_with_index},{index,[0]}])), + ?match({aborted,bad_index}, + mnesia:create_table([{name,create_with_index},{index,[1]}])), + ?match({aborted,bad_index}, + mnesia:create_table([{name,create_with_index},{index,[2]}])), + ?match({atomic,ok}, + mnesia:create_table([{name,create_with_index},{index,[3]}, + {ram_copies,[Node1]}])), + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add, drop and move replicas, change storage types +%% Change table layout (only arity change supported) + +replica_management(suite) -> []; +replica_management(Nodes) -> + %% add_table_copy/3, del_table_copy/2, move_table_copy/3, + %% change_table_copy_type/3, transform_table/3 + + [Node1,Node2,Node3] = ?acquire_nodes(3,Nodes), + + Tab = replica_management, + Attrs = [k,v], + + %% + %% Add, delete and change replicas + %% + ?match({atomic,ok}, + mnesia:create_table([{name,Tab},{attributes,Attrs}, + {ram_copies,[Node1]}])), + mnesia_test_lib:verify_replica_location(Tab,[],[Node1],[],Nodes), + %% R - - + ?match({aborted,combine_error}, + mnesia:add_table_copy(Tab, Node2, disc_copies)), + ?match({aborted,combine_error}, + mnesia:change_table_copy_type(Tab, Node1, disc_copies)), + ?match({atomic,ok}, mnesia:del_table_copy(Tab,Node1)), + mnesia_test_lib:verify_replica_location(Tab,[],[],[],Nodes), + %% - - - + ?match({aborted,no_exists}, + mnesia:add_table_copy(Tab, Node3, ram_copies)), + + ?match({atomic,ok}, mnesia:create_table([{name,Tab}, + {attributes,Attrs}, + {disc_copies,[Node1]}])), + mnesia_test_lib:verify_replica_location(Tab,[],[],[Node1],Nodes), + %% D - - + ?match({aborted,badarg}, + mnesia:add_table_copy(Tab, Node2, bad_storage_type)), + ?match({atomic,ok}, mnesia:add_table_copy(Tab, Node2, disc_only_copies)), + mnesia_test_lib:verify_replica_location(Tab,[Node2],[],[Node1],Nodes), + %% D DO - + ?match({atomic,ok}, mnesia:add_table_copy(Tab, Node3, ram_copies)), + mnesia_test_lib:verify_replica_location(Tab,[Node2],[Node3],[Node1],Nodes), + %% D DO R + ?match({atomic,ok}, + mnesia:change_table_copy_type(Tab, Node1, disc_only_copies)), + mnesia_test_lib:verify_replica_location(Tab,[Node1,Node2],[Node3],[],Nodes), + %% DO DO R + ?match({aborted,already_exists}, + mnesia:add_table_copy(Tab, Node3, ram_copies)), + ?match({atomic,ok}, mnesia:del_table_copy(Tab, Node1)), + mnesia_test_lib:verify_replica_location(Tab,[Node2],[Node3],[],Nodes), + %% - DO R + ?match({aborted,_}, mnesia:del_table_copy(Tab, Node1)), + ?match({atomic,ok}, mnesia:add_table_copy(Tab, Node1, disc_copies)), + mnesia_test_lib:verify_replica_location(Tab,[Node2],[Node3],[Node1],Nodes), + %% D DO R + ?match({atomic,ok}, + mnesia:change_table_copy_type(Tab, Node3, disc_only_copies)), + mnesia_test_lib:verify_replica_location(Tab,[Node2,Node3],[],[Node1],Nodes), + %% D DO DO + ?match({atomic,ok}, mnesia:del_table_copy(Tab, Node2)), + mnesia_test_lib:verify_replica_location(Tab,[Node3],[],[Node1],Nodes), + %% D - DO + ?match({aborted,already_exists}, + mnesia:change_table_copy_type(Tab, Node1, disc_copies)), + + %% + %% Move replica + %% + ?match({atomic,ok}, mnesia:move_table_copy(Tab,Node1,Node2)), + mnesia_test_lib:verify_replica_location(Tab,[Node3],[],[Node2],Nodes), + %% - D DO + ?match({aborted,_}, mnesia:move_table_copy(Tab,Node1,Node2)), + ?match([], mnesia_test_lib:stop_mnesia([Node3])), + mnesia_test_lib:verify_replica_location(Tab,[Node3],[],[Node2], + Nodes -- [Node3]), + %% - D DO + ?match({atomic,ok}, mnesia:move_table_copy(Tab,Node3,Node1)), + mnesia_test_lib:verify_replica_location(Tab,[Node1],[],[Node2], + Nodes -- [Node3]), + %% DO D - + ?match([],mnesia_test_lib:start_mnesia([Node3])), + mnesia_test_lib:verify_replica_location(Tab,[Node1],[],[Node2],Nodes), + %% DO D - + + %% + %% Transformer + %% + + NewAttrs = Attrs ++ [extra], + Transformer = + fun(Rec) -> list_to_tuple(tuple_to_list(Rec) ++ [initial_value]) end, + ?match({atomic,ok}, mnesia:transform_table(Tab, Transformer,NewAttrs)), + ?match({atomic,ok}, mnesia:transform_table(Tab, fun(R) -> R end, Attrs)), + ?match({aborted,bad_type}, mnesia:transform_table(Tab, Transformer, 0)), + ?match({aborted,bad_type}, mnesia:transform_table(Tab, Transformer, -1)), + ?match({aborted,badarg}, mnesia:transform_table(Tab, Transformer, [])), + ?match({aborted,bad_type}, mnesia:transform_table(Tab, no_fun, NewAttrs)), + + NestedFun = + fun() -> + ?match({aborted,_}, + mnesia:move_table_copy(Tab,Node1,Node2)), + ?match({aborted,_}, + mnesia:add_table_copy(Tab,Node1,ram_copies)), + ?match({aborted,_}, + mnesia:del_table_copy(Tab,Node1)), + T = fun(_) -> 4711 end, + ?match({aborted,_}, + mnesia:transform_table(Tab,Transformer, T)), + ok + end, + ?match({atomic,ok},mnesia:transaction(NestedFun)), + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Add and drop indecies + +index_lifecycle(suite) -> + [ add_table_index, create_live_table_index, del_table_index ]. + +%% Add table index + +add_table_index(suite) -> []; +add_table_index(Nodes) -> + [Node1] = ?acquire_nodes(1,Nodes), + Tab = add_table_index, + Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node1]}], + ?match({atomic,ok}, mnesia:create_table(Schema)), + ValPos = 3, + BadValPos = ValPos + 1, + ?match({aborted,bad_index}, mnesia:add_table_index(Tab,BadValPos)), + ?match({aborted,bad_index}, mnesia:add_table_index(Tab,2)), + ?match({aborted,bad_index}, mnesia:add_table_index(Tab,1)), + ?match({aborted,bad_index}, mnesia:add_table_index(Tab,0)), + ?match({aborted,bad_index}, mnesia:add_table_index(Tab,-1)), + ?match({atomic,ok}, mnesia:add_table_index(Tab,ValPos)), + ?match({aborted,already_exists}, mnesia:add_table_index(Tab,ValPos)), + + NestedFun = fun() -> + ?match({aborted,nested_transaction}, + mnesia:add_table_index(Tab,ValPos)), + + ok + end, + ?match({atomic,ok},mnesia:transaction(NestedFun)), + done. + +create_live_table_index(suite) -> []; +create_live_table_index(Nodes) -> + [Node1] = ?acquire_nodes(1,Nodes), + Tab = create_live_table_index, + Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node1]}], + ?match({atomic,ok}, mnesia:create_table(Schema)), + ValPos = 3, + mnesia:dirty_write({Tab,1,2}), + + Fun = fun() -> + ?match(ok, mnesia:write({Tab,2,2})), + ok + end, + ?match({atomic,ok},mnesia:transaction(Fun)), + ?match({atomic,ok}, mnesia:add_table_index(Tab,ValPos)), + done. + +%% Drop table index + +del_table_index(suite) ->[]; +del_table_index(Nodes) -> + [Node1] = ?acquire_nodes(1,Nodes), + Tab = del_table_index, + Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node1]}], + ?match({atomic,ok}, mnesia:create_table(Schema)), + ValPos = 3, + BadValPos = ValPos + 1, + ?match({atomic,ok}, mnesia:add_table_index(Tab,ValPos)), + ?match({aborted,no_exists}, + mnesia:del_table_index(Tab,BadValPos)), + ?match({atomic,ok}, mnesia:del_table_index(Tab,ValPos)), + + NestedFun = + fun() -> + ?match({aborted,nested_transaction}, + mnesia:del_table_index(Tab,ValPos)), + ok + end, + ?match({atomic,ok},mnesia:transaction(NestedFun)), + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Syncronize table with log or disc +%% +table_sync(suite) -> + [ dump_tables, dump_log, change_dump_log_config, wait_for_tables, force_load_table ]. + +%% Dump ram tables on disc +dump_tables(suite) -> []; +dump_tables(Nodes) -> + [Node1,Node2] = ?acquire_nodes(2,Nodes), + Tab = dump_tables, + Schema = [{name,Tab},{attributes,[k,v]},{ram_copies,[Node2]}], + ?match({atomic,ok}, mnesia:create_table(Schema)), + + %% Dump 10 records + Size = 10, + Keys = lists:seq(1,Size), + Records = [{Tab,A,7} || A <- Keys], + lists:foreach(fun(Rec) -> ?match(ok,mnesia:dirty_write(Rec)) end,Records), + AllKeys = fun() -> lists:sort(mnesia:all_keys(Tab)) end, + + ?match({atomic,Keys}, mnesia:transaction(AllKeys)), + ?match(ok, mnesia:dump_tables(Tab)), + + %% Delete one record + ?match(ok,mnesia:dirty_delete({Tab,5})), + Keys2 = lists:delete(5,Keys), + ?match({atomic,Keys2}, mnesia:transaction(AllKeys)), + + %% Check that all 10 is restored after a stop + ?match([], mnesia_test_lib:stop_mnesia([Node1,Node2])), + ?match([],mnesia_test_lib:start_mnesia([Node1,Node2])), + ?match(ok,mnesia:wait_for_tables([Tab],infinity)), + ?match({atomic,Keys}, mnesia:transaction(AllKeys)), + + ?match(ok, mnesia:dump_tables([foo])), + done. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Make Mnesia table accessible via SNMP + +snmp_access(suite) -> + [ + snmp_open_table, snmp_close_table, + snmp_get_row, snmp_get_next_index, snmp_get_mnesia_key + ]. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Check that the debug support has not decayed + +debug_support(suite) -> + [ info, schema, schema, kill, lkill ]. + diff --git a/lib/compiler/test/compilation_SUITE_data/compiler_3.erl b/lib/compiler/test/compilation_SUITE_data/compiler_3.erl new file mode 100644 index 0000000000..47891a22b5 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/compiler_3.erl @@ -0,0 +1,33 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(compiler_3). +-export([compiler_3/0]). +-record(rec,{a}). + +compiler_3() -> + guard_record(). + +guard_record() -> + 1=func(#rec{}), + {'EXIT',_} = (catch func({rec})), + ok. + +func(X) when record(X, +rec) -> + 1. diff --git a/lib/compiler/test/compilation_SUITE_data/compiler_5.erl b/lib/compiler/test/compilation_SUITE_data/compiler_5.erl new file mode 100644 index 0000000000..c2a0c2064f --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/compiler_5.erl @@ -0,0 +1,49 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1997-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(compiler_5). +-export([compiler_5/0]). + +compiler_5() -> + f0(), + f1(), + f2(), + ok. + +%% compiler treats records with 1 and 2 fields differently... +-record(nil, {}). +-record(foo, {hello=1}). +-record(bar, {hello=2,there=3}). + +f0() -> + R1 = #nil{}, + R2 = R1#nil{}, %% stupid code, but compiler shouldn't crash + R1 = R2, + ok. + +f1() -> + R1 = #foo{}, + R2 = R1#foo{}, %% stupid code, but compiler shouldn't crash + R1 = R2, + ok. + +f2() -> + R1 = #bar{}, + R2 = R1#bar{}, %% stupid code, but compiler shouldn't crash + R1 = R2, + ok. diff --git a/lib/compiler/test/compilation_SUITE_data/complex_guard.erl b/lib/compiler/test/compilation_SUITE_data/complex_guard.erl new file mode 100644 index 0000000000..961aa6a460 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/complex_guard.erl @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(complex_guard). + +-compile(export_all). + +?MODULE() -> + ok. + +f(X1,Y1,Z1) -> + if + ((X1 =:= 4) or (X1 =:= 5)) and ((Y1 =:= 4) or (Y1 =:= 5)) and ((Z1 =:= 4) or (Z1 =:= 5)) or ((X1 =:= 1) or (X1 =:= 2) or (X1 =:= 3)) and ((Y1 =:= 1) or (Y1 =:= 2) or (Y1 =:= 3)) and ((Z1 =:= 1) or (Z1 =:= 2) or (Z1 =:= 3)) -> + true + end. + diff --git a/lib/compiler/test/compilation_SUITE_data/const_list_256.erl b/lib/compiler/test/compilation_SUITE_data/const_list_256.erl new file mode 100644 index 0000000000..0baf427911 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/const_list_256.erl @@ -0,0 +1,282 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(const_list_256). +-export([?MODULE/0]). + +?MODULE() -> + put_list(x), + ok. + +put_list(A) -> + [{A, 255}, + {A, 254}, + {A, 253}, + {A, 252}, + {A, 251}, + {A, 250}, + {A, 249}, + {A, 248}, + {A, 247}, + {A, 246}, + {A, 245}, + {A, 244}, + {A, 243}, + {A, 242}, + {A, 241}, + {A, 240}, + {A, 239}, + {A, 238}, + {A, 237}, + {A, 236}, + {A, 235}, + {A, 234}, + {A, 233}, + {A, 232}, + {A, 231}, + {A, 230}, + {A, 229}, + {A, 228}, + {A, 227}, + {A, 226}, + {A, 225}, + {A, 224}, + {A, 223}, + {A, 222}, + {A, 221}, + {A, 220}, + {A, 219}, + {A, 218}, + {A, 217}, + {A, 216}, + {A, 215}, + {A, 214}, + {A, 213}, + {A, 212}, + {A, 211}, + {A, 210}, + {A, 209}, + {A, 208}, + {A, 207}, + {A, 206}, + {A, 205}, + {A, 204}, + {A, 203}, + {A, 202}, + {A, 201}, + {A, 200}, + {A, 199}, + {A, 198}, + {A, 197}, + {A, 196}, + {A, 195}, + {A, 194}, + {A, 193}, + {A, 192}, + {A, 191}, + {A, 190}, + {A, 189}, + {A, 188}, + {A, 187}, + {A, 186}, + {A, 185}, + {A, 184}, + {A, 183}, + {A, 182}, + {A, 181}, + {A, 180}, + {A, 179}, + {A, 178}, + {A, 177}, + {A, 176}, + {A, 175}, + {A, 174}, + {A, 173}, + {A, 172}, + {A, 171}, + {A, 170}, + {A, 169}, + {A, 168}, + {A, 167}, + {A, 166}, + {A, 165}, + {A, 164}, + {A, 163}, + {A, 162}, + {A, 161}, + {A, 160}, + {A, 159}, + {A, 158}, + {A, 157}, + {A, 156}, + {A, 155}, + {A, 154}, + {A, 153}, + {A, 152}, + {A, 151}, + {A, 150}, + {A, 149}, + {A, 148}, + {A, 147}, + {A, 146}, + {A, 145}, + {A, 144}, + {A, 143}, + {A, 142}, + {A, 141}, + {A, 140}, + {A, 139}, + {A, 138}, + {A, 137}, + {A, 136}, + {A, 135}, + {A, 134}, + {A, 133}, + {A, 132}, + {A, 131}, + {A, 130}, + {A, 129}, + {A, 128}, + {A, 127}, + {A, 126}, + {A, 125}, + {A, 124}, + {A, 123}, + {A, 122}, + {A, 121}, + {A, 120}, + {A, 119}, + {A, 118}, + {A, 117}, + {A, 116}, + {A, 115}, + {A, 114}, + {A, 113}, + {A, 112}, + {A, 111}, + {A, 110}, + {A, 109}, + {A, 108}, + {A, 107}, + {A, 106}, + {A, 105}, + {A, 104}, + {A, 103}, + {A, 102}, + {A, 101}, + {A, 100}, + {A, 99}, + {A, 98}, + {A, 97}, + {A, 96}, + {A, 95}, + {A, 94}, + {A, 93}, + {A, 92}, + {A, 91}, + {A, 90}, + {A, 89}, + {A, 88}, + {A, 87}, + {A, 86}, + {A, 85}, + {A, 84}, + {A, 83}, + {A, 82}, + {A, 81}, + {A, 80}, + {A, 79}, + {A, 78}, + {A, 77}, + {A, 76}, + {A, 75}, + {A, 74}, + {A, 73}, + {A, 72}, + {A, 71}, + {A, 70}, + {A, 69}, + {A, 68}, + {A, 67}, + {A, 66}, + {A, 65}, + {A, 64}, + {A, 63}, + {A, 62}, + {A, 61}, + {A, 60}, + {A, 59}, + {A, 58}, + {A, 57}, + {A, 56}, + {A, 55}, + {A, 54}, + {A, 53}, + {A, 52}, + {A, 51}, + {A, 50}, + {A, 49}, + {A, 48}, + {A, 47}, + {A, 46}, + {A, 45}, + {A, 44}, + {A, 43}, + {A, 42}, + {A, 41}, + {A, 40}, + {A, 39}, + {A, 38}, + {A, 37}, + {A, 36}, + {A, 35}, + {A, 34}, + {A, 33}, + {A, 32}, + {A, 31}, + {A, 30}, + {A, 29}, + {A, 28}, + {A, 27}, + {A, 26}, + {A, 25}, + {A, 24}, + {A, 23}, + {A, 22}, + {A, 21}, + {A, 20}, + {A, 19}, + {A, 18}, + {A, 17}, + {A, 16}, + {A, 15}, + {A, 14}, + {A, 13}, + {A, 12}, + {A, 11}, + {A, 10}, + {A, 9}, + {A, 8}, + {A, 7}, + {A, 6}, + {A, 5}, + {A, 4}, + {A, 3}, + {A, 2}, + {A, 1}, + {A, 0}]. diff --git a/lib/compiler/test/compilation_SUITE_data/convopts.erl b/lib/compiler/test/compilation_SUITE_data/convopts.erl new file mode 100644 index 0000000000..429c683ca9 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/convopts.erl @@ -0,0 +1,159 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(convopts). + +-export([?MODULE/0]). + +-define(UINT32_MAX, ((1 bsl 32) - 1)). + +?MODULE() -> + Type = 12345, + Inst = 1, + Zone = 0, + case convopts([{dest, {tipc_name, Type, Inst, Zone}}]) of + {ok, [{$B, <<Type:32, Inst:32, Zone:32>>}]} -> + ok; + Other -> + {error, Other} + end. + + + +convopts(Opts) -> + catch + case getopts(Opts, [active, recvfrom, importance, distribution, + dest]) of + {[Active, Recvfrom, Importance, Distribution, + Dest], []} -> + {R, RR} = + case {Active, Recvfrom} of + {[], [recvfrom]} -> + throw({error, einval}); + {_, [recvfrom]} -> + {$r, $R}; + {_, _} -> + {$e, $E} + end, + {ok, + lists:flatten( + [case Active of + [{active, true}] -> + [{R, <<?UINT32_MAX:32>>}]; + [{active, N}] when integer(N), + 0 =< N, N < ?UINT32_MAX -> + [{R, <<N:32>>}]; + [{active, N}] when integer(N), + -?UINT32_MAX < N, N < 0 -> + [{RR, <<-N:32>>}]; + [{active, once}] -> + [{R, <<1:32>>}]; + [{active, false}] -> + [{R, <<0:32>>}]; + [] -> + []; + _ -> + throw({error, einval}) + end, + case Importance of + [{importance, normal}] -> + [{$i, []}]; + [{importance, high}] -> + [{$I, []}]; + [] -> + []; + _ -> + throw({error, einval}) + end, + case Distribution of + [distribution] -> + [{$d, []}]; + [] -> + []; + _ -> + throw({error, einval}) + end, + case Dest of + %% Port addressed message + [{dest, {tipc_port_id, Port, Proc}}] + when binary(Port), + integer(Proc), 0 =< Proc, Proc =< ?UINT32_MAX + ; + list(Port), + integer(Proc), 0 =< Proc, Proc =< ?UINT32_MAX -> + [{$p, [Port | <<Proc:32>>]}]; + %% Name addressed message + [{dest, {tipc_name, Type, Inst, Zone}}] + when integer(Type), 0 =< Type, Type =< ?UINT32_MAX, + integer(Inst), 0 =< Inst, Inst =< ?UINT32_MAX, + integer(Zone), 0 =< Zone, Zone =< ?UINT32_MAX -> + [{$B, <<Type:32, Inst:32, Zone:32>>}]; + %% + %% This undocumented clause uses an undocumented + %% feature of the TIPC socket interface that takes + %% advantage of some gory internals of the protocol. + %% It is protocol implementation dependant and + %% breaks the whole idea of location transparency + %% for name addressed messages. Therefore it should + %% only be used when all other possibilities are + %% exhausted. + %% + [{dest, {tipc_name, Type, Inst, + {tipc_processor_id, + Zone, Subnetwork, Processor}}}] + when integer(Type), 0 =< Type, Type =< ?UINT32_MAX, + integer(Inst), 0 =< Inst, Inst =< ?UINT32_MAX, + integer(Zone), + 0 =< Zone, Zone < 16#FF, + integer(Subnetwork), + 0 =< Subnetwork, Subnetwork < 16#FFF, + integer(Processor), + 0 =< Processor, Processor < 16#FFF -> + [{$B, <<Type:32, + Inst:32, + Zone:8, Subnetwork:12, Processor:12>>}]; + [] -> + []; + _ -> + throw({error, einval}) + end + ])}; + _ -> + throw({error, einval}) + end. + + + +getopts(List, Options) when list(List), list(Options) -> + getopts_1(Options, List, []). + +getopts_1([], List, Result) -> + {lists:reverse(Result), List}; +getopts_1([Option | Options], List, Result) -> + {Optvals, Remaining} = getopts_2(List, Option, [], []), + getopts_1(Options, Remaining, [Optvals | Result]). + +getopts_2([], _Option, Result, Remaining) -> + {lists:reverse(Result), lists:reverse(Remaining)}; +getopts_2([Option | Tail], Option, Result, Remaining) -> + getopts_2(Tail, Option, [Option | Result], Remaining); +getopts_2([Optval | Tail], Option, Result, Remaining) + when element(1, Optval) == Option -> + getopts_2(Tail, Option, [Optval | Result], Remaining); +getopts_2([Other | Tail], Option, Result, Remaining) -> + getopts_2(Tail, Option, Result, [Other | Remaining]). diff --git a/lib/compiler/test/compilation_SUITE_data/guards.erl b/lib/compiler/test/compilation_SUITE_data/guards.erl new file mode 100644 index 0000000000..84e41b8ede --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/guards.erl @@ -0,0 +1,106 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(guards). + +-export([guards/0]). + +guards() -> + ok = t(), + ok = f(), + ok = ct(1), + ok = multi(1), + ok = multi(2), + ok = multi(3). + +%% The following tests are always true. +t() when integer(42) -> + ok; +t() when float(2.0) -> + ok; +t() when number(7) -> + ok; +t() when number(3.14) -> + ok; +t() when atom(error) -> + ok; +t() when list([a]) -> + ok; +t() when tuple({}) -> + ok; +t() when tuple({1, 2}) -> + ok. + +%% The following tests are always false. +f() when integer(a) -> + ok; +f() when float(b) -> + ok; +f() when number(c) -> + ok; +f() when atom(42) -> + ok; +f() when list(33) -> + ok; +f() when list({}) -> + ok; +f() when list({1, 2}) -> + ok; +f() when tuple(33) -> + ok; +f() when tuple([a]) -> + ok; +f() when tuple([]) -> + ok; +f() when tuple(35) -> + ok; +f() -> + ok. + +%% The following tests are always true. +ct(X) -> + case X of + Y when integer(42) -> + ok; + Y when float(2.0) -> + ok; + Y when number(7) -> + ok; + Y when number(3.14) -> + ok; + Y when atom(error) -> + ok; + Y when list([a]) -> + ok; + Y when tuple({}) -> + ok; + Y when tuple({1, 2}) -> + ok + end. + +multi(X) -> + case X of + Y when float(Y) ; integer(Y) -> + ok; + Y when Y > 1, Y < 10 ; atom(Y) -> + ok; + Y when Y == 4, number(Y) ; list(Y) -> + pannkaka; + Y when Y==3 ; Y==5 ; Y==6 -> + ok + end. diff --git a/lib/compiler/test/compilation_SUITE_data/live_var.erl b/lib/compiler/test/compilation_SUITE_data/live_var.erl new file mode 100644 index 0000000000..483eec0630 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/live_var.erl @@ -0,0 +1,30 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2002-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(live_var). +-export([?MODULE/0,start/0]). + +?MODULE() -> + ok. + +start() -> + receive + after 3000 -> + A = 5 + end, + A. diff --git a/lib/compiler/test/compilation_SUITE_data/long_string.erl b/lib/compiler/test/compilation_SUITE_data/long_string.erl new file mode 100644 index 0000000000..b3cf77b13f --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/long_string.erl @@ -0,0 +1,670 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(long_string). + +-export([?MODULE/0]). + +?MODULE() -> + Options = "some stupid long string", + 49252 = length(generate(Options, "348927432097sfkjfkljf329")), + ok. + +generate(Options, Glurf) -> + "asdhfaslfdjhhwleirsk e4kjhr430usduy fdk;///s llsjkf;laskjfsdfkjasdfkj +sdkljflasdfkjasldkfjasd" ++ Options ++ +"CSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQoKIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBG +cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgICAgICAgICAgICAgICAgICAgICA1OSBU +ZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiBFdmVy +eW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMK +IG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2Vk +LgoKCQkJICAgIFByZWFtYmxlCgogIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUg +ZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0 +LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBpcyBpbnRlbmRl +ZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQpzb2Z0 +d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJz +LiAgVGhpcwpHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJl +ZSBTb2Z0d2FyZQpGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFt +IHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCnVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0 +d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKdGhlIEdOVSBMaWJyYXJ5IEdl +bmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCnlvdXIg +cHJvZ3JhbXMsIHRvby4KCiAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUg +cmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdApwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNl +bnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CmhhdmUgdGhlIGZyZWVkb20g +dG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKdGhp +cyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBj +YW4gZ2V0IGl0CmlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2Fy +ZSBvciB1c2UgcGllY2VzIG9mIGl0CmluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Ug +a25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KCiAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywg +d2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAphbnlvbmUgdG8gZGVueSB5 +b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuClRo +ZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZv +ciB5b3UgaWYgeW91CmRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91 +IG1vZGlmeSBpdC4KCiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBz +dWNoIGEgcHJvZ3JhbSwgd2hldGhlcgpncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZl +IHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKeW91IGhhdmUuICBZb3UgbXVzdCBt +YWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKc291cmNlIGNv +ZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVp +cgpyaWdodHMuCgogIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBj +b3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hp +Y2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKZGlzdHJpYnV0ZSBhbmQvb3Ig +bW9kaWZ5IHRoZSBzb2Z0d2FyZS4KCiAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlv +biBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KdGhhdCBldmVyeW9uZSB1bmRlcnN0 +YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKc29mdHdhcmUuICBJ +ZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24s +IHdlCndhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5v +dCB0aGUgb3JpZ2luYWwsIHNvCnRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJz +IHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCmF1dGhvcnMnIHJlcHV0YXRpb25zLgoK +ICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBz +b2Z0d2FyZQpwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0 +cmlidXRvcnMgb2YgYSBmcmVlCnByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVu +dCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRv +IHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CnBhdGVudCBtdXN0 +IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBh +bGwuCgogIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0 +cmlidXRpb24gYW5kCm1vZGlmaWNhdGlvbiBmb2xsb3cuCgwKCQkgICAgR05VIEdFTkVSQUwgUFVC +TElDIExJQ0VOU0UKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJV +VElPTiBBTkQgTU9ESUZJQ0FUSU9OCgogIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBw +cm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKYSBub3RpY2UgcGxhY2VkIGJ5IHRo +ZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKdW5kZXIgdGhl +IHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJl +bG93LApyZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNl +ZCBvbiB0aGUgUHJvZ3JhbSIKbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0 +aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250 +YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKZWl0aGVyIHZlcmJhdGltIG9y +IHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKbGFuZ3Vh +Z2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRh +dGlvbiBpbgp0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJl +c3NlZCBhcyAieW91Ii4KCkFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRp +b24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90CmNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5 +IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKcnVubmluZyB0aGUgUHJvZ3JhbSBp +cyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQppcyBjb3Zl +cmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQpQ +cm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFBy +b2dyYW0pLgpXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0g +ZG9lcy4KCiAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBv +ZiB0aGUgUHJvZ3JhbSdzCnNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVk +aXVtLCBwcm92aWRlZCB0aGF0IHlvdQpjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1 +Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCmNvcHlyaWdodCBub3RpY2UgYW5kIGRp +c2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKbm90aWNlcyB0aGF0IHJl +ZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5Owph +bmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhp +cyBMaWNlbnNlCmFsb25nIHdpdGggdGhlIFByb2dyYW0uCgpZb3UgbWF5IGNoYXJnZSBhIGZlZSBm +b3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKeW91IG1heSBh +dCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBh +IGZlZS4KCiAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJv +Z3JhbSBvciBhbnkgcG9ydGlvbgpvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0 +aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCmRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9y +IHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQphYm92ZSwgcHJvdmlkZWQgdGhhdCB5 +b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgoKICAgIGEpIFlvdSBtdXN0IGNh +dXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwogICAgc3Rh +dGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5n +ZS4KCiAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9y +IHB1Ymxpc2gsIHRoYXQgaW4KICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVy +aXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQogICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNl +bnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKICAgIHBhcnRpZXMgdW5k +ZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KCiAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJv +Z3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CiAgICB3aGVuIHJ1biwg +eW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCiAgICBpbnRl +cmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5 +IGFuCiAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBu +b3RpY2UgYW5kIGEKICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNl +LCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQogICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMg +bWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgogICAgdGhlc2UgY29uZGl0aW9ucywg +YW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKICAgIExpY2Vu +c2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0 +CiAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3 +b3JrIGJhc2VkIG9uCiAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4g +YW5ub3VuY2VtZW50LikKDApUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVk +IHdvcmsgYXMgYSB3aG9sZS4gIElmCmlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsg +YXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCmFuZCBjYW4gYmUgcmVhc29uYWJseSBj +b25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgp0aGVtc2VsdmVzLCB0 +aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCnNl +Y3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3 +aGVuIHlvdQpkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3 +aGljaCBpcyBhIHdvcmsgYmFzZWQKb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2Yg +dGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCnRoaXMgTGljZW5zZSwgd2hvc2UgcGVy +bWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCmVudGlyZSB3aG9sZSwg +YW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBp +dC4KClRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSBy +aWdodHMgb3IgY29udGVzdAp5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkg +eW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRy +b2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCmNvbGxlY3RpdmUgd29ya3MgYmFz +ZWQgb24gdGhlIFByb2dyYW0uCgpJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90 +aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCndpdGggdGhlIFByb2dyYW0gKG9yIHdp +dGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgphIHN0b3JhZ2Ug +b3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRl +cgp0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgoKICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3Ry +aWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKdW5kZXIgU2VjdGlvbiAy +KSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mClNl +Y3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhl +IGZvbGxvd2luZzoKCiAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVz +cG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCiAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBk +aXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKICAgIDEgYW5kIDIgYWJvdmUg +b24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9y +LAoKICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0 +IGxlYXN0IHRocmVlCiAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNo +YXJnZSBubyBtb3JlIHRoYW4geW91cgogICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcg +c291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQogICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5 +IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQogICAgZGlzdHJpYnV0ZWQg +dW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KICAg +IGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKCiAgICBjKSBB +Y2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBv +ZmZlcgogICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMg +YWx0ZXJuYXRpdmUgaXMKICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmli +dXRpb24gYW5kIG9ubHkgaWYgeW91CiAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3Qg +Y29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCiAgICBhbiBvZmZlciwgaW4gYWNjb3Jk +IHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKClRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1l +YW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKbWFraW5nIG1vZGlmaWNhdGlv +bnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKY29kZSBt +ZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1 +cyBhbnkKYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2Ny +aXB0cyB1c2VkIHRvCmNvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUg +ZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2Ug +Y29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCmFueXRoaW5nIHRoYXQgaXMgbm9ybWFs +bHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5CmZvcm0pIHdpdGggdGhl +IG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCm9w +ZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQg +Y29tcG9uZW50Cml0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KCklmIGRpc3RyaWJ1 +dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKYWNj +ZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZh +bGVudAphY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBj +b3VudHMgYXMKZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhp +cmQgcGFydGllcyBhcmUgbm90CmNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0 +aCB0aGUgb2JqZWN0IGNvZGUuCgwKICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1Ymxp +Y2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92 +aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdApvdGhlcndpc2UgdG8gY29weSwg +bW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKdm9pZCwgYW5k +IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNl +bnNlLgpIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRz +LCBmcm9tIHlvdSB1bmRlcgp0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNl +cyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaApwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBs +aWFuY2UuCgogIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2Us +IHNpbmNlIHlvdSBoYXZlIG5vdApzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3Jh +bnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgpkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9y +IGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKcHJvaGliaXRlZCBieSBs +YXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQptb2Rp +Znlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0 +aGUKUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNl +IHRvIGRvIHNvLCBhbmQKYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywg +ZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwp0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBp +dC4KCiAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3 +b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJl +Y2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQpvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0 +cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCnRoZXNlIHRlcm1zIGFuZCBj +b25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBv +biB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4K +WW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJk +IHBhcnRpZXMgdG8KdGhpcyBMaWNlbnNlLgoKICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBh +IGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CmluZnJpbmdlbWVudCBvciBm +b3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCmNvbmRp +dGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1l +bnQgb3IKb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBM +aWNlbnNlLCB0aGV5IGRvIG5vdApleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhp +cyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdApkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2lt +dWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCkxpY2Vuc2UgYW5kIGFueSBv +dGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKbWF5 +IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBh +dGVudApsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9u +IG9mIHRoZSBQcm9ncmFtIGJ5CmFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkg +b3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgp0aGUgb25seSB3YXkgeW91IGNvdWxkIHNh +dGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCnJlZnJhaW4gZW50aXJl +bHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCgpJZiBhbnkgcG9ydGlvbiBvZiB0 +aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKYW55IHBh +cnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRl +bmRlZCB0bwphcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBh +cHBseSBpbiBvdGhlcgpjaXJjdW1zdGFuY2VzLgoKSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRo +aXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQpwYXRlbnRzIG9yIG90aGVy +IHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQpzdWNo +IGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3Rpbmcg +dGhlCmludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3 +aGljaCBpcwppbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBl +b3BsZSBoYXZlIG1hZGUKZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBv +ZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAp0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9u +IGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdApzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBh +dXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCnRvIGRpc3RyaWJ1 +dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5v +dAppbXBvc2UgdGhhdCBjaG9pY2UuCgpUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0 +aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KYmUgYSBjb25zZXF1ZW5jZSBvZiB0 +aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCgwKICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9v +ciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgpjZXJ0YWluIGNvdW50cmllcyBl +aXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKb3JpZ2lu +YWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGlj +ZW5zZQptYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRh +dGlvbiBleGNsdWRpbmcKdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBw +ZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwpjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJ +biBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKdGhlIGxpbWl0YXRpb24gYXMg +aWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCgogIDkuIFRoZSBGcmVlIFNv +ZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25z +Cm9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBu +ZXcgdmVyc2lvbnMgd2lsbApiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJz +aW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3Ig +Y29uY2VybnMuCgpFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9u +IG51bWJlci4gIElmIHRoZSBQcm9ncmFtCnNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRo +aXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CmxhdGVyIHZlcnNpb24iLCB5 +b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMK +ZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQg +YnkgdGhlIEZyZWUKU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90 +IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgp0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3Nl +IGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRp +b24uCgogIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3Jh +bSBpbnRvIG90aGVyIGZyZWUKcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMg +YXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgp0byBhc2sgZm9yIHBlcm1pc3Npb24u +ICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKU29mdHdhcmUg +Rm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29t +ZXRpbWVzCm1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1 +aWRlZCBieSB0aGUgdHdvIGdvYWxzCm9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFs +bCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKb2YgcHJvbW90aW5nIHRoZSBz +aGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCgoJCQkgICAgTk8gV0FSUkFO +VFkKCiAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0Us +IFRIRVJFIElTIE5PIFdBUlJBTlRZCkZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJN +SVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgpPVEhFUldJU0UgU1RBVEVEIElO +IFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTClBST1ZJ +REUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRI +RVIgRVhQUkVTU0VECk9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU +SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig +QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKVE8gVEhFIFFVQUxJVFkg +QU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQpQ +Uk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNT +QVJZIFNFUlZJQ0lORywKUkVQQUlSIE9SIENPUlJFQ1RJT04uCgogIDEyLiBJTiBOTyBFVkVOVCBV +TkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcK +V0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9E +SUZZIEFORC9PUgpSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBC +RSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLApJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJ +QUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKT1VUIE9GIFRI +RSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1Qg +TElNSVRFRApUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRF +IE9SIExPU1NFUyBTVVNUQUlORUQgQlkKWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJF +IE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKUFJPR1JBTVMpLCBFVkVO +IElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFClBP +U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KCgkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJ +VElPTlMKDAoJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFt +cwoKICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUg +b2YgdGhlIGdyZWF0ZXN0CnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkg +dG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9u +ZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCgogIFRvIGRv +IHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMg +c2FmZXN0CnRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRv +IG1vc3QgZWZmZWN0aXZlbHkKY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBl +YWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKdGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEg +cG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCgogICAgPG9uZSBsaW5l +IHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBk +b2VzLj4KICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CgogICAgVGhp +cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v +ciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj +IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u +OyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9u +KSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4g +dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJS +QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFC +SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBH +TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91 +bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl +CiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBT +b2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAs +IEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKCkFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhv +dyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgoKSWYgdGhlIHBy +b2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2Ug +dGhpcwp3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgoKICAgIEdub21vdmlz +aW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgogICAgR25v +bW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0 +eXBlIGBzaG93IHcnLgogICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxj +b21lIHRvIHJlZGlzdHJpYnV0ZSBpdAogICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBl +IGBzaG93IGMnIGZvciBkZXRhaWxzLgoKVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3 +JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCnBhcnRzIG9mIHRoZSBH +ZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBt +YXkKYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsg +dGhleSBjb3VsZCBldmVuIGJlCm1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBz +dWl0cyB5b3VyIHByb2dyYW0uCgpZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlm +IHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgpzY2hvb2wsIGlmIGFueSwgdG8gc2ln +biBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgpuZWNlc3Nhcnku +ICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CgogIFlveW9keW5lLCBJbmMuLCBo +ZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KICBg +R25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5 +IEphbWVzIEhhY2tlci4KCiAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CiAg +VHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKClRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBk +b2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwpwcm9wcmlldGFy +eSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91 +IG1heQpjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFy +eSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2Fu +dCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsClB1YmxpYyBMaWNlbnNlIGluc3Rl +YWQgb2YgdGhpcyBMaWNlbnNlLgo= +ClxjaGFwdGVye1RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZX0KClxiZWdpbntjZW50ZXJ9 +CntccGFyaW5kZW50IDBpbgoKVmVyc2lvbiAyLCBKdW5lIDE5OTEKCkNvcHlyaWdodCBcY29weXJp +Z2h0XCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgoKXGJpZ3NraXAK +CjU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNB +CgpcYmlnc2tpcAoKRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUg +dmVyYmF0aW0gY29waWVzCm9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0 +IGlzIG5vdCBhbGxvd2VkLgp9ClxlbmR7Y2VudGVyfQoKXGJlZ2lue2NlbnRlcn0Ke1xiZlxsYXJn +ZSBQcmVhbWJsZX0KXGVuZHtjZW50ZXJ9CgoKVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJl +IGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvCnNoYXJlIGFuZCBjaGFu +Z2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzCmlu +dGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVl +IHNvZnR3YXJlLS0tdG8KbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRz +IHVzZXJzLiAgVGhpcyBHZW5lcmFsIFB1YmxpYwpMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0 +aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvCmFueSBvdGhlciBw +cm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvIHVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJl +ZQpTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkgdGhlIEdOVSBMaWJy +YXJ5IEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRv +IHlvdXIgcHJvZ3JhbXMsIHRvby4KCldoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2Ug +YXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QgcHJpY2UuCk91ciBHZW5lcmFsIFB1YmxpYyBM +aWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgdGhlCmZyZWVk +b20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3Ig +dGhpcyBzZXJ2aWNlCmlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBv +ciBjYW4gZ2V0IGl0IGlmIHlvdSB3YW50IGl0LAp0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0 +d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldyBmcmVlIHByb2dyYW1zOwphbmQgdGhhdCB5 +b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KClRvIHByb3RlY3QgeW91ciByaWdodHMs +IHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQgYW55b25lIHRvCmRlbnkg +eW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiAg +VGhlc2UKcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMg +Zm9yIHlvdSBpZiB5b3UKZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5 +b3UgbW9kaWZ5IGl0LgoKRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBz +dWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IKZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZl +IHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgeW91IGhhdmUuICBZb3UKbXVzdCBt +YWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNv +ZGUuICBBbmQKeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVp +ciByaWdodHMuCgpXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29w +eXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kICgyKQpvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNo +IGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCmRpc3RyaWJ1dGUgYW5kL29yIG1v +ZGlmeSB0aGUgc29mdHdhcmUuCgpBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFu +ZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbiB0aGF0CmV2ZXJ5b25lIHVuZGVyc3RhbmRz +IHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIElmCnRo +ZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2Ug +d2FudCBpdHMKcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRo +ZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkKcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2ls +bCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwgYXV0aG9ycycKcmVwdXRhdGlvbnMuCgpGaW5h +bGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2Fy +ZSBwYXRlbnRzLgpXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9y +cyBvZiBhIGZyZWUgcHJvZ3JhbSB3aWxsCmluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vu +c2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtCnByb3ByaWV0YXJ5LiAgVG8gcHJldmVu +dCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QKYmUgbGlj +ZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KClRo +ZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24g +YW5kCm1vZGlmaWNhdGlvbiBmb2xsb3cuCgpcYmVnaW57Y2VudGVyfQp7XExhcmdlIFxzYyBUZXJt +cyBhbmQgQ29uZGl0aW9ucyBGb3IgQ29weWluZywgRGlzdHJpYnV0aW9uIGFuZAogIE1vZGlmaWNh +dGlvbn0KXGVuZHtjZW50ZXJ9CgoKJVxyZW5ld2NvbW1hbmR7XHRoZWVudW1pfXtcYWxwaGF7ZW51 +bWl9fQpcYmVnaW57ZW51bWVyYXRlfQoKXGFkZHRvY291bnRlcntlbnVtaX17LTF9CgpcaXRlbSAK +ClRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2gg +Y29udGFpbnMgYSBub3RpY2UKcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBp +dCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCnRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJs +aWMgTGljZW5zZS4gIFRoZSBgYFByb2dyYW0nJywgYmVsb3csIHJlZmVycyB0bwphbnkgc3VjaCBw +cm9ncmFtIG9yIHdvcmssIGFuZCBhIGBgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbScnIG1lYW5z +IGVpdGhlcgp0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdo +dCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhCndvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBh +IHBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoCm1vZGlmaWNhdGlvbnMgYW5k +L29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLAp0cmFu +c2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gYGBtb2Rp +ZmljYXRpb24nJy4pCkVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzIGBgeW91JycuCgpBY3Rp +dml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24g +YXJlIG5vdApjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2Nv +cGUuICBUaGUgYWN0IG9mCnJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFu +ZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250 +ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKUHJvZ3JhbSAoaW5kZXBlbmRlbnQg +b2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KV2hldGhlciB0aGF0 +IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCgpcaXRlbSBZb3UgbWF5 +IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3Mgc291 +cmNlCiAgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhh +dCB5b3UgY29uc3BpY3VvdXNseQogIGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBj +b3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UKICBhbmQgZGlzY2xhaW1lciBvZiB3 +YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8KICB0aGlz +IExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYW55 +IG90aGVyCiAgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNl +IGFsb25nIHdpdGggdGhlIFByb2dyYW0uCgpZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBo +eXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQgeW91Cm1heSBhdCB5b3VyIG9w +dGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KClxp +dGVtCgpZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9y +IGFueSBwb3J0aW9uCm9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9n +cmFtLCBhbmQgY29weSBhbmQKZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1 +bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCmFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNv +IG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CgpcYmVnaW57ZW51bWVyYXRlfQoKXGl0ZW0g +CgpZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5v +dGljZXMgc3RhdGluZyB0aGF0CnlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2Yg +YW55IGNoYW5nZS4KClxpdGVtCgpZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0 +cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4Kd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBp +cyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CnBhcnQgdGhlcmVvZiwgdG8gYmUgbGlj +ZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCnBhcnRpZXMgdW5kZXIg +dGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KClxpdGVtCklmIHRoZSBtb2RpZmllZCBwcm9ncmFt +IG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKd2hlbiBydW4sIHlvdSBtdXN0 +IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAppbnRlcmFjdGl2ZSB1c2Ug +aW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCmFubm91bmNl +bWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQpub3Rp +Y2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHBy +b3ZpZGUKYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJv +Z3JhbSB1bmRlcgp0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8g +dmlldyBhIGNvcHkgb2YgdGhpcwpMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0g +aXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dApkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFu +IGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCnRoZSBQcm9ncmFtIGlzIG5vdCByZXF1 +aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQoKXGVuZHtlbnVtZXJhdGV9CgoKVGhlc2Ug +cmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgpp +ZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRo +ZSBQcm9ncmFtLAphbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBh +bmQgc2VwYXJhdGUgd29ya3MgaW4KdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBp +dHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQpzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmli +dXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKZGlzdHJpYnV0ZSB0aGUg +c2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCm9u +IHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRo +ZSB0ZXJtcyBvZgp0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNl +bnNlZXMgZXh0ZW5kIHRvIHRoZQplbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2 +ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCgpUaHVzLCBpdCBpcyBub3QgdGhl +IGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKeW91ciBy +aWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50 +IGlzIHRvCmV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2Yg +ZGVyaXZhdGl2ZSBvcgpjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgoKSW4g +YWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0 +aGUgUHJvZ3JhbQp3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUg +UHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0g +ZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKdGhlIHNjb3BlIG9mIHRoaXMgTGlj +ZW5zZS4KClxpdGVtCllvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3Ig +YSB3b3JrIGJhc2VkIG9uIGl0LAp1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4 +ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBw +cm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgoKXGJlZ2lue2Vu +dW1lcmF0ZX0KClxpdGVtCgpBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9u +ZGluZyBtYWNoaW5lLXJlYWRhYmxlCnNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1 +dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwoxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVt +IGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKClxpdGVtCgpB +Y2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJl +ZQp5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRo +YW4geW91cgpjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9u +LCBhIGNvbXBsZXRlCm1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBz +b3VyY2UgY29kZSwgdG8gYmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25z +IDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUg +aW50ZXJjaGFuZ2U7IG9yLAoKXGl0ZW0KCkFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlv +biB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCnRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGlu +ZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCmFsbG93ZWQgb25seSBmb3Igbm9u +Y29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CnJlY2VpdmVkIHRoZSBwcm9n +cmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKYW4gb2ZmZXIs +IGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCgpcZW5ke2VudW1lcmF0ZX0KCgpU +aGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhl +IHdvcmsgZm9yCm1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUg +d29yaywgY29tcGxldGUgc291cmNlCmNvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3Ig +YWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55CmFzc29jaWF0ZWQgaW50ZXJmYWNlIGRl +ZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwpjb250cm9sIGNvbXBpbGF0 +aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCnNw +ZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5j +bHVkZQphbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291 +cmNlIG9yIGJpbmFyeQpmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwg +a2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQpvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBl +eGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAppdHNlbGYgYWNjb21wYW5pZXMg +dGhlIGV4ZWN1dGFibGUuCgpJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3Qg +Y29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCmFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVk +IHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJj +ZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCmRpc3RyaWJ1dGlvbiBvZiB0aGUg +c291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdApjb21wZWxsZWQg +dG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgoKXGl0ZW0KWW91 +IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9n +cmFtCmV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55 +IGF0dGVtcHQKb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmli +dXRlIHRoZSBQcm9ncmFtIGlzCnZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRl +IHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KSG93ZXZlciwgcGFydGllcyB3aG8gaGF2 +ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKdGhpcyBMaWNlbnNl +IHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gK +cGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgoKXGl0ZW0KWW91IGFyZSBub3QgcmVx +dWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CnNpZ25lZCBp +dC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5 +IG9yCmRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVz +ZSBhY3Rpb25zIGFyZQpwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlz +IExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cm1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFBy +b2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwgeW91IGluZGljYXRlIHlv +dXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAphbGwgaXRzIHRlcm1z +IGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCnRo +ZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgoKXGl0ZW0KRWFjaCB0aW1lIHlvdSByZWRp +c3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQpQcm9ncmFtKSwg +dGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQpv +cmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3Jh +bSBzdWJqZWN0IHRvCnRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1w +b3NlIGFueSBmdXJ0aGVyCnJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ug +b2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9y +IGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KdGhpcyBMaWNlbnNlLgoK +XGl0ZW0KSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0 +aW9uIG9mIHBhdGVudAppbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBs +aW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLApjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAo +d2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCm90aGVyd2lzZSkgdGhhdCBjb250 +cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKZXhjdXNl +IHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QK +ZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlv +bnMgdW5kZXIgdGhpcwpMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25z +LCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Cm1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3Jh +bSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKbGljZW5zZSB3b3VsZCBub3QgcGVy +bWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQphbGwgdGhv +c2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3Us +IHRoZW4KdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGlj +ZW5zZSB3b3VsZCBiZSB0bwpyZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRo +ZSBQcm9ncmFtLgoKSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxp +ZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCmFueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhl +IGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KYXBwbHkgYW5kIHRoZSBzZWN0 +aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKY2lyY3Vtc3RhbmNl +cy4KCkl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0 +byBpbmZyaW5nZSBhbnkKcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3Ig +dG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMg +dGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQppbnRlZ3JpdHkgb2YgdGhlIGZyZWUg +c29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKaW1wbGVtZW50ZWQgYnkgcHVi +bGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCmdlbmVyb3VzIGNv +bnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKdGhy +b3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9m +IHRoYXQKc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBo +ZSBvciBzaGUgaXMgd2lsbGluZwp0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90 +aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKaW1wb3NlIHRoYXQgY2hvaWNlLgoKVGhp +cyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJl +bGlldmVkIHRvCmJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgoK +XGl0ZW0KSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJl +c3RyaWN0ZWQgaW4KY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29w +eXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCm9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBs +YWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKbWF5IGFkZCBhbiBleHBsaWNpdCBn +ZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCnRob3NlIGNvdW50 +cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcK +Y291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2Ug +aW5jb3Jwb3JhdGVzCnRoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2Yg +dGhpcyBMaWNlbnNlLgoKXGl0ZW0KVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVi +bGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKb2YgdGhlIEdlbmVyYWwgUHVibGljIExp +Y2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCmJlIHNpbWls +YXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRl +dGFpbCB0bwphZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KCkVhY2ggdmVyc2lvbiBp +cyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0K +c3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMg +dG8gaXQgYW5kIGBgYW55CmxhdGVyIHZlcnNpb24nJywgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBm +b2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCmVpdGhlciBvZiB0aGF0IHZlcnNpb24g +b3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlClNvZnR3YXJlIEZv +dW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1i +ZXIgb2YKdGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxp +c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLgoKXGl0ZW0KSWYgeW91IHdpc2gg +dG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCnByb2dy +YW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRv +IHRoZSBhdXRob3IKdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlz +IGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlClNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRo +ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcwptYWtlIGV4Y2VwdGlvbnMg +Zm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwpv +ZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZy +ZWUgc29mdHdhcmUgYW5kCm9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29m +dHdhcmUgZ2VuZXJhbGx5LgoKXGJlZ2lue2NlbnRlcn0Ke1xMYXJnZVxzYwpObyBXYXJyYW50eQp9 +ClxlbmR7Y2VudGVyfQoKXGl0ZW0Ke1xzYyBCZWNhdXNlIHRoZSBwcm9ncmFtIGlzIGxpY2Vuc2Vk +IGZyZWUgb2YgY2hhcmdlLCB0aGVyZSBpcyBubyB3YXJyYW50eQpmb3IgdGhlIHByb2dyYW0sIHRv +IHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGFwcGxpY2FibGUgbGF3LiAgRXhjZXB0IHdoZW4Kb3Ro +ZXJ3aXNlIHN0YXRlZCBpbiB3cml0aW5nIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQvb3Igb3Ro +ZXIgcGFydGllcwpwcm92aWRlIHRoZSBwcm9ncmFtIGBgYXMgaXMnJyB3aXRob3V0IHdhcnJhbnR5 +IG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzc2VkCm9yIGltcGxpZWQsIGluY2x1ZGluZywgYnV0 +IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mCm1lcmNoYW50YWJpbGl0 +eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBUaGUgZW50aXJlIHJpc2sg +YXMKdG8gdGhlIHF1YWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIHRoZSBwcm9ncmFtIGlzIHdpdGgg +eW91LiAgU2hvdWxkIHRoZQpwcm9ncmFtIHByb3ZlIGRlZmVjdGl2ZSwgeW91IGFzc3VtZSB0aGUg +Y29zdCBvZiBhbGwgbmVjZXNzYXJ5IHNlcnZpY2luZywKcmVwYWlyIG9yIGNvcnJlY3Rpb24ufQoK +XGl0ZW0Ke1xzYyBJbiBubyBldmVudCB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcg +b3IgYWdyZWVkIHRvIGluIHdyaXRpbmcKd2lsbCBhbnkgY29weXJpZ2h0IGhvbGRlciwgb3IgYW55 +IG90aGVyIHBhcnR5IHdobyBtYXkgbW9kaWZ5IGFuZC9vcgpyZWRpc3RyaWJ1dGUgdGhlIHByb2dy +YW0gYXMgcGVybWl0dGVkIGFib3ZlLCBiZSBsaWFibGUgdG8geW91IGZvciBkYW1hZ2VzLAppbmNs +dWRpbmcgYW55IGdlbmVyYWwsIHNwZWNpYWwsIGluY2lkZW50YWwgb3IgY29uc2VxdWVudGlhbCBk +YW1hZ2VzIGFyaXNpbmcKb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUgcHJv +Z3JhbSAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZAp0byBsb3NzIG9mIGRhdGEgb3IgZGF0YSBi +ZWluZyByZW5kZXJlZCBpbmFjY3VyYXRlIG9yIGxvc3NlcyBzdXN0YWluZWQgYnkKeW91IG9yIHRo +aXJkIHBhcnRpZXMgb3IgYSBmYWlsdXJlIG9mIHRoZSBwcm9ncmFtIHRvIG9wZXJhdGUgd2l0aCBh +bnkgb3RoZXIKcHJvZ3JhbXMpLCBldmVuIGlmIHN1Y2ggaG9sZGVyIG9yIG90aGVyIHBhcnR5IGhh +cyBiZWVuIGFkdmlzZWQgb2YgdGhlCnBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy59CgpcZW5k +e2VudW1lcmF0ZX0KCgpcYmVnaW57Y2VudGVyfQp7XExhcmdlXHNjIEVuZCBvZiBUZXJtcyBhbmQg +Q29uZGl0aW9uc30KXGVuZHtjZW50ZXJ9CgoKXHBhZ2VicmVha1syXQoKXHNlY3Rpb24qe0FwcGVu +ZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXN9CgpJZiB5 +b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdy +ZWF0ZXN0CnBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2 +ZSB0aGlzIGlzIHRvIG1ha2UgaXQKZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVk +aXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UKdGVybXMuCgogIFRvIGRvIHNvLCBhdHRh +Y2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0IHRv +CiAgYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBl +ZmZlY3RpdmVseSBjb252ZXkKICB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBm +aWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQogIGBgY29weXJpZ2h0JycgbGluZSBhbmQgYSBw +b2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KClxiZWdpbntxdW90ZX0K +b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3 +aGF0IGl0IGRvZXMuIFxcCkNvcHlyaWdodCAoQykgeXl5eSAgbmFtZSBvZiBhdXRob3IgXFwKClRo +aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv +b3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp +Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl +ciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy +IHZlcnNpb24uCgpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp +dCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g +dGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg +UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQpHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm +b3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg +R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5v +dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl +IFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuClxlbmR7cXVv +dGV9CgpBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ry +b25pYyBhbmQgcGFwZXIgbWFpbC4KCklmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtl +IGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKd2hlbiBpdCBzdGFydHMgaW4gYW4g +aW50ZXJhY3RpdmUgbW9kZToKClxiZWdpbntxdW90ZX0KR25vbW92aXNpb24gdmVyc2lvbiA2OSwg +Q29weXJpZ2h0IChDKSB5eXl5ICBuYW1lIG9mIGF1dGhvciBcXApHbm9tb3Zpc2lvbiBjb21lcyB3 +aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuIFxc +ClRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1 +dGUgaXQKdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxz +LgpcZW5ke3F1b3RlfQoKClRoZSBoeXBvdGhldGljYWwgY29tbWFuZHMge1x0dCBzaG93IHd9IGFu +ZCB7XHR0IHNob3cgY30gc2hvdWxkIHNob3cgdGhlCmFwcHJvcHJpYXRlIHBhcnRzIG9mIHRoZSBH +ZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMKeW91IHVzZSBt +YXkgYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIHtcdHQgc2hvdyB3fSBhbmQge1x0dCBz +aG93IGN9Owp0aGV5IGNvdWxkIGV2ZW4gYmUgbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLS13 +aGF0ZXZlciBzdWl0cyB5b3VyCnByb2dyYW0uCgpZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1w +bG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgpzY2hvb2wsIGlmIGFu +eSwgdG8gc2lnbiBhIGBgY29weXJpZ2h0IGRpc2NsYWltZXInJyBmb3IgdGhlIHByb2dyYW0sIGlm +Cm5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKClxiZWdpbntx +dW90ZX0KWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRl +cmVzdCBpbiB0aGUgcHJvZ3JhbSBcXApgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMg +YXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4gXFwKCnNpZ25hdHVyZSBvZiBU +eSBDb29uLCAxIEFwcmlsIDE5ODkgXFwKVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKXGVuZHtx +dW90ZX0KCgpUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29y +cG9yYXRpbmcgeW91ciBwcm9ncmFtCmludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3Vy +IHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQptYXkgY29uc2lkZXIgaXQgbW9y +ZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zCndpdGgg +dGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05V +IExpYnJhcnkKR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4K +Cgo= +" ++ Glurf ++ lists:reverse(Glurf++"kalle"). diff --git a/lib/compiler/test/compilation_SUITE_data/nested_tuples_in_case_expr.erl b/lib/compiler/test/compilation_SUITE_data/nested_tuples_in_case_expr.erl new file mode 100644 index 0000000000..62402c10b7 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/nested_tuples_in_case_expr.erl @@ -0,0 +1,36 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2001-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(nested_tuples_in_case_expr). +-export([nested_tuples_in_case_expr/0,t/2]). + +nested_tuples_in_case_expr() -> + ok. + +t(A, B) -> + case {{element(1, A),element(2, B)},{element(2, A),element(2, B)}} of + {Same,Same} -> ok; + {{0,1},{up,X}} -> bar(X); + {_,{X,_}} -> bar(X) + end. + +bar(X) -> X. + + + + diff --git a/lib/compiler/test/compilation_SUITE_data/on_load.erl b/lib/compiler/test/compilation_SUITE_data/on_load.erl new file mode 100644 index 0000000000..92bcf74624 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/on_load.erl @@ -0,0 +1,18 @@ +-module(on_load). +-export([?MODULE/0]). + +-on_load(do_on_load/0). + +%% Only test that the compiler is able to compile a module +%% with an on_load attribute. (There will be more thorough tests +%% of the functionality in code_SUITE in the Kernel application.) + +?MODULE() -> + ok. + +do_on_load() -> + local_function(), + true. + +local_function() -> + ok. diff --git a/lib/compiler/test/compilation_SUITE_data/opt_crash.erl b/lib/compiler/test/compilation_SUITE_data/opt_crash.erl new file mode 100644 index 0000000000..3a1d625c28 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/opt_crash.erl @@ -0,0 +1,65 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(opt_crash). +-export([?MODULE/0,test/0]). + +?MODULE() -> + ok. + +test() -> + URI_Before = + {absoluteURI, + {scheme,fun() -> nil end}, + {'hier-part', + {'net-path', + {srvr, + {userinfo,nil}, + fun() -> nil end}, + nil}, + {'query',nil}}}, + + {absoluteURI, + {scheme,_}, + {'hier-part', + {'net-path', + {srvr, + {userinfo,nil}, + HostportBefore}, + nil}, + {'query',nil}}} = URI_Before, + + %% ... some funky code ommitted, not relevant ... + + {absoluteURI, + {scheme,_}, + {'hier-part', + {'net-path', + {srvr, + {userinfo,nil}, + HostportAfter}, + nil}, + {'query',nil}}} = URI_Before, + %% NOTE: I intended to write URI_After instead of URI_Before + %% but the accident revealed that when you add the line below, + %% it causes internal error in v3_codegen on compilation + {hostport,{hostname,"HostName"},{port,nil}} = HostportAfter, + + ok. + + diff --git a/lib/compiler/test/compilation_SUITE_data/other/vsn_1.erl b/lib/compiler/test/compilation_SUITE_data/other/vsn_1.erl new file mode 100644 index 0000000000..7cb0778b95 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/other/vsn_1.erl @@ -0,0 +1,19 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(vsn_1). diff --git a/lib/compiler/test/compilation_SUITE_data/other/vsn_3.erl b/lib/compiler/test/compilation_SUITE_data/other/vsn_3.erl new file mode 100644 index 0000000000..3870e0704d --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/other/vsn_3.erl @@ -0,0 +1,24 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(vsn_3). + +-export([f/1]). + +f(X) -> + 2*X. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2141.erl b/lib/compiler/test/compilation_SUITE_data/otp_2141.erl new file mode 100644 index 0000000000..3e766546be --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_2141.erl @@ -0,0 +1,24 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_2141). +-export([otp_2141/0]). + + +otp_2141() -> + ok. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2173.erl b/lib/compiler/test/compilation_SUITE_data/otp_2173.erl new file mode 100644 index 0000000000..7e9d4c417b --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_2173.erl @@ -0,0 +1,31 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_2173). +-compile(export_all). + +-record(t, {a = fun(X) -> X*X end}). + +otp_2173() -> + ok. + +t() -> + #t{}. + + + diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2330.erl b/lib/compiler/test/compilation_SUITE_data/otp_2330.erl new file mode 100644 index 0000000000..f5f6717968 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_2330.erl @@ -0,0 +1,35 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_2330). +-export([otp_2330/0, handle_interface/1]). + +otp_2330() -> + ok. + +handle_interface(Data)-> + Ctrl = 1, + case Data of + ok -> + case Ctrl of + [Viar]->integer_to_list(Viar); + _ -> [] + + end + end. + diff --git a/lib/compiler/test/compilation_SUITE_data/otp_2380.erl b/lib/compiler/test/compilation_SUITE_data/otp_2380.erl new file mode 100644 index 0000000000..db2028b347 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_2380.erl @@ -0,0 +1,36 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1998-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_2380). +-export([test/0, otp_2380/0]). + +otp_2380() -> + ok. + +-define(FUNC(Name), + case Name of + dpCh -> 5; + dpEvent -> 1; + dpc -> 4; + dpFm -> 6; + dpFm1 -> 6; + _ -> false + end). + +test() -> + N = ?FUNC(dpCh). diff --git a/lib/compiler/test/compilation_SUITE_data/otp_4790.erl b/lib/compiler/test/compilation_SUITE_data/otp_4790.erl new file mode 100644 index 0000000000..130ee44e80 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_4790.erl @@ -0,0 +1,63 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2003-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_4790). + +-export([?MODULE/0]). + +?MODULE() -> + pan_test(). + + +% --------------------------- OTP Ticket -------------------------------- +% *Id: OTP-4790 +% *Notes: In the code below, the compiler incorrectly assumes +% wings_pref:get_value(pan_speed) returns a float, +% causing a crash at run-time. + +% The same error could cause tuple tests to be removed, +% but that would propbably only cause a crash if the +% Erlang code was incorrect or if it depended on a catch +% to catch exceptions. Therefore, I consider it unlikely +% that Erlang programs that don't use floating point +% arithmetic are likely to be bitten by this bug. +% ----------------------------------------------------------------------- + +-record(view, {pan_x,pan_y,distance}). + +pan_test() -> + pan(13, 3). + +pan(Dx0, Dy0) -> + #view{pan_x=PanX0,pan_y=PanY0,distance=D} = View = current(), + S = D*(1/8)/(51-pref_get_value(pan_speed)), + Dx = Dx0*S, + Dy = Dy0*S, + PanX = PanX0 + Dx, + PanY = PanY0 - Dy, + set_current(View#view{pan_x=PanX,pan_y=PanY}). + +current() -> + #view{pan_x=2.0,pan_y=9.75,distance=25.3}. + +set_current(#view{pan_x=X,pan_y=Y,distance=D}) + when is_float(X), is_float(Y), is_float(D) -> + io:format("X=~p Y=~p D=~p\n", [X,Y,D]). + +pref_get_value(pan_speed) -> + 32. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5076.erl b/lib/compiler/test/compilation_SUITE_data/otp_5076.erl new file mode 100644 index 0000000000..f05a4e1148 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5076.erl @@ -0,0 +1,27 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5076). +-export([?MODULE/0]). + +?MODULE() -> + [] = t(), + ok. + +t() -> + [3 || {3=4} <- []]. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5092.erl b/lib/compiler/test/compilation_SUITE_data/otp_5092.erl new file mode 100644 index 0000000000..e445e5e1e9 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5092.erl @@ -0,0 +1,39 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5092). +-export([?MODULE/0]). + +?MODULE() -> + [] = t(), + [] = t2(), + [t] = t4(), + [] = t5(), + ok. + +t() -> + [t || {C=D}={_,_} <- []]. + +t2() -> + [X || {X,{Y}={X,X}} <- []]. + +t4() -> + [t || "a"++"b" = "ab" <- ["ab"]]. + +t5() -> + [{X,Y} || {X} <- [], begin Y = X, Y =:= X end]. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5151.erl b/lib/compiler/test/compilation_SUITE_data/otp_5151.erl new file mode 100644 index 0000000000..2dccb979df --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5151.erl @@ -0,0 +1,61 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5151). + +-export([?MODULE/0]). +-export([read_variables/1,read_variables_1/1,read_variables_2/1, + read_variables_3/1,read_variables_4/1]). + +?MODULE() -> + ok. + +read_variables(Name) -> + case file:consult(Name) of + {ok,Vars} -> Vars; + {error,Reason} -> + erlang:error({bad_installation,file:format_error(Reason)}, [Name]) + end. + +read_variables_1(Name) -> + case file:consult(Name) of + {ok,Vars} -> Vars; + {error,Reason} -> + erlang:error({bad_installation,file:format_error(Reason)}) + end. + +read_variables_2(Name) -> + case file:consult(Name) of + {ok,Vars} -> Vars; + {error,Reason} -> + erlang:error({bad_installation,file:format_error(Reason)}, [Name]) + end. + +read_variables_3(Name) -> + case file:consult(Name) of + {ok,Vars} -> Vars; + {error,Reason} -> + erlang:error({bad_installation,file:format_error(Reason)}) + end. + +read_variables_4(Name) -> + case file:consult(Name) of + {ok,Vars} -> Vars; + {error,Reason} -> + exit({bad_installation,file:format_error(Reason)}) + end. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5235.erl b/lib/compiler/test/compilation_SUITE_data/otp_5235.erl new file mode 100644 index 0000000000..1c918cdf9d --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5235.erl @@ -0,0 +1,84 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5235). +-export([?MODULE/0]). + +-record(commit, {node, + decision, % presume_commit | Decision + ram_copies = [], + disc_copies = [], + disc_only_copies = [], + snmp = [], + schema_ops = [self(),make_ref()] + }). + +?MODULE() -> + process_flag(trap_exit, true), + N = 1024, + clone(N), + wait(N). + +wait(0) -> ok; +wait(N) -> + receive + {'EXIT',_,normal} -> + wait(N-1); + Other -> + exit(Other) + end. + +clone(0) -> ok; +clone(N) -> + spawn_link(fun worker/0), + clone(N-1). + +worker() -> + Seq = lists:seq(1, 10), + PidList = [{N,self()} || N <- Seq], + Commit = #commit{ram_copies=PidList,disc_copies=[], + disc_only_copies=[],snmp=[]}, + List = lists:duplicate(2, Commit), + verify(run(2, List)). + +verify([#commit{node=true,ram_copies=L}|T]) -> + verify_1(L, 1), + verify(T); +verify([]) -> ok. + +verify_1([{N,Pid}|T], N) when Pid =:= self() -> + verify_1(T, N+1); +verify_1([], _) -> ok. + +run(0, L) -> L; +run(N, L) -> run(N-1, reverse(L)). + +reverse([]) -> []; +reverse([H|R]) when record(H, commit) -> + [H#commit{ + ram_copies = lists:reverse(H#commit.ram_copies), + disc_copies = lists:reverse(H#commit.disc_copies), + disc_only_copies = lists:reverse(H#commit.disc_only_copies), + snmp = lists:reverse(H#commit.snmp), + node = erlang:yield() + } + | reverse(R)]. + + + + diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5244.erl b/lib/compiler/test/compilation_SUITE_data/otp_5244.erl new file mode 100644 index 0000000000..30849c6b5e --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5244.erl @@ -0,0 +1,47 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5244). +-export([?MODULE/0]). + +?MODULE() -> + L = [{stretch,0,0}, + {bad,[]}, + {bad,atom}, + {bad,0}, + {bad,16#AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA}, + {bad,16#555555555555555555555555555555555555555555555555555}], + remove_failure(L, unit, 0). + +remove_failure([], _Unit, _MaxFailure) -> + ok; +remove_failure([{bad,Bad}|_], _Unit, _MaxFailure) -> + Bad; +remove_failure([{stretch,_,Mi}=Stretch | Specs], Unit, _MaxFailure) -> + {MinMax,NewMaxFailure} = max_failure(), + case {MinMax,remove_failure(Specs, Unit, NewMaxFailure)} of + {min,{NewMaxFailure,Rest}} -> + {done,[{fixed,Mi} | Rest]}; + {min,_} when Specs =/= [] -> + remove_failure([Stretch|tl(Specs)], Unit, NewMaxFailure); + {min,_} -> + ok + end. + +max_failure() -> + {min,1}. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5404.erl b/lib/compiler/test/compilation_SUITE_data/otp_5404.erl new file mode 100644 index 0000000000..2de147c082 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5404.erl @@ -0,0 +1,51 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5404). +-compile(export_all). + +%% Thanks to Martin Bjorklund. + +?MODULE() -> + ok. + +-record(bar, {status, vs = []}). + +y() -> + x({foo, 1, []}). + +get_bar() -> + #bar{status = 1}. + +x(Trans) -> + {foo, Barno, _} = Trans, + case get_bar() of + Bar when Bar#bar.status /= 2 -> + if 1 == 1 -> + mnesia:dirty_delete({bar, Barno}), + Vs = [1,2] ++ Bar#bar.vs, + Bar33 = Bar#bar{status = 1}, + Bar1 = Bar#bar{status = 3, + vs = Vs}, + [{payment, Barno}]; + true -> + Barno + end; + _ -> + Trans + end. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5436.erl b/lib/compiler/test/compilation_SUITE_data/otp_5436.erl new file mode 100644 index 0000000000..4df8d50647 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5436.erl @@ -0,0 +1,201 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5436). +-compile(export_all). + +?MODULE() -> + ok. + +-record(readerState, {action_index, + log_index, + log_name, + time_period, + rec_id_period, + result_format, + action_status, + filter_type, + event_list, + sender_list, + read_status}). + +handle_call(delete,_From,State) -> + case catch debug:filter(console,logReader) of + true -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,306,console,self(),sysAssert:format_time2(erlang:now())])|"delete, State: ~p ~n"],[State]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["delete, State: ~p ~n",[State]]), + ok + end; + false -> + disabled; + {'EXIT',{undef,_}} -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,306,console,self(),sysAssert:format_time2(erlang:now())])|"delete, State: ~p ~n"],[State]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["delete, State: ~p ~n",[State]]), + ok + end; + {'EXIT',_} -> + debug:filter(console,logReader); + _ -> + exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}}) + end, + ?MODULE:clean_result(State), + {stop,normal,ok,State}; +handle_call(die,_,State) -> + {stop,normal,ok,State}; +handle_call(_Action,_From,#readerState{action_status = 2} = State) -> + {reply,error,State}; +handle_call(update_action_attr,_From,State) -> + NewState = ?MODULE:handle_update_action_attr(State), + case catch debug:filter(console,logReader) of + true -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,317,console,self(),sysAssert:format_time2(erlang:now())])|"update_action_attr, State: ~p ~n"],[NewState]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["update_action_attr, State: ~p ~n",[NewState]]), + ok + end; + false -> + disabled; + {'EXIT',{undef,_}} -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,317,console,self(),sysAssert:format_time2(erlang:now())])|"update_action_attr, State: ~p ~n"],[NewState]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["update_action_attr, State: ~p ~n",[NewState]]), + ok + end; + {'EXIT',_} -> + debug:filter(console,logReader); + _ -> + exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}}) + end, + {reply,ok,NewState}; +handle_call(update_event_filter,_From,State) -> + NewState = State#readerState{event_list = ?MODULE:get_event_list(State#readerState.action_index)}, + case catch debug:filter(console,logReader) of + true -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,323,console,self(),sysAssert:format_time2(erlang:now())])|"update_event_filter, State: ~p ~n"],[NewState]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["update_event_filter, State: ~p ~n",[NewState]]), + ok + end; + false -> + disabled; + {'EXIT',{undef,_}} -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,323,console,self(),sysAssert:format_time2(erlang:now())])|"update_event_filter, State: ~p ~n"],[NewState]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["update_event_filter, State: ~p ~n",[NewState]]), + ok + end; + {'EXIT',_} -> + debug:filter(console,logReader); + _ -> + exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}}) + end, + {reply,ok,NewState}; +handle_call(update_sender_filter,_From,State) -> + NewState = State#readerState{sender_list = ?MODULE:get_sender_list(State#readerState.action_index)}, + case catch debug:filter(console,logReader) of + true -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,329,console,self(),sysAssert:format_time2(erlang:now())])|"update_sender_filter, State: ~p ~n"],[NewState]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["update_sender_filter, State: ~p ~n",[NewState]]), + ok + end; + false -> + disabled; + {'EXIT',{undef,_}} -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,329,console,self(),sysAssert:format_time2(erlang:now())])|"update_sender_filter, State: ~p ~n"],[NewState]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["update_sender_filter, State: ~p ~n",[NewState]]), + ok + end; + {'EXIT',_} -> + debug:filter(console,logReader); + _ -> + exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}}) + end, + {reply,ok,NewState}; +handle_call(Request,_From,State) -> + case catch debug:filter(console,logReader) of + true -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,332,console,self(),sysAssert:format_time2(erlang:now())])|"Call ~p, State: ~p ~n"],[Request,State]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["Call ~p, State: ~p ~n",[Request,State]]), + ok + end; + false -> + disabled; + {'EXIT',{undef,_}} -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,332,console,self(),sysAssert:format_time2(erlang:now())])|"Call ~p, State: ~p ~n"],[Request,State]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["Call ~p, State: ~p ~n",[Request,State]]), + ok + end; + {'EXIT',_} -> + debug:filter(console,logReader); + _ -> + exit({badmatch,{{debug,filter,[console,logReader]},debug:filter(console,logReader)}}) + end, + {stop,{error,unknown,Request},State}. + +handle_info(Request,State) -> + case catch debug:filter(readlog,logReader) of + true -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,345,readlog,self(),sysAssert:format_time2(erlang:now())])|"Info ~p, State: ~p ~n"],[Request,State]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["Info ~p, State: ~p ~n",[Request,State]]), + ok + end; + false -> + disabled; + {'EXIT',{undef,_}} -> + case io:format([io_lib:format("~nSYS_DBG {~p,~p,~p}, ~w ~s:~n-- ",[logReader,345,readlog,self(),sysAssert:format_time2(erlang:now())])|"Info ~p, State: ~p ~n"],[Request,State]) of + ok -> + ok; + _ -> + io:format("*** Bad format (~p, ~p) ***~n",["Info ~p, State: ~p ~n",[Request,State]]), + ok + end; + {'EXIT',_} -> + debug:filter(readlog,logReader); + _ -> + exit({badmatch,{{debug,filter,[readlog,logReader]},debug:filter(readlog,logReader)}}) + end, + {stop,{error,unknown,Request},State}. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5481.erl b/lib/compiler/test/compilation_SUITE_data/otp_5481.erl new file mode 100644 index 0000000000..5cf114ac4e --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5481.erl @@ -0,0 +1,527 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5481). + +-export([?MODULE/0,encode_cc_clpn/1,get_oper_status/2,foo/0]). + +?MODULE() -> + ok. + +-record(pchVp, {vplEntry, + vplLastChange, + vplReceiveTrafficDescrIndex = 0, + vplTransmitTrafficDescrIndex = 0, + vplConnId, + vplGroupShapingId}). + +-record(pchVc, {vclEntry, + vclLastChange, + vplConnId, + vclConnId, + vclShapingMode = 1}). +-record(spvcVpc, {spvcVpcEntry, + currentState, + spvcRerCap = false, + spvcRerStatus = false}). +-record(spvcVpcPerm, {spvcVpcEntry, + spvcVpcTargetAddress, + spvcVpcTargetSelectType, + spvcVpcUserName, + spvcVpcProviderName, + spvcVpcApplication}). +-record(spvcVcc, {spvcVccEntry, + spvcVccTargetAddress, + spvcVccTargetSelectType, + spvcVccTargetVpi, + spvcVccApplication, + spvcVccFrKey, + spvcVccTranslationMode, + spvcRerCap = false, + currentState, + spvcRerStatus = false}). +-record(spvcVccPerm, {spvcVccEntry, + spvcVccTargetAddress, + spvcVccTargetSelectType, + spvcVccTargetVpi, + spvcVccTargetType, + spvcVccApplication, + spvcVccFrKey, + spvcVccTranslationMode = 2}). +-record(spvcObj, {spvcEntry, + spvcTargetAddress, + spvcTargetSelectType, + spvcTargetVpi, + spvcTargetVci, + spvcLastReleaseCause, + spvcLastReleaseDiagnostic, + spvcRetryInterval = 1000, + spvcRetryTimer = 0, + spvcRetryThreshold = 1, + spvcRetryFailures = 0, + spvcRetryLimit = 15, + spvcFrKey, + spvcVccTranslationMode = 2, + spvcRerCap = false, + spvcRerStatus = false}). +-record(spvcTargetVc, {entry, + userName = [], + providerName = [], + opState, + rowStatus}). + +-record(spvcTargetVp, {entry, + userName = [], + providerName = [], + opState, + rowStatus}). + +-record(spvcFr, {spvcFrEntry, + spvcFrAtmEntry, + spvcFrTargetAddress, + spvcFrTargetSelectType, + spvcFrProviderName, + currentState}). + +-record(spvcFrPerm, {spvcFrEntry, + spvcFrAtmEntry, + spvcFrAtmTranslation, + spvcFrAdminStatus, + spvcFrConnect}). + +-record(hci_clpn, {hci_pci, + hci_type_of_number, + hci_numbering_plan_indicator, + hci_presentation_indicator, + hci_screening_indicator, + hci_number_digits, + hci_incomplete_indicator = 0, + hci_binary}). + +encode_cc_clpn(Spvc) when Spvc#spvcObj.spvcFrKey == undefined -> + If = case Spvc of + Spvc when record(Spvc,spvcObj) -> + case Spvc#spvcObj.spvcEntry of + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value + end; + Spvc when record(Spvc,spvcVcc) -> + {If_Value,_,_,_} = Spvc#spvcVcc.spvcVccEntry, + If_Value; + Spvc when record(Spvc,spvcVpc) -> + {If_Value,_,_} = Spvc#spvcVpc.spvcVpcEntry, + If_Value; + Spvc when record(Spvc,spvcVpcPerm) -> + {If_Value,_,_} = Spvc#spvcVpcPerm.spvcVpcEntry, + If_Value; + Spvc when record(Spvc,spvcVccPerm) -> + {If_Value,_,_,_} = Spvc#spvcVccPerm.spvcVccEntry, + If_Value; + Spvc when record(Spvc,spvcTargetVc) -> + {If_Value,_,_} = Spvc#spvcTargetVc.entry, + If_Value; + Spvc when record(Spvc,spvcTargetVp) -> + {If_Value,_} = Spvc#spvcTargetVp.entry, + If_Value; + Spvc when record(Spvc,pchVc) -> + {If_Value,_,_} = Spvc#pchVc.vclEntry, + If_Value; + Spvc when record(Spvc,pchVp) -> + {If_Value,_} = Spvc#pchVp.vplEntry, + If_Value; + Spvc when record(Spvc,spvcFr) -> + {If_Value,_} = Spvc#spvcFr.spvcFrEntry, + If_Value; + Spvc when record(Spvc,spvcFrPerm) -> + {If_Value,_} = Spvc#spvcFrPerm.spvcFrEntry, + If_Value; + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value; + {If_Value,_} -> + If_Value; + [If_Value|_] -> + If_Value; + _ -> + error + end, + Col = [2], + SpvcAddress = case x:x(get_next,[If],Col) of + [{[2,If,20|Address],_}] -> + Address; + _ -> + lists:duplicate(20,0) + end, + #hci_clpn{hci_type_of_number = 0, + hci_numbering_plan_indicator = 2, + hci_presentation_indicator = 0, + hci_screening_indicator = 1, + hci_number_digits = SpvcAddress}; +encode_cc_clpn(Spvc) -> + {If,_} = Spvc#spvcObj.spvcFrKey, + Col = [4], + SpvcFrAddress = case x:x(get_next,[If],Col) of + [{[4,If,20|Address],_}] -> + Address; + _ -> + lists:duplicate(20,0) + end, + #hci_clpn{hci_type_of_number = 0, + hci_numbering_plan_indicator = 2, + hci_presentation_indicator = 0, + hci_screening_indicator = 1, + hci_number_digits = SpvcFrAddress}. + + + +get_oper_status(spvcVpc,Obj) when record(Obj,spvcVpc) -> + State = Obj#spvcVpc.currentState, + LinkState = get_link_opstate(case Obj of + Obj when record(Obj,spvcObj) -> + case Obj#spvcObj.spvcEntry of + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value + end; + Obj when record(Obj,spvcVcc) -> + {If_Value,_,_,_} = +Obj#spvcVcc.spvcVccEntry, + If_Value; + Obj when record(Obj,spvcVpc) -> + {If_Value,_,_} = Obj#spvcVpc.spvcVpcEntry, + If_Value; + Obj when record(Obj,spvcVpcPerm) -> + {If_Value,_,_} = +Obj#spvcVpcPerm.spvcVpcEntry, + If_Value; + Obj when record(Obj,spvcVccPerm) -> + {If_Value,_,_,_} = +Obj#spvcVccPerm.spvcVccEntry, + If_Value; + Obj when record(Obj,spvcTargetVc) -> + {If_Value,_,_} = Obj#spvcTargetVc.entry, + If_Value; + Obj when record(Obj,spvcTargetVp) -> + {If_Value,_} = Obj#spvcTargetVp.entry, + If_Value; + Obj when record(Obj,pchVc) -> + {If_Value,_,_} = Obj#pchVc.vclEntry, + If_Value; + Obj when record(Obj,pchVp) -> + {If_Value,_} = Obj#pchVp.vplEntry, + If_Value; + Obj when record(Obj,spvcFr) -> + {If_Value,_} = Obj#spvcFr.spvcFrEntry, + If_Value; + Obj when record(Obj,spvcFrPerm) -> + {If_Value,_} = Obj#spvcFrPerm.spvcFrEntry, + If_Value; + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value; + {If_Value,_} -> + If_Value; + [If_Value|_] -> + If_Value; + _ -> + error + end), + debug_disabled, + case {State,LinkState} of + {not_in_service,_} -> + 10; + {created,_} -> + 10; + {_,disabled} -> + 6; + {wait,_} -> + 2; + {outgoing_callproceeding,_} -> + 2; + {release_at_restart,_} -> + 2; + {active,_} -> + 3; + {rest_in_peace,_} -> + 4; + {_Other,_} -> + 1 + end; +get_oper_status(spvcVpc,_) -> + debug_disabled, + 1; +get_oper_status(spvcVcc,Obj) when record(Obj,spvcVcc) -> + State = Obj#spvcVcc.currentState, + LinkState = get_link_opstate(case Obj of + Obj when record(Obj,spvcObj) -> + case Obj#spvcObj.spvcEntry of + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value + end; + Obj when record(Obj,spvcVcc) -> + {If_Value,_,_,_} = +Obj#spvcVcc.spvcVccEntry, + If_Value; + Obj when record(Obj,spvcVpc) -> + {If_Value,_,_} = Obj#spvcVpc.spvcVpcEntry, + If_Value; + Obj when record(Obj,spvcVpcPerm) -> + {If_Value,_,_} = +Obj#spvcVpcPerm.spvcVpcEntry, + If_Value; + Obj when record(Obj,spvcVccPerm) -> + {If_Value,_,_,_} = +Obj#spvcVccPerm.spvcVccEntry, + If_Value; + Obj when record(Obj,spvcTargetVc) -> + {If_Value,_,_} = Obj#spvcTargetVc.entry, + If_Value; + Obj when record(Obj,spvcTargetVp) -> + {If_Value,_} = Obj#spvcTargetVp.entry, + If_Value; + Obj when record(Obj,pchVc) -> + {If_Value,_,_} = Obj#pchVc.vclEntry, + If_Value; + Obj when record(Obj,pchVp) -> + {If_Value,_} = Obj#pchVp.vplEntry, + If_Value; + Obj when record(Obj,spvcFr) -> + {If_Value,_} = Obj#spvcFr.spvcFrEntry, + If_Value; + Obj when record(Obj,spvcFrPerm) -> + {If_Value,_} = Obj#spvcFrPerm.spvcFrEntry, + If_Value; + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value; + {If_Value,_} -> + If_Value; + [If_Value|_] -> + If_Value; + _ -> + error + end), + debug_disabled, + case {State,LinkState} of + {not_in_service,_} -> + 10; + {created,_} -> + 10; + {_,disabled} -> + 6; + {wait,_} -> + 2; + {outgoing_callproceeding,_} -> + 2; + {release_at_restart,_} -> + 2; + {active,_} -> + 3; + {rest_in_peace,_} -> + 4; + {_Other,_} -> + 1 + end; +get_oper_status(spvcVcc,_) -> + debug_disabled, + 1; +get_oper_status(spvcTargetVp,Obj) when record(Obj,spvcTargetVp) -> + debug_disabled, + Key = Obj#spvcTargetVp.entry, + case get_link_opstate(case Key of + Key when record(Key,spvcObj) -> + case Key#spvcObj.spvcEntry of + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value + end; + Key when record(Key,spvcVcc) -> + {If_Value,_,_,_} = Key#spvcVcc.spvcVccEntry, + If_Value; + Key when record(Key,spvcVpc) -> + {If_Value,_,_} = Key#spvcVpc.spvcVpcEntry, + If_Value; + Key when record(Key,spvcVpcPerm) -> + {If_Value,_,_} = Key#spvcVpcPerm.spvcVpcEntry, + If_Value; + Key when record(Key,spvcVccPerm) -> + {If_Value,_,_,_} = Key#spvcVccPerm.spvcVccEntry, + If_Value; + Key when record(Key,spvcTargetVc) -> + {If_Value,_,_} = Key#spvcTargetVc.entry, + If_Value; + Key when record(Key,spvcTargetVp) -> + {If_Value,_} = Key#spvcTargetVp.entry, + If_Value; + Key when record(Key,pchVc) -> + {If_Value,_,_} = Key#pchVc.vclEntry, + If_Value; + Key when record(Key,pchVp) -> + {If_Value,_} = Key#pchVp.vplEntry, + If_Value; + Key when record(Key,spvcFr) -> + {If_Value,_} = Key#spvcFr.spvcFrEntry, + If_Value; + Key when record(Key,spvcFrPerm) -> + {If_Value,_} = Key#spvcFrPerm.spvcFrEntry, + If_Value; + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value; + {If_Value,_} -> + If_Value; + [If_Value|_] -> + If_Value; + _ -> + error + end) of + disabled -> + debug_disabled, + 4; + enabled -> + debug_disabled, + case (x:x({pchVp,Key}))#pchVp.vplConnId of + undefined -> + debug_disabled, + 3; + _ -> + debug_disabled, + 2 + end + end; +get_oper_status(spvcTargetVp,_) -> + debug_disabled, + 1; +get_oper_status(spvcTargetVc,Obj) when record(Obj,spvcTargetVc) -> + debug_disabled, + Key = Obj#spvcTargetVc.entry, + case get_link_opstate(case Key of + Key when record(Key,spvcObj) -> + case Key#spvcObj.spvcEntry of + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value + end; + Key when record(Key,spvcVcc) -> + {If_Value,_,_,_} = Key#spvcVcc.spvcVccEntry, + If_Value; + Key when record(Key,spvcVpc) -> + {If_Value,_,_} = Key#spvcVpc.spvcVpcEntry, + If_Value; + Key when record(Key,spvcVpcPerm) -> + {If_Value,_,_} = Key#spvcVpcPerm.spvcVpcEntry, + If_Value; + Key when record(Key,spvcVccPerm) -> + {If_Value,_,_,_} = Key#spvcVccPerm.spvcVccEntry, + If_Value; + Key when record(Key,spvcTargetVc) -> + {If_Value,_,_} = Key#spvcTargetVc.entry, + If_Value; + Key when record(Key,spvcTargetVp) -> + {If_Value,_} = Key#spvcTargetVp.entry, + If_Value; + Key when record(Key,pchVc) -> + {If_Value,_,_} = Key#pchVc.vclEntry, + If_Value; + Key when record(Key,pchVp) -> + {If_Value,_} = Key#pchVp.vplEntry, + If_Value; + Key when record(Key,spvcFr) -> + {If_Value,_} = Key#spvcFr.spvcFrEntry, + If_Value; + Key when record(Key,spvcFrPerm) -> + {If_Value,_} = Key#spvcFrPerm.spvcFrEntry, + If_Value; + {If_Value,_,_,_} -> + If_Value; + {If_Value,_,_} -> + If_Value; + {If_Value,_} -> + If_Value; + [If_Value|_] -> + If_Value; + _ -> + error + end) of + disabled -> + debug_disabled, + 4; + enabled -> + debug_disabled, + case (x:x({pchVc,Key}))#pchVc.vclConnId of + undefined -> + debug_disabled, + 3; + _ -> + debug_disabled, + 2 + end + end; +get_oper_status(spvcTargetVc,_) -> + debug_disabled, + 1. + +get_link_opstate(If) -> + debug_disabled, + case x:x(x:x(If),cnhChi,get_link_opstate,[If]) of + {genError,_} -> + debug_disabled, + disabled; + Return -> + debug_disabled, + Return + end. + +-record(record_A,{ + field_1, + field_2, + field_3, + field_4, + field_5 + }). +-record(record_B, { field_1 }). +-record(record_C, { }). + +foo() -> + case something of + [#record_A{} = A] -> + B = foo3(#record_C{}), + C = element(B, A), + foo2(A), + D = C#record_B.field_1, + foo4(A#record_A.field_4, + B, + #record_C{}, + D) + end. + +foo2(_) -> ok. +foo3(_) -> 1. +foo4(_,_,_,_) -> ok. + diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5553.erl b/lib/compiler/test/compilation_SUITE_data/otp_5553.erl new file mode 100644 index 0000000000..9a7004a980 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5553.erl @@ -0,0 +1,82 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5553). + +-export([?MODULE/0,test/0,handle_cast/2]). + +?MODULE() -> + ok. + +split_quoted_string([34 | _Rest]) -> %% 34 is '"' + ok. + +test() -> + %% does not start with quote + io:format("test: split_quoted_string/1 - 5~n"), + try split_quoted_string("foo \"bar\"") of + SQS_Res5 -> throw({error, test_case_failed, SQS_Res5}) + catch + error: does_not_start_with_quote -> ok + end, + + %% no ending quote + io:format("test: split_quoted_string/1 - 6~n"), + try split_quoted_string("\"foo ") of + SQS_Res6 -> throw({error, test_case_failed, SQS_Res6}) + catch + error: no_end_quote -> ok + end, + + ok. + +test2() -> + try split_quoted_string("") of + SQS_Res5 -> throw({error, test_case_failed, SQS_Res5}) + catch + error: does_not_start_with_quote -> ok + after + ok + end, + try split_quoted_string("") of + SQS_Res6 -> throw({error, test_case_failed, SQS_Res6}) + catch + error: no_end_quote -> ok + after + ok + end, + ok. + +-record(state, {connect_all, known = [], synced = [], + lockers = [], syncers = [], node_name = node(), + the_locker, the_deleter}). + +handle_cast({in_sync, Node, IsKnown}, S) -> + NewS = cancel_locker(Node, S, get({sync_tag_my, Node})), + NKnown = case lists:member(Node, Known = NewS#state.known) of + false when IsKnown == true -> +1/0, + gen_server:cast({global_name_server, Node}, + {in_sync, node(), false}), + [Node | Known]; + _ -> + Known + end. + +cancel_locker(Node, S, Tag) -> + ok. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5632.erl b/lib/compiler/test/compilation_SUITE_data/otp_5632.erl new file mode 100644 index 0000000000..ebf8e47ca2 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5632.erl @@ -0,0 +1,230 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5632). +-export([?MODULE/0]). +-export([pstnproxy_add_headers/2,macosx_workaround/0,fast_cut/3,test/1,test2/1, + create_int_jumper_cables/1]). + +-import(lists, [foldl/3,last/1,member/2,reverse/1,reverse/2,seq/2,sort/1]). + +?MODULE() -> + ok. + +-record(request, { + header + }). + + +-record(siporigin, { + proto + }). + + +%% Test a problem in beam_jump.erl. +pstnproxy_add_headers(Request, Origin) when is_record(Request, request), + is_record(Origin, siporigin) -> + NewHeaders1 = Request#request.header, + NewHeaders2 = + case (Origin#siporigin.proto == tls) or (Origin#siporigin.proto == tls6) of + true -> + keylist:delete("X-Foo2", NewHeaders1); + false -> + keylist:delete("X-Foo2", NewHeaders1) + end, + NewHeaders3 = + case (Origin#siporigin.proto == tls) or (Origin#siporigin.proto == tls6) of + true -> + keylist:delete("X-Foo3", NewHeaders2); + false -> + keylist:delete("X-Foo3", NewHeaders2) + end, + Request#request{header = NewHeaders3}. + +%% Test a problem in beam_validator.erl. +macosx_workaround() -> + try 1.0/zero() + catch + error:_ -> ok + end. + +zero() -> 0.0. + +-record(we, {id, + perm = 0, + name, + es, + fs, + he, + vc, + vp, + mat = default, + next_id, + mode, + mirror = none, + light = none, + has_shape = true}). + +-record(edge, {vs, + ve, + a = none, + b = none, + lf, + rf, + ltpr, + ltsu, + rtpr, + rtsu}). + + +fast_cut(Edge,Pos0,We0) -> + {NewEdge = NewV,We} = wings_we:new_ids(1,We0), + #we{es = Etab0, + vc = Vct0, + vp = Vtab0, + he = Htab0} = We, + Template = gb_trees:get(Edge,Etab0), + #edge{vs = Vstart, + ve = Vend, + a = ACol, + b = BCol, + lf = Lf, + rf = Rf, + ltpr = EdgeA, + rtsu = EdgeB, + rtpr = NextBCol} = Template, + VendPos = gb_trees:get(Vend,Vtab0), + Vct1 = gb_trees:update(Vend,NewEdge,Vct0), + VstartPos = wings_vertex:pos(Vstart,Vtab0), + if + Pos0 =:= default -> + NewVPos0 = e3d_vec:average([VstartPos,VendPos]); + true -> + NewVPos0 = Pos0 + end, + NewVPos = wings_util:share(NewVPos0), + Vct = gb_trees:insert(NewV,NewEdge,Vct1), + Vtab = gb_trees:insert(NewV,NewVPos,Vtab0), + AColOther = ?MODULE:get_vtx_color(EdgeA,Lf,Etab0), + BColOther = ?MODULE:get_vtx_color(NextBCol,Rf,Etab0), + Weight = if + Pos0 == default -> + 0.500000; + true -> + ADist = e3d_vec:dist(Pos0,VstartPos), + BDist = e3d_vec:dist(Pos0,VendPos), + try + ADist / (ADist + BDist) + catch + error:badarith -> + 0.500000 + end + end, + NewColA = wings_color:mix(Weight,AColOther,ACol), + NewColB = wings_color:mix(Weight,BCol,BColOther), + NewEdgeRec = Template#edge{vs = NewV, + a = NewColA, + ltsu = Edge, + rtpr = Edge}, + Etab1 = gb_trees:insert(NewEdge,NewEdgeRec,Etab0), + Etab2 = ?MODULE:patch_edge(EdgeA,NewEdge,Edge,Etab1), + Etab3 = ?MODULE:patch_edge(EdgeB,NewEdge,Edge,Etab2), + EdgeRec = Template#edge{ve = NewV, + b = NewColB, + rtsu = NewEdge, + ltpr = NewEdge}, + Etab = gb_trees:update(Edge,EdgeRec,Etab3), + Htab = case gb_sets:is_member(Edge,Htab0) of + false -> + Htab0; + true -> + gb_sets:insert(NewEdge,Htab0) + end, + {We#we{es = Etab, + vc = Vct, + vp = Vtab, + he = Htab},NewV}. + +%% A problem in beam_bool. + +-record(a, {a,b,c}). + +test(As) -> + case As of + A when A#a.b == []; A#a.b == undefined -> + true; + _ -> + false + end. + +test2(As) -> + case As of + A when A#a.b == {a,b,c}; A#a.b == undefined -> + true; + _ -> + false + end. + +%% Record updating problems. + +-record(int_jumper_cable, {id, + connectionFieldRef, + aiuPlugInUnitRef, + connFieldConnector, + aiuConnector, + dlAttenuation = 1, + ulAttenuation = 1, + electricalDlDelay = 100, + electricalUlDelay = 100, + optionals = []}). + +create_int_jumper_cables(_Config) -> + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},637}), + ct:comment("Create IntJumperCable MO"), + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},639}), + Parent = "ManagedElement=1,Equipment=1", + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},641}), + I1 = #int_jumper_cable{id = 1, + connectionFieldRef = Parent ++ ",ConnectionField=1", + aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=6,PlugInUnit=1", + connFieldConnector = "J1", + aiuConnector = 1}, + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},650}), + I2 = I1#int_jumper_cable{id = 2, + connFieldConnector = "H1", + aiuConnector = 2}, + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},657}), + I3 = I1#int_jumper_cable{id = 3, + aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=9,PlugInUnit=1", + connFieldConnector = "J2"}, + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},663}), + I4 = I3#int_jumper_cable{id = 4, + connFieldConnector = "H2", + aiuConnector = 2}, + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},670}), + I5 = I1#int_jumper_cable{id = 5, + aiuPlugInUnitRef = Parent ++ ",Subrack=2,Slot=12,PlugInUnit=1", + connFieldConnector = "J3"}, + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},677}), + I6 = I5#int_jumper_cable{id = 6, + connFieldConnector = "H3", + aiuConnector = 2}, + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},684}), + [_MO1,_MO2,_MO3,_MO4,_MO5,_MO6] = mub_util:create(mp_mub,Parent,[I1,I2,I3,I4,I5,I6]), + ct_line:line({{ccl_setup_SUITE,create_int_jumper_cables},686}), + ok. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5714.erl b/lib/compiler/test/compilation_SUITE_data/otp_5714.erl new file mode 100644 index 0000000000..5aefa0a803 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5714.erl @@ -0,0 +1,46 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5714). +-export([?MODULE/0,foo/1,mktree_text/1]). +-binary(<<1,2,3>>). + +?MODULE() -> + [<<1,2,3>>] = proplists:get_value(binary, ?MODULE:module_info(attributes)), + ok. + +-record(foo_record, {key,blabla}). +foo(A) -> + hd(tl(element(2,element(2,catch erlang:error(apa))))), + case A of + A -> + B = #foo_record{ key = key1}, + C = B#foo_record{ key = key2}, + {X,Y} = {a,b} + end. + +mktree_text(Val) -> + case erlang:is_integer(Val) of + _A = IsInteger -> + _A; + _A -> + IsInteger = erlang:exit({{bug,mktree_text,4},{line,34},match,[_A]}) + end, + ok; +mktree_text(_A1) -> + erlang:exit({{bug,mktree_text,4},{line,33},function_clause,[_A1]}). diff --git a/lib/compiler/test/compilation_SUITE_data/otp_5872.erl b/lib/compiler/test/compilation_SUITE_data/otp_5872.erl new file mode 100644 index 0000000000..cada7ad994 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_5872.erl @@ -0,0 +1,46 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_5872). +-export([?MODULE/0,chunk_request_body/3]). + +?MODULE() -> + ok. + +chunk_request_body(Body,_ChunkSize,Acc) when Body == <<>>; Body == [] -> + LastChunk = "0\r\n", + lists:reverse(["\r\n",LastChunk|Acc]); +chunk_request_body(Body,ChunkSize,Acc) when binary(Body), size(Body) >= ChunkSize -> + <<ChunkBody:ChunkSize/binary, + Rest/binary>> = Body, + Chunk = [ibrowse_lib:dec2hex(4,ChunkSize),"\r\n",ChunkBody,"\r\n"], + chunk_request_body(Rest,ChunkSize,[Chunk|Acc]); +chunk_request_body(Body,_ChunkSize,Acc) when binary(Body) -> + BodySize = size(Body), + Chunk = [ibrowse_lib:dec2hex(4,BodySize),"\r\n",Body,"\r\n"], + LastChunk = "0\r\n", + lists:reverse(["\r\n",LastChunk,Chunk|Acc]); +chunk_request_body(Body,ChunkSize,Acc) when list(Body), length(Body) >= ChunkSize -> + {ChunkBody,Rest} = ?MODULE:split_list_at(Body,ChunkSize), + Chunk = [ibrowse_lib:dec2hex(4,ChunkSize),"\r\n",ChunkBody,"\r\n"], + chunk_request_body(Rest,ChunkSize,[Chunk|Acc]); +chunk_request_body(Body,_ChunkSize,Acc) when list(Body) -> + BodySize = length(Body), + Chunk = [ibrowse_lib:dec2hex(4,BodySize),"\r\n",Body,"\r\n"], + LastChunk = "0\r\n", + lists:reverse(["\r\n",LastChunk,Chunk|Acc]). diff --git a/lib/compiler/test/compilation_SUITE_data/otp_6121.erl b/lib/compiler/test/compilation_SUITE_data/otp_6121.erl new file mode 100644 index 0000000000..c71f7806a0 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_6121.erl @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_6121). +-export([?MODULE/0]). + +?MODULE() -> + 42 = digit_map_timer(<<1>>, 42), + test(), + Beam = code:which(?MODULE), + Sz = filelib:file_size(Beam), + io:format("Size of Beam file: ~p\n", [Sz]), + if + 100 < Sz, Sz < 100000 -> + ok + end. + +test() -> + %% Make sure that the compiler does not make an unreasonable + %% expansion when trying to optimize the following expressions. + <<0:(8*128*1024)>> = id(<<0:(8*128*1024)>>), + <<100:(8*128*1024)>> = id(<<100:(8*128*1024)>>), + <<1009797879398749873879789879388:(8*128*1024)>> = + id(<<1009797879398749873879789879388:(8*128*1024)>>), + <<7:(8*128*1024)/little>> = id(<<7:(8*128*1024)/little>>), + ok. + +id(I) -> I. + +digit_map_timer(<<_:8>>, Int) when is_integer(Int) andalso Int >= 0 -> + Int; +digit_map_timer(_, _) -> + error. diff --git a/lib/compiler/test/compilation_SUITE_data/otp_6121a.erl b/lib/compiler/test/compilation_SUITE_data/otp_6121a.erl new file mode 100644 index 0000000000..caed631aa2 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_6121a.erl @@ -0,0 +1,32 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_6121a). +-export([?MODULE/0]). + +%% Thanks to Martin Bjorklund. + +?MODULE() -> + G = fun() -> ok end, + try + fun() -> ok end + after + fun({A, B}) -> A + B end + end, + ok. + diff --git a/lib/compiler/test/compilation_SUITE_data/otp_6121b.erl b/lib/compiler/test/compilation_SUITE_data/otp_6121b.erl new file mode 100644 index 0000000000..967f078942 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_6121b.erl @@ -0,0 +1,33 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2006-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_6121b). +-export([?MODULE/0]). + +%% Thanks to Tim Rath. + +?MODULE() -> + A = {6}, + try + io:fwrite("") + after + fun () -> + fun () -> {B} = A end + end + end. + diff --git a/lib/compiler/test/compilation_SUITE_data/otp_7202.erl b/lib/compiler/test/compilation_SUITE_data/otp_7202.erl new file mode 100644 index 0000000000..9dca244aa5 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/otp_7202.erl @@ -0,0 +1,48 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2008-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(otp_7202). +-export([?MODULE/0]). + +?MODULE() -> + test(). + +test() -> + List = [a], + Error = case func() of + no_value -> true; + {ok, V} -> V + end, + %% Liveness calculation for the make_fun2 instruction was wrong - + %% it looked like Error would not be needed by the make_fun2 instruction. + lists:foreach(fun(_E) -> + case Error of + true -> + ok; + false -> + ok + end + end, List). + +func() -> + no_value. + + + + + diff --git a/lib/compiler/test/compilation_SUITE_data/pattern_expr.erl b/lib/compiler/test/compilation_SUITE_data/pattern_expr.erl new file mode 100644 index 0000000000..02eacced81 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/pattern_expr.erl @@ -0,0 +1,30 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(pattern_expr). + +-export(pattern_expr/0). + +pattern_expr() -> + f(). + +f() -> + case 4 of + 2+2 -> + ok + end. diff --git a/lib/compiler/test/compilation_SUITE_data/trycatch_4.erl b/lib/compiler/test/compilation_SUITE_data/trycatch_4.erl new file mode 100644 index 0000000000..7ea710856f --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/trycatch_4.erl @@ -0,0 +1,50 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2005-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(trycatch_4). +-export([trycatch_4/0]). +-record(state, {foo}). + +trycatch_4() -> + handle_info({foo}, #state{}), + ok. + +handle_info({_}, State) -> + foo(), + State#state{foo = bar}, + case ok of + _ -> + case catch foo() of + ok -> + {stop, State} + end + end; +handle_info(_, State) -> + (catch begin + foo(), + State#state{foo = bar} + end), + case ok of + _ -> + case catch foo() of + ok -> + {stop, State} + end + end. + +foo() -> ok. diff --git a/lib/compiler/test/compilation_SUITE_data/vsn_1.erl b/lib/compiler/test/compilation_SUITE_data/vsn_1.erl new file mode 100644 index 0000000000..a9e23f7c25 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/vsn_1.erl @@ -0,0 +1,21 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(vsn_1). + +-hubbub(himmap). diff --git a/lib/compiler/test/compilation_SUITE_data/vsn_2.erl b/lib/compiler/test/compilation_SUITE_data/vsn_2.erl new file mode 100644 index 0000000000..4833458cf4 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/vsn_2.erl @@ -0,0 +1,21 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(vsn_2). + +-vsn(34). diff --git a/lib/compiler/test/compilation_SUITE_data/vsn_3.erl b/lib/compiler/test/compilation_SUITE_data/vsn_3.erl new file mode 100644 index 0000000000..7b970b2b75 --- /dev/null +++ b/lib/compiler/test/compilation_SUITE_data/vsn_3.erl @@ -0,0 +1,22 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +-module(vsn_3). + +f(X) -> + 2*X. |