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
 |