@jdeighan/coffee-utils 7.0.55 → 7.0.58

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