@jdeighan/coffee-utils 7.0.50 → 7.0.51

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  assert, undef, error, croak, warn, defined,
5
- isString, isFunction, isBoolean,
5
+ isString, isFunction, isBoolean, sep_dash,
6
6
  OL, escapeStr, isNumber, isArray, words, pass,
7
7
  } from '@jdeighan/coffee-utils'
8
8
  import {blockToArray} from '@jdeighan/coffee-utils/block'
@@ -10,16 +10,15 @@ import {untabify} from '@jdeighan/coffee-utils/indent'
10
10
  import {slurp} from '@jdeighan/coffee-utils/fs'
11
11
  import {CallStack} from '@jdeighan/coffee-utils/stack'
12
12
  import {
13
- log, logItem, LOG, setStringifier, orderedStringify,
13
+ getPrefix, addArrow, removeLastVbar,
14
+ } from '@jdeighan/coffee-utils/arrow'
15
+ import {
16
+ log, logItem, LOG, shortEnough,
14
17
  } from '@jdeighan/coffee-utils/log'
15
18
 
16
- # --- These are saved/restored on the call stack
17
- export debugging = false
18
- shouldLogFunc = (func) -> return debugging
19
- shouldLogString = (str) -> return debugging
20
-
21
- stack = new CallStack()
19
+ callStack = new CallStack()
22
20
  doDebugDebug = false
21
+ shouldLog = undef # set in resetDebugging() and setDebugging()
23
22
 
24
23
  # ---------------------------------------------------------------------------
25
24
 
@@ -34,49 +33,47 @@ export debugDebug = (flag=true) ->
34
33
 
35
34
  resetDebugging = () ->
36
35
 
37
- debugging = false
38
36
  if doDebugDebug
39
- LOG "resetDebugging() - debugging = false"
40
- stack.reset()
41
- shouldLogFunc = (func) -> return debugging
42
- shouldLogString = (str) -> return debugging
37
+ LOG "resetDebugging()"
38
+ callStack.reset()
39
+ shouldLog = (type, str, stack) -> false
43
40
  return
44
41
 
45
42
  # ---------------------------------------------------------------------------
46
43
 
47
- export setDebugging = (funcDoDebug=undef, funcDoLog=undef) ->
44
+ export setDebugging = (option) ->
48
45
 
49
46
  resetDebugging()
50
- if isBoolean(funcDoDebug)
51
- debugging = funcDoDebug
52
- if doDebugDebug
53
- LOG "setDebugging(): debugging = #{funcDoDebug}"
54
- else if isString(funcDoDebug)
55
- debugging = false
56
- lFuncNames = words(funcDoDebug)
57
- assert isArray(lFuncNames), "words('#{funcDoDebug}') returned non-array"
58
- shouldLogFunc = (funcName) ->
59
- funcMatch(funcName, lFuncNames)
47
+ if isBoolean(option)
48
+ shouldLog = (type, str, stack) -> option
49
+ else if isString(option)
50
+ shouldLog = (type, str, stack) ->
51
+ lFuncs = words(option)
52
+ switch type
53
+ when 'enter'
54
+ return funcMatch(stack, lFuncs, str)
55
+ else
56
+ return funcMatch(stack, lFuncs)
60
57
  if doDebugDebug
61
- LOG "setDebugging FUNCS: #{lFuncNames.join(',')}, debugging = false"
62
- else if isFunction(funcDoDebug)
63
- shouldLogFunc = funcDoDebug
58
+ LOG "setDebugging FUNCS: #{option}"
59
+ else if isFunction(option)
60
+ shouldLog = option
64
61
  if doDebugDebug
65
62
  LOG "setDebugging to custom func"
66
63
  else
67
- croak "setDebugging(): bad parameter #{OL(funcDoDebug)}"
68
-
69
- if isFunction(funcDoLog)
70
- assert isFunction(funcDoLog), "setDebugging: arg 2 not a function"
71
- shouldLogString = funcDoLog
64
+ croak "setDebugging(): bad parameter #{OL(option)}"
72
65
  return
73
66
 
74
67
  # ---------------------------------------------------------------------------
75
68
  # --- export only to allow unit tests
76
69
 
77
- export funcMatch = (curFunc, lFuncNames) ->
70
+ export funcMatch = (stack, lFuncNames, enteringFunc=undef) ->
71
+
72
+ if defined(enteringFunc) && (enteringFunc in lFuncNames)
73
+ return true
78
74
 
79
- assert isString(curFunc), "funcMatch(): not a string"
75
+ curFunc = stack.curFunc()
76
+ assert isString(curFunc), "funcMatch(): not a string #{OL(curFunc)}"
80
77
  assert isArray(lFuncNames), "funcMatch(): bad array #{lFuncNames}"
81
78
  if lFuncNames.includes(curFunc)
82
79
  return true
@@ -88,128 +85,116 @@ export funcMatch = (curFunc, lFuncNames) ->
88
85
  return false
89
86
 
90
87
  # ---------------------------------------------------------------------------
91
- # 1. adjust call stack on 'enter' or 'return from'
92
- # 2. adjust debugging flag
93
- # 3. return [mainPrefix, auxPrefix, hEnv, type] - hEnv can be undef
94
- # 4. disable logging by setting type to undef
88
+ # --- type is one of: 'enter', 'return', 'string', 'object'
95
89
 
96
- adjustStack = (str) ->
90
+ export getType = (str, nObjects) ->
97
91
 
98
- if (lMatches = str.match(///^
92
+ if lMatches = str.match(///^
99
93
  \s*
100
94
  enter
101
95
  \s+
102
96
  ([A-Za-z_][A-Za-z0-9_\.]*)
103
- ///))
97
+ ///)
104
98
 
105
99
  # --- We are entering function curFunc
106
- curFunc = lMatches[1]
100
+ return ['enter', lMatches[1]]
107
101
 
108
- hEnv = {
109
- debugging
110
- shouldLogFunc
111
- shouldLogString
112
- }
113
-
114
- debugging = shouldLogFunc(curFunc)
115
- if doDebugDebug
116
- trans = "#{hEnv.debugging} => #{debugging}"
117
- LOG " ENTER #{curFunc}, debugging: #{trans}"
118
- [mainPre, auxPre] = stack.doCall(curFunc, hEnv, debugging)
119
- return [
120
- mainPre
121
- auxPre
122
- undef
123
- if shouldLogFunc(curFunc) then 'enter' else undef
124
- ]
125
- else if (lMatches = str.match(///^
102
+ else if lMatches = str.match(///^
126
103
  \s*
127
104
  return
128
105
  .+
129
106
  from
130
107
  \s+
131
108
  ([A-Za-z_][A-Za-z0-9_\.]*)
132
- ///))
133
- curFunc = lMatches[1]
134
- [mainPre, auxPre, hEnv] = stack.returnFrom(curFunc)
135
- if doDebugDebug
136
- LOG " RETURN FROM #{curFunc}"
137
- return [
138
- mainPre
139
- auxPre
140
- hEnv
141
- if shouldLogFunc(curFunc) then 'return' else undef
142
- ]
109
+ ///)
110
+ return ['return', lMatches[1]]
111
+
112
+ else if (nObjects > 0)
113
+ return ['objects', undef]
143
114
  else
144
- [mainPre, auxPre, _] = stack.logStr()
145
- return [
146
- mainPre
147
- auxPre
148
- undef
149
- if shouldLogString(str) then 'string' else undef
150
- ]
115
+ return ['string', undef]
151
116
 
152
117
  # ---------------------------------------------------------------------------
153
118
 
154
- export debug = (lArgs...) ->
119
+ export debug = (label, lObjects...) ->
155
120
 
156
- # --- We want to allow item to be undef. Therefore, we need to
157
- # distinguish between 1 arg sent vs. 2 args sent
158
- nArgs = lArgs.length
159
- assert (nArgs==1) || (nArgs==2), "debug(): #{nArgs} args"
121
+ assert isString(label), "1st arg #{OL(label)} should be a string"
160
122
 
161
- # --- label must always be there, and be a string
162
- # item is optional
163
- [label, item] = lArgs
164
- assert isString(label),
165
- "debug(): 1st arg #{OL(label)} should be a string"
166
-
167
- if doDebugDebug
168
- if nArgs==1
169
- LOG "debug('#{escapeStr(label)}') - 1 arg"
170
- else
171
- LOG "debug('#{escapeStr(label)}', #{typeof item}) - 2 args"
172
- LOG "debugging flag = #{OL(debugging)}"
173
-
174
- # --- We always need to manipulate the stack when we encounter
175
- # either "enter X" or "return from X", so we can't short-circuit
176
- # when debugging is off
177
-
178
- lResult = adjustStack(label)
179
- if doDebugDebug
180
- LOG 'lResult', lResult
181
- [mainPre, auxPre, hEnv, type] = lResult
182
- if doDebugDebug && (type == undef)
183
- LOG "type is undef - NOT LOGGING"
184
-
185
- hOptions = {
186
- prefix: mainPre
187
- itemPrefix: auxPre
188
- }
123
+ # --- We want to allow objects to be undef. Therefore, we need to
124
+ # distinguish between 1 arg sent vs. 2 or more args sent
125
+ nObjects = lObjects.length
189
126
 
127
+ # --- funcName is only set for types 'enter' and 'return'
128
+ [type, funcName] = getType(label, nObjects)
190
129
  switch type
191
130
  when 'enter'
192
- log label, hOptions
193
- if (nArgs==2)
194
- # --- don't repeat the label
195
- logItem undef, item, hOptions
131
+ doLog = shouldLog(type, funcName, callStack)
132
+
133
+ # --- If we won't be logging when funcName is activated
134
+ # then change 'enter' to 'call'
135
+ callStack.enter funcName # add to call stack
136
+ if ! shouldLog('string', 'abc', callStack)
137
+ label = label.replace('enter', 'call')
138
+ callStack.returnFrom funcName # remove from call stack
196
139
  when 'return'
197
- log label, hOptions
198
- if (nArgs==2)
199
- # --- don't repeat the label
200
- logItem undef, item, hOptions
140
+ doLog = shouldLog(type, funcName, callStack)
201
141
  when 'string'
202
- if (nArgs==2)
203
- logItem label, item, hOptions
204
- else
205
- log label, hOptions
142
+ doLog = shouldLog(type, label, callStack)
143
+ assert (nObjects == 0),
144
+ "multiple objects only not allowed for #{OL(type)}"
145
+ when 'objects'
146
+ doLog = shouldLog(type, label, callStack)
147
+ assert (nObjects > 0),
148
+ "multiple objects only not allowed for #{OL(type)}"
149
+
150
+ if doDebugDebug
151
+ if nObjects == 0
152
+ LOG "debug(#{OL(label)}) - 1 arg"
153
+ else
154
+ LOG "debug(#{OL(label)}), #{nObjects} args"
155
+ LOG "doLog = #{OL(doLog)}"
156
+ LOG "type = #{OL(type)}"
157
+ LOG "funcName = #{OL(funcName)}"
158
+
159
+ if doLog
160
+ level = callStack.getLevel()
161
+ prefix = getPrefix(level)
206
162
 
207
- if hEnv
208
- orgDebugging = debugging
209
- {debugging, shouldLogFunc, shouldLogString} = hEnv
210
163
  if doDebugDebug
211
- trans = "#{orgDebugging} => #{debugging}"
212
- LOG " Restore hEnv: debugging: #{trans}"
164
+ LOG "callStack", callStack
165
+ LOG "level = #{OL(level)}"
166
+ LOG "prefix = #{OL(prefix)}"
167
+
168
+ switch type
169
+ when 'enter'
170
+ log label, {prefix}
171
+ for obj,i in lObjects
172
+ if (i > 0)
173
+ log sep_dash, {prefix: removeLastVbar(prefix)}
174
+ logItem undef, obj, {prefix: removeLastVbar(prefix)}
175
+ when 'return'
176
+ log label, {prefix: addArrow(prefix)}
177
+ for obj,i in lObjects
178
+ if (i > 0)
179
+ log sep_dash, {prefix: removeLastVbar(prefix)}
180
+ logItem undef, obj, {prefix: removeLastVbar(prefix)}
181
+ when 'string'
182
+ log label, {prefix}
183
+ when 'objects'
184
+ if (nObjects==1) && shortEnough(label, lObjects[0])
185
+ logItem label, lObjects[0], {prefix}
186
+ else
187
+ if (label.indexOf(':') != label.length - 1)
188
+ label += ':'
189
+ log label, {prefix}
190
+ for obj in lObjects
191
+ logItem undef, obj, {prefix}
192
+
193
+ if (type == 'enter')
194
+ callStack.enter funcName, doLog
195
+ else if (type == 'return')
196
+ callStack.returnFrom funcName
197
+
213
198
  return true # allow use in boolean expressions
214
199
 
215
200
  # ---------------------------------------------------------------------------
@@ -1,6 +1,7 @@
1
1
  // Generated by CoffeeScript 2.7.0
2
- // debug_utils.coffee
3
- var adjustStack, doDebugDebug, reMethod, resetDebugging, shouldLogFunc, shouldLogString, stack;
2
+ // debug_utils.coffee
3
+ var callStack, doDebugDebug, reMethod, resetDebugging, shouldLog,
4
+ indexOf = [].indexOf;
4
5
 
5
6
  import {
6
7
  assert,
@@ -12,6 +13,7 @@ import {
12
13
  isString,
13
14
  isFunction,
14
15
  isBoolean,
16
+ sep_dash,
15
17
  OL,
16
18
  escapeStr,
17
19
  isNumber,
@@ -36,28 +38,25 @@ import {
36
38
  CallStack
37
39
  } from '@jdeighan/coffee-utils/stack';
38
40
 
41
+ import {
42
+ getPrefix,
43
+ addArrow,
44
+ removeLastVbar
45
+ } from '@jdeighan/coffee-utils/arrow';
46
+
39
47
  import {
40
48
  log,
41
49
  logItem,
42
50
  LOG,
43
- setStringifier,
44
- orderedStringify
51
+ shortEnough
45
52
  } from '@jdeighan/coffee-utils/log';
46
53
 
47
- // --- These are saved/restored on the call stack
48
- export var debugging = false;
54
+ callStack = new CallStack();
49
55
 
50
- shouldLogFunc = function(func) {
51
- return debugging;
52
- };
53
-
54
- shouldLogString = function(str) {
55
- return debugging;
56
- };
56
+ doDebugDebug = false;
57
57
 
58
- stack = new CallStack();
58
+ shouldLog = undef; // set in resetDebugging() and setDebugging()
59
59
 
60
- doDebugDebug = false;
61
60
 
62
61
  // ---------------------------------------------------------------------------
63
62
  export var debugDebug = function(flag = true) {
@@ -69,57 +68,55 @@ export var debugDebug = function(flag = true) {
69
68
 
70
69
  // ---------------------------------------------------------------------------
71
70
  resetDebugging = function() {
72
- debugging = false;
73
71
  if (doDebugDebug) {
74
- LOG("resetDebugging() - debugging = false");
72
+ LOG("resetDebugging()");
75
73
  }
76
- stack.reset();
77
- shouldLogFunc = function(func) {
78
- return debugging;
79
- };
80
- shouldLogString = function(str) {
81
- return debugging;
74
+ callStack.reset();
75
+ shouldLog = function(type, str, stack) {
76
+ return false;
82
77
  };
83
78
  };
84
79
 
85
80
  // ---------------------------------------------------------------------------
86
- export var setDebugging = function(funcDoDebug = undef, funcDoLog = undef) {
87
- var lFuncNames;
81
+ export var setDebugging = function(option) {
88
82
  resetDebugging();
89
- if (isBoolean(funcDoDebug)) {
90
- debugging = funcDoDebug;
91
- if (doDebugDebug) {
92
- LOG(`setDebugging(): debugging = ${funcDoDebug}`);
93
- }
94
- } else if (isString(funcDoDebug)) {
95
- debugging = false;
96
- lFuncNames = words(funcDoDebug);
97
- assert(isArray(lFuncNames), `words('${funcDoDebug}') returned non-array`);
98
- shouldLogFunc = function(funcName) {
99
- return funcMatch(funcName, lFuncNames);
83
+ if (isBoolean(option)) {
84
+ shouldLog = function(type, str, stack) {
85
+ return option;
86
+ };
87
+ } else if (isString(option)) {
88
+ shouldLog = function(type, str, stack) {
89
+ var lFuncs;
90
+ lFuncs = words(option);
91
+ switch (type) {
92
+ case 'enter':
93
+ return funcMatch(stack, lFuncs, str);
94
+ default:
95
+ return funcMatch(stack, lFuncs);
96
+ }
100
97
  };
101
98
  if (doDebugDebug) {
102
- LOG(`setDebugging FUNCS: ${lFuncNames.join(',')}, debugging = false`);
99
+ LOG(`setDebugging FUNCS: ${option}`);
103
100
  }
104
- } else if (isFunction(funcDoDebug)) {
105
- shouldLogFunc = funcDoDebug;
101
+ } else if (isFunction(option)) {
102
+ shouldLog = option;
106
103
  if (doDebugDebug) {
107
104
  LOG("setDebugging to custom func");
108
105
  }
109
106
  } else {
110
- croak(`setDebugging(): bad parameter ${OL(funcDoDebug)}`);
111
- }
112
- if (isFunction(funcDoLog)) {
113
- assert(isFunction(funcDoLog), "setDebugging: arg 2 not a function");
114
- shouldLogString = funcDoLog;
107
+ croak(`setDebugging(): bad parameter ${OL(option)}`);
115
108
  }
116
109
  };
117
110
 
118
111
  // ---------------------------------------------------------------------------
119
112
  // --- export only to allow unit tests
120
- export var funcMatch = function(curFunc, lFuncNames) {
121
- var _, cls, lMatches, meth;
122
- assert(isString(curFunc), "funcMatch(): not a string");
113
+ export var funcMatch = function(stack, lFuncNames, enteringFunc = undef) {
114
+ var _, cls, curFunc, lMatches, meth;
115
+ if (defined(enteringFunc) && (indexOf.call(lFuncNames, enteringFunc) >= 0)) {
116
+ return true;
117
+ }
118
+ curFunc = stack.curFunc();
119
+ assert(isString(curFunc), `funcMatch(): not a string ${OL(curFunc)}`);
123
120
  assert(isArray(lFuncNames), `funcMatch(): bad array ${lFuncNames}`);
124
121
  if (lFuncNames.includes(curFunc)) {
125
122
  return true;
@@ -131,99 +128,123 @@ export var funcMatch = function(curFunc, lFuncNames) {
131
128
  };
132
129
 
133
130
  // ---------------------------------------------------------------------------
134
- // 1. adjust call stack on 'enter' or 'return from'
135
- // 2. adjust debugging flag
136
- // 3. return [mainPrefix, auxPrefix, hEnv, type] - hEnv can be undef
137
- // 4. disable logging by setting type to undef
138
- adjustStack = function(str) {
139
- var _, auxPre, curFunc, hEnv, lMatches, mainPre, trans;
140
- if ((lMatches = str.match(/^\s*enter\s+([A-Za-z_][A-Za-z0-9_\.]*)/))) {
131
+ // --- type is one of: 'enter', 'return', 'string', 'object'
132
+ export var getType = function(str, nObjects) {
133
+ var lMatches;
134
+ if (lMatches = str.match(/^\s*enter\s+([A-Za-z_][A-Za-z0-9_\.]*)/)) {
141
135
  // --- We are entering function curFunc
142
- curFunc = lMatches[1];
143
- hEnv = {debugging, shouldLogFunc, shouldLogString};
144
- debugging = shouldLogFunc(curFunc);
145
- if (doDebugDebug) {
146
- trans = `${hEnv.debugging} => ${debugging}`;
147
- LOG(` ENTER ${curFunc}, debugging: ${trans}`);
148
- }
149
- [mainPre, auxPre] = stack.doCall(curFunc, hEnv, debugging);
150
- return [mainPre, auxPre, undef, shouldLogFunc(curFunc) ? 'enter' : undef];
151
- } else if ((lMatches = str.match(/^\s*return.+from\s+([A-Za-z_][A-Za-z0-9_\.]*)/))) {
152
- curFunc = lMatches[1];
153
- [mainPre, auxPre, hEnv] = stack.returnFrom(curFunc);
154
- if (doDebugDebug) {
155
- LOG(` RETURN FROM ${curFunc}`);
156
- }
157
- return [mainPre, auxPre, hEnv, shouldLogFunc(curFunc) ? 'return' : undef];
136
+ return ['enter', lMatches[1]];
137
+ } else if (lMatches = str.match(/^\s*return.+from\s+([A-Za-z_][A-Za-z0-9_\.]*)/)) {
138
+ return ['return', lMatches[1]];
139
+ } else if (nObjects > 0) {
140
+ return ['objects', undef];
158
141
  } else {
159
- [mainPre, auxPre, _] = stack.logStr();
160
- return [mainPre, auxPre, undef, shouldLogString(str) ? 'string' : undef];
142
+ return ['string', undef];
161
143
  }
162
144
  };
163
145
 
164
146
  // ---------------------------------------------------------------------------
165
- export var debug = function(...lArgs) {
166
- var auxPre, hEnv, hOptions, item, lResult, label, mainPre, nArgs, orgDebugging, trans, type;
167
- // --- We want to allow item to be undef. Therefore, we need to
168
- // distinguish between 1 arg sent vs. 2 args sent
169
- nArgs = lArgs.length;
170
- assert((nArgs === 1) || (nArgs === 2), `debug(): ${nArgs} args`);
171
- // --- label must always be there, and be a string
172
- // item is optional
173
- [label, item] = lArgs;
174
- assert(isString(label), `debug(): 1st arg ${OL(label)} should be a string`);
175
- if (doDebugDebug) {
176
- if (nArgs === 1) {
177
- LOG(`debug('${escapeStr(label)}') - 1 arg`);
178
- } else {
179
- LOG(`debug('${escapeStr(label)}', ${typeof item}) - 2 args`);
180
- }
181
- LOG(`debugging flag = ${OL(debugging)}`);
182
- }
183
- // --- We always need to manipulate the stack when we encounter
184
- // either "enter X" or "return from X", so we can't short-circuit
185
- // when debugging is off
186
- lResult = adjustStack(label);
187
- if (doDebugDebug) {
188
- LOG('lResult', lResult);
189
- }
190
- [mainPre, auxPre, hEnv, type] = lResult;
191
- if (doDebugDebug && (type === undef)) {
192
- LOG("type is undef - NOT LOGGING");
193
- }
194
- hOptions = {
195
- prefix: mainPre,
196
- itemPrefix: auxPre
197
- };
147
+ export var debug = function(label, ...lObjects) {
148
+ var doLog, funcName, i, j, k, l, len1, len2, len3, level, nObjects, obj, prefix, type;
149
+ assert(isString(label), `1st arg ${OL(label)} should be a string`);
150
+ // --- We want to allow objects to be undef. Therefore, we need to
151
+ // distinguish between 1 arg sent vs. 2 or more args sent
152
+ nObjects = lObjects.length;
153
+ // --- funcName is only set for types 'enter' and 'return'
154
+ [type, funcName] = getType(label, nObjects);
198
155
  switch (type) {
199
156
  case 'enter':
200
- log(label, hOptions);
201
- if (nArgs === 2) {
202
- // --- don't repeat the label
203
- logItem(undef, item, hOptions);
157
+ doLog = shouldLog(type, funcName, callStack);
158
+ // --- If we won't be logging when funcName is activated
159
+ // then change 'enter' to 'call'
160
+ callStack.enter(funcName); // add to call stack
161
+ if (!shouldLog('string', 'abc', callStack)) {
162
+ label = label.replace('enter', 'call');
204
163
  }
164
+ callStack.returnFrom(funcName); // remove from call stack
205
165
  break;
206
166
  case 'return':
207
- log(label, hOptions);
208
- if (nArgs === 2) {
209
- // --- don't repeat the label
210
- logItem(undef, item, hOptions);
211
- }
167
+ doLog = shouldLog(type, funcName, callStack);
212
168
  break;
213
169
  case 'string':
214
- if (nArgs === 2) {
215
- logItem(label, item, hOptions);
216
- } else {
217
- log(label, hOptions);
218
- }
170
+ doLog = shouldLog(type, label, callStack);
171
+ assert(nObjects === 0, `multiple objects only not allowed for ${OL(type)}`);
172
+ break;
173
+ case 'objects':
174
+ doLog = shouldLog(type, label, callStack);
175
+ assert(nObjects > 0, `multiple objects only not allowed for ${OL(type)}`);
219
176
  }
220
- if (hEnv) {
221
- orgDebugging = debugging;
222
- ({debugging, shouldLogFunc, shouldLogString} = hEnv);
177
+ if (doDebugDebug) {
178
+ if (nObjects === 0) {
179
+ LOG(`debug(${OL(label)}) - 1 arg`);
180
+ } else {
181
+ LOG(`debug(${OL(label)}), ${nObjects} args`);
182
+ }
183
+ LOG(`doLog = ${OL(doLog)}`);
184
+ LOG(`type = ${OL(type)}`);
185
+ LOG(`funcName = ${OL(funcName)}`);
186
+ }
187
+ if (doLog) {
188
+ level = callStack.getLevel();
189
+ prefix = getPrefix(level);
223
190
  if (doDebugDebug) {
224
- trans = `${orgDebugging} => ${debugging}`;
225
- LOG(` Restore hEnv: debugging: ${trans}`);
191
+ LOG("callStack", callStack);
192
+ LOG(`level = ${OL(level)}`);
193
+ LOG(`prefix = ${OL(prefix)}`);
226
194
  }
195
+ switch (type) {
196
+ case 'enter':
197
+ log(label, {prefix});
198
+ for (i = j = 0, len1 = lObjects.length; j < len1; i = ++j) {
199
+ obj = lObjects[i];
200
+ if (i > 0) {
201
+ log(sep_dash, {
202
+ prefix: removeLastVbar(prefix)
203
+ });
204
+ }
205
+ logItem(undef, obj, {
206
+ prefix: removeLastVbar(prefix)
207
+ });
208
+ }
209
+ break;
210
+ case 'return':
211
+ log(label, {
212
+ prefix: addArrow(prefix)
213
+ });
214
+ for (i = k = 0, len2 = lObjects.length; k < len2; i = ++k) {
215
+ obj = lObjects[i];
216
+ if (i > 0) {
217
+ log(sep_dash, {
218
+ prefix: removeLastVbar(prefix)
219
+ });
220
+ }
221
+ logItem(undef, obj, {
222
+ prefix: removeLastVbar(prefix)
223
+ });
224
+ }
225
+ break;
226
+ case 'string':
227
+ log(label, {prefix});
228
+ break;
229
+ case 'objects':
230
+ if ((nObjects === 1) && shortEnough(label, lObjects[0])) {
231
+ logItem(label, lObjects[0], {prefix});
232
+ } else {
233
+ if (label.indexOf(':') !== label.length - 1) {
234
+ label += ':';
235
+ }
236
+ log(label, {prefix});
237
+ for (l = 0, len3 = lObjects.length; l < len3; l++) {
238
+ obj = lObjects[l];
239
+ logItem(undef, obj, {prefix});
240
+ }
241
+ }
242
+ }
243
+ }
244
+ if (type === 'enter') {
245
+ callStack.enter(funcName, doLog);
246
+ } else if (type === 'return') {
247
+ callStack.returnFrom(funcName);
227
248
  }
228
249
  return true; // allow use in boolean expressions
229
250
  };
@@ -234,12 +255,12 @@ reMethod = /^([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)$/;
234
255
 
235
256
  // ---------------------------------------------------------------------------
236
257
  export var checkTrace = function(block) {
237
- var funcName, i, lMatches, lStack, len, len1, line, ref;
258
+ var funcName, j, lMatches, lStack, len, len1, line, ref;
238
259
  // --- export only to allow unit tests
239
260
  lStack = [];
240
261
  ref = blockToArray(block);
241
- for (i = 0, len1 = ref.length; i < len1; i++) {
242
- line = ref[i];
262
+ for (j = 0, len1 = ref.length; j < len1; j++) {
263
+ line = ref[j];
243
264
  if (lMatches = line.match(/enter\s+([A-Za-z_][A-Za-z0-9_\.]*)/)) {
244
265
  funcName = lMatches[1];
245
266
  lStack.push(funcName);