1*023bc8eaSKudo Chien #include "WorkletsCache.h"
2*023bc8eaSKudo Chien #include "FrozenObject.h"
3*023bc8eaSKudo Chien #include "ShareableValue.h"
4*023bc8eaSKudo Chien
5*023bc8eaSKudo Chien #include <string>
6*023bc8eaSKudo Chien #include <utility>
7*023bc8eaSKudo Chien
8*023bc8eaSKudo Chien using namespace facebook;
9*023bc8eaSKudo Chien
10*023bc8eaSKudo Chien namespace reanimated {
11*023bc8eaSKudo Chien
eval(jsi::Runtime & rt,const char * code)12*023bc8eaSKudo Chien jsi::Value eval(jsi::Runtime &rt, const char *code) {
13*023bc8eaSKudo Chien return rt.global().getPropertyAsFunction(rt, "eval").call(rt, code);
14*023bc8eaSKudo Chien }
15*023bc8eaSKudo Chien
function(jsi::Runtime & rt,const std::string & code)16*023bc8eaSKudo Chien jsi::Function function(jsi::Runtime &rt, const std::string &code) {
17*023bc8eaSKudo Chien return eval(rt, ("(" + code + ")").c_str()).getObject(rt).getFunction(rt);
18*023bc8eaSKudo Chien }
19*023bc8eaSKudo Chien
getFunction(jsi::Runtime & rt,std::shared_ptr<FrozenObject> frozenObj)20*023bc8eaSKudo Chien std::shared_ptr<jsi::Function> WorkletsCache::getFunction(
21*023bc8eaSKudo Chien jsi::Runtime &rt,
22*023bc8eaSKudo Chien std::shared_ptr<FrozenObject> frozenObj) {
23*023bc8eaSKudo Chien long long workletHash =
24*023bc8eaSKudo Chien ValueWrapper::asNumber(frozenObj->map["__workletHash"]->valueContainer);
25*023bc8eaSKudo Chien if (worklets.count(workletHash) == 0) {
26*023bc8eaSKudo Chien auto codeBuffer = std::make_shared<const jsi::StringBuffer>(
27*023bc8eaSKudo Chien "(" +
28*023bc8eaSKudo Chien ValueWrapper::asString(frozenObj->map["asString"]->valueContainer) +
29*023bc8eaSKudo Chien ")");
30*023bc8eaSKudo Chien auto func = rt.evaluateJavaScript(
31*023bc8eaSKudo Chien codeBuffer,
32*023bc8eaSKudo Chien ValueWrapper::asString(
33*023bc8eaSKudo Chien frozenObj->map["__location"]->valueContainer))
34*023bc8eaSKudo Chien .asObject(rt)
35*023bc8eaSKudo Chien .asFunction(rt);
36*023bc8eaSKudo Chien worklets[workletHash] = std::make_shared<jsi::Function>(std::move(func));
37*023bc8eaSKudo Chien }
38*023bc8eaSKudo Chien return worklets[workletHash];
39*023bc8eaSKudo Chien }
40*023bc8eaSKudo Chien
41*023bc8eaSKudo Chien } // namespace reanimated
42