50 lines
1.3 KiB
Text
50 lines
1.3 KiB
Text
|
|
#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<const uint8_t *>(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<NSDataBuffer>(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<jsi::StringBuffer>(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
|