aboutsummaryrefslogtreecommitdiff
path: root/hashlink/hashlink-1.12/include/hlc_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'hashlink/hashlink-1.12/include/hlc_main.c')
-rw-r--r--hashlink/hashlink-1.12/include/hlc_main.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/hashlink/hashlink-1.12/include/hlc_main.c b/hashlink/hashlink-1.12/include/hlc_main.c
new file mode 100644
index 0000000..c69e9c7
--- /dev/null
+++ b/hashlink/hashlink-1.12/include/hlc_main.c
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C)2015-2016 Haxe Foundation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+#include <hlc.h>
+
+#if defined(HL_MOBILE) && defined(sdl__Sdl__val)
+# include <SDL_main.h>
+#endif
+
+#ifdef HL_WIN_DESKTOP
+# ifndef CONST
+# define CONST
+# endif
+# pragma warning(disable:4091)
+#if !defined(HL_MINGW)
+# include <DbgHelp.h>
+#else
+# include <dbghelp.h>
+#endif
+# pragma comment(lib, "Dbghelp.lib")
+# undef CONST
+#endif
+
+#ifdef HL_CONSOLE
+extern void sys_global_init();
+extern void sys_global_exit();
+#else
+#define sys_global_init()
+#define sys_global_exit()
+#endif
+
+
+#ifdef HL_VCC
+# include <crtdbg.h>
+#else
+# define _CrtSetDbgFlag(x)
+# define _CrtCheckMemory()
+#endif
+
+static uchar *hlc_resolve_symbol( void *addr, uchar *out, int *outSize ) {
+#ifdef HL_WIN_DESKTOP
+ static HANDLE stack_process_handle = NULL;
+ DWORD64 index;
+ IMAGEHLP_LINEW64 line;
+ struct {
+ SYMBOL_INFOW sym;
+ uchar buffer[256];
+ } data;
+ data.sym.SizeOfStruct = sizeof(data.sym);
+ data.sym.MaxNameLen = 255;
+ if( !stack_process_handle ) {
+ stack_process_handle = GetCurrentProcess();
+ SymSetOptions(SYMOPT_LOAD_LINES);
+ SymInitialize(stack_process_handle,NULL,(BOOL)1);
+ }
+ if( SymFromAddrW(stack_process_handle,(DWORD64)(int_val)addr,&index,&data.sym) ) {
+ DWORD offset = 0;
+ line.SizeOfStruct = sizeof(line);
+ line.FileName = USTR("\\?");
+ line.LineNumber = 0;
+ SymGetLineFromAddrW64(stack_process_handle, (DWORD64)(int_val)addr, &offset, &line);
+ *outSize = usprintf(out,*outSize,USTR("%s(%s:%d)"),data.sym.Name,wcsrchr(line.FileName,'\\')+1,(int)line.LineNumber);
+ return out;
+ }
+#endif
+ return NULL;
+}
+
+static int hlc_capture_stack( void **stack, int size ) {
+ int count = 0;
+# ifdef HL_WIN_DESKTOP
+ count = CaptureStackBackTrace(2, size, stack, NULL) - 8; // 8 startup
+ if( count < 0 ) count = 0;
+# endif
+ return count;
+}
+
+#if defined( HL_VCC )
+static int throw_handler( int code ) {
+ #if !defined(HL_XBO)
+ switch( code ) {
+ case EXCEPTION_ACCESS_VIOLATION: hl_error("Access violation");
+ case EXCEPTION_STACK_OVERFLOW: hl_error("Stack overflow");
+ default: hl_error("Unknown runtime error");
+ }
+ return EXCEPTION_CONTINUE_SEARCH;
+ #else
+ return 0;
+ #endif
+}
+#endif
+
+#if defined(HL_WIN_DESKTOP) && !defined(_CONSOLE)
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
+ return wmain(__argc, __argv);
+}
+#endif
+
+#ifdef HL_WIN_DESKTOP
+int wmain(int argc, uchar *argv[]) {
+#else
+int main(int argc, char *argv[]) {
+#endif
+ vdynamic *ret;
+ bool isExc = false;
+ hl_type_fun tf = { 0 };
+ hl_type clt = { 0 };
+ vclosure cl = { 0 };
+ sys_global_init();
+ hl_global_init();
+ hl_register_thread(&ret);
+ hl_setup_exception(hlc_resolve_symbol,hlc_capture_stack);
+ hl_setup_callbacks(hlc_static_call, hlc_get_wrapper);
+ hl_sys_init((void**)(argv + 1),argc - 1,NULL);
+ tf.ret = &hlt_void;
+ clt.kind = HFUN;
+ clt.fun = &tf;
+ cl.t = &clt;
+ cl.fun = hl_entry_point;
+ ret = hl_dyn_call_safe(&cl, NULL, 0, &isExc);
+ if( isExc ) {
+ varray *a = hl_exception_stack();
+ int i;
+ uprintf(USTR("Uncaught exception: %s\n"), hl_to_string(ret));
+ for (i = 0; i<a->size; i++)
+ uprintf(USTR("Called from %s\n"), hl_aptr(a, uchar*)[i]);
+ }
+ hl_global_free();
+ sys_global_exit();
+ return (int)isExc;
+}