#include #include #include #include #include #include #include #include extern void before_main_loop(); extern void after_main_loop(); /* import: 'a' 'qa' */ // "qa": "_emscripten_set_main_loop", WASM_IMPORT_IMPL(env, _emscripten_set_main_loop) = [](u32 a, u32 fps, u32 simulate_infinite_loop) { static u32 original_main_loop = 0; auto main_loop_override = []() { // std::cout << "This is fugg main loop being called! Calling original loop... at " << reinterpret_cast(original_main_loop) << std::endl; before_main_loop(); const auto& func = fugg::function_ref(original_main_loop); func(); after_main_loop(); }; original_main_loop = a; #if TRACE_CALLBACK_CALLS std::cout << "_emscripten_set_main_loop(" << func << " (" << reinterpret_cast(a) << "), " << fps << ", " << simulate_infinite_loop << ")" << std::endl; #endif emscripten_set_main_loop(main_loop_override, fps, simulate_infinite_loop); }; /* import: 'a' 'pa' */ // "pa": "_emscripten_cancel_main_loop", WASM_IMPORT_IMPL(env, _emscripten_cancel_main_loop) = []() { emscripten_cancel_main_loop(); }; /* import: 'a' 'ab' */ // "ab": "_emscripten_async_wget_data", WASM_IMPORT_IMPL(env, _emscripten_async_wget_data) = [](u32 url_, u32 arg_, u32 onload_, u32 onerror_) { // This function is only called by the flyff runtime, so we introduce // stubs to refer the onload and onerror on to actual flyff functions. // See `onload_stub` and `onerror_stub`. struct wget_data { u32 onload; u32 onerror; u32 original_arg; }; auto onload_stub = [](void* arg_, void *data_, int size) { const auto& interop_data = reinterpret_cast(arg_); const auto& onload = fugg::function_ref(interop_data->onload); // This pointer can stay unchanged, it came from inside and is going inside. const auto& arg = reinterpret_cast(interop_data->original_arg); const auto& data = fugg::RuntimePointer { data_ }; #if TRACE_EM_CALLS std::cout << "onload_stub: Calling function at " << reinterpret_cast(onload) << "(" << arg << ", " << data << ", " << size << ")" << std::endl; #endif onload(arg, data, size); delete interop_data; }; auto onerror_stub = [](void* arg_) { const auto& interop_data = reinterpret_cast(arg_); const auto& onerror = fugg::function_ref(interop_data->onerror); const auto& arg = reinterpret_cast(interop_data->original_arg); #if TRACE_EM_CALLS std::cout << "onerror_stub: Calling function at " << reinterpret_cast(onerror) << "(" << arg << ")" << std::endl; #endif onerror(arg); delete interop_data; }; const auto& url = fugg::ModulePointer { url_ }; const auto data = new wget_data { .onload = onload_, .onerror = onerror_, .original_arg = arg_ }; #if TRACE_EM_CALLS std::cout << "_emscripten_async_wget_data(" << url << ", " << arg_ << ", " << reinterpret_cast(onload_) << ", " << reinterpret_cast(onerror_) << ")" << std::endl; #endif // std::cout << "Client: Downloading " << static_cast(url) << std::endl; // This function can allocate, which will call the Flyff runtime allocate. emscripten_async_wget_data(url, data, onload_stub, onerror_stub); }; /* import: 'a' 'fb' */ // "fb": "_emscripten_set_element_css_size", WASM_IMPORT_IMPL(env, _emscripten_set_element_css_size) = [](u32 target_, f64 width, f64 height) { const auto& target = fugg::ModulePointer(target_); #if TRACE_EM_CALLS std::cout << "_emscripten_set_element_css_size(" << target << ", " << width << ", " << height << ")" << std::endl; #endif return static_cast( emscripten_set_element_css_size(target, width, height) ); }; /* import: 'a' 'gb' */ // "gb": "_emscripten_set_canvas_element_size", WASM_IMPORT_IMPL(env, _emscripten_set_canvas_element_size) = [](u32 target_, u32 width, u32 height) { const auto& target = fugg::ModulePointer(target_); #if TRACE_EM_CALLS std::cout << "_emscripten_set_canvas_element_size(" << target << ", " << width << ", " << height << ")" << std::endl; #endif return static_cast( emscripten_set_canvas_element_size(target, width, height) ); }; /* import: 'a' 'ob' */ // "ob": "_emscripten_get_orientation_status", WASM_IMPORT_IMPL(env, _emscripten_get_orientation_status) = [](u32 a) { return static_cast( emscripten_get_orientation_status( fugg::ModulePointer(a) ) ); }; /* import: 'a' 'Ab' */ /* _fd_seek */ WASM_IMPORT_IMPL(env, _fd_seek) = [](u32 a, u32 b, u32 c, u32 d, u32 e) { // For some reason, it only returns 70. return static_cast(70); }; WASM_IMPORT_IMPL(env, _abort) = [](void) { puts("abort() called!"); assert(0); }; // "la": "_emscripten_exit_fullscreen", WASM_IMPORT_IMPL(env, _emscripten_exit_fullscreen) = []() { return static_cast( emscripten_exit_fullscreen() ); }; // "ma": "_emscripten_request_fullscreen", WASM_IMPORT_IMPL(env, _emscripten_request_fullscreen) = [](u32 a, u32 b) { return static_cast( emscripten_request_fullscreen( reinterpret_cast(a), b ) ); }; /* import: 'a' 'oa' */ // "oa": "_emscripten_performance_now", WASM_IMPORT_IMPL(env, _emscripten_performance_now) = []() { return emscripten_performance_now(); }; /* import: 'a' 'Za' */ /* __emscripten_date_now */ WASM_IMPORT_IMPL(env, __emscripten_date_now) = []() { return emscripten_get_now(); }; // "da": "_emscripten_vibrate", WASM_IMPORT_IMPL(env, _emscripten_vibrate) = [](u32 a) { return static_cast( emscripten_vibrate(a) ); }; /* import: 'a' 'Aa' */ /* _strftime */ WASM_IMPORT_IMPL(env, _strftime) = [](u32 a, u32 b, u32 c, u32 d) { return static_cast( strftime( fugg::ModulePointer(a), b, fugg::ModulePointer(c), fugg::ModulePointer(d) ) ); }; /* import: 'a' 'Oa' */ // "Oa": "_emscripten_webgl_destroy_context", WASM_IMPORT_IMPL(env, _emscripten_webgl_destroy_context) = [](u32 a) { return static_cast( emscripten_webgl_destroy_context(a) ); }; /* import: 'a' 'Cb' */ /* _strftime_l */ WASM_IMPORT_IMPL(env, _strftime_l) = [](u32 a, u32 b, u32 c, u32 d, u32 e) { return static_cast( strftime_l( reinterpret_cast(a), b, reinterpret_cast(c), reinterpret_cast(d), reinterpret_cast(e) ) ); }; /* import: 'a' 'Db' */ /* _environ_get */ WASM_IMPORT_IMPL(env, _environ_get) = [](u32 a, u32 b) { puts("_environ_get"); // FIXME: return static_cast(0); }; /* import: 'a' 'Eb' */ /* _environ_sizes_get */ WASM_IMPORT_IMPL(env, _environ_sizes_get) = [](u32, u32) { puts("_environ_sizes_get"); // FIXME: return static_cast(0); }; /* import: 'a' 'Fb' */ /* _fd_close */ WASM_IMPORT_IMPL(env, _fd_close) = [](u32 a) { // For some reason returns 52... return static_cast(52); }; /* import: 'a' 'Gb' */ /* _fd_write */ WASM_IMPORT_IMPL(env, _fd_write) = [](u32 a, u32 b, u32 c, u32 d) { puts("fd_write"); // FIXME: return static_cast(0); }; /* import: 'a' 'Hb' */ // "Hb": "_emscripten_memcpy_big", WASM_IMPORT_IMPL(env, _emscripten_memcpy_big) = [](u32 dest_, u32 src_, u32 length) { // WASM runtime calls this, so no need to change the pointers since it's "internal". // Right? const auto& dest = fugg::ModulePointer(dest_); const auto& src = fugg::ModulePointer(src_); #if TRACE_ALLOC std::cout << "_emscripten_memcpy_big(" << dest << ", " << src << ", " << length << ")" << std::endl; #endif wasm_rt_memcpy(dest, src, length); }; /* import: 'a' 'Ib' */ /* __emscripten_get_now_is_monotonic */ WASM_IMPORT_IMPL(env, __emscripten_get_now_is_monotonic) = []() { return static_cast(true); }; /* import: 'a' 'Jb' */ /* __gmtime_js */ WASM_IMPORT_IMPL(env, __gmtime_js) = [](u32 a, u32 b) { // FIXME: // puts("__gmtime_js is not implemented yet."); }; /* import: 'a' 'Kb' */ /* __localtime_js */ WASM_IMPORT_IMPL(env, __localtime_js) = [](u32 a, u32 b) { // FIXME: // puts("__localtime_js is not implemented yet."); }; /* import: 'a' 'Lb' */ /* __mktime_js */ WASM_IMPORT_IMPL(env, __mktime_js) = [](u32 a) { // FIXME: // puts("__mktime_js is not implemented yet."); return static_cast(0); }; /* import: 'a' 'Mb' */ /* __tzset_js */ WASM_IMPORT_IMPL(env, __tzset_js) = [](u32 a, u32 b, u32 c) { // FIXME: // puts("__tzset_js is not implemented yet."); }; /* import: 'a' 'Rb' */ // "Rb": "_emscripten_log", WASM_IMPORT_IMPL(env, _emscripten_log) = [](u32 flags, u32 b, u32 c) { const auto& format = fugg::ModulePointer(b); emscripten_log(flags, format, c); }; /* import: 'a' 'bc' */ // "bc": "_emscripten_get_fullscreen_status", WASM_IMPORT_IMPL(env, _emscripten_get_fullscreen_status) = [](u32 a) { const auto& fullscreen_status = fugg::ModulePointer(a); #if TRACE_EM_CALLS std::cout << "_emscripten_get_fullscreen_status(" << fullscreen_status << ")" << std::endl; #endif return static_cast( emscripten_get_fullscreen_status(fullscreen_status) ); }; /* import: 'a' 'cc' */ // "cc": "_emscripten_force_exit", WASM_IMPORT_IMPL(env, _emscripten_force_exit) = [](u32 a) { emscripten_force_exit(a); };