Open XY0797 opened 9 months ago
比如说LLSE-FakePlayer插件,它除了LLSE-FakePlayer.js外,还有LangPack等文件夹 如果目录为英文,那么engine->loadFile可以成功,插件正常加载 如果目录为英文,那么engine->loadFile会失败,因为脚本引擎的文件读入未使用wchar 理论上engine->eval可以解决问题,但是engine->loadFile却是失败的
LLSE-FakePlayer.zip
BDS放中文目录下,这个插件会无法正常加载
正常加载
图片中我打上了调试信息,报错是expecting '(',非常奇怪
expecting '('
Windows 11 22H2
1.20.62.02
LeviLamina-0.8.3
latest
我调试过代码,错误出现在\src\legacy\main\PluginManager.cpp:156
\src\legacy\main\PluginManager.cpp:156
engine->eval(*scripts, ENGINE_OWN_DATA()->pluginFileOrDirPath);
传入后js引擎无法正常加载,报错是expecting '(',这非常奇怪
我一开始怀疑是上一次那个中文路径的issues修复的不彻底,但是很快我就发现不是这个的问题
因为我发现哪怕是在纯英语(这个文件名是纯英语)的目录环境下,如果我注释外面的engine->loadFile(realPath);,指定使用engine->eval的方法来加载,那么也会报同样的错误
engine->loadFile(realPath);
engine->eval
于是我去看了脚本引擎的loadFile函数源代码 ScriptX\backend\JavaScriptCore\JscEngine.cc:181
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>,但是也是报一样的错误
script::Local<script::String>
显然这不是一个简单的错误,我已经无力解决,希望开发组从头排查一遍,看看到底是什么问题
develop分支已经重写了插件加载部分,应该能解决此问题
确实解决了问题,不过dev分支下无法正常使用插件了,似乎是功能对接还没写完 那等分支合并并且测试通过后再关闭issue
Describe the bug
比如说LLSE-FakePlayer插件,它除了LLSE-FakePlayer.js外,还有LangPack等文件夹 如果目录为英文,那么engine->loadFile可以成功,插件正常加载 如果目录为英文,那么engine->loadFile会失败,因为脚本引擎的文件读入未使用wchar 理论上engine->eval可以解决问题,但是engine->loadFile却是失败的
To Reproduce
LLSE-FakePlayer.zip
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
传入后js引擎无法正常加载,报错是
expecting '('
,这非常奇怪我一开始怀疑是上一次那个中文路径的issues修复的不彻底,但是很快我就发现不是这个的问题
因为我发现哪怕是在纯英语(这个文件名是纯英语)的目录环境下,如果我注释外面的
engine->loadFile(realPath);
,指定使用engine->eval
的方法来加载,那么也会报同样的错误于是我去看了脚本引擎的
loadFile
函数源代码ScriptX\backend\JavaScriptCore\JscEngine.cc:181
我发现这里有一个去除前缀只保留文件名的操作
于是我就写了个同样的取文件名函数,套上去,调试发现还是一样报错
我也尝试过显式转换数据类型为
script::Local<script::String>
,但是也是报一样的错误显然这不是一个简单的错误,我已经无力解决,希望开发组从头排查一遍,看看到底是什么问题