Skip to content

Program crash after function call with too much parameters #82

@CzaiStefanB

Description

@CzaiStefanB

Hello,

I have a strange behaviour when calling embedded functions with too much parameters.

JavaScriptEngineSwitcher.ChakraCore.JsRt.JsUsageException: Runtime is active on another thread.
bei JavaScriptEngineSwitcher.ChakraCore.JsRt.JsErrorHelpers.ThrowIfError(JsErrorCode errorCode)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.<>c__DisplayClass24_0.b__0()
bei JavaScriptEngineSwitcher.ChakraCore.ScriptDispatcher.ScriptTaskWithResult1.Run() --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde --- bei JavaScriptEngineSwitcher.ChakraCore.ScriptDispatcher.Invoke[T](Func1 func)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.InnerEvaluate(String expression, String documentName)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.InnerEvaluate[T](String expression, String documentName)
bei JavaScriptEngineSwitcher.ChakraCore.ChakraCoreJsEngine.InnerEvaluate[T](String expression)
bei JavaScriptEngineSwitcher.Core.JsEngineBase.Evaluate[T](String expression)
bei TestConsoleRun.Program.JavaScriptEngineSwitcherTest2() in Program.cs:Zeile 335.

I think something gets corrupted in background because with the next function call the program is crashing. When calling a function with too less parameters everything is working like expected. You can use the following code to reproduce this behaviour:

        IJsEngineSwitcher engineSwitcher = JsEngineSwitcher.Current;
        engineSwitcher.EngineFactories.Add(new ChakraCoreJsEngineFactory());
        engineSwitcher.DefaultEngineName = ChakraCoreJsEngine.EngineName;
        IJsEngine javaEngine = engineSwitcher.CreateEngine(ChakraCoreJsEngine.EngineName);
        javaEngine.EmbedHostObject("Sleep", (Action<int>)System.Threading.Thread.Sleep);

        Console.WriteLine("Sleep with correct parameters.");
        Console.WriteLine(javaEngine.Evaluate("Sleep(2000);"));
        try
        {
            Console.WriteLine("Sleep with too less parameters.");
            Console.WriteLine(javaEngine.Evaluate("Sleep();"));   // useful "parameter" exception
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        Console.WriteLine("Sleep with correct parameters.");
        Console.WriteLine(javaEngine.Evaluate("Sleep(2000);"));
        try
        {
            Console.WriteLine("Sleep with too much parameters.");
            Console.WriteLine(javaEngine.Evaluate("Sleep(2000, true);"));   // strange exception ("Runtime is active on another thread."), something is corrupted afterwards
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        Console.WriteLine("Sleep with correct parameters.");
        Console.WriteLine(javaEngine.Evaluate("Sleep(2000);")); // never called because of program crash
        Console.WriteLine("End");

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions