Преглед на файлове

[lua] Anon creation is done inplace, the basic idea is that LuaJIT caches anonimous objects constructors. That is, just copies couple of bytes to the memory instead of full initialization. Original solution also involved too much overhead by itself.

peyty преди 9 години
родител
ревизия
27d4b5f511
променени са 1 файла, в които са добавени 5 реда и са изтрити 3 реда
  1. 5 3
      genlua.ml

+ 5 - 3
genlua.ml

@@ -685,9 +685,11 @@ and gen_expr ?(local=true) ctx e = begin
 		spr ctx "_hx_empty()";
 		ctx.separator <- true
 	| TObjectDecl fields ->
-		spr ctx "_hx_anon(";
-		concat ctx ", " (fun (f,e) -> print ctx "\"%s\", " f; gen_value ctx e) fields;
-		spr ctx ")";
+		spr ctx "setmetatable({__fields__={";
+		concat ctx "," (fun (f,e) -> print ctx "%s=" (anon_field f); spr ctx "true") fields;
+		spr ctx "},";
+		concat ctx "," (fun (f,e) -> print ctx "%s=" (anon_field f); gen_value ctx e) fields;
+		spr ctx "},{__newindex=_hx_anon_newindex})";
 		ctx.separator <- true
 	| TFor (v,it,e) ->
 		let handle_break = handle_break ctx e in