Сборка мусора, указатели и область применения в D - PullRequest
3 голосов
/ 12 июля 2011

Заранее извиняюсь за длинный пост - у меня возникла проблема, я думаю, она может быть связана со сборкой мусора.

У меня есть класс, который упаковывает 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

Я также добавил в ScriptingHost метод, который отслеживал объект cc.global:

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

..., который также работает нормально - проблема возникает, когда я пытаюсь получить доступэто вне класса ала:

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

Может ли кто-нибудь пролить свет на проблему здесь - и, возможно, как обойтиэто, пожалуйста?:)

edit: я использую настройки windows D1-Tango.Я использую версию 0.99.9 Tango / DMD 1.056 Kai.

спасибо,

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Прежде всего, какую операционную систему вы используете?На основании ошибки я угадываю окна?Какую версию dmd / tango вы используете?32 бит или 64 бит?Попробуйте запустить ваше приложение через дизассемблер и посмотреть, какая инструкция указана в 5fd264 (поиск по выводу).Мы должны быть в состоянии помочь больше с некоторой информацией выше.

0 голосов
/ 12 июля 2011

Какую версию DMD вы используете? Если вы все еще используете 1.067, компилируете в 64-битном режиме и используете достаточно древнее оборудование, у вас могут быть проблемы. 1.067 была первой версией с 64-битной поддержкой и имела ошибку, в которой использовались инструкции LAHF и SAHF, которые не поддерживались на очень старых 64-битных процессорах.

...