質問編集履歴
4
質問本文の一部が debug-code\.js のものに書き換わっていなかったのを修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えました
|
89
|
+
今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えました。例外が発生していない時には V8 Stack Trace API で Google Chrome のみ行数を追えましたが、他のブラウザでは行数を追えません)。
|
90
90
|
|
91
91
|
何か上手い手立てはないものでしょうか。
|
92
92
|
|
@@ -110,9 +110,9 @@
|
|
110
110
|
|
111
111
|
|
112
112
|
|
113
|
-
例外エラー発生時にプログラムを強制終了しない為に `try-catch` を利用している為、コンソールに出力されるコード実行行が `return Function.apply(null, args).apply(
|
113
|
+
例外エラー発生時にプログラムを強制終了しない為に `try-catch` を利用している為、コンソールに出力されるコード実行行が `return Function.apply(null, args).apply(this, getObjectValues(valiables));` の行になってしまいます。
|
114
114
|
|
115
|
-
`test
|
115
|
+
`debug.test()` を呼び出した行数をコンソールに出力したい。
|
116
116
|
|
117
117
|
|
118
118
|
|
3
「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようにしました\(Google Chromeのみ\)
test
CHANGED
File without changes
|
test
CHANGED
@@ -58,7 +58,9 @@
|
|
58
58
|
|
59
59
|
debug.test('\'hoge\''); // "hoge" (※debug.console.allLog() は評価値を返す時、それが String 型なら "" で括る)
|
60
60
|
|
61
|
+
debug.console.options.useStack = true; // エラースタックを返す動作をデフォルトとする(DebugCode#test, DebugCode#console のデフォルト動作に影響)
|
62
|
+
|
61
|
-
debug.test('wm.set(object, 2)'); // WeakMap {Object {} => 2}
|
63
|
+
debug.test('wm.set(object, 2)'); // WeakMap {Object {} => 2} (Google Chrome は例外なしでもエラースタック動作)
|
62
64
|
|
63
65
|
debug.test('wm.get(object)'); // 2
|
64
66
|
|
@@ -74,9 +76,9 @@
|
|
74
76
|
|
75
77
|
debug.test('wm.set.call({}, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver #<Object>
|
76
78
|
|
77
|
-
debug.console.
|
79
|
+
debug.console.logAll(); // 全コードを評価値orエラースタックのコメント付で出力(引数未指定はデフォルトなのでエラースタック指定)
|
78
80
|
|
79
|
-
debug.console.
|
81
|
+
debug.console.logAll(false); // 全コードを評価値orエラーのコメント付で出力(デフォルト動作を上書きしてエラースタック無しを指定)
|
80
82
|
|
81
83
|
</script>
|
82
84
|
|
@@ -87,6 +89,20 @@
|
|
87
89
|
今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えましたが、例外が発生していない時には行数を追えません)。
|
88
90
|
|
89
91
|
何か上手い手立てはないものでしょうか。
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
**(2015/12/10 01:40追記)**
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
Google Chrome のみ、「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようになりました。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
- [Stack Trace API · v8/v8 Wiki](https://github.com/v8/v8/wiki/Stack%20Trace%20API)
|
104
|
+
|
105
|
+
- [JavaScriptStackTraceApi邦訳。Errorオブジェクトのstackについて。 | Ginpen.com](http://ginpen.com/2014/05/13/javascriptstacktraceapi/)
|
90
106
|
|
91
107
|
|
92
108
|
|
@@ -151,3 +167,13 @@
|
|
151
167
|
- 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
|
152
168
|
|
153
169
|
- `debug-code.js` を github に置きました。
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
**(2015/12/10 01:40追記)**
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
- 「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようにしました(Google Chromeのみ)。
|
178
|
+
|
179
|
+
- JSDoc コメントを入れました。
|
2
debug-code\.js の記述修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -31,6 +31,10 @@
|
|
31
31
|
例外エラーが発生するとプログラムが強制終了されますが、今回はコードの実行テストが目的なので強制終了してほしくありません。
|
32
32
|
|
33
33
|
そこで下記コードを組みました。
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
- [debug-code.js: コードを実行し、評価値or例外エラーをプログラムを強制終了せずに返す](https://gist.github.com/think49/bfca562039aa29fa5766)
|
34
38
|
|
35
39
|
|
36
40
|
|
@@ -124,7 +128,7 @@
|
|
124
128
|
|
125
129
|
|
126
130
|
|
127
|
-
`
|
131
|
+
`debug-code.js` を github に置きました。
|
128
132
|
|
129
133
|
|
130
134
|
|
@@ -146,4 +150,4 @@
|
|
146
150
|
|
147
151
|
- 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
|
148
152
|
|
149
|
-
- `
|
153
|
+
- `debug-code.js` を github に置きました。
|
1
error\.stack をコードに反映しました。DebugCode を github に置きました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -34,73 +34,53 @@
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
-
```
|
37
|
+
```HTML
|
38
38
|
|
39
|
-
|
39
|
+
<!-- https://gist.github.com/think49/bfca562039aa29fa5766 のjsファイルを参照する -->
|
40
40
|
|
41
|
+
<script src="debug-code.js"></script>
|
42
|
+
|
43
|
+
<script>
|
44
|
+
|
45
|
+
'use strict';
|
46
|
+
|
47
|
+
var wm = new WeakMap,
|
48
|
+
|
41
|
-
|
49
|
+
object = {},
|
50
|
+
|
51
|
+
debug = new DebugCode({wm: wm, object: object}); // コード実行時に参照するローカル変数を指定する(プロパティ名: ローカル変数名 / プロパティ値: ローカル変数の値)
|
42
52
|
|
43
53
|
|
44
54
|
|
45
|
-
|
55
|
+
debug.test('\'hoge\''); // "hoge" (※debug.console.allLog() は評価値を返す時、それが String 型なら "" で括る)
|
46
56
|
|
47
|
-
|
57
|
+
debug.test('wm.set(object, 2)'); // WeakMap {Object {} => 2}
|
48
58
|
|
59
|
+
debug.test('wm.get(object)'); // 2
|
49
60
|
|
61
|
+
debug.test('wm.get(null)'); // undefined
|
50
62
|
|
51
|
-
|
63
|
+
debug.test('wm.get.call(null)'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver null
|
52
64
|
|
53
|
-
|
65
|
+
debug.test('wm.get.call({})'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver #<Object>
|
54
66
|
|
55
|
-
|
67
|
+
debug.test('wm.set(null, {})'); // TypeError: Invalid value used as weak map key
|
56
68
|
|
69
|
+
debug.test('wm.set.call(null, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver null
|
57
70
|
|
71
|
+
debug.test('wm.set.call({}, {}, 1)'); // TypeError: Method WeakMap.prototype.set called on incompatible receiver #<Object>
|
58
72
|
|
59
|
-
|
73
|
+
debug.console.allLog(); // 全コードを評価値orエラーのコメント付で出力
|
60
74
|
|
61
|
-
|
75
|
+
debug.console.allLog(true); // 全コードを評価値orエラースタックのコメント付で出力
|
62
76
|
|
63
|
-
return function getObjectValues (object) {
|
64
|
-
|
65
|
-
return keys(object).map(mapfn, object);
|
66
|
-
|
67
|
-
};
|
68
|
-
|
69
|
-
}(Object.keys, function mapfn (key) {
|
70
|
-
|
71
|
-
|
77
|
+
</script>
|
72
|
-
|
73
|
-
}))));
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
var wm = new WeakMap,
|
78
|
-
|
79
|
-
object = {};
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
testCode('wm.set(object, 2)', {wm: wm, object: object}); // code1: WeakMap {Object {} => 2}
|
84
|
-
|
85
|
-
testCode('wm.get(object)', {wm: wm, object: object}); // code2: 2
|
86
|
-
|
87
|
-
testCode('wm.get(null)', {wm: wm}); // code3: undefined
|
88
|
-
|
89
|
-
testCode('wm.get.call(null)', {wm: wm}); // code4: TypeError: Method WeakMap.prototype.get called on incompatible receiver null
|
90
|
-
|
91
|
-
testCode('wm.get.call({})', {wm: wm}); // code5: TypeError: Method WeakMap.prototype.get called on incompatible receiver #<Object>
|
92
|
-
|
93
|
-
testCode('wm.set(null, {})', {wm: wm}); // code6: TypeError: Invalid value used as weak map key
|
94
|
-
|
95
|
-
testCode('wm.set.call(null, {}, 1)', {wm: wm}); // code7: TypeError: Method WeakMap.prototype.set called on incompatible receiver null
|
96
|
-
|
97
|
-
testCode('wm.set.call({}, {}, 1)', {wm: wm}); // code8: TypeError: Method WeakMap.prototype.set called on incompatible receiver #<Object>
|
98
78
|
|
99
79
|
```
|
100
80
|
|
101
81
|
|
102
82
|
|
103
|
-
今度は期待通りに動作しますが、コードの実行コードの行数がコンソールで確認できなくなってしまいました。
|
83
|
+
今度は期待通りに動作しますが、~~コードの実行コードの行数がコンソールで確認できなくなってしまいました(tako-black さんに `error.stack` を教えていただいた事で例外発生時には該当行を終えましたが、例外が発生していない時には行数を追えません)。
|
104
84
|
|
105
85
|
何か上手い手立てはないものでしょうか。
|
106
86
|
|
@@ -141,3 +121,29 @@
|
|
141
121
|
- [23.3.3.3 WeakMap.prototype.get(key) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap.prototype.get)
|
142
122
|
|
143
123
|
- [23.3.3.5 WeakMap.prototype.set(key, value) – ECMA-262 6th Edition](http://www.ecma-international.org/ecma-262/6.0/#sec-weakmap.prototype.set)
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
`DebugCode` のサンプルコードを github に置きました。
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
- [debug-code.js: コードを実行し、評価値or例外エラーをプログラムを強制終了せずに返す](https://gist.github.com/think49/bfca562039aa29fa5766)
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
---
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
**(2015/12/09 22:35追記)**
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
- tako-black さんに教えて頂いた `error.stack` をコードに反映しました。
|
144
|
+
|
145
|
+
- 静的関数を止めてコンストラクタ呼び出しする事でローカル変数の指定をキャッシュするようにしました。
|
146
|
+
|
147
|
+
- 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
|
148
|
+
|
149
|
+
- `DebugCode` のサンプルコードを github に置きました。
|