@@ -30,17 +30,47 @@ parse.Block = function(contract, expression) {
3030 }
3131} ;
3232
33- parse . BinaryOperation = function ( contract , expression ) {
34- register . statement ( contract , expression ) ;
33+ parse . BinaryOperation = function ( contract , expression , skipStatementRegistry ) {
34+ // Regular binary operation
35+ if ( ! skipStatementRegistry ) {
36+ register . statement ( contract , expression ) ;
37+
38+ // LogicalOR conditional search...
39+ } else {
40+ parse [ expression . left . type ] &&
41+ parse [ expression . left . type ] ( contract , expression . left , true ) ;
42+
43+ parse [ expression . right . type ] &&
44+ parse [ expression . right . type ] ( contract , expression . right , true ) ;
45+
46+ if ( expression . operator === '||' ) {
47+ register . logicalOR ( contract , expression ) ;
48+ }
49+ }
50+ }
51+
52+ parse . TupleExpression = function ( contract , expression , skipStatementRegistry ) {
53+ expression . components . forEach ( component => {
54+ parse [ component . type ] &&
55+ parse [ component . type ] ( contract , component , skipStatementRegistry ) ;
56+ } ) ;
3557}
3658
37- parse . FunctionCall = function ( contract , expression ) {
59+ parse . FunctionCall = function ( contract , expression , skipStatementRegistry ) {
3860 // In any given chain of call expressions, only the last one will fail this check.
3961 // This makes sure we don't instrument a chain of expressions multiple times.
4062 if ( expression . expression . type !== 'FunctionCall' ) {
41- register . statement ( contract , expression ) ;
63+
64+ // Don't register sub-expressions (like intermediate method calls)
65+ if ( ! skipStatementRegistry ) {
66+ register . statement ( contract , expression ) ;
67+ }
68+
4269 if ( expression . expression . name === 'require' ) {
4370 register . requireBranch ( contract , expression ) ;
71+ expression . arguments . forEach ( arg => {
72+ parse [ arg . type ] && parse [ arg . type ] ( contract , arg , true ) ;
73+ } ) ;
4474 }
4575 parse [ expression . expression . type ] &&
4676 parse [ expression . expression . type ] ( contract , expression . expression ) ;
@@ -50,10 +80,13 @@ parse.FunctionCall = function(contract, expression) {
5080 }
5181} ;
5282
53- parse . Conditional = function ( contract , expression ) {
54- register . statement ( contract , expression ) ;
55- // TODO: Investigate node structure
56- // There are potential substatements here we aren't measuring
83+ parse . Conditional = function ( contract , expression , skipStatementRegistry ) {
84+ if ( ! skipStatementRegistry ) {
85+ register . statement ( contract , expression ) ;
86+ }
87+
88+ parse [ expression . condition . type ] &&
89+ parse [ expression . condition . type ] ( contract , expression . condition , skipStatementRegistry ) ;
5790} ;
5891
5992parse . ContractDefinition = function ( contract , expression ) {
@@ -130,6 +163,10 @@ parse.FunctionDefinition = function(contract, expression) {
130163parse . IfStatement = function ( contract , expression ) {
131164 register . statement ( contract , expression ) ;
132165 register . ifStatement ( contract , expression ) ;
166+
167+ parse [ expression . condition . type ] &&
168+ parse [ expression . condition . type ] ( contract , expression . condition , true ) ;
169+
133170 parse [ expression . trueBody . type ] &&
134171 parse [ expression . trueBody . type ] ( contract , expression . trueBody ) ;
135172
@@ -173,6 +210,10 @@ parse.SourceUnit = function(contract, expression) {
173210
174211parse . ReturnStatement = function ( contract , expression ) {
175212 register . statement ( contract , expression ) ;
213+
214+ expression . expression &&
215+ parse [ expression . expression . type ] &&
216+ parse [ expression . expression . type ] ( contract , expression . expression , true ) ;
176217} ;
177218
178219// TODO:Investigate node structure
@@ -203,6 +244,10 @@ parse.VariableDeclarationStatement = function (contract, expression) {
203244
204245parse . WhileStatement = function ( contract , expression ) {
205246 register . statement ( contract , expression ) ;
247+
248+ parse [ expression . condition . type ] &&
249+ parse [ expression . condition . type ] ( contract , expression . condition , true ) ;
250+
206251 parse [ expression . body . type ] &&
207252 parse [ expression . body . type ] ( contract , expression . body ) ;
208253} ;
0 commit comments