2016-04-04 3 views
7

は、それ(あるいはそれが定義する関数は)エラーが発生した場合、スタックトレースに示されている行番号と列番号が事前に指定した量によって相殺されるように、文字列をevalするための方法のいずれかを知っていますか? また、長いソース文字列をチャンクに分割して別々に評価したいが、文字列全体が一度に評価されたかのように見えるスタックトレースを取得したいとします。空の行と列を使用することを除いて、この効果を達成する方法はありますか? (私は、好ましくは、クロスブラウザ、ブラウザベースのソリューションが必要ですが、私は主要なブラウザの少なくとも一方に働く何かのために解決することができます。)Eval行と列のオフセットを持つJavascriptの文字列?

+0

おそらくsourcemapsは、移動するための方法ですが、私は彼らがeval' 'で動作するかどうかはわかりません。 – Bergi

+0

ソースマップは、チャンクを評価する単一の文字列に連結するツールで生成する必要がありますが、特定のチャンクで定義された関数が生成過程で使用されるため、チャンクを個別に評価する必要があります後のチャンク。 – user3026691

+0

なぜあなたはこれをしたいですか? –

答えて

0

私がこれまでに見つけた最良の解決策は、それがevalされたています前に、スタックトレース内の一意のファイル名の形でそれにマーカーを与えて、各文字列にsourceURLにディレクティブを付加することです。スタックトレースは、(パーサーコンポーネントstacktracejsを使用して)解析され、マーカーに関連付けられているラインオフセットを参照して修正されます。

var evalCounter = 0; 
var lineCounter = 0; 
var lineOffsetTable = {}; 

    function myEval(code) { 
     lineOffsetTable[evalCounter] = lineCounter; 
     lineCounter += countLines(code); 
     return eval("//# sourceURL=" + (evalCounter++) + "\n" + code); 
    } 

    window.onerror = function(errorMsg, url, lineNumber, column, e) { 
     var stackFrames = ErrorStackParser.parse(e); 
     logStackTrace(stackFrames.map(function(f) { 
     if(f.fileName in lineOffsetTable) 
      f.lineNumber += lineOffsetTable[f.fileName]; 
     return f; 
     })); 
    }; 

残念ながら、これは現時点ではFirefoxでのみ機能します。 Chromeはエラーオブジェクトをonerrorコールバックに渡すことを拒否します(evalされたコードでのみ発生し、不思議な問題です)、IEはsourceURLディレクティブを無視します。

0

私はそれが根底にあるメカニズムので、可能だとは思いません想定される作業は実際にはdeprecatedです。セキュリティ上の理由から、ブラウザはエラーオブジェクトをJavascriptに渡すことはありません。

あなたはJavascriptにコンパイルされるカスタムプログラミング言語で作業しているので、あなたは結果のスクリプトの構造がどうなるか知っています。また、結果のJavascriptに文カウンタを導入することもできます。最後に実行されたことがわかるようになります。ような何か:

function(1); function(2); 
function(3); 

のように翻訳することができます。

12はもちろん.Of "function(n);".lengthある
var __column=0; 
var __line=0; 
function(1); __column+=12; 
function(2); /*__column+=12;*/ __line++; __column=0; 
function(3); /*__column+=12;*/ __line++; __column=0; 

、結果のコードは醜いですが、デバッグフラグか何かでこの動作を可能にすることができます。

+0

エラーオブジェクトを取得することはできますが、提供された行/列のペアが一意でない場合は、実際には役に立ちません。 (そして、私は別々のコードを別々に評価しているので、そうではありません。)私が興味を持っているのは、何とかJSエンジンに、適切なスタックトレースを生成するように指示することです。これはNodeJSのvmモジュールを使って可能ですが、ブラウザで同じことをする方法を探しています。 – user3026691

+0

提案された解決策に関しては、実行が行われた最後の場所は、それ自身では特に有用ではないので、関数が入力/返却されるたびにスタックを維持する必要があります。 また、一時変数を使用してa(b(c))やa + b + cのようなものを平坦化する必要があります。これはすべての操作の定型文であり、私の主な使用例(ゲーム開発)には望ましくないものです。 開発プロセス中にパフォーマンスが低下したとしても、展開された製品でこの機能をオフにしていたので、ユーザーに発生したエラーはデバッグするのが難しくなります。 – user3026691

+0

評価版で使用されている文字列をJSファイルにダンプするのはなぜですか... – IMTheNachoMan

関連する問題