function countIf() {
		var self = this, ret;
		if (self[0].start && analyzing.indexOf(self) < 0) {
			var decision = self[1];
			var lineId = self[0].name + ':' + (self[0].start.line + lineOffset);

			self[1] = wrapCondition(decision, lineId);

			// We are adding new lines, make sure code blocks are actual blocks
			if (self[2] && self[2][0].start && self[2][0].start.value != "{") {
				self[2] = [ "block", [self[2]]];
			}

			if (self[3] && self[3][0].start && self[3][0].start.value != "{") {
				self[3] = [ "block", [self[3]]];
			}
		}

		ret = countLine.call(self);

		if (decision) {
			analyzing.pop(decision);
		}

		return ret;
	}
function countIf() {
		var self = this, ret;
		if (self[0].start && analyzing.indexOf(self) < 0) {
			var decision = self[1];
			var lineId = self[0].name + ':' + (self[0].start.line + lineOffset);

			self[1] = wrapCondition(decision, lineId);

			
			if (self[2] && self[2][0].start && self[2][0].start.value != "{") {
				self[2] = [ "block", [self[2]]];
			}

			if (self[3] && self[3][0].start && self[3][0].start.value != "{") {
				self[3] = [ "block", [self[3]]];
			}
		}

		ret = countLine.call(self);

		if (decision) {
			analyzing.pop(decision);
		}

		return ret;
	}
function countIf ( ) { var self = this , ret ; if ( self [ 0 ] . start && analyzing . indexOf ( self ) < 0 ) { var decision = self [ 1 ] ; var lineId = self [ 0 ] . name + ':' + ( self [ 0 ] . start . line + lineOffset ) ; self [ 1 ] = wrapCondition ( decision , lineId ) ; // We are adding new lines, make sure code blocks are actual blocks if ( self [ 2 ] && self [ 2 ] [ 0 ] . start && self [ 2 ] [ 0 ] . start . value != "{" ) { self [ 2 ] = [ "block" , [ self [ 2 ] ] ] ; } if ( self [ 3 ] && self [ 3 ] [ 0 ] . start && self [ 3 ] [ 0 ] . start . value != "{" ) { self [ 3 ] = [ "block" , [ self [ 3 ] ] ] ; } } ret = countLine . call ( self ) ; if ( decision ) { analyzing . pop ( decision ) ; } return ret ; }
Walker for 'if' nodes. It overrides countLine because we want to instrument conditions.

'this' is an if node, so
'this[0]' is the node descriptor
'this[1]' is the decision block
'this[2]' is the 'then' code block
'this[3]' is the 'else' code block

Note that if/else if/else in AST are represented as nested if/else
Walker for if nodes . It overrides countLine because we want to instrument conditions .