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