@@ -32,17 +32,47 @@ parse.Block = function(contract, expression) {
3232 }
3333} ;
3434
35- parse . BinaryOperation = function ( contract , expression ) {
36- register . statement ( contract , expression ) ;
35+ parse . BinaryOperation = function ( contract , expression , skipStatementRegistry ) {
36+ // Regular binary operation
37+ if ( ! skipStatementRegistry ) {
38+ register . statement ( contract , expression ) ;
39+
40+ // LogicalOR conditional search...
41+ } else {
42+ parse [ expression . left . type ] &&
43+ parse [ expression . left . type ] ( contract , expression . left , true ) ;
44+
45+ parse [ expression . right . type ] &&
46+ parse [ expression . right . type ] ( contract , expression . right , true ) ;
47+
48+ if ( expression . operator === '||' ) {
49+ register . logicalOR ( contract , expression ) ;
50+ }
51+ }
52+ }
53+
54+ parse . TupleExpression = function ( contract , expression , skipStatementRegistry ) {
55+ expression . components . forEach ( component => {
56+ parse [ component . type ] &&
57+ parse [ component . type ] ( contract , component , skipStatementRegistry ) ;
58+ } ) ;
3759}
3860
39- parse . FunctionCall = function ( contract , expression ) {
61+ parse . FunctionCall = function ( contract , expression , skipStatementRegistry ) {
4062 // In any given chain of call expressions, only the last one will fail this check.
4163 // This makes sure we don't instrument a chain of expressions multiple times.
4264 if ( expression . expression . type !== 'FunctionCall' ) {
43- register . statement ( contract , expression ) ;
65+
66+ // Don't register sub-expressions (like intermediate method calls)
67+ if ( ! skipStatementRegistry ) {
68+ register . statement ( contract , expression ) ;
69+ }
70+
4471 if ( expression . expression . name === 'require' ) {
4572 register . requireBranch ( contract , expression ) ;
73+ expression . arguments . forEach ( arg => {
74+ parse [ arg . type ] && parse [ arg . type ] ( contract , arg , true ) ;
75+ } ) ;
4676 }
4777 parse [ expression . expression . type ] &&
4878 parse [ expression . expression . type ] ( contract , expression . expression ) ;
@@ -52,10 +82,13 @@ parse.FunctionCall = function(contract, expression) {
5282 }
5383} ;
5484
55- parse . Conditional = function ( contract , expression ) {
56- register . statement ( contract , expression ) ;
57- // TODO: Investigate node structure
58- // There are potential substatements here we aren't measuring
85+ parse . Conditional = function ( contract , expression , skipStatementRegistry ) {
86+ if ( ! skipStatementRegistry ) {
87+ register . statement ( contract , expression ) ;
88+ }
89+
90+ parse [ expression . condition . type ] &&
91+ parse [ expression . condition . type ] ( contract , expression . condition , skipStatementRegistry ) ;
5992} ;
6093
6194parse . ContractDefinition = function ( contract , expression ) {
@@ -145,6 +178,10 @@ parse.FunctionDefinition = function(contract, expression) {
145178parse . IfStatement = function ( contract , expression ) {
146179 register . statement ( contract , expression ) ;
147180 register . ifStatement ( contract , expression ) ;
181+
182+ parse [ expression . condition . type ] &&
183+ parse [ expression . condition . type ] ( contract , expression . condition , true ) ;
184+
148185 parse [ expression . trueBody . type ] &&
149186 parse [ expression . trueBody . type ] ( contract , expression . trueBody ) ;
150187
@@ -220,6 +257,10 @@ parse.SourceUnit = function(contract, expression) {
220257
221258parse . ReturnStatement = function ( contract , expression ) {
222259 register . statement ( contract , expression ) ;
260+
261+ expression . expression &&
262+ parse [ expression . expression . type ] &&
263+ parse [ expression . expression . type ] ( contract , expression . expression , true ) ;
223264} ;
224265
225266// TODO:Investigate node structure
@@ -255,6 +296,10 @@ parse.VariableDeclarationStatement = function (contract, expression) {
255296
256297parse . WhileStatement = function ( contract , expression ) {
257298 register . statement ( contract , expression ) ;
299+
300+ parse [ expression . condition . type ] &&
301+ parse [ expression . condition . type ] ( contract , expression . condition , true ) ;
302+
258303 parse [ expression . body . type ] &&
259304 parse [ expression . body . type ] ( contract , expression . body ) ;
260305} ;
0 commit comments