dart_shared_libray icon indicating copy to clipboard operation
dart_shared_libray copied to clipboard

Add an API to directly execute dart code?

Open arcticfox1919 opened this issue 2 years ago • 1 comments

First of all thank you very much for your work, I happen to have the need to embed the Dart VM to execute the code. Here is the code I read in dart_api_impl_test.cc and it seems that the VM can execute Dart code directly in string form:

TEST_CASE(DartAPI_InstanceOf) {
  const char* kScriptChars =
      "class OtherClass {\n"
      "  static returnNull() { return null; }\n"
      "}\n"
      "class InstanceOfTest {\n"
      "  InstanceOfTest() {}\n"
      "  static InstanceOfTest testMain() {\n"
      "    return new InstanceOfTest();\n"
      "  }\n"
      "}\n";
  Dart_Handle result;
  // Create a test library and Load up a test script in it.
  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);

  // Fetch InstanceOfTest class.
  Dart_Handle type =
      Dart_GetNonNullableType(lib, NewString("InstanceOfTest"), 0, NULL);
  EXPECT_VALID(type);

  // Invoke a function which returns an object of type InstanceOf..
  Dart_Handle instanceOfTestObj =
      Dart_Invoke(type, NewString("testMain"), 0, NULL);
  EXPECT_VALID(instanceOfTestObj);

}

Can you add an API like TestCase::LoadTestScript?

arcticfox1919 avatar Mar 20 '23 15:03 arcticfox1919

Hi @arcticfox1919 ,

I did a brief look and it looks possible, but will need to take advantage of some internal methods. This is really the magic method that's doing most of the work.

So with some work it could be probably be added, and I'd accept a PR to do so, but it's not in my use case so I likely won't get around to it any time soon.

fuzzybinary avatar Mar 21 '23 03:03 fuzzybinary