WebAssembly не может скомпилировать простые классы?
Я поигрался с WebAssembly Explorer, чтобы привыкнуть к общей концепции, и я считаю, что получаю неправильный вывод:
Код C++:
class Rectangle {
void draw(int fooBar) {};
};
Выход в веб-сборку:
(module
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
)
Честно говоря, это не выглядит правильно. Почему он не показывает функцию? Я действительно ожидал, что проводник экспортирует функцию, которая может выглядеть примерно так:
(export "_Z4drawi" (func $_Z4drawi))
(func $_Z4drawi (param $0 i32)
Вместо этого, однако, он делает вид, что объект был пуст... почему это так?
1 ответ
Решение
LLVM устраняет вашу функцию, потому что она не используется.
Попробуйте использовать его и сделать его не встроенным (чтобы не допустить его устранения):
class Rectangle {
public:
Rectangle() {}
__attribute__((noinline)) void draw(int fooBar) {}
};
int main() {
Rectangle r;
r.draw(42);
}
И вы получите:
(module
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(export "main" (func $main))
(func $main (result i32)
(local $0 i32)
(i32.store offset=4
(i32.const 0)
(tee_local $0
(i32.sub
(i32.load offset=4
(i32.const 0)
)
(i32.const 16)
)
)
)
(call $_ZN9Rectangle4drawEi
(i32.add
(get_local $0)
(i32.const 8)
)
(i32.const 42)
)
(i32.store offset=4
(i32.const 0)
(i32.add
(get_local $0)
(i32.const 16)
)
)
(i32.const 0)
)
(func $_ZN9Rectangle4drawEi (param $0 i32) (param $1 i32)
)
)
Использование no-inline - это хитрость, связанная с простейшим оптимизацией кода. Вы также можете пометить его как использованный:
class Rectangle {
public:
Rectangle() {}
__attribute__((used)) void draw(int fooBar) {}
};
Тогда вы получите:
(module
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(func $_ZN9Rectangle4drawEi (param $0 i32) (param $1 i32)
)
)