From 5d2fbd9f25dbeccd0761cc332b3484b3ba39dca1 Mon Sep 17 00:00:00 2001 From: cgewecke Date: Thu, 25 Jan 2024 20:40:13 -0800 Subject: [PATCH 1/2] Fix chained ternary conditionals instrumentation --- lib/parse.js | 8 ++++++++ .../conditional/chained-multiline.sol | 14 +++++++++++++ .../conditional/chained-singleline.sol | 10 ++++++++++ .../contracts/conditional/chained-true.sol | 14 +++++++++++++ .../conditional/chained-with-parens.sol | 10 ++++++++++ test/units/conditional.js | 20 +++++++++++++++++++ 6 files changed, 76 insertions(+) create mode 100644 test/sources/solidity/contracts/conditional/chained-multiline.sol create mode 100644 test/sources/solidity/contracts/conditional/chained-singleline.sol create mode 100644 test/sources/solidity/contracts/conditional/chained-true.sol create mode 100644 test/sources/solidity/contracts/conditional/chained-with-parens.sol diff --git a/lib/parse.js b/lib/parse.js index 210633c2..1d6c9be0 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -91,6 +91,14 @@ parse.Conditional = function(contract, expression, skipStatementRegistry) { parse[expression.condition.type] && parse[expression.condition.type](contract, expression.condition, true); + if (expression.trueExpression && expression.trueExpression.type === 'Conditional'){ + parse[expression.trueExpression.type](contract, expression.trueExpression, true); + } + + if (expression.falseExpression && expression.falseExpression.type === 'Conditional'){ + parse[expression.falseExpression.type](contract, expression.falseExpression, true); + } + register.conditional(contract, expression); }; diff --git a/test/sources/solidity/contracts/conditional/chained-multiline.sol b/test/sources/solidity/contracts/conditional/chained-multiline.sol new file mode 100644 index 00000000..21bea59d --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-multiline.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + value < min + ? min + : value > max + ? max + : value; + } +} \ No newline at end of file diff --git a/test/sources/solidity/contracts/conditional/chained-singleline.sol b/test/sources/solidity/contracts/conditional/chained-singleline.sol new file mode 100644 index 00000000..d777efdd --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-singleline.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + value < min ? min : value > max ? max : value; + } +} \ No newline at end of file diff --git a/test/sources/solidity/contracts/conditional/chained-true.sol b/test/sources/solidity/contracts/conditional/chained-true.sol new file mode 100644 index 00000000..fa626c6e --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-true.sol @@ -0,0 +1,14 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + value < min + ? value > max + ? max + : value + : min; + } +} \ No newline at end of file diff --git a/test/sources/solidity/contracts/conditional/chained-with-parens.sol b/test/sources/solidity/contracts/conditional/chained-with-parens.sol new file mode 100644 index 00000000..54e4198e --- /dev/null +++ b/test/sources/solidity/contracts/conditional/chained-with-parens.sol @@ -0,0 +1,10 @@ +pragma solidity ^0.7.0; + +contract Test { + function a() public { + int min = 1; + int max = 2; + int value = 3; + (value < min) ? min : (value > max) ? max : value; + } +} \ No newline at end of file diff --git a/test/units/conditional.js b/test/units/conditional.js index 84185e5c..a9fb2e47 100644 --- a/test/units/conditional.js +++ b/test/units/conditional.js @@ -233,4 +233,24 @@ describe('ternary conditionals', () => { const info = util.instrumentAndCompile('conditional/ternary-with-unbracketed-else'); util.report(info.solcOutput.errors); }); + + it('should compile after instrumenting a chain of ternary conditionals (single line)', () => { + const info = util.instrumentAndCompile('conditional/chained-singleline'); + util.report(info.solcOutput.errors); + }); + + it('should compile after instrumenting a chain of ternary conditionals (multi-line)', () => { + const info = util.instrumentAndCompile('conditional/chained-multiline'); + util.report(info.solcOutput.errors); + }); + + it('should compile after instrumenting a chain of ternary conditionals (parens)', () => { + const info = util.instrumentAndCompile('conditional/chained-with-parens'); + util.report(info.solcOutput.errors); + }); + + it('should compile after instrumenting a chain of ternary conditionals (true expr is tern)', () => { + const info = util.instrumentAndCompile('conditional/chained-true'); + util.report(info.solcOutput.errors); + }); }); From c5cc14750abcfb41fdf51c2d0f814def7f476f19 Mon Sep 17 00:00:00 2001 From: cgewecke Date: Thu, 25 Jan 2024 20:50:21 -0800 Subject: [PATCH 2/2] Add missing file newlines --- .../solidity/contracts/conditional/chained-multiline.sol | 2 +- .../solidity/contracts/conditional/chained-singleline.sol | 2 +- test/sources/solidity/contracts/conditional/chained-true.sol | 2 +- .../solidity/contracts/conditional/chained-with-parens.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/sources/solidity/contracts/conditional/chained-multiline.sol b/test/sources/solidity/contracts/conditional/chained-multiline.sol index 21bea59d..87db27a7 100644 --- a/test/sources/solidity/contracts/conditional/chained-multiline.sol +++ b/test/sources/solidity/contracts/conditional/chained-multiline.sol @@ -11,4 +11,4 @@ contract Test { ? max : value; } -} \ No newline at end of file +} diff --git a/test/sources/solidity/contracts/conditional/chained-singleline.sol b/test/sources/solidity/contracts/conditional/chained-singleline.sol index d777efdd..539a7b90 100644 --- a/test/sources/solidity/contracts/conditional/chained-singleline.sol +++ b/test/sources/solidity/contracts/conditional/chained-singleline.sol @@ -7,4 +7,4 @@ contract Test { int value = 3; value < min ? min : value > max ? max : value; } -} \ No newline at end of file +} diff --git a/test/sources/solidity/contracts/conditional/chained-true.sol b/test/sources/solidity/contracts/conditional/chained-true.sol index fa626c6e..166c4dcf 100644 --- a/test/sources/solidity/contracts/conditional/chained-true.sol +++ b/test/sources/solidity/contracts/conditional/chained-true.sol @@ -11,4 +11,4 @@ contract Test { : value : min; } -} \ No newline at end of file +} diff --git a/test/sources/solidity/contracts/conditional/chained-with-parens.sol b/test/sources/solidity/contracts/conditional/chained-with-parens.sol index 54e4198e..184fb29c 100644 --- a/test/sources/solidity/contracts/conditional/chained-with-parens.sol +++ b/test/sources/solidity/contracts/conditional/chained-with-parens.sol @@ -7,4 +7,4 @@ contract Test { int value = 3; (value < min) ? min : (value > max) ? max : value; } -} \ No newline at end of file +}