diff --git a/project/Build.xml b/project/Build.xml index 3ab4d2915..f5d35a593 100644 --- a/project/Build.xml +++ b/project/Build.xml @@ -390,6 +390,9 @@ + + +
@@ -419,7 +422,7 @@ - + diff --git a/project/include/hl.h b/project/include/hl.h index c75a17730..309b671f2 100644 --- a/project/include/hl.h +++ b/project/include/hl.h @@ -27,7 +27,7 @@ https://github.com/HaxeFoundation/hashlink/wiki/ **/ -#define HL_VERSION 0x160 +#define HL_VERSION 0x190 #if defined(_WIN32) # define HL_WIN @@ -206,8 +206,10 @@ typedef unsigned long long uint64; // -------------- UNICODE ----------------------------------- #if defined(HL_WIN) && !defined(HL_LLVM) -#ifdef HL_WIN_DESKTOP +#if defined(HL_WIN_DESKTOP) && !defined(HL_MINGW) // # include +#elif defined(HL_WIN_DESKTOP) && defined(HL_MINGW) +// # include #else # include #endif @@ -219,7 +221,7 @@ typedef wchar_t uchar; # define uprintf wprintf # define ustrlen wcslen # define ustrdup _wcsdup -# define uvsprintf wvsprintf +HL_API int uvszprintf( uchar *out, int out_size, const uchar *fmt, va_list arglist ); # define utod(s,end) wcstod(s,end) # define utoi(s,end) wcstol(s,end,10) # define ucmp(a,b) wcscmp(a,b) @@ -262,7 +264,7 @@ HL_API int utoi( const uchar *str, uchar **end ); HL_API int ucmp( const uchar *a, const uchar *b ); HL_API int utostr( char *out, int out_size, const uchar *str ); HL_API int usprintf( uchar *out, int out_size, const uchar *fmt, ... ); -HL_API int uvsprintf( uchar *out, const uchar *fmt, va_list arglist ); +HL_API int uvszprintf( uchar *out, int out_size, const uchar *fmt, va_list arglist ); HL_API void uprintf( const uchar *fmt, const uchar *str ); C_FUNCTION_END #endif @@ -295,6 +297,14 @@ C_FUNCTION_END # define hl_debug_break() #endif +#ifdef HL_VCC +# define HL_NO_RETURN(f) __declspec(noreturn) f +# define HL_UNREACHABLE +#else +# define HL_NO_RETURN(f) f __attribute__((noreturn)) +# define HL_UNREACHABLE __builtin_unreachable() +#endif + // ---- TYPES ------------------------------------------- typedef enum { @@ -318,8 +328,9 @@ typedef enum { HABSTRACT=17, HENUM = 18, HNULL = 19, + HMETHOD = 20, // --------- - HLAST = 20, + HLAST = 21, _H_FORCE_INT = 0x7FFFFFFF } hl_type_kind; @@ -578,11 +589,12 @@ HL_API int hl_hash_utf8( const char *str ); // no cache HL_API int hl_hash_gen( const uchar *name, bool cache_name ); HL_API const uchar *hl_field_name( int hash ); -#define hl_error(msg) hl_error_msg(USTR(msg)) -HL_API void hl_error_msg( const uchar *msg, ... ); +#define hl_error(msg, ...) hl_throw(hl_alloc_strbytes(USTR(msg), ## __VA_ARGS__)) + +HL_API vdynamic *hl_alloc_strbytes( const uchar *msg, ... ); HL_API void hl_assert( void ); -HL_API void hl_throw( vdynamic *v ); -HL_API void hl_rethrow( vdynamic *v ); +HL_API HL_NO_RETURN( void hl_throw( vdynamic *v ) ); +HL_API HL_NO_RETURN( void hl_rethrow( vdynamic *v ) ); HL_API void hl_setup_longjump( void *j ); HL_API void hl_setup_exception( void *resolve_symbol, void *capture_stack ); HL_API void hl_dump_stack( void ); @@ -716,6 +728,7 @@ HL_API int hl_buffer_length( hl_buffer *b ); HL_API uchar *hl_buffer_content( hl_buffer *b, int *len ); HL_API uchar *hl_to_string( vdynamic *v ); HL_API const uchar *hl_type_str( hl_type *t ); +HL_API void hl_throw_buffer( hl_buffer *b ); // ----------------------- FFI ------------------------------------------------------ @@ -784,7 +797,11 @@ typedef struct { #endif #if defined(HL_GCC) && !defined(HL_CONSOLE) -# define HL_NO_OPT __attribute__((optimize("-O0"))) +# ifdef HL_CLANG +# define HL_NO_OPT __attribute__ ((optnone)) +# else +# define HL_NO_OPT __attribute__((optimize("-O0"))) +# endif #else # define HL_NO_OPT #endif @@ -806,8 +823,9 @@ typedef struct _hl_trap_ctx hl_trap_ctx; struct _hl_trap_ctx { jmp_buf buf; hl_trap_ctx *prev; + vdynamic *tcheck; }; -#define hl_trap(ctx,r,label) { hl_thread_info *__tinf = hl_get_thread(); ctx.prev = __tinf->trap_current; __tinf->trap_current = &ctx; if( setjmp(ctx.buf) ) { r = __tinf->exc_value; goto label; } } +#define hl_trap(ctx,r,label) { hl_thread_info *__tinf = hl_get_thread(); ctx.tcheck = NULL; ctx.prev = __tinf->trap_current; __tinf->trap_current = &ctx; if( setjmp(ctx.buf) ) { r = __tinf->exc_value; goto label; } } #define hl_endtrap(ctx) hl_get_thread()->trap_current = ctx.prev #define HL_EXC_MAX_STACK 0x100 @@ -815,6 +833,7 @@ struct _hl_trap_ctx { #define HL_EXC_CATCH_ALL 2 #define HL_EXC_IS_THROW 4 #define HL_TRACK_DISABLE 8 +#define HL_THREAD_INVISIBLE 16 typedef struct { int thread_id; diff --git a/tools/platforms/WindowsPlatform.hx b/tools/platforms/WindowsPlatform.hx index 62cf6b3c9..28c49361e 100644 --- a/tools/platforms/WindowsPlatform.hx +++ b/tools/platforms/WindowsPlatform.hx @@ -51,6 +51,7 @@ class WindowsPlatform extends PlatformTarget else if (project.targetFlags.exists("hl")) { targetType = "hl"; + is64 = false; } else if (project.targetFlags.exists("nodejs")) { @@ -154,13 +155,13 @@ class WindowsPlatform extends PlatformTarget if (targetType == "winrt") { - if(!project.targetFlags.exists ("static")) + if (!project.targetFlags.exists("static")) { for (ndll in project.ndlls) { ProjectHelper.copyLibrary(project, ndll, "WinRT" + (is64 ? "64" : ""), "", - (ndll.haxelib != null && (ndll.haxelib.name == "hxcpp" || ndll.haxelib.name == "hxlibc")) ? ".dll" : ".ndll", applicationDirectory, - project.debug, null); + (ndll.haxelib != null && (ndll.haxelib.name == "hxcpp" || ndll.haxelib.name == "hxlibc")) ? ".dll" : ".ndll", + applicationDirectory, project.debug, null); } } } @@ -170,9 +171,18 @@ class WindowsPlatform extends PlatformTarget for (ndll in project.ndlls) { - ProjectHelper.copyLibrary(project, ndll, "Windows" + (is64 ? "64" : ""), "", - (ndll.haxelib != null && (ndll.haxelib.name == "hxcpp" || ndll.haxelib.name == "hxlibc")) ? ".dll" : ".ndll", applicationDirectory, - project.debug, targetSuffix); + // TODO: Support single binary for HashLink + if (targetType == "hl") + { + ProjectHelper.copyLibrary(project, ndll, "Windows" + (is64 ? "64" : ""), "", ".hdll", applicationDirectory, project + .debug, targetSuffix); + } + else + { + ProjectHelper.copyLibrary(project, ndll, "Windows" + (is64 ? "64" : ""), "", + (ndll.haxelib != null && (ndll.haxelib.name == "hxcpp" || ndll.haxelib.name == "hxlibc")) ? ".dll" : ".ndll", + applicationDirectory, project.debug, targetSuffix); + } } } @@ -200,7 +210,19 @@ class WindowsPlatform extends PlatformTarget if (noOutput) return; - System.copyFile(targetDirectory + "/obj/ApplicationMain.hl", Path.combine(applicationDirectory, project.app.file + ".hl")); + // System.copyFile(targetDirectory + "/obj/ApplicationMain.hl", Path.combine(applicationDirectory, project.app.file + ".hl")); + System.recursiveCopyTemplate(project.templatePaths, "bin/hl/windows", applicationDirectory); + System.copyFile(targetDirectory + "/obj/ApplicationMain.hl", Path.combine(applicationDirectory, "hlboot.dat")); + System.renameFile(Path.combine(applicationDirectory, "hl.exe"), executablePath); + + var iconPath = Path.combine(applicationDirectory, "icon.ico"); + + if (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS) + { + var templates = [Haxelib.getPath(new Haxelib(#if lime "lime" #else "hxp" #end)) + + "/templates"].concat(project.templatePaths); + System.runCommand("", System.findTemplate(templates, "bin/ReplaceVistaIcon.exe"), [executablePath, iconPath, "1"], true, true); + } } else if (targetType == "nodejs") { @@ -237,8 +259,9 @@ class WindowsPlatform extends PlatformTarget if (haxeVersion.length > 4) { - haxeVersionString = haxeVersion.charAt(0) + haxeVersion.charAt(2) + (haxeVersion.length == 5 ? "0" + haxeVersion.charAt(4) : haxeVersion - .charAt(4) + haxeVersion.charAt(5)); + haxeVersionString = haxeVersion.charAt(0) + + haxeVersion.charAt(2) + + (haxeVersion.length == 5 ? "0" + haxeVersion.charAt(4) : haxeVersion.charAt(4) + haxeVersion.charAt(5)); } System.runCommand(targetDirectory + "/obj", "haxelib", ["run", "hxjava", "hxjava_build.txt", "--haxe-version", haxeVersionString]); @@ -298,14 +321,14 @@ class WindowsPlatform extends PlatformTarget System.copyFile(targetDirectory + "/obj/Main" + (project.debug ? "-debug" : "") + ".exe", executablePath); } - //TODO createWinrtIcons - //var iconPath = Path.combine(applicationDirectory, "icon.ico"); + // TODO createWinrtIcons + // var iconPath = Path.combine(applicationDirectory, "icon.ico"); - //if (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS) - //{ + // if (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS) + // { // var templates = [Haxelib.getPath(new Haxelib(#if lime "lime" #else "hxp" #end)) + "/templates"].concat(project.templatePaths); // System.runCommand("", System.findTemplate(templates, "bin/ReplaceVistaIcon.exe"), [executablePath, iconPath, "1"], true, true); - //} + // } } else { @@ -356,7 +379,8 @@ class WindowsPlatform extends PlatformTarget if (IconHelper.createWindowsIcon(icons, iconPath) && System.hostPlatform == WINDOWS) { - var templates = [Haxelib.getPath(new Haxelib(#if lime "lime" #else "hxp" #end)) + "/templates"].concat(project.templatePaths); + var templates = [Haxelib.getPath(new Haxelib(#if lime "lime" #else "hxp" #end)) + + "/templates"].concat(project.templatePaths); System.runCommand("", System.findTemplate(templates, "bin/ReplaceVistaIcon.exe"), [executablePath, iconPath, "1"], true, true); } } @@ -407,11 +431,11 @@ class WindowsPlatform extends PlatformTarget } } else if (targetType == "winrt") - { + { context.CPP_DIR = targetDirectory + "/obj"; context.BUILD_DIR = project.app.path + "/winrt" + (is64 ? "64" : ""); context.DC = "::"; - } + } else { context.NEKO_FILE = targetDirectory + "/obj/ApplicationMain.n"; @@ -439,11 +463,16 @@ class WindowsPlatform extends PlatformTarget hxml.addClassName(context.APP_MAIN); switch (targetType) { - case "hl": hxml.hl = "_.hl"; - case "neko": hxml.neko = "_.n"; - case "java": hxml.java = "_"; - case "nodejs", "winjs": hxml.js = "_.js"; - default: hxml.cpp = "_"; + case "hl": + hxml.hl = "_.hl"; + case "neko": + hxml.neko = "_.n"; + case "java": + hxml.java = "_"; + case "nodejs", "winjs": + hxml.js = "_.js"; + default: + hxml.cpp = "_"; } hxml.noOutput = true; return hxml; @@ -463,14 +492,18 @@ class WindowsPlatform extends PlatformTarget var commands = []; - if (!targetFlags.exists("64") && (command == "rebuild" - || System.hostArchitecture == X86 - || (targetType != "cpp" && targetType != "winrt"))) + if (!targetFlags.exists("64") + && (command == "rebuild" || System.hostArchitecture == X86 || (targetType != "cpp" && targetType != "winrt"))) { - if (targetFlags.exists("winrt")) + if (targetType == "winrt") { commands.push(["-Dwinrt", "-DHXCPP_M32"]); } + else if (targetType == "hl") + { + // TODO: Support single binary + commands.push(["-Dwindows", "-DHXCPP_M32", "-Dhashlink"]); + } else { commands.push(["-Dwindows", "-DHXCPP_M32"]); @@ -483,10 +516,12 @@ class WindowsPlatform extends PlatformTarget if (!targetFlags.exists("32") && System.hostArchitecture == X64 - && (command != "rebuild" || targetType == "cpp" || targetType == "winrt")) + && (command != "rebuild" || targetType == "cpp" || targetType == "winrt") + && targetType != "hl") { - if (targetFlags.exists("winrt")) + if (targetType == "winrt") { + commands.push(["-Dwinrt", "-DHXCPP_M64"]); } else @@ -508,11 +543,7 @@ class WindowsPlatform extends PlatformTarget arguments.push("-verbose"); } - if (targetType == "hl") - { - System.runCommand(applicationDirectory, "hl", [project.app.file + ".hl"].concat(arguments)); - } - else if (targetType == "nodejs") + if (targetType == "nodejs") { NodeJSHelper.run(project, targetDirectory + "/bin/ApplicationMain.js", arguments); } @@ -575,8 +606,8 @@ class WindowsPlatform extends PlatformTarget // var test = '"& ""' + targetDirectory + '/bin/PowerShell_Set_Unrestricted.reg"""'; // Sys.command ('powershell & ""' + targetDirectory + '/bin/source/AppPackages/' + project.app.file + '_1.0.0.0_AnyCPU_Test/Add-AppDevPackage.ps1""'); var version = project.meta.version + "." + project.meta.buildNumber; - System.openFile(targetDirectory + "/source/AppPackages/" + project.app.file + "_" + version + "_AnyCPU_Test", - project.app.file + "_" + version + "_AnyCPU.appx"); + System.openFile(targetDirectory + "/source/AppPackages/" + project.app.file + "_" + version + "_AnyCPU_Test", project.app + .file + "_" + version + "_AnyCPU.appx"); // source/AppPackages/uwp-project_1.0.0.0_AnyCPU_Test/Add-AppDevPackage.ps1 @@ -631,7 +662,8 @@ class WindowsPlatform extends PlatformTarget if ((targetType == "cpp" || targetType == "winrt") && project.targetFlags.exists("static")) { var programFiles = project.environment.get("ProgramFiles(x86)"); - var hasVSCommunity = (programFiles != null && FileSystem.exists(Path.combine(programFiles, "Microsoft Visual Studio/Installer/vswhere.exe"))); + var hasVSCommunity = (programFiles != null + && FileSystem.exists(Path.combine(programFiles, "Microsoft Visual Studio/Installer/vswhere.exe"))); var hxcppMSVC = project.environment.get("HXCPP_MSVC"); var vs140 = project.environment.get("VS140COMNTOOLS"); @@ -650,7 +682,8 @@ class WindowsPlatform extends PlatformTarget if (ndll.path == null || ndll.path == "") { - context.ndlls[i].path = NDLL.getLibraryPath(ndll, (targetType == "winrt" ? "WinRT":"Windows") + (is64 ? "64" : ""), "lib", suffix, project.debug); + context.ndlls[i].path = NDLL.getLibraryPath(ndll, (targetType == "winrt" ? "WinRT" : "Windows") + (is64 ? "64" : ""), "lib", suffix, project + .debug); } } } @@ -665,11 +698,11 @@ class WindowsPlatform extends PlatformTarget ProjectHelper.recursiveSmartCopyTemplate(project, "haxe", targetDirectory + "/haxe", context); ProjectHelper.recursiveSmartCopyTemplate(project, targetType + "/hxml", targetDirectory + "/haxe", context); - if (targetType == "winrt" && project.targetFlags.exists ("static")) + if (targetType == "winrt" && project.targetFlags.exists("static")) { - ProjectHelper.recursiveSmartCopyTemplate (project, "winrt/assetspkg", targetDirectory + "/bin/assetspkg", context, false, true); - ProjectHelper.recursiveSmartCopyTemplate (project, "winrt/appx", targetDirectory + "/bin", context, true, true); - ProjectHelper.recursiveSmartCopyTemplate (project, "winrt/static", targetDirectory + "/obj", context, true, true); + ProjectHelper.recursiveSmartCopyTemplate(project, "winrt/assetspkg", targetDirectory + "/bin/assetspkg", context, false, true); + ProjectHelper.recursiveSmartCopyTemplate(project, "winrt/appx", targetDirectory + "/bin", context, true, true); + ProjectHelper.recursiveSmartCopyTemplate(project, "winrt/static", targetDirectory + "/obj", context, true, true); } else if (targetType == "cpp" && project.targetFlags.exists("static")) { @@ -908,78 +941,83 @@ class WindowsPlatform extends PlatformTarget System.watch(command, dirs); } -// @ignore public override function install ():Void {} + // @ignore public override function install ():Void {} override public function install():Void { super.install(); if (targetType == "winrt") { - //if(project.winrtConfig.isAppx) - //{ + // if(project.winrtConfig.isAppx) + // { // TODO: pack in appx - //} - //else + // } + // else { - uninstall(); - Log.info("run: Register app"); - var process = new sys.io.Process('powershell', ["-noprofile", "-command",'Add-AppxPackage -Path '+applicationDirectory + "/"+'AppxManifest.xml -Register']); - if (process.exitCode() != 0) + uninstall(); + Log.info("run: Register app"); + var process = new sys.io.Process('powershell', [ + "-noprofile", + "-command", + 'Add-AppxPackage -Path ' + applicationDirectory + "/" + 'AppxManifest.xml -Register' + ]); + if (process.exitCode() != 0) { var message = process.stderr.readAll().toString(); - Log.error("Cannot register. " + message); - } - process.close(); + Log.error("Cannot register. " + message); + } + process.close(); } } } @ignore public override function trace():Void {} - //@ignore public override function uninstall ():Void {} + // @ignore public override function uninstall ():Void {} override public function uninstall():Void - { + { super.uninstall(); - if (targetType == "winrt") - //if(project.winrtConfig.isAppx) - //{ - // TODO - //} - //else + if (targetType == "winrt") // if(project.winrtConfig.isAppx) + // { + // TODO + // } + // else { - var appxName = project.meta.packageName; - Log.info("run: Remove previous registered app"); - var process = new sys.io.Process('powershell', ["-noprofile", "-command",'Get-AppxPackage '+appxName+' | Remove-AppxPackage']); - if (process.exitCode() != 0) + var appxName = project.meta.packageName; + Log.info("run: Remove previous registered app"); + var process = new sys.io.Process('powershell', [ + "-noprofile", + "-command", + 'Get-AppxPackage ' + appxName + ' | Remove-AppxPackage' + ]); + if (process.exitCode() != 0) { - var message = process.stderr.readAll().toString(); - Log.error("Cannot remove. " + message); + var message = process.stderr.readAll().toString(); + Log.error("Cannot remove. " + message); } - process.close(); + process.close(); } } - - public function winrtRun (arguments:Array):Void + public function winrtRun(arguments:Array):Void { - var dir = applicationDirectory; - var haxeDir = targetDirectory + "/haxe"; + var haxeDir = targetDirectory + "/haxe"; - //if(project.winrtConfig.isAppx) - //{ + // if(project.winrtConfig.isAppx) + // { // Log.info("\n***Double click on "+project.app.file + ".Appx to install Appx"); - //} - //else + // } + // else { var appxName = project.meta.packageName; var appxId = "App"; - var appxAUMID:String = null; + var appxAUMID:String = null; var appxInfoFile = haxeDir + "/appxinfo.txt"; - var kitsRoot10 = "C:\\Program Files (x86)\\Windows Kits\\10\\"; //%WindowsSdkDir% + var kitsRoot10 = "C:\\Program Files (x86)\\Windows Kits\\10\\"; // %WindowsSdkDir% - //get PackageFamilyappxName and set appxAUMID + // get PackageFamilyappxName and set appxAUMID // write app info in a file - var cmd = 'Get-AppxPackage '+appxName+' | Out-File '+appxInfoFile+' -Encoding ASCII'; + var cmd = 'Get-AppxPackage ' + appxName + ' | Out-File ' + appxInfoFile + ' -Encoding ASCII'; trace("powershell " + cmd); var process3 = new sys.io.Process('powershell', [cmd]); if (process3.exitCode() != 0) @@ -989,37 +1027,38 @@ class WindowsPlatform extends PlatformTarget } process3.close(); // parse file - if(sys.FileSystem.exists(appxInfoFile)) + if (sys.FileSystem.exists(appxInfoFile)) { var fin = sys.io.File.read(appxInfoFile, false); - try - { - while(true) - { - var str = fin.readLine(); - var split = str.split (":"); - var name = StringTools.trim(split[0]); - if( name == "PackageFamilyName") - { - var appxPackageFamilyName = StringTools.trim(split[1]); - if(appxPackageFamilyName!=null) - { - appxAUMID = appxPackageFamilyName+"!"+appxId; + try + { + while (true) + { + var str = fin.readLine(); + var split = str.split(":"); + var name = StringTools.trim(split[0]); + if (name == "PackageFamilyName") + { + var appxPackageFamilyName = StringTools.trim(split[1]); + if (appxPackageFamilyName != null) + { + appxAUMID = appxPackageFamilyName + "!" + appxId; break; - } - } - } - } - catch(e:haxe.io.Eof) - { - Log.error('Could not get PackageFamilyName from '+appxInfoFile); - } - fin.close(); + } + } + } + } + catch (e:haxe.io.Eof) + { + Log.error('Could not get PackageFamilyName from ' + appxInfoFile); + } + fin.close(); } - Log.info("run: "+appxAUMID); - Log.info(kitsRoot10+'App Certification Kit\\microsoft.windows.softwarelogo.appxlauncher.exe '+appxAUMID); - var process4 = new sys.io.Process(kitsRoot10+'App Certification Kit\\microsoft.windows.softwarelogo.appxlauncher.exe', [appxAUMID]); + Log.info("run: " + appxAUMID); + Log.info(kitsRoot10 + 'App Certification Kit\\microsoft.windows.softwarelogo.appxlauncher.exe ' + appxAUMID); + var process4 = new sys.io.Process(kitsRoot10 + + 'App Certification Kit\\microsoft.windows.softwarelogo.appxlauncher.exe', [appxAUMID]); } } }