@jdeighan/coffee-utils 7.0.54 → 7.0.57
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.
- package/Debugging.md +6 -0
- package/package.json +1 -1
- package/src/call_stack.coffee +5 -5
- package/src/call_stack.js +6 -5
- package/src/debug_utils.coffee +86 -102
- package/src/debug_utils.js +100 -124
- package/src/log_utils.coffee +8 -2
- package/src/log_utils.js +7 -2
package/Debugging.md
ADDED
package/package.json
CHANGED
package/src/call_stack.coffee
CHANGED
|
@@ -105,7 +105,7 @@ export class CallStack
|
|
|
105
105
|
LOG "[<-- BACK #{fName}]"
|
|
106
106
|
|
|
107
107
|
if @lStack.length == 0
|
|
108
|
-
LOG "ERROR: returnFrom('#{
|
|
108
|
+
LOG "ERROR: returnFrom('#{fName}') but stack is empty"
|
|
109
109
|
return
|
|
110
110
|
|
|
111
111
|
{fullName, isLogged} = @lStack.pop()
|
|
@@ -155,10 +155,10 @@ export class CallStack
|
|
|
155
155
|
|
|
156
156
|
dump: (prefix='', label='CALL STACK') ->
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
lLines = ["#{label}:"]
|
|
159
159
|
if @lStack.length == 0
|
|
160
|
-
|
|
160
|
+
lLines.push " <EMPTY>"
|
|
161
161
|
else
|
|
162
162
|
for item, i in @lStack
|
|
163
|
-
|
|
164
|
-
return
|
|
163
|
+
lLines.push " #{i}: #{item.fullName} #{item.isLogged}"
|
|
164
|
+
return lLines.join("\n") + "\n"
|
package/src/call_stack.js
CHANGED
|
@@ -107,7 +107,7 @@ export var CallStack = class CallStack {
|
|
|
107
107
|
LOG(`[<-- BACK ${fName}]`);
|
|
108
108
|
}
|
|
109
109
|
if (this.lStack.length === 0) {
|
|
110
|
-
LOG(`ERROR: returnFrom('${
|
|
110
|
+
LOG(`ERROR: returnFrom('${fName}') but stack is empty`);
|
|
111
111
|
return;
|
|
112
112
|
}
|
|
113
113
|
({fullName, isLogged} = this.lStack.pop());
|
|
@@ -160,17 +160,18 @@ export var CallStack = class CallStack {
|
|
|
160
160
|
// ........................................................................
|
|
161
161
|
// ........................................................................
|
|
162
162
|
dump(prefix = '', label = 'CALL STACK') {
|
|
163
|
-
var i, item, j, len, ref;
|
|
164
|
-
|
|
163
|
+
var i, item, j, lLines, len, ref;
|
|
164
|
+
lLines = [`${label}:`];
|
|
165
165
|
if (this.lStack.length === 0) {
|
|
166
|
-
|
|
166
|
+
lLines.push(" <EMPTY>");
|
|
167
167
|
} else {
|
|
168
168
|
ref = this.lStack;
|
|
169
169
|
for (i = j = 0, len = ref.length; j < len; i = ++j) {
|
|
170
170
|
item = ref[i];
|
|
171
|
-
|
|
171
|
+
lLines.push(` ${i}: ${item.fullName} ${item.isLogged}`);
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
|
+
return lLines.join("\n") + "\n";
|
|
174
175
|
}
|
|
175
176
|
|
|
176
177
|
};
|
package/src/debug_utils.coffee
CHANGED
|
@@ -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,
|
|
6
6
|
OL, escapeStr, isNumber, isArray, words, pass,
|
|
7
7
|
} from '@jdeighan/coffee-utils'
|
|
8
8
|
import {blockToArray} from '@jdeighan/coffee-utils/block'
|
|
@@ -13,19 +13,66 @@ import {
|
|
|
13
13
|
getPrefix, addArrow, removeLastVbar,
|
|
14
14
|
} from '@jdeighan/coffee-utils/arrow'
|
|
15
15
|
import {
|
|
16
|
-
log, logItem, LOG, shortEnough,
|
|
16
|
+
log, logItem, LOG, shortEnough, dashes,
|
|
17
17
|
} from '@jdeighan/coffee-utils/log'
|
|
18
18
|
|
|
19
19
|
callStack = new CallStack()
|
|
20
|
-
doDebugDebug = false
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
# --- set in resetDebugging() and setDebugging()
|
|
22
|
+
export shouldLog = () -> undef
|
|
23
23
|
export lFuncList = []
|
|
24
24
|
|
|
25
|
+
# --- internal debugging
|
|
26
|
+
doDebugDebug = false
|
|
27
|
+
lFunctions = undef # --- only used when doDebugDebug is true
|
|
28
|
+
|
|
29
|
+
# ---------------------------------------------------------------------------
|
|
30
|
+
|
|
31
|
+
export setDebugDebugging = (value=true) ->
|
|
32
|
+
# --- value can be a boolean or string of words
|
|
33
|
+
|
|
34
|
+
if isBoolean(value)
|
|
35
|
+
doDebugDebug = value
|
|
36
|
+
else if isString(value)
|
|
37
|
+
doDebugDebug = true
|
|
38
|
+
lFunctions = words(value)
|
|
39
|
+
else
|
|
40
|
+
croak "Bad value: #{OL(value)}"
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
# ---------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
logif = (label, lObjects...) ->
|
|
46
|
+
|
|
47
|
+
if ! doDebugDebug
|
|
48
|
+
return
|
|
49
|
+
|
|
50
|
+
assert isString(label), "1st arg #{OL(label)} should be a string"
|
|
51
|
+
nObjects = lObjects.length
|
|
52
|
+
[type, funcName] = getType(label, nObjects)
|
|
53
|
+
switch type
|
|
54
|
+
when 'enter'
|
|
55
|
+
if defined(lFunctions) && (funcName not in lFunctions)
|
|
56
|
+
return
|
|
57
|
+
callStack.enter funcName
|
|
58
|
+
log label, lObjects...
|
|
59
|
+
when 'return'
|
|
60
|
+
if defined(lFunctions) && (funcName not in lFunctions)
|
|
61
|
+
return
|
|
62
|
+
log label, lObjects...
|
|
63
|
+
callStack.returnFrom funcName
|
|
64
|
+
when 'string'
|
|
65
|
+
log label, lObjects...
|
|
66
|
+
when 'objects'
|
|
67
|
+
log label, lObjects...
|
|
68
|
+
return
|
|
69
|
+
|
|
25
70
|
# ---------------------------------------------------------------------------
|
|
26
71
|
|
|
27
72
|
export debug = (label, lObjects...) ->
|
|
28
73
|
|
|
74
|
+
logif "enter debug(#{OL(label)})", lObjects...
|
|
75
|
+
|
|
29
76
|
assert isString(label), "1st arg #{OL(label)} should be a string"
|
|
30
77
|
|
|
31
78
|
# --- We want to allow objects to be undef. Therefore, we need to
|
|
@@ -34,9 +81,11 @@ export debug = (label, lObjects...) ->
|
|
|
34
81
|
|
|
35
82
|
# --- funcName is only set for types 'enter' and 'return'
|
|
36
83
|
[type, funcName] = getType(label, nObjects)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
84
|
+
logif "type = #{OL(type)}"
|
|
85
|
+
logif "funcName = #{OL(funcName)}"
|
|
86
|
+
|
|
87
|
+
# --- function shouldLog() returns the (possibly modified) label
|
|
88
|
+
# if we should log this, else it returns undef
|
|
40
89
|
|
|
41
90
|
switch type
|
|
42
91
|
when 'enter'
|
|
@@ -47,42 +96,44 @@ export debug = (label, lObjects...) ->
|
|
|
47
96
|
when 'string'
|
|
48
97
|
label = shouldLog(label, type, undef, callStack)
|
|
49
98
|
assert (nObjects == 0),
|
|
50
|
-
"
|
|
99
|
+
"Objects not allowed for #{OL(type)}"
|
|
51
100
|
when 'objects'
|
|
52
101
|
label = shouldLog(label, type, undef, callStack)
|
|
53
102
|
assert (nObjects > 0),
|
|
54
|
-
"
|
|
55
|
-
doLog = defined(label)
|
|
103
|
+
"Objects required for #{OL(type)}"
|
|
56
104
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
LOG "doLog = #{OL(doLog)}"
|
|
105
|
+
assert (label == undef) || isString(label),
|
|
106
|
+
"label not a string: #{OL(label)}"
|
|
107
|
+
doLog = defined(label)
|
|
108
|
+
logif "doLog = #{OL(doLog)}"
|
|
109
|
+
logif "#{nObjects} objects"
|
|
63
110
|
|
|
64
111
|
if doLog
|
|
65
112
|
level = callStack.getLevel()
|
|
66
113
|
prefix = getPrefix(level)
|
|
114
|
+
itemPrefix = removeLastVbar(prefix)
|
|
115
|
+
sep = dashes(itemPrefix, 40)
|
|
116
|
+
assert isString(sep), "sep is not a string"
|
|
67
117
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
118
|
+
logif "callStack", callStack
|
|
119
|
+
logif "level = #{OL(level)}"
|
|
120
|
+
logif "prefix = #{OL(prefix)}"
|
|
121
|
+
logif "itemPrefix = #{OL(itemPrefix)}"
|
|
122
|
+
logif "sep = #{OL(sep)}"
|
|
72
123
|
|
|
73
124
|
switch type
|
|
74
125
|
when 'enter'
|
|
75
126
|
log label, {prefix}
|
|
76
127
|
for obj,i in lObjects
|
|
77
128
|
if (i > 0)
|
|
78
|
-
log
|
|
79
|
-
logItem undef, obj, {
|
|
129
|
+
log sep
|
|
130
|
+
logItem undef, obj, {itemPrefix}
|
|
80
131
|
when 'return'
|
|
81
132
|
log label, {prefix: addArrow(prefix)}
|
|
82
133
|
for obj,i in lObjects
|
|
83
134
|
if (i > 0)
|
|
84
|
-
log
|
|
85
|
-
logItem undef, obj, {
|
|
135
|
+
log sep
|
|
136
|
+
logItem undef, obj, {itemPrefix}
|
|
86
137
|
when 'string'
|
|
87
138
|
log label, {prefix}
|
|
88
139
|
when 'objects'
|
|
@@ -100,6 +151,7 @@ export debug = (label, lObjects...) ->
|
|
|
100
151
|
else if (type == 'return')
|
|
101
152
|
callStack.returnFrom funcName
|
|
102
153
|
|
|
154
|
+
logif "return from debug()"
|
|
103
155
|
return true # allow use in boolean expressions
|
|
104
156
|
|
|
105
157
|
# ---------------------------------------------------------------------------
|
|
@@ -120,10 +172,9 @@ export stdShouldLog = (label, type, funcName, stack) ->
|
|
|
120
172
|
assert funcName == undef, "func name #{OL(funcName)} not undef"
|
|
121
173
|
assert stack instanceof CallStack, "not a call stack object"
|
|
122
174
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
LOG "lFuncList", lFuncList
|
|
175
|
+
logif "stdShouldLog(#{OL(label)}, #{OL(type)}, #{OL(funcName)}, stack)"
|
|
176
|
+
logif "stack", stack
|
|
177
|
+
logif "lFuncList", lFuncList
|
|
127
178
|
|
|
128
179
|
switch type
|
|
129
180
|
when 'enter'
|
|
@@ -145,45 +196,19 @@ export stdShouldLog = (label, type, funcName, stack) ->
|
|
|
145
196
|
|
|
146
197
|
# ---------------------------------------------------------------------------
|
|
147
198
|
|
|
148
|
-
export debugDebug = (flag=true) ->
|
|
149
|
-
|
|
150
|
-
doDebugDebug = flag
|
|
151
|
-
if doDebugDebug
|
|
152
|
-
LOG "doDebugDebug = #{flag}"
|
|
153
|
-
return
|
|
154
|
-
|
|
155
|
-
# ---------------------------------------------------------------------------
|
|
156
|
-
|
|
157
|
-
resetDebugging = () ->
|
|
158
|
-
|
|
159
|
-
if doDebugDebug
|
|
160
|
-
LOG "resetDebugging()"
|
|
161
|
-
callStack.reset()
|
|
162
|
-
shouldLog = (label, type, funcName, stack) -> undef
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
# ---------------------------------------------------------------------------
|
|
166
|
-
|
|
167
199
|
export setDebugging = (option) ->
|
|
168
200
|
|
|
169
|
-
|
|
201
|
+
callStack.reset()
|
|
170
202
|
if isBoolean(option)
|
|
171
203
|
if option
|
|
172
204
|
shouldLog = (label, type, funcName, stack) -> label
|
|
173
205
|
else
|
|
174
206
|
shouldLog = (label, type, funcName, stack) -> undef
|
|
175
|
-
if doDebugDebug
|
|
176
|
-
LOG "setDebugging = #{option}"
|
|
177
207
|
else if isString(option)
|
|
178
208
|
lFuncList = getFuncList(option)
|
|
179
209
|
shouldLog = stdShouldLog
|
|
180
|
-
if doDebugDebug
|
|
181
|
-
LOG "setDebugging FUNCS: #{option}"
|
|
182
|
-
LOG 'lFuncList', lFuncList
|
|
183
210
|
else if isFunction(option)
|
|
184
211
|
shouldLog = option
|
|
185
|
-
if doDebugDebug
|
|
186
|
-
LOG "setDebugging to custom func"
|
|
187
212
|
else
|
|
188
213
|
croak "bad parameter #{OL(option)}"
|
|
189
214
|
return
|
|
@@ -227,22 +252,18 @@ export funcMatch = (stack, lFuncList) ->
|
|
|
227
252
|
assert isArray(lFuncList), "not an array #{OL(lFuncList)}"
|
|
228
253
|
|
|
229
254
|
curFunc = stack.curFunc()
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
LOG 'lFuncList', lFuncList
|
|
255
|
+
logif "funcMatch(): curFunc = #{OL(curFunc)}"
|
|
256
|
+
logif stack.dump(' ')
|
|
257
|
+
logif 'lFuncList', lFuncList
|
|
234
258
|
for h in lFuncList
|
|
235
259
|
{name, object, plus} = h
|
|
236
260
|
if (name == curFunc)
|
|
237
|
-
|
|
238
|
-
LOG " curFunc in lFuncList - match successful"
|
|
261
|
+
logif " curFunc in lFuncList - match successful"
|
|
239
262
|
return true
|
|
240
263
|
if plus && stack.isActive(name)
|
|
241
|
-
|
|
242
|
-
LOG " func #{OL(name)} is active - match successful"
|
|
264
|
+
logif " func #{OL(name)} is active - match successful"
|
|
243
265
|
return true
|
|
244
|
-
|
|
245
|
-
LOG " - no match"
|
|
266
|
+
logif " - no match"
|
|
246
267
|
return false
|
|
247
268
|
|
|
248
269
|
# ---------------------------------------------------------------------------
|
|
@@ -285,40 +306,3 @@ reMethod = ///^
|
|
|
285
306
|
|
|
286
307
|
# ---------------------------------------------------------------------------
|
|
287
308
|
|
|
288
|
-
export checkTrace = (block) ->
|
|
289
|
-
# --- export only to allow unit tests
|
|
290
|
-
|
|
291
|
-
lStack = []
|
|
292
|
-
|
|
293
|
-
for line in blockToArray(block)
|
|
294
|
-
if lMatches = line.match(///
|
|
295
|
-
enter
|
|
296
|
-
\s+
|
|
297
|
-
([A-Za-z_][A-Za-z0-9_\.]*)
|
|
298
|
-
///)
|
|
299
|
-
funcName = lMatches[1]
|
|
300
|
-
lStack.push funcName
|
|
301
|
-
else if lMatches = line.match(///
|
|
302
|
-
return
|
|
303
|
-
.*
|
|
304
|
-
from
|
|
305
|
-
\s+
|
|
306
|
-
([A-Za-z_][A-Za-z0-9_\.]*)
|
|
307
|
-
///)
|
|
308
|
-
funcName = lMatches[1]
|
|
309
|
-
len = lStack.length
|
|
310
|
-
if (len == 0)
|
|
311
|
-
log "return from #{funcName} with empty stack"
|
|
312
|
-
else if (lStack[len-1] == funcName)
|
|
313
|
-
lStack.pop()
|
|
314
|
-
else if (lStack[len-2] == funcName)
|
|
315
|
-
log "missing return from #{lStack[len-2]}"
|
|
316
|
-
lStack.pop()
|
|
317
|
-
lStack.pop()
|
|
318
|
-
else
|
|
319
|
-
log "return from #{funcName} - not found on stack"
|
|
320
|
-
return
|
|
321
|
-
|
|
322
|
-
# ---------------------------------------------------------------------------
|
|
323
|
-
|
|
324
|
-
resetDebugging()
|
package/src/debug_utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Generated by CoffeeScript 2.7.0
|
|
2
|
-
// debug_utils.coffee
|
|
3
|
-
var callStack, doDebugDebug, reMethod,
|
|
2
|
+
// debug_utils.coffee
|
|
3
|
+
var callStack, doDebugDebug, lFunctions, logif, reMethod,
|
|
4
|
+
indexOf = [].indexOf;
|
|
4
5
|
|
|
5
6
|
import {
|
|
6
7
|
assert,
|
|
@@ -12,7 +13,6 @@ import {
|
|
|
12
13
|
isString,
|
|
13
14
|
isFunction,
|
|
14
15
|
isBoolean,
|
|
15
|
-
sep_dash,
|
|
16
16
|
OL,
|
|
17
17
|
escapeStr,
|
|
18
18
|
isNumber,
|
|
@@ -47,30 +47,84 @@ import {
|
|
|
47
47
|
log,
|
|
48
48
|
logItem,
|
|
49
49
|
LOG,
|
|
50
|
-
shortEnough
|
|
50
|
+
shortEnough,
|
|
51
|
+
dashes
|
|
51
52
|
} from '@jdeighan/coffee-utils/log';
|
|
52
53
|
|
|
53
54
|
callStack = new CallStack();
|
|
54
55
|
|
|
56
|
+
// --- set in resetDebugging() and setDebugging()
|
|
57
|
+
export var shouldLog = function() {
|
|
58
|
+
return undef;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export var lFuncList = [];
|
|
62
|
+
|
|
63
|
+
// --- internal debugging
|
|
55
64
|
doDebugDebug = false;
|
|
56
65
|
|
|
57
|
-
|
|
66
|
+
lFunctions = undef; // --- only used when doDebugDebug is true
|
|
58
67
|
|
|
59
|
-
|
|
68
|
+
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
export var setDebugDebugging = function(value = true) {
|
|
71
|
+
// --- value can be a boolean or string of words
|
|
72
|
+
if (isBoolean(value)) {
|
|
73
|
+
doDebugDebug = value;
|
|
74
|
+
} else if (isString(value)) {
|
|
75
|
+
doDebugDebug = true;
|
|
76
|
+
lFunctions = words(value);
|
|
77
|
+
} else {
|
|
78
|
+
croak(`Bad value: ${OL(value)}`);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
logif = function(label, ...lObjects) {
|
|
84
|
+
var funcName, nObjects, type;
|
|
85
|
+
if (!doDebugDebug) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
assert(isString(label), `1st arg ${OL(label)} should be a string`);
|
|
89
|
+
nObjects = lObjects.length;
|
|
90
|
+
[type, funcName] = getType(label, nObjects);
|
|
91
|
+
switch (type) {
|
|
92
|
+
case 'enter':
|
|
93
|
+
if (defined(lFunctions) && (indexOf.call(lFunctions, funcName) < 0)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
callStack.enter(funcName);
|
|
97
|
+
log(label, ...lObjects);
|
|
98
|
+
break;
|
|
99
|
+
case 'return':
|
|
100
|
+
if (defined(lFunctions) && (indexOf.call(lFunctions, funcName) < 0)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
log(label, ...lObjects);
|
|
104
|
+
callStack.returnFrom(funcName);
|
|
105
|
+
break;
|
|
106
|
+
case 'string':
|
|
107
|
+
log(label, ...lObjects);
|
|
108
|
+
break;
|
|
109
|
+
case 'objects':
|
|
110
|
+
log(label, ...lObjects);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
60
113
|
|
|
61
114
|
// ---------------------------------------------------------------------------
|
|
62
115
|
export var debug = function(label, ...lObjects) {
|
|
63
|
-
var doLog, funcName, i, j, k, l, len1, len2,
|
|
116
|
+
var doLog, funcName, i, itemPrefix, j, k, l, len, len1, len2, level, nObjects, obj, prefix, sep, type;
|
|
117
|
+
logif(`enter debug(${OL(label)})`, ...lObjects);
|
|
64
118
|
assert(isString(label), `1st arg ${OL(label)} should be a string`);
|
|
65
119
|
// --- We want to allow objects to be undef. Therefore, we need to
|
|
66
120
|
// distinguish between 1 arg sent vs. 2 or more args sent
|
|
67
121
|
nObjects = lObjects.length;
|
|
68
122
|
// --- funcName is only set for types 'enter' and 'return'
|
|
69
123
|
[type, funcName] = getType(label, nObjects);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
124
|
+
logif(`type = ${OL(type)}`);
|
|
125
|
+
logif(`funcName = ${OL(funcName)}`);
|
|
126
|
+
// --- function shouldLog() returns the (possibly modified) label
|
|
127
|
+
// if we should log this, else it returns undef
|
|
74
128
|
switch (type) {
|
|
75
129
|
case 'enter':
|
|
76
130
|
callStack.enter(funcName);
|
|
@@ -81,58 +135,48 @@ export var debug = function(label, ...lObjects) {
|
|
|
81
135
|
break;
|
|
82
136
|
case 'string':
|
|
83
137
|
label = shouldLog(label, type, undef, callStack);
|
|
84
|
-
assert(nObjects === 0, `
|
|
138
|
+
assert(nObjects === 0, `Objects not allowed for ${OL(type)}`);
|
|
85
139
|
break;
|
|
86
140
|
case 'objects':
|
|
87
141
|
label = shouldLog(label, type, undef, callStack);
|
|
88
|
-
assert(nObjects > 0, `
|
|
142
|
+
assert(nObjects > 0, `Objects required for ${OL(type)}`);
|
|
89
143
|
}
|
|
144
|
+
assert((label === undef) || isString(label), `label not a string: ${OL(label)}`);
|
|
90
145
|
doLog = defined(label);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
LOG(`debug(${OL(label)}) - 1 arg`);
|
|
94
|
-
} else {
|
|
95
|
-
LOG(`debug(${OL(label)}), ${nObjects} args`);
|
|
96
|
-
}
|
|
97
|
-
LOG(`doLog = ${OL(doLog)}`);
|
|
98
|
-
}
|
|
146
|
+
logif(`doLog = ${OL(doLog)}`);
|
|
147
|
+
logif(`${nObjects} objects`);
|
|
99
148
|
if (doLog) {
|
|
100
149
|
level = callStack.getLevel();
|
|
101
150
|
prefix = getPrefix(level);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
151
|
+
itemPrefix = removeLastVbar(prefix);
|
|
152
|
+
sep = dashes(itemPrefix, 40);
|
|
153
|
+
assert(isString(sep), "sep is not a string");
|
|
154
|
+
logif("callStack", callStack);
|
|
155
|
+
logif(`level = ${OL(level)}`);
|
|
156
|
+
logif(`prefix = ${OL(prefix)}`);
|
|
157
|
+
logif(`itemPrefix = ${OL(itemPrefix)}`);
|
|
158
|
+
logif(`sep = ${OL(sep)}`);
|
|
107
159
|
switch (type) {
|
|
108
160
|
case 'enter':
|
|
109
161
|
log(label, {prefix});
|
|
110
|
-
for (i = j = 0,
|
|
162
|
+
for (i = j = 0, len = lObjects.length; j < len; i = ++j) {
|
|
111
163
|
obj = lObjects[i];
|
|
112
164
|
if (i > 0) {
|
|
113
|
-
log(
|
|
114
|
-
prefix: removeLastVbar(prefix)
|
|
115
|
-
});
|
|
165
|
+
log(sep);
|
|
116
166
|
}
|
|
117
|
-
logItem(undef, obj, {
|
|
118
|
-
prefix: removeLastVbar(prefix)
|
|
119
|
-
});
|
|
167
|
+
logItem(undef, obj, {itemPrefix});
|
|
120
168
|
}
|
|
121
169
|
break;
|
|
122
170
|
case 'return':
|
|
123
171
|
log(label, {
|
|
124
172
|
prefix: addArrow(prefix)
|
|
125
173
|
});
|
|
126
|
-
for (i = k = 0,
|
|
174
|
+
for (i = k = 0, len1 = lObjects.length; k < len1; i = ++k) {
|
|
127
175
|
obj = lObjects[i];
|
|
128
176
|
if (i > 0) {
|
|
129
|
-
log(
|
|
130
|
-
prefix: removeLastVbar(prefix)
|
|
131
|
-
});
|
|
177
|
+
log(sep);
|
|
132
178
|
}
|
|
133
|
-
logItem(undef, obj, {
|
|
134
|
-
prefix: removeLastVbar(prefix)
|
|
135
|
-
});
|
|
179
|
+
logItem(undef, obj, {itemPrefix});
|
|
136
180
|
}
|
|
137
181
|
break;
|
|
138
182
|
case 'string':
|
|
@@ -146,7 +190,7 @@ export var debug = function(label, ...lObjects) {
|
|
|
146
190
|
label += ':';
|
|
147
191
|
}
|
|
148
192
|
log(label, {prefix});
|
|
149
|
-
for (l = 0,
|
|
193
|
+
for (l = 0, len2 = lObjects.length; l < len2; l++) {
|
|
150
194
|
obj = lObjects[l];
|
|
151
195
|
logItem(undef, obj, {prefix});
|
|
152
196
|
}
|
|
@@ -158,6 +202,7 @@ export var debug = function(label, ...lObjects) {
|
|
|
158
202
|
} else if (type === 'return') {
|
|
159
203
|
callStack.returnFrom(funcName);
|
|
160
204
|
}
|
|
205
|
+
logif("return from debug()");
|
|
161
206
|
return true; // allow use in boolean expressions
|
|
162
207
|
};
|
|
163
208
|
|
|
@@ -179,11 +224,9 @@ export var stdShouldLog = function(label, type, funcName, stack) {
|
|
|
179
224
|
assert(funcName === undef, `func name ${OL(funcName)} not undef`);
|
|
180
225
|
}
|
|
181
226
|
assert(stack instanceof CallStack, "not a call stack object");
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
LOG("lFuncList", lFuncList);
|
|
186
|
-
}
|
|
227
|
+
logif(`stdShouldLog(${OL(label)}, ${OL(type)}, ${OL(funcName)}, stack)`);
|
|
228
|
+
logif("stack", stack);
|
|
229
|
+
logif("lFuncList", lFuncList);
|
|
187
230
|
switch (type) {
|
|
188
231
|
case 'enter':
|
|
189
232
|
if (funcMatch(stack, lFuncList)) {
|
|
@@ -206,28 +249,9 @@ export var stdShouldLog = function(label, type, funcName, stack) {
|
|
|
206
249
|
return undef;
|
|
207
250
|
};
|
|
208
251
|
|
|
209
|
-
// ---------------------------------------------------------------------------
|
|
210
|
-
export var debugDebug = function(flag = true) {
|
|
211
|
-
doDebugDebug = flag;
|
|
212
|
-
if (doDebugDebug) {
|
|
213
|
-
LOG(`doDebugDebug = ${flag}`);
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
// ---------------------------------------------------------------------------
|
|
218
|
-
resetDebugging = function() {
|
|
219
|
-
if (doDebugDebug) {
|
|
220
|
-
LOG("resetDebugging()");
|
|
221
|
-
}
|
|
222
|
-
callStack.reset();
|
|
223
|
-
shouldLog = function(label, type, funcName, stack) {
|
|
224
|
-
return undef;
|
|
225
|
-
};
|
|
226
|
-
};
|
|
227
|
-
|
|
228
252
|
// ---------------------------------------------------------------------------
|
|
229
253
|
export var setDebugging = function(option) {
|
|
230
|
-
|
|
254
|
+
callStack.reset();
|
|
231
255
|
if (isBoolean(option)) {
|
|
232
256
|
if (option) {
|
|
233
257
|
shouldLog = function(label, type, funcName, stack) {
|
|
@@ -238,21 +262,11 @@ export var setDebugging = function(option) {
|
|
|
238
262
|
return undef;
|
|
239
263
|
};
|
|
240
264
|
}
|
|
241
|
-
if (doDebugDebug) {
|
|
242
|
-
LOG(`setDebugging = ${option}`);
|
|
243
|
-
}
|
|
244
265
|
} else if (isString(option)) {
|
|
245
266
|
lFuncList = getFuncList(option);
|
|
246
267
|
shouldLog = stdShouldLog;
|
|
247
|
-
if (doDebugDebug) {
|
|
248
|
-
LOG(`setDebugging FUNCS: ${option}`);
|
|
249
|
-
LOG('lFuncList', lFuncList);
|
|
250
|
-
}
|
|
251
268
|
} else if (isFunction(option)) {
|
|
252
269
|
shouldLog = option;
|
|
253
|
-
if (doDebugDebug) {
|
|
254
|
-
LOG("setDebugging to custom func");
|
|
255
|
-
}
|
|
256
270
|
} else {
|
|
257
271
|
croak(`bad parameter ${OL(option)}`);
|
|
258
272
|
}
|
|
@@ -261,10 +275,10 @@ export var setDebugging = function(option) {
|
|
|
261
275
|
// ---------------------------------------------------------------------------
|
|
262
276
|
// --- export only to allow unit tests
|
|
263
277
|
export var getFuncList = function(str) {
|
|
264
|
-
var _, ident1, ident2, j, lMatches,
|
|
278
|
+
var _, ident1, ident2, j, lMatches, len, plus, ref, word;
|
|
265
279
|
lFuncList = [];
|
|
266
280
|
ref = words(str);
|
|
267
|
-
for (j = 0,
|
|
281
|
+
for (j = 0, len = ref.length; j < len; j++) {
|
|
268
282
|
word = ref[j];
|
|
269
283
|
if (lMatches = word.match(/^([A-Za-z_][A-Za-z0-9_]*)(?:\.([A-Za-z_][A-Za-z0-9_]*))?(\+)?$/)) {
|
|
270
284
|
[_, ident1, ident2, plus] = lMatches;
|
|
@@ -290,33 +304,25 @@ export var getFuncList = function(str) {
|
|
|
290
304
|
// ---------------------------------------------------------------------------
|
|
291
305
|
// --- export only to allow unit tests
|
|
292
306
|
export var funcMatch = function(stack, lFuncList) {
|
|
293
|
-
var curFunc, h, j,
|
|
307
|
+
var curFunc, h, j, len, name, object, plus;
|
|
294
308
|
assert(isArray(lFuncList), `not an array ${OL(lFuncList)}`);
|
|
295
309
|
curFunc = stack.curFunc();
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
}
|
|
301
|
-
for (j = 0, len1 = lFuncList.length; j < len1; j++) {
|
|
310
|
+
logif(`funcMatch(): curFunc = ${OL(curFunc)}`);
|
|
311
|
+
logif(stack.dump(' '));
|
|
312
|
+
logif('lFuncList', lFuncList);
|
|
313
|
+
for (j = 0, len = lFuncList.length; j < len; j++) {
|
|
302
314
|
h = lFuncList[j];
|
|
303
315
|
({name, object, plus} = h);
|
|
304
316
|
if (name === curFunc) {
|
|
305
|
-
|
|
306
|
-
LOG(" curFunc in lFuncList - match successful");
|
|
307
|
-
}
|
|
317
|
+
logif(" curFunc in lFuncList - match successful");
|
|
308
318
|
return true;
|
|
309
319
|
}
|
|
310
320
|
if (plus && stack.isActive(name)) {
|
|
311
|
-
|
|
312
|
-
LOG(` func ${OL(name)} is active - match successful`);
|
|
313
|
-
}
|
|
321
|
+
logif(` func ${OL(name)} is active - match successful`);
|
|
314
322
|
return true;
|
|
315
323
|
}
|
|
316
324
|
}
|
|
317
|
-
|
|
318
|
-
LOG(" - no match");
|
|
319
|
-
}
|
|
325
|
+
logif(" - no match");
|
|
320
326
|
return false;
|
|
321
327
|
};
|
|
322
328
|
|
|
@@ -340,33 +346,3 @@ export var getType = function(str, nObjects) {
|
|
|
340
346
|
reMethod = /^([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)$/;
|
|
341
347
|
|
|
342
348
|
// ---------------------------------------------------------------------------
|
|
343
|
-
export var checkTrace = function(block) {
|
|
344
|
-
var funcName, j, lMatches, lStack, len, len1, line, ref;
|
|
345
|
-
// --- export only to allow unit tests
|
|
346
|
-
lStack = [];
|
|
347
|
-
ref = blockToArray(block);
|
|
348
|
-
for (j = 0, len1 = ref.length; j < len1; j++) {
|
|
349
|
-
line = ref[j];
|
|
350
|
-
if (lMatches = line.match(/enter\s+([A-Za-z_][A-Za-z0-9_\.]*)/)) {
|
|
351
|
-
funcName = lMatches[1];
|
|
352
|
-
lStack.push(funcName);
|
|
353
|
-
} else if (lMatches = line.match(/return.*from\s+([A-Za-z_][A-Za-z0-9_\.]*)/)) {
|
|
354
|
-
funcName = lMatches[1];
|
|
355
|
-
len = lStack.length;
|
|
356
|
-
if (len === 0) {
|
|
357
|
-
log(`return from ${funcName} with empty stack`);
|
|
358
|
-
} else if (lStack[len - 1] === funcName) {
|
|
359
|
-
lStack.pop();
|
|
360
|
-
} else if (lStack[len - 2] === funcName) {
|
|
361
|
-
log(`missing return from ${lStack[len - 2]}`);
|
|
362
|
-
lStack.pop();
|
|
363
|
-
lStack.pop();
|
|
364
|
-
} else {
|
|
365
|
-
log(`return from ${funcName} - not found on stack`);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
// ---------------------------------------------------------------------------
|
|
372
|
-
resetDebugging();
|
package/src/log_utils.coffee
CHANGED
|
@@ -20,6 +20,12 @@ fourSpaces = ' '
|
|
|
20
20
|
|
|
21
21
|
# ---------------------------------------------------------------------------
|
|
22
22
|
|
|
23
|
+
export dashes = (prefix, totalLen=64, ch='-') ->
|
|
24
|
+
|
|
25
|
+
return prefix + ch.repeat(totalLen - prefix.length)
|
|
26
|
+
|
|
27
|
+
# ---------------------------------------------------------------------------
|
|
28
|
+
|
|
23
29
|
export debugLog = (flag=true) ->
|
|
24
30
|
|
|
25
31
|
doDebugLog = flag
|
|
@@ -129,9 +135,9 @@ export log = (str, hOptions={}) ->
|
|
|
129
135
|
# --- valid options:
|
|
130
136
|
# prefix
|
|
131
137
|
|
|
138
|
+
assert isString(str), "log(): not a string: #{OL(str)}"
|
|
132
139
|
assert isFunction(putstr), "putstr not properly set"
|
|
133
|
-
assert
|
|
134
|
-
assert isHash(hOptions), "log(): arg 2 not a hash"
|
|
140
|
+
assert isHash(hOptions), "log(): arg 2 not a hash: #{OL(hOptions)}"
|
|
135
141
|
prefix = fixForTerminal(hOptions.prefix)
|
|
136
142
|
|
|
137
143
|
if doDebugLog
|
package/src/log_utils.js
CHANGED
|
@@ -39,6 +39,11 @@ export var stringify = undef;
|
|
|
39
39
|
|
|
40
40
|
fourSpaces = ' ';
|
|
41
41
|
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
export var dashes = function(prefix, totalLen = 64, ch = '-') {
|
|
44
|
+
return prefix + ch.repeat(totalLen - prefix.length);
|
|
45
|
+
};
|
|
46
|
+
|
|
42
47
|
// ---------------------------------------------------------------------------
|
|
43
48
|
export var debugLog = function(flag = true) {
|
|
44
49
|
doDebugLog = flag;
|
|
@@ -153,9 +158,9 @@ export var log = function(str, hOptions = {}) {
|
|
|
153
158
|
var prefix;
|
|
154
159
|
// --- valid options:
|
|
155
160
|
// prefix
|
|
161
|
+
assert(isString(str), `log(): not a string: ${OL(str)}`);
|
|
156
162
|
assert(isFunction(putstr), "putstr not properly set");
|
|
157
|
-
assert(
|
|
158
|
-
assert(isHash(hOptions), "log(): arg 2 not a hash");
|
|
163
|
+
assert(isHash(hOptions), `log(): arg 2 not a hash: ${OL(hOptions)}`);
|
|
159
164
|
prefix = fixForTerminal(hOptions.prefix);
|
|
160
165
|
if (doDebugLog) {
|
|
161
166
|
LOG(`CALL log(${OL(str)}), prefix = ${OL(prefix)}`);
|