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