@jdeighan/coffee-utils 7.0.50 → 7.0.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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);