@@ -20,17 +20,47 @@ parse.Block = function(contract, expression) {
2020 }
2121} ;
2222
23- parse . BinaryOperation = function ( contract , expression ) {
24- register . statement ( contract , expression ) ;
23+ parse . BinaryOperation = function ( contract , expression , skipStatementRegistry ) {
24+ // Regular binary operation
25+ if ( ! skipStatementRegistry ) {
26+ register . statement ( contract , expression ) ;
27+
28+ // LogicalOR conditional search...
29+ } else {
30+ parse [ expression . left . type ] &&
31+ parse [ expression . left . type ] ( contract , expression . left , true ) ;
32+
33+ parse [ expression . right . type ] &&
34+ parse [ expression . right . type ] ( contract , expression . right , true ) ;
35+
36+ if ( expression . operator === '||' ) {
37+ register . logicalOR ( contract , expression ) ;
38+ }
39+ }
40+ }
41+
42+ parse . TupleExpression = function ( contract , expression , skipStatementRegistry ) {
43+ expression . components . forEach ( component => {
44+ parse [ component . type ] &&
45+ parse [ component . type ] ( contract , component , skipStatementRegistry ) ;
46+ } ) ;
2547}
2648
27- parse . FunctionCall = function ( contract , expression ) {
49+ parse . FunctionCall = function ( contract , expression , skipStatementRegistry ) {
2850 // In any given chain of call expressions, only the last one will fail this check.
2951 // This makes sure we don't instrument a chain of expressions multiple times.
3052 if ( expression . expression . type !== 'FunctionCall' ) {
31- register . statement ( contract , expression ) ;
53+
54+ // Don't register sub-expressions (like intermediate method calls)
55+ if ( ! skipStatementRegistry ) {
56+ register . statement ( contract , expression ) ;
57+ }
58+
3259 if ( expression . expression . name === 'assert' || expression . expression . name === 'require' ) {
3360 register . assertOrRequire ( contract , expression ) ;
61+ expression . arguments . forEach ( arg => {
62+ parse [ arg . type ] && parse [ arg . type ] ( contract , arg , true ) ;
63+ } ) ;
3464 }
3565 parse [ expression . expression . type ] &&
3666 parse [ expression . expression . type ] ( contract , expression . expression ) ;
@@ -40,10 +70,13 @@ parse.FunctionCall = function(contract, expression) {
4070 }
4171} ;
4272
43- parse . Conditional = function ( contract , expression ) {
44- register . statement ( contract , expression ) ;
45- // TODO: Investigate node structure
46- // There are potential substatements here we aren't measuring
73+ parse . Conditional = function ( contract , expression , skipStatementRegistry ) {
74+ if ( ! skipStatementRegistry ) {
75+ register . statement ( contract , expression ) ;
76+ }
77+
78+ parse [ expression . condition . type ] &&
79+ parse [ expression . condition . type ] ( contract , expression . condition , skipStatementRegistry ) ;
4780} ;
4881
4982parse . ContractDefinition = function ( contract , expression ) {
@@ -120,6 +153,10 @@ parse.FunctionDefinition = function(contract, expression) {
120153parse . IfStatement = function ( contract , expression ) {
121154 register . statement ( contract , expression ) ;
122155 register . ifStatement ( contract , expression ) ;
156+
157+ parse [ expression . condition . type ] &&
158+ parse [ expression . condition . type ] ( contract , expression . condition , true ) ;
159+
123160 parse [ expression . trueBody . type ] &&
124161 parse [ expression . trueBody . type ] ( contract , expression . trueBody ) ;
125162
@@ -163,6 +200,10 @@ parse.SourceUnit = function(contract, expression) {
163200
164201parse . ReturnStatement = function ( contract , expression ) {
165202 register . statement ( contract , expression ) ;
203+
204+ expression . expression &&
205+ parse [ expression . expression . type ] &&
206+ parse [ expression . expression . type ] ( contract , expression . expression , true ) ;
166207} ;
167208
168209// TODO:Investigate node structure
@@ -193,6 +234,10 @@ parse.VariableDeclarationStatement = function (contract, expression) {
193234
194235parse . WhileStatement = function ( contract , expression ) {
195236 register . statement ( contract , expression ) ;
237+
238+ parse [ expression . condition . type ] &&
239+ parse [ expression . condition . type ] ( contract , expression . condition , true ) ;
240+
196241 parse [ expression . body . type ] &&
197242 parse [ expression . body . type ] ( contract , expression . body ) ;
198243} ;
0 commit comments