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