forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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
 |