Git Product home page Git Product logo

Comments (6)

ClearScriptLib avatar ClearScriptLib commented on May 22, 2024

Hi @Muchaszewski,

First, your CreateObject method could simply be this:

public static object CreateObject(string document)
{
    return _engine.Evaluate(document);
}

Second, how do setScriptData and getScriptData work?

from clearscript.

Muchaszewski avatar Muchaszewski commented on May 22, 2024

Thanks for a tip.

Those methods are pretty straightforward. Just dictionary storage.

        public Dictionary<string, object> ScriptResults = new Dictionary<string, object>();

        public void setScriptData(string name, object value)
        {
            ScriptResults[name] = value;
        }

        public object getScriptData(string name)
        {
            if (ScriptResults.ContainsKey(name))
            {
                return ScriptResults[name];
            }
            return null;
        }

from clearscript.

ClearScriptLib avatar ClearScriptLib commented on May 22, 2024

@Muchaszewski, is it possible that, when your script calls getScriptData, it gets an object that was created by a different instance of V8ScriptEngine? That would explain what you're seeing.

A script engine cannot be given direct access to an object created by another script engine, so ClearScript provides a proxy that marshals invocations across script engine boundaries. JavaScript's typeof always returns "function" when applied to a ClearScript proxy.

Note that, although ClearScript supports this setup, it isn't recommended. Invocations across script engines incur heavy overhead, and the full capabilities of the target object may not be accessible.

If the object belongs to the same script engine, ClearScript should hand it off without a proxy, resulting in the expected behavior. Please let us know if that's not the case.

from clearscript.

Muchaszewski avatar Muchaszewski commented on May 22, 2024

I confirm that the case. CreateObject is using a different instance of V8ScriptEngine. This is due to the limitation I have encountered. Settings up Engine.MaxRuntimeStackUsage = 50 and invoking CreateObject always created stack overflow on complicated enough objects, or when reaching stack limit and trying to create anything.

My idea to prevent developers from passing object from different instances of an engine, and making them wonder about errors that can occur from that, simple check and a setting for instantiation of an engine.

Engine = new V8ScriptEngine();
Engine.AllowProxyObjects = true; //Default is false

from clearscript.

ClearScriptLib avatar ClearScriptLib commented on May 22, 2024

@Muchaszewski, the runtime stack usage limit is specified in bytes. A value of 50 actually selects an internal minimum, which is currently 16 KiB, and while that may be enough to run simple scripts, it's not surprising that you can easily overflow it by calling into the host and back out to script code.

Consider increasing that limit, or not specifying one at all. A higher limit will let you reign in runaway scripts without having to deal with the overhead of external script objects.

from clearscript.

Muchaszewski avatar Muchaszewski commented on May 22, 2024

Ok. I will close this ticket as the issue with inconsistency is solved.

As mentioned above would be nice to have documentation on that behavior that multiple V8ScriptEngine "talking" to each other may cause an error, this is not so obvious as my example has shown :)

from clearscript.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.