浏览代码

Expose interface functions to reflection

Hugh Sanderson 12 年之前
父节点
当前提交
8e5272120a
共有 1 个文件被更改,包括 24 次插入23 次删除
  1. 24 23
      gencpp.ml

+ 24 - 23
gencpp.ml

@@ -2846,6 +2846,8 @@ let generate_class_files common_ctx member_types super_deps constructor_deps cla
 
 	let statics_except_meta = (List.filter (fun static -> static.cf_name <> "__meta__") class_def.cl_ordered_statics) in
 	let implemented_fields = List.filter should_implement_field statics_except_meta in
+	let dump_field_name = (fun field -> output_cpp ("	" ^  (str field.cf_name) ^ ",\n")) in
+   let implemented_instance_fields = List.filter should_implement_field class_def.cl_ordered_fields in
 
 	List.iter
 		(gen_field ctx class_def class_name smart_class_name false class_def.cl_interface)
@@ -2884,7 +2886,6 @@ let generate_class_files common_ctx member_types super_deps constructor_deps cla
 				end
 		in
 
-      let implemented_instance_fields = List.filter should_implement_field class_def.cl_ordered_fields in
 
 		(* MARK function - explicitly mark all child pointers *)
 		output_cpp ("void " ^ class_name ^ "::__Mark(HX_MARK_PARAMS)\n{\n");
@@ -3029,34 +3030,34 @@ let generate_class_files common_ctx member_types super_deps constructor_deps cla
 		output_cpp "	super::__GetFields(outFields);\n";
 		output_cpp "};\n\n";
 
-		let dump_field_name = (fun field -> output_cpp ("	" ^  (str field.cf_name) ^ ",\n")) in
 		output_cpp "static ::String sStaticFields[] = {\n";
 		List.iter dump_field_name  implemented_fields;
 		output_cpp "	String(null()) };\n\n";
 
-		output_cpp "static ::String sMemberFields[] = {\n";
-		List.iter dump_field_name  implemented_instance_fields;
-		output_cpp "	String(null()) };\n\n";
+   end; (* cl_interface *)
 
-     end; (* cl_interface *)
+	output_cpp "static ::String sMemberFields[] = {\n";
+	List.iter dump_field_name  implemented_instance_fields;
+	output_cpp "	String(null()) };\n\n";
 
-		(* Mark static variables as used *)
-		output_cpp "static void sMarkStatics(HX_MARK_PARAMS) {\n";
-		output_cpp ("	HX_MARK_MEMBER_NAME(" ^ class_name ^ "::__mClass,\"__mClass\");\n");
-		List.iter (fun field ->
-			if (is_data_member field) then
-				output_cpp ("	HX_MARK_MEMBER_NAME(" ^ class_name ^ "::" ^ (keyword_remap field.cf_name) ^ ",\"" ^  field.cf_name ^ "\");\n") )
-			implemented_fields;
-		output_cpp "};\n\n";
 
-		(* Visit static variables *)
-		output_cpp "static void sVisitStatics(HX_VISIT_PARAMS) {\n";
-		output_cpp ("	HX_VISIT_MEMBER_NAME(" ^ class_name ^ "::__mClass,\"__mClass\");\n");
-		List.iter (fun field ->
-			if (is_data_member field) then
-				output_cpp ("	HX_VISIT_MEMBER_NAME(" ^ class_name ^ "::" ^ (keyword_remap field.cf_name) ^ ",\"" ^  field.cf_name ^ "\");\n") )
-			implemented_fields;
-		output_cpp "};\n\n";
+	(* Mark static variables as used *)
+	output_cpp "static void sMarkStatics(HX_MARK_PARAMS) {\n";
+	output_cpp ("	HX_MARK_MEMBER_NAME(" ^ class_name ^ "::__mClass,\"__mClass\");\n");
+	List.iter (fun field ->
+		if (is_data_member field) then
+			output_cpp ("	HX_MARK_MEMBER_NAME(" ^ class_name ^ "::" ^ (keyword_remap field.cf_name) ^ ",\"" ^  field.cf_name ^ "\");\n") )
+		implemented_fields;
+	output_cpp "};\n\n";
+
+	(* Visit static variables *)
+	output_cpp "static void sVisitStatics(HX_VISIT_PARAMS) {\n";
+	output_cpp ("	HX_VISIT_MEMBER_NAME(" ^ class_name ^ "::__mClass,\"__mClass\");\n");
+	List.iter (fun field ->
+		if (is_data_member field) then
+			output_cpp ("	HX_VISIT_MEMBER_NAME(" ^ class_name ^ "::" ^ (keyword_remap field.cf_name) ^ ",\"" ^  field.cf_name ^ "\");\n") )
+		implemented_fields;
+	output_cpp "};\n\n";
 
    if (scriptable ) then begin
       let dump_script_field idx (field,f_args,return_t) =
@@ -3136,7 +3137,7 @@ let generate_class_files common_ctx member_types super_deps constructor_deps cla
 
 		output_cpp ("void " ^ class_name ^ "::__register()\n{\n");
 		output_cpp ("	hx::Static(__mClass) = hx::RegisterClass(" ^ (str class_name_text)  ^
-				", hx::TCanCast< " ^ class_name ^ "> ,0,0,\n");
+				", hx::TCanCast< " ^ class_name ^ "> ,0,sMemberFields,\n");
 		output_cpp ("	0, 0,\n");
 		output_cpp ("	&super::__SGetClass(), 0, sMarkStatics, sVisitStatics);\n");
       if (scriptable) then