243 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (C)2005-2019 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.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package cpp.cppia;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import haxe.macro.Compiler;
							 | 
						||
| 
								 | 
							
								import haxe.macro.Context;
							 | 
						||
| 
								 | 
							
								import haxe.macro.Type;
							 | 
						||
| 
								 | 
							
								#if !macro
							 | 
						||
| 
								 | 
							
								#if cppia
							 | 
						||
| 
								 | 
							
								@:build(cpp.cppia.HostClasses.exclude())
							 | 
						||
| 
								 | 
							
								#end
							 | 
						||
| 
								 | 
							
								class HostClasses {}
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								import Sys;
							 | 
						||
| 
								 | 
							
								import haxe.Constraints;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:noPackageRestrict
							 | 
						||
| 
								 | 
							
								class HostClasses {
							 | 
						||
| 
								 | 
							
									static var classes = [
							 | 
						||
| 
								 | 
							
										"cpp.Lib",
							 | 
						||
| 
								 | 
							
										"cpp.NativeArray",
							 | 
						||
| 
								 | 
							
										"cpp.NativeString",
							 | 
						||
| 
								 | 
							
										"cpp.vm.Debugger",
							 | 
						||
| 
								 | 
							
										"sys.thread.Deque",
							 | 
						||
| 
								 | 
							
										"sys.thread.Lock",
							 | 
						||
| 
								 | 
							
										"sys.thread.Mutex",
							 | 
						||
| 
								 | 
							
										"sys.thread.Thread",
							 | 
						||
| 
								 | 
							
										"sys.thread.Tls",
							 | 
						||
| 
								 | 
							
										"cpp.vm.ExecutionTrace",
							 | 
						||
| 
								 | 
							
										"cpp.vm.Gc",
							 | 
						||
| 
								 | 
							
										"cpp.vm.Profiler",
							 | 
						||
| 
								 | 
							
										"cpp.vm.Unsafe",
							 | 
						||
| 
								 | 
							
										"cpp.vm.WeakRef",
							 | 
						||
| 
								 | 
							
										"cpp.Object",
							 | 
						||
| 
								 | 
							
										"cpp.Int64",
							 | 
						||
| 
								 | 
							
										"cpp.Finalizable",
							 | 
						||
| 
								 | 
							
										"Std",
							 | 
						||
| 
								 | 
							
										"StringBuf",
							 | 
						||
| 
								 | 
							
										"sys.db.Mysql",
							 | 
						||
| 
								 | 
							
										"sys.db.Sqlite",
							 | 
						||
| 
								 | 
							
										"sys.FileSystem",
							 | 
						||
| 
								 | 
							
										"sys.io.File",
							 | 
						||
| 
								 | 
							
										"sys.io.FileInput",
							 | 
						||
| 
								 | 
							
										"sys.io.Process",
							 | 
						||
| 
								 | 
							
										"sys.net.UdpSocket",
							 | 
						||
| 
								 | 
							
										"sys.net.Socket",
							 | 
						||
| 
								 | 
							
										"sys.ssl.Certificate",
							 | 
						||
| 
								 | 
							
										"sys.ssl.Digest",
							 | 
						||
| 
								 | 
							
										"sys.ssl.Key",
							 | 
						||
| 
								 | 
							
										"sys.ssl.Socket",
							 | 
						||
| 
								 | 
							
										"Enum",
							 | 
						||
| 
								 | 
							
										"EnumValue",
							 | 
						||
| 
								 | 
							
										// "Sys",
							 | 
						||
| 
								 | 
							
										"Type",
							 | 
						||
| 
								 | 
							
										"Xml",
							 | 
						||
| 
								 | 
							
										"Date",
							 | 
						||
| 
								 | 
							
										"Lambda",
							 | 
						||
| 
								 | 
							
										"DateTools",
							 | 
						||
| 
								 | 
							
										"List",
							 | 
						||
| 
								 | 
							
										"Math",
							 | 
						||
| 
								 | 
							
										"Reflect",
							 | 
						||
| 
								 | 
							
										"StringBuf",
							 | 
						||
| 
								 | 
							
										"StringTools",
							 | 
						||
| 
								 | 
							
										"haxe.ds.IntMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.ObjectMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.StringMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.BalancedTree",
							 | 
						||
| 
								 | 
							
										"haxe.NativeStackTrace",
							 | 
						||
| 
								 | 
							
										"haxe.Serializer",
							 | 
						||
| 
								 | 
							
										"haxe.Unserializer",
							 | 
						||
| 
								 | 
							
										"haxe.Resource",
							 | 
						||
| 
								 | 
							
										"haxe.Template",
							 | 
						||
| 
								 | 
							
										"haxe.Utf8",
							 | 
						||
| 
								 | 
							
										"haxe.Log",
							 | 
						||
| 
								 | 
							
										"haxe.zip.Compress",
							 | 
						||
| 
								 | 
							
										"haxe.zip.Uncompress",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.BaseCode",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.Sha256",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.Hmac",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.Crc32",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.Base64",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.Adler32",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.Md5",
							 | 
						||
| 
								 | 
							
										"haxe.crypto.Sha1",
							 | 
						||
| 
								 | 
							
										"haxe.io.BufferInput",
							 | 
						||
| 
								 | 
							
										"haxe.io.Bytes",
							 | 
						||
| 
								 | 
							
										"haxe.io.BytesBuffer",
							 | 
						||
| 
								 | 
							
										"haxe.io.BytesData",
							 | 
						||
| 
								 | 
							
										"haxe.io.BytesInput",
							 | 
						||
| 
								 | 
							
										"haxe.io.BytesOutput",
							 | 
						||
| 
								 | 
							
										"haxe.io.Eof",
							 | 
						||
| 
								 | 
							
										"haxe.io.Error",
							 | 
						||
| 
								 | 
							
										"haxe.io.FPHelper",
							 | 
						||
| 
								 | 
							
										"haxe.io.Input",
							 | 
						||
| 
								 | 
							
										"haxe.io.Output",
							 | 
						||
| 
								 | 
							
										"haxe.io.Path",
							 | 
						||
| 
								 | 
							
										"haxe.io.StringInput",
							 | 
						||
| 
								 | 
							
										"haxe.xml.Parser",
							 | 
						||
| 
								 | 
							
										"haxe.Json",
							 | 
						||
| 
								 | 
							
										"haxe.NativeStackTrace",
							 | 
						||
| 
								 | 
							
										"haxe.Resource",
							 | 
						||
| 
								 | 
							
										"haxe.Utf8",
							 | 
						||
| 
								 | 
							
										"haxe.Int64",
							 | 
						||
| 
								 | 
							
										"haxe.Int32",
							 | 
						||
| 
								 | 
							
										"haxe.Serializer",
							 | 
						||
| 
								 | 
							
										"haxe.Unserializer",
							 | 
						||
| 
								 | 
							
										"haxe.ds.ArraySort",
							 | 
						||
| 
								 | 
							
										"haxe.ds.GenericStack",
							 | 
						||
| 
								 | 
							
										"haxe.ds.ObjectMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.Vector",
							 | 
						||
| 
								 | 
							
										"haxe.ds.BalancedTree",
							 | 
						||
| 
								 | 
							
										"haxe.ds.HashMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.Option",
							 | 
						||
| 
								 | 
							
										"haxe.ds.WeakMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.EnumValueMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.IntMap",
							 | 
						||
| 
								 | 
							
										"haxe.ds.StringMap",
							 | 
						||
| 
								 | 
							
										"haxe.iterators.MapKeyValueIterator",
							 | 
						||
| 
								 | 
							
										"StdTypes",
							 | 
						||
| 
								 | 
							
										"Array",
							 | 
						||
| 
								 | 
							
										"Class",
							 | 
						||
| 
								 | 
							
										"Date",
							 | 
						||
| 
								 | 
							
										"EReg",
							 | 
						||
| 
								 | 
							
										"Enum",
							 | 
						||
| 
								 | 
							
										"EnumValue",
							 | 
						||
| 
								 | 
							
										// "IntIterator",
							 | 
						||
| 
								 | 
							
										"List",
							 | 
						||
| 
								 | 
							
										"Map",
							 | 
						||
| 
								 | 
							
										"String",
							 | 
						||
| 
								 | 
							
									];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function parseClassInfo(externs:Map<String, Bool>, filename:String) {
							 | 
						||
| 
								 | 
							
										if (sys.FileSystem.exists(filename)) {
							 | 
						||
| 
								 | 
							
											var file = sys.io.File.read(filename);
							 | 
						||
| 
								 | 
							
											try {
							 | 
						||
| 
								 | 
							
												while (true) {
							 | 
						||
| 
								 | 
							
													var line = file.readLine();
							 | 
						||
| 
								 | 
							
													var parts = line.split(" ");
							 | 
						||
| 
								 | 
							
													if (parts[0] == "class" || parts[0] == "interface" || parts[0] == "enum")
							 | 
						||
| 
								 | 
							
														externs.set(parts[1], true);
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											} catch (e:Dynamic) {}
							 | 
						||
| 
								 | 
							
											if (file != null)
							 | 
						||
| 
								 | 
							
												file.close();
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function onGenerateCppia(types:Array<Type>):Void {
							 | 
						||
| 
								 | 
							
										var externs = new Map<String, Bool>();
							 | 
						||
| 
								 | 
							
										externs.set("Sys", true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe.IMap", true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe.crypto.HashMethod", true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe._Int64.Int64_Impl_", true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe._Int64.___Int64", true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe._Int32.Int32_Impl_", true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe._Int32.___Int32", true);
							 | 
						||
| 
								 | 
							
										// Hidded in implementation classes
							 | 
						||
| 
								 | 
							
										// externs.set("sys.db.RecordType",true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.db._Sqlite.SqliteConnection", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.db._Sqlite.SqliteResultSet", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.db._Mysql.MysqlConnection", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.db._Mysql.MysqlResultSet", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.net._Socket.SocketInput", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.net._Socket.SocketOutput", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.ssl._Socket.SocketInput", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.ssl._Socket.SocketOutput", true);
							 | 
						||
| 
								 | 
							
										externs.set("sys.thread._Thread.HaxeThread",true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe.ds.TreeNode", true);
							 | 
						||
| 
								 | 
							
										externs.set("haxe.xml.XmlParserException", true);
							 | 
						||
| 
								 | 
							
										for (e in classes)
							 | 
						||
| 
								 | 
							
											externs.set(e, true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										var define = Context.defined("dll_import") ? Context.definedValue("dll_import") : "1";
							 | 
						||
| 
								 | 
							
										if (define != "1")
							 | 
						||
| 
								 | 
							
											parseClassInfo(externs, define);
							 | 
						||
| 
								 | 
							
										else {
							 | 
						||
| 
								 | 
							
											var tried = new Map<String, Bool>();
							 | 
						||
| 
								 | 
							
											for (path in Context.getClassPath())
							 | 
						||
| 
								 | 
							
												if (!tried.exists(path)) {
							 | 
						||
| 
								 | 
							
													tried.set(path, true);
							 | 
						||
| 
								 | 
							
													parseClassInfo(externs, path + "/export_classes.info");
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										for (type in types) {
							 | 
						||
| 
								 | 
							
											switch (type) {
							 | 
						||
| 
								 | 
							
												case TInst(classRef, params):
							 | 
						||
| 
								 | 
							
													if (externs.exists(classRef.toString()))
							 | 
						||
| 
								 | 
							
														classRef.get().exclude();
							 | 
						||
| 
								 | 
							
												case TEnum(enumRef, params):
							 | 
						||
| 
								 | 
							
													if (externs.exists(enumRef.toString()))
							 | 
						||
| 
								 | 
							
														enumRef.get().exclude();
							 | 
						||
| 
								 | 
							
												default:
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Exclude the standard classes, and any described in 'export_classes.info' files found in the classpath
							 | 
						||
| 
								 | 
							
									public static function exclude() {
							 | 
						||
| 
								 | 
							
										if (Context.defined("cppia"))
							 | 
						||
| 
								 | 
							
											Context.onGenerate(onGenerateCppia);
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											Context.error("cpp.cppia.excludeHostFiles is only for cppia code", Context.currentPos());
							 | 
						||
| 
								 | 
							
										return Context.getBuildFields();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// Ensure that the standard classes are included in the host
							 | 
						||
| 
								 | 
							
									public static function include() {
							 | 
						||
| 
								 | 
							
										Compiler.keep("haxe.IMap");
							 | 
						||
| 
								 | 
							
										Compiler.keep("haxe.crypto.HashMethod");
							 | 
						||
| 
								 | 
							
										Compiler.keep("haxe._Int64.Int64_Impl_");
							 | 
						||
| 
								 | 
							
										Compiler.keep("haxe._Int32.Int32_Impl_");
							 | 
						||
| 
								 | 
							
										Compiler.keep("haxe._Int64.___Int64");
							 | 
						||
| 
								 | 
							
										Compiler.keep("haxe._Int32.___Int32");
							 | 
						||
| 
								 | 
							
										for (cls in classes) {
							 | 
						||
| 
								 | 
							
											Context.getModule(cls);
							 | 
						||
| 
								 | 
							
											Compiler.keep(cls);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return Context.getBuildFields();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#end
							 |