質問編集履歴

4

質問本文の一部が debug-code\.js のものに書き換わっていなかったのを修正

2015/12/15 04:13

投稿

think49
think49

スコア18166

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(null, getObjectValues(valiables));` の行になってしまいます。
113
+ 例外エラー発生時にプログラムを強制終了しない為に `try-catch` を利用している為、コンソールに出力されるコード実行行が `return Function.apply(null, args).apply(this, getObjectValues(valiables));` の行になってしまいます。
114
114
 
115
- `testCode()` を呼び出した行数をコンソールに出力したい。
115
+ `debug.test()` を呼び出した行数をコンソールに出力したい。
116
116
 
117
117
 
118
118
 

3

「JavaScript Stack Trace API」を使用して例外未発生時にもエラースタックで追従できるようにしました\(Google Chromeのみ\)

2015/12/15 04:13

投稿

think49
think49

スコア18166

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.allLog(); // 全コードを評価値orエラーのコメント付で出力
79
+ debug.console.logAll(); // 全コードを評価値orエラースタックのコメント付で出力(引数未指定はデフォルトなのでエラースタック指定)
78
80
 
79
- debug.console.allLog(true); // 全コードを評価値orエラースタックのコメント付で出力
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 の記述修正

2015/12/09 16:41

投稿

think49
think49

スコア18166

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
- `DebugCode` のサンプルコードを github に置きました。
131
+ `debug-code.js` を github に置きました。
128
132
 
129
133
 
130
134
 
@@ -146,4 +150,4 @@
146
150
 
147
151
  - 実行コード、評価値、エラーをキャッシュし、最後にまとめて出力できるようにしました。
148
152
 
149
- - `DebugCode` のサンプルコードを github に置きました。
153
+ - `debug-code.js` を github に置きました。

1

error\.stack をコードに反映しました。DebugCode を github に置きました。

2015/12/09 13:37

投稿

think49
think49

スコア18166

test CHANGED
File without changes
test CHANGED
@@ -34,73 +34,53 @@
34
34
 
35
35
 
36
36
 
37
- ```JavaScript
37
+ ```HTML
38
38
 
39
- var testCode = (function (getObjectValues) {
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
- var i = 0;
49
+ object = {},
50
+
51
+ debug = new DebugCode({wm: wm, object: object}); // コード実行時に参照するローカル変数を指定する(プロパティ名: ローカル変数名 / プロパティ値: ローカル変数の値)
42
52
 
43
53
 
44
54
 
45
- function testCode (code, valiables) {
55
+ debug.test('\'hoge\''); // "hoge" (※debug.console.allLog() は評価値を返す時、それが String 型なら "" で括る)
46
56
 
47
- var args = Object.keys(valiables);
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
- args.push('try {console.log(\'code' + ++i + ': \', ' + String(code) + ');} catch (error) { console.error(error); }');
63
+ debug.test('wm.get.call(null)'); // TypeError: Method WeakMap.prototype.get called on incompatible receiver null
52
64
 
53
- return Function.apply(null, args).apply(null, getObjectValues(valiables));
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
- return testCode;
73
+ debug.console.allLog(); // 全コードを評価値orエラーのコメント付で出力
60
74
 
61
- }((function (keys, mapfn) {
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
- return this[key];
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 に置きました。