2011-07-11 19 views
3

私は問題を抱えていることを前もって謝罪しています。ガベージコレクションに関連していると思います。Dのガベージコレクション、ポインタとスコープD

私はこのようなDMDScriptをラップするクラスを持っている:

/** 
* Wrapper class for the DMDScript 
*/ 
class ScriptingHost 
{ 
    protected static CallContext *cc ; // Call Context for interaction with the script. 
    protected static Program prg ;  // Reference to program object (this is where the script buffer gets parsed) 

    static this() 
    { 
     // create our program instance 
     prg = new Program(); 

     // create reference to call Context 
     cc = prg.callcontext; 

     Stdout("cc.global: ")(cc.global).newline ; 

     // add some built-in functions, like trace() and trigger() 
     DnativeFunction dnfTrace = new DnativeFunction(&jsTrace, "trace", 0, Dfunction.getPrototype()) ; 
     DnativeFunction dnfTrigger = new DnativeFunction(&jsTrigger, "trigger", 0, Dfunction.getPrototype()) ; 

     // add it to the call context 
     cc.global.Put("trace", dnfTrace , 0); 
     cc.global.Put("trigger", dnfTrigger , 0); 
    } 

    /*********************************************************************** 
    * Helper functions for D<-->JS interaction 
    ************************************************************************/ 

    /** 
    * Trace (output) 
    */ 
    protected static void* jsTrace(Dobject pthis, CallContext* cc, Dobject othis, Value* ret, Value[] arglist) 
    { 
     Stdout("<<")(arglist).newline ; 
     return null; 
    } 

    /** 
    * Trigger 
    */ 
    protected static void* jsTrigger(Dobject pthis, CallContext* cc, Dobject othis, Value* ret, Value[] arglist) 
    { 
     Stdout("<<")(arglist).newline ; 
     return null; 
    } 
} 

これまでのところ、すべてが正常であると私はエラーなしでコードを実行することができます。 出力:

cc.global: dmdscript_tango.dglobal.Dglobal 

私もcc.globalオブジェクトにトレースScriptingHostの方法を追加しました:また、正常に動作します

public static void testGlobal() 
{ 
    Stdout("testGlobal: ")(cc.global).newline.flush ; 
} 

を... - 私は外からアクセスしようとすると問題が発生しますクラスALA:

int main() 
{ 
    Stdout("DMDScriptTest").newline ; 
    ScriptingHost.testGlobal() ; 
    Stdout("global: ")(ScriptingHost.global()).newline.flush ; 
    ScriptingHost.testGlobal() ; 
} 

は、その後、私は次のエラーを取得する:

cc.global: dmdscript_tango.dglobal.Dglobal 
DMDScriptTest 
testGlobal: dmdscript_tango.dglobal.Dglobal 
object.Exception: Illegal Instruction 
---------------- 
[ 5fd264]  0+0 ???                     @0+1975211 :0 
[ 404e05]  0+0 tango.text.convert.Layout.Layout!(char).Layout.parse.process      @0+29 c:\dmd\dmd\bin\..\import\tango\text\convert\Layout.d:595 
[ 404875]  0+0 tango.text.convert.Layout.Layout!(char).Layout.parse        @0+65 c:\dmd\dmd\bin\..\import\tango\text\convert\Layout.d:603 
[ 40463b]  0+0 tango.text.convert.Layout.Layout!(char).Layout.convert       @0+34 c:\dmd\dmd\bin\..\import\tango\text\convert\Layout.d:347 
[ 40418e]  0+0 tango.io.stream.Format.FormatOutput!(char).FormatOutput.print     @0+67 c:\dmd\dmd\bin\..\import\tango\io\stream\Format.d:172 
[ 40206c]  0+0 __Dmain                   @0+45 test2.d:87 
[ 4380b5]  0+0 rt.compiler.dmd.rt.dmain2.main.runMain           @0+119292 :0 
[ 43800b]  0+0 rt.compiler.dmd.rt.dmain2.main.tryExec           @0+119122 :0 
[ 4380f3]  0+0 rt.compiler.dmd.rt.dmain2.main.runAll           @0+119354 :0 
[ 43800b]  0+0 rt.compiler.dmd.rt.dmain2.main.tryExec           @0+119122 :0 
[ 437fc3]  0+0 _main                   @0+119050 :0 
[ 44c980]  0+0 _mainCRTStartup                 @0+203463 :0 
[75e133c8]  0+0 ???                     @0+1973388559 :0 
[76f49ed0]  0+0 ???                     @0+1991438359 :0 
[76f49ea0]  0+0 ???                     @0+1991438311 :0 
global: unittest start 
unittest end 

誰も問題をここで取り除くことができますか?それを回避する方法は? :)

編集:Windows D1-Tangoセットアップを使用しています。私が使用しているバージョンは、0.99.9 Tango/DMD 1.056 Kaiバンドルです。

ありがとう、

答えて

1

まず、どのオペレーティングシステムを使用していますか?エラーに基づいて、私はウィンドウを推測していますか?どのバージョンのdmd/tangoを使用していますか? 32ビットまたは64ビット?逆アセンブラでアプリケーションを実行し、5fd264にリストされている命令を調べてください(出力を検索してください)。私たちは、上記の情報のいくつかでより多くを助けることができるはずです。

+0

私はDMD 1.056/Tango 0.99.9カイを使用しています。それは私のシステムが64ビットを実行しているという。 32ビットまたは64ビットのタンゴを実行しているかどうかを確認するにはどうすればよいですか? – Frederik

+0

Windows/OS Xの場合は32ビットです。 Linuxの場合、 'libtango.aファイル 'があなたに伝えます。または 'dmd -v'。 dsmichaが言及しているように、最初にリリースされたときに64bit dmdに問題がありました。最近のdmdを試して修正できるかどうか確認できますか? (私は、タンゴサイトにいくつかのよりコンパイルされたバイナリがあると信じています)。 – Robert

+0

私は[タンゴの最新バンドル](http://downloads.dsource.org/projects/tango/0.99.9/tango-0.99.9-bin-win32.zip)を使用しています。私が理解しているように、タンゴを破るので、新しいバージョンのDMDに切り替えることはできません(?) – Frederik

0

どのDMDのバージョンを使用していますか?まだ1.067を使用していて、64ビットモードでコンパイルしていて、十分古代のハードウェアを使用している場合は、問題がある可能性があります。 1.067は64ビットサポートの最初のバージョンで、LAHFとSAHF命令を使用するバグがありました.LAHF命令とSAHF命令は、非常に古い64ビットCPUではサポートされていませんでした。

+0

私は窓にDMD 1.056 /タンゴ0.99.9カイを使用しています。私は64ビットを実行していますが、私はD + Tangoのインストールが32ビットであることを99%確信しています – Frederik