[Bug]: 对于有复合目录的插件,如果engine->loadFile失败,那么engine->eval返回错误
Describe the bug
比如说LLSE-FakePlayer插件,它除了LLSE-FakePlayer.js外,还有LangPack等文件夹 如果目录为英文,那么engine->loadFile可以成功,插件正常加载 如果目录为英文,那么engine->loadFile会失败,因为脚本引擎的文件读入未使用wchar 理论上engine->eval可以解决问题,但是engine->loadFile却是失败的
To Reproduce
BDS放中文目录下,这个插件会无法正常加载
Expected behavior
正常加载
Screenshots
图片中我打上了调试信息,报错是
expecting '(',非常奇怪
Platform
Windows 11 22H2
BDS Version
1.20.62.02
LeviLamina Version
LeviLamina-0.8.3
LegacyScriptEngine Version
latest
Additional context
我调试过代码,错误出现在\src\legacy\main\PluginManager.cpp:156
engine->eval(*scripts, ENGINE_OWN_DATA()->pluginFileOrDirPath);
传入后js引擎无法正常加载,报错是 expecting '(',这非常奇怪
我一开始怀疑是上一次那个中文路径的issues修复的不彻底,但是很快我就发现不是这个的问题
因为我发现哪怕是在纯英语(这个文件名是纯英语)的目录环境下,如果我注释外面的engine->loadFile(realPath);,指定使用engine->eval的方法来加载,那么也会报同样的错误
于是我去看了脚本引擎的loadFile函数源代码
ScriptX\backend\JavaScriptCore\JscEngine.cc:181
Local<Value> JscEngine::loadFile(const Local<String>& scriptFile) {
if(scriptFile.toString().empty())
throw Exception("script file no found");
Local<Value> content = internal::readAllFileContent(scriptFile);
if(content.isNull())
throw Exception("can't load script file");
std::string sourceFilePath = scriptFile.toString();
std::size_t pathSymbol = sourceFilePath.rfind("/");
if(pathSymbol != std::string::npos)
sourceFilePath = sourceFilePath.substr(pathSymbol + 1);
else
{
pathSymbol = sourceFilePath.rfind("\\");
if(pathSymbol != std::string::npos)
sourceFilePath = sourceFilePath.substr(pathSymbol + 1);
}
Local<String> sourceFileName = String::newString(sourceFilePath);
return eval(content.asString(), sourceFileName);
}
我发现这里有一个去除前缀只保留文件名的操作
于是我就写了个同样的取文件名函数,套上去,调试发现还是一样报错
我也尝试过显式转换数据类型为script::Local<script::String>,但是也是报一样的错误
显然这不是一个简单的错误,我已经无力解决,希望开发组从头排查一遍,看看到底是什么问题
develop分支已经重写了插件加载部分,应该能解决此问题
develop分支已经重写了插件加载部分,应该能解决此问题
确实解决了问题,不过dev分支下无法正常使用插件了,似乎是功能对接还没写完 那等分支合并并且测试通过后再关闭issue