Home

Awesome

SlowSharp Build Status

Slow version of C# interpreter because modern JITs are too fast.<br> Web Playground

Pros

Zero-binding

Even this can be possible:

CScript.Run(@"
   CScript.Run("" Console.WriteLine(""hello from inception""); "");
");

Hot Reloading

Can replace methods after parsing. This also affects already instantiated objects.

var r = CScript.CreateRunner(@"
class Foo { public int GiveMeNumber() => 10; }
");

var foo = r.Instantiate("Foo");
// should be 10
foo.Invoke("GiveMeNumber");
ss.UpdateMethodsOnly(@"
class Foo { public int GiveMeNumber() => 20; }
");
// should be 20
foo.Invoke("GiveMeNumber");

Overriding (Virtual inheritance)

Supports virtual inheritance, this is useful with Unity.

class MyBehaviour : MonoBehaviour { 
   public void SayHello() { /* ... */ }
}
// Error, MonoBehaviour cannot be instantiated by Unity's law
ss.Instantiate("MyBehaviour");

// Use this when you're not able to create an object yourself.
ss.Override("MyBehaviour", gameObject);

Finally, there will be two instances, but act as one derivered object.

// You can invoke methods from `MyBehaviour` which are defined in script-side.
ss.Invoke("SayHello");

// You can also invoke methods from `MonoBehaviour`
ss.Invoke("StopAllCoroutines");

Sandboxing

Access control

Prevents malicious function call such as Threading and File.

var ac = new AccessControl();
ac.AddBlockedType("System.Threading.Thread");
ac.AddBlockedNamespace("System.IO");

new RunConfig() {
  accessControl = ac
};

Timeout

Prevents long-running tasks with a timeout option.

new RunConfig() {
  timeout = 1000 /* ms */
};

Limitations

Since SlowSharp is an interpreter, there're some differences and limitations.

Lazy semantic validation<br> SlowSharp does not validate whole syntaxs during the parse time. It only checks the overall form is valid or not.<br> As a result, some mistakes won't be detected until it's fully reached and executed.

Console.WriteLine("Hello");

// There's not method `WriteLn` in `Conosle` class.
// However, this will not throw an exception util SlowSharp actually 
// evaluates the below line.
Console.WriteLn("World");
var a = 1234;
Console.WriteLine(a);
var a = 4556; // redefination