我有一个很大的c++代码库,用Emscripten生成WebAssembly模块。当我向WebAssembly返回的对象添加新属性时,我经常以这样的格式获得UnboundErrorType
:
Cannot call MyModule.myFunc due to unbound types:
N2XY7Something26DateObjectTILNS0_15OptionalMembersE1ENS_5DateTINS0_12DateObjectEEES4_EE
Cannot call MyModule.myFunc due to unbound types:
NSt3__28optionalIN2XY7Something12DateObjectEEE, NSt3__28optionalIN2XY5DateTINS1_7XY12DateObjectEEEEE
虽然我不是在寻找一个具体的解决方案,而是一个解释,但这通常是由如下代码引起的:
auto getDay ( XY::Something::DateObject const & d ) { return d.getDay (); }
auto getMonth( XY::Something::DateObject const & d ) { return d.getMonth(); }
auto getYear ( XY::Something::DateObject const & d ) { return d.getYear (); }
void dummyDateObjectSet( XY::DateObject &, bool ) {}
EMSCRIPTEN_BINDINGS( MyObject )
{
value_object< XY::DateObject >( "DateObject" )
.field( "day" , getDay , dummyDateObjectSet )
.field( "month", getMonth, dummyDateObjectSet )
.field( "year" , getYear , dummyDateObjectSet );
}
我得到了为什么这个错误发生的一般想法,但我不知道如何解释这些标识符,如N2
,7
,ILNS0_15
,EEES4_EE
和类似的。我假设它们以c++的方式表示数据类型,但由于我来自JavaScript背景,我不知道如何阅读这些。
是否有任何参考或文档(或常识)来解释如何理解这一点?
看来我原来的假设完全错了。
这是由名称混淆技术引起的。
通过这种方法可以解码混乱的名称(类似于URI解码)以获得人类可读的信息:
# Ignore that this code may not make sense, it's just to showcase the tool
echo "NSt3__28optionalIN2XY9Something10DateObjectEEE, NSt3__28optionalIN2XY5DateTINS1_2XY10DateObjectEEEEE" | c++filt -t
std::__2::optional<XY::Something::DateObject>, std::__2::optional<XY::DateT<XY::XY::DateObject> >