#import "JSI.h" #import "Logger.h" #import "Utils.h" using namespace facebook; namespace { class NSDataBuffer : public jsi::Buffer { public: explicit NSDataBuffer(NSData *data) : data_(data) {} size_t size() const override { return data_.length; } const uint8_t *data() const override { return static_cast(data_.bytes); } private: NSData *data_; }; } @implementation JSI + (void)evaluate:(NSData *)scriptData tag:(NSString *)tag runtime:(jsi::Runtime &)runtime { if (scriptData.length == 0) return; try { if (isHermesBytecode(scriptData)) { auto buffer = std::make_shared(scriptData); auto prepared = runtime.prepareJavaScript(buffer, std::string(tag.UTF8String)); runtime.evaluatePreparedJavaScript(prepared); } else { std::string source((const char *)scriptData.bytes, scriptData.length); auto buffer = std::make_shared(std::move(source)); runtime.evaluateJavaScript(buffer, std::string(tag.UTF8String)); } } catch (const jsi::JSError &e) { RevengeLog(@"[JSI] evaluate error: JSError for '%@': %s", tag, e.what()); } catch (const std::exception &e) { RevengeLog(@"[JSI] evaluate error: exception for '%@': %s", tag, e.what()); } } @end