Преглед изворни кода

remove $hxClasses generation if Type.resolveClass/resolveEnum not referenced
added "features" check in genjs to enable more removal of extra code depending of some features activation

Nicolas Cannasse пре 13 година
родитељ
комит
d8ea86f64e
5 измењених фајлова са 52 додато и 17 уклоњено
  1. 1 0
      doc/CHANGES.txt
  2. 41 7
      genjs.ml
  3. 1 1
      std/Date.hx
  4. 1 1
      std/Math.hx
  5. 8 8
      std/js/_std/Std.hx

+ 1 - 0
doc/CHANGES.txt

@@ -12,6 +12,7 @@
 	flash : fixed completion issue with for( x in Vector )
 	all : forbid static inline var when not a constant (after optimization)
 	all : optimized Std.int(123) and Std.int(123.45)
+	js : remove $hxClasses generation if Type.resolveClass/resolveEnum not referenced
 
 2012-04-14: 2.09
 	all : optimized const == const and const != const (with different const types)

+ 41 - 7
genjs.ml

@@ -41,6 +41,7 @@ type ctx = {
 	packages : (string list,unit) Hashtbl.t;
 	smap : sourcemap;
 	js_modern : bool;
+	mutable features : (string, bool) PMap.t;
 
 	mutable current : tclass;
 	mutable statics : (tclass * string * texpr) list;
@@ -85,6 +86,24 @@ let field s = if Hashtbl.mem kwds s then "[\"" ^ s ^ "\"]" else "." ^ s
 let ident s = if Hashtbl.mem kwds s then "$" ^ s else s
 let anon_field s = if Hashtbl.mem kwds s || not (valid_js_ident s) then "'" ^ s ^ "'" else s
 
+let has_feature ctx f =
+	try
+		PMap.find f ctx.features
+	with Not_found ->
+		match List.rev (ExtString.String.nsplit f ".") with
+		| [] | _ :: [] -> assert false
+		| meth :: cl :: pack ->
+			let r = (try 
+				let path = List.rev pack, cl in
+				(match List.find (fun t -> t_path t = path) ctx.com.types with
+				| TClassDecl c -> PMap.exists meth c.cl_statics || PMap.exists meth c.cl_fields
+				| _ -> false)
+			with Not_found ->
+				false
+			) in
+			ctx.features <- PMap.add f r ctx.features;
+			r	
+
 let handle_newlines ctx str =
 	if ctx.com.debug then
 		let rec loop from =
@@ -342,6 +361,12 @@ let rec gen_call ctx e el =
 		spr ctx ")";
 	| TLocal { v_name = "__js__" }, [{ eexpr = TConst (TString code) }] ->
 		spr ctx (String.concat "\n" (ExtString.String.nsplit code "\r\n"))
+	| TLocal { v_name = "__feature__" }, { eexpr = TConst (TString f) } :: eif :: eelse ->
+		(if has_feature ctx f then
+			gen_value ctx eif
+		else match eelse with
+			| [] -> ()
+			| e :: _ -> gen_value ctx e)			
 	| TLocal { v_name = "__resources__" }, [] ->
 		spr ctx "[";
 		concat ctx "," (fun (name,data) ->
@@ -856,7 +881,8 @@ let generate_class ctx c =
 	| _ -> ());
 	let p = s_path ctx c.cl_path in
 	generate_package_create ctx c.cl_path;
-	if ctx.js_modern then
+	let hxClasses = has_feature ctx "Type.resolveClass" in
+	if ctx.js_modern || not hxClasses then
 		print ctx "%s = " p
 	else
 		print ctx "%s = $hxClasses[\"%s\"] = " p p;
@@ -864,7 +890,7 @@ let generate_class ctx c =
 	| Some { cf_expr = Some e } -> gen_expr ctx e
 	| _ -> print ctx "function() { }");
 	newline ctx;
-	if ctx.js_modern then begin
+	if ctx.js_modern && hxClasses then begin
 		print ctx "$hxClasses[\"%s\"] = %s" p p;
 		newline ctx;
 	end;
@@ -924,7 +950,9 @@ let generate_enum ctx e =
 	let p = s_path ctx e.e_path in
 	generate_package_create ctx e.e_path;
 	let ename = List.map (fun s -> Printf.sprintf "\"%s\"" (Ast.s_escape s)) (fst e.e_path @ [snd e.e_path]) in
-	print ctx "%s = $hxClasses[\"%s\"] = { __ename__ : [%s], __constructs__ : [%s] }" p p (String.concat "," ename) (String.concat "," (List.map (fun s -> Printf.sprintf "\"%s\"" s) e.e_names));
+	print ctx "%s = " p;
+	if has_feature ctx "Type.resolveEnum" then print ctx "$hxClasses[\"%s\"] = " p;
+	print ctx "{ __ename__ : [%s], __constructs__ : [%s] }" (String.concat "," ename) (String.concat "," (List.map (fun s -> Printf.sprintf "\"%s\"" s) e.e_names));
 	newline ctx;
 	List.iter (fun n ->
 		let f = PMap.find n e.e_constrs in
@@ -973,6 +1001,7 @@ let alloc_ctx com =
 		com = com;
 		buf = Buffer.create 16000;
 		packages = Hashtbl.create 0;
+		features = PMap.empty;
 		smap = {
 			source_last_line = 0;
 			source_last_col = 0;
@@ -1022,13 +1051,18 @@ let generate com =
 		newline ctx;
 	end;
 
-	let hxClasses = if ctx.js_modern then "{}" else "$hxClasses || {}" in
-	print ctx "var $_, $hxClasses = %s, $estr = function() { return js.Boot.__string_rec(this,''); }
-function $extend(from, fields) {
+	print ctx "var $_";
+	if has_feature ctx "Type.resolveClass" || has_feature ctx "Type.resolveEnum" then print ctx ", $hxClasses = %s" (if ctx.js_modern then "{}" else "$hxClasses || {}");
+	if List.exists (function TEnumDecl { e_extern = false } -> true | _ -> false) com.types then print ctx ", $estr = function() { return js.Boot.__string_rec(this,''); }";
+	if List.exists (function TClassDecl { cl_extern = false; cl_super = Some _ } -> true | _ -> false) com.types then begin
+		print ctx ";";
+		newline ctx;
+		print ctx "function $extend(from, fields) {
 	function inherit() {}; inherit.prototype = from; var proto = new inherit();
 	for (var name in fields) proto[name] = fields[name];
 	return proto;
-}" hxClasses;
+}";
+	end;
 	newline ctx;
 	List.iter (generate_type ctx) com.types;
 	print ctx "js.Boot.__res = {}";

+ 1 - 1
std/Date.hx

@@ -166,7 +166,7 @@ extern class Date
 		d.prototype[__unprotect__("__class__")] = d;
 		d[__unprotect__("__name__")] = ["Date"];
 		#elseif js
-		d.prototype.__class__ = $hxClasses['Date'] = d;
+		d.prototype.__class__ = __feature__('Type.resolveClass',$hxClasses['Date'] = d,d);
 		d.__name__ = ["Date"];
 		#end
 	}

+ 1 - 1
std/Math.hx

@@ -67,7 +67,7 @@ extern class Math
 		Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"];
 	#end
 	#if js
-		$hxClasses['Math'] = Math;
+		__feature__("Type.resolveClass",$hxClasses['Math'] = Math);
 	#end
 		Math.isFinite = function(i) {
 			return

+ 8 - 8
std/js/_std/Std.hx

@@ -61,19 +61,19 @@ import js.Boot;
 	}
 
 	static function __init__() : Void untyped {
-		String.prototype.__class__ = $hxClasses["String"] = String;
+		String.prototype.__class__ = __feature__("Type.resolveClass",$hxClasses["String"] = String,String);
 		String.__name__ = ["String"];
-		Array.prototype.__class__ = $hxClasses["Array"] = Array;
+		Array.prototype.__class__ = __feature__("Type.resolveClass",$hxClasses["Array"] = Array,Array);
 		Array.__name__ = ["Array"];
-		var Int = $hxClasses["Int"] = { __name__ : ["Int"] };
-		var Dynamic = $hxClasses["Dynamic"] = { __name__ : ["Dynamic"] };
-		var Float = $hxClasses["Float"] = __js__("Number");
+		var Int = __feature__("Type.resolveClass", $hxClasses["Int"] = { __name__ : ["Int"] }, { __name__ : ["Int"] });
+		var Dynamic = __feature__("Type.resolveClass", $hxClasses["Dynamic"] = { __name__ : ["Dynamic"] }, { __name__ : ["Dynamic"] });
+		var Float = __feature__("Type.resolveClass", $hxClasses["Float"] = __js__("Number"), __js__("Number"));
 		Float.__name__ = ["Float"];
-		var Bool = $hxClasses["Bool"] = __js__("Boolean");
+		var Bool = __feature__("Type.resolveEnum",$hxClasses["Bool"] = __js__("Boolean"), __js__("Boolean"));
 		Bool.__ename__ = ["Bool"];
-		var Class = $hxClasses["Class"] = { __name__ : ["Class"] };
+		var Class = __feature__("Type.resolveClass", $hxClasses["Class"] = { __name__ : ["Class"] }, { __name__ : ["Class"] });
 		var Enum = {};
-		var Void = $hxClasses["Void"] = { __ename__ : ["Void"] };
+		var Void = __feature__("Type.resolveEnum", $hxClasses["Void"] = { __ename__ : ["Void"] }, { __ename__ : ["Void"] });
 	}
 
 }