Browse Source

[cpp] Add some debugging to cpp AST

hughsando 9 years ago
parent
commit
340953b1e9
1 changed files with 267 additions and 117 deletions
  1. 267 117
      gencpp.ml

+ 267 - 117
gencpp.ml

@@ -1614,6 +1614,17 @@ and tcpp_block = {
    block_undeclared : (string,tvar) Hashtbl.t
 }
 
+and tcppvarloc =
+   | VarLocal of tvar
+   | VarClosure of tvar
+   | VarInstance of tcppexpr * tclass_field
+   | VarStatic of tcppexpr * tclass_field
+
+
+and tcppfuncloc =
+   | FuncInstance of tcppexpr * tclass_field
+   | FuncInterface of tcppexpr * tclass_field
+   | FuncStatic of tcppexpr * tclass_field
 
 
 and tcpp_expr_expr =
@@ -1627,44 +1638,28 @@ and tcpp_expr_expr =
    | CppSuper
    | CppCode of string * tcppexpr list
    | CppClosure of tcpp_closure
-   | CppLocalVar of tvar
-   | CppLocalVarCrement of tvar * bool * bool
-   | CppLocalVarSet of tvar * Ast.binop * tcppexpr
-   | CppClosureVar of tvar
-   | CppClosureVarCrement of tvar * bool * bool
-   | CppClosureVarSet of tvar * Ast.binop * tcppexpr
-   | CppInstanceVariable of tcppexpr * tclass_field
-   | CppInstanceVariableCrement of tcppexpr * tclass_field * bool * bool
-   | CppInstanceVariableSet of tcppexpr * tclass_field * Ast.binop * tcppexpr
-   | CppInstanceFunction of tcppexpr * tclass_field
-   | CppInterfaceFunction of tcppexpr * tclass_field
-   | CppStaticVariable of tcppexpr * tclass_field
-   | CppStaticVariableCrement of tcppexpr * tclass_field * bool * bool
-   | CppStaticVariableSet of tcppexpr * tclass_field * Ast.binop * tcppexpr
-   | CppStaticFunction of tcppexpr * tclass_field
+   | CppVar of tcppvarloc
+   | CppVarCrement of tcppvarloc * bool * bool
+   | CppVarSet of tcppvarloc * Ast.binop * tcppexpr
+   | CppFunction of tcppfuncloc
+   | CppCall of tcppfuncloc * tcppexpr list
+   | CppCallDynamic of tcppexpr * tcppexpr list
    | CppDynamicField of tcppexpr * string
    | CppDynamicFieldCrement of tcppexpr * string * bool * bool
    | CppDynamicFieldSet of tcppexpr * string * Ast.binop * tcppexpr
-   | CppInstanceCall of tcppexpr * tclass_field * tcppexpr list
-   | CppStaticCall of tcppexpr * tclass_field * tcppexpr list
-   | CppInterfaceCall of tcppexpr * tclass_field * tcppexpr list
    | CppEnumCreate of tenum * tenum_field * tcppexpr list
    | CppSuperCall of tcppexpr list
    | CppNewCall of tclass * tparams * tcppexpr list
-   | CppDynamicCall of tcppexpr * tcppexpr list
    | CppEnumField of tenum * tenum_field
    | CppArray of tcppexpr * tcppexpr
    | CppArrayCrement of tcppexpr * tcppexpr * bool * bool
    | CppArraySet of tcppexpr * tcppexpr * Ast.binop * tcppexpr
    | CppBinop of Ast.binop * tcppexpr * tcppexpr
-   | CppField of tcppexpr * tfield_access
-   | CppTypeExpr of module_type
    | CppObjectDecl of (string * tcppexpr) list
    | CppPosition of string * int32 * string * string
    | CppArrayDecl of tcppexpr list
-   | CppNew of tclass * (string list) * tcppexpr list
    | CppUnop of Ast.unop * tcppexpr
-   | CppVar of tvar * tcppexpr option
+   | CppVarDecl of tvar * tcppexpr option
    | CppBlock of tcppexpr list
    | CppReturnBlock of tcpp_block
    | CppFor of tvar * tcppexpr * tcppexpr
@@ -1681,10 +1676,6 @@ and tcpp_expr_expr =
    | CppEnumParameter of tcppexpr * tenum_field * int
 
 
-   (*| CppParenthesis of texpr *)
-   (*| CppMeta of metadata_entry * texpr *)
-
-
 let cpp_const_type cval = match cval with
    | TInt i -> CppInt(i) , TCppScalar("Int")
    | TBool b -> CppBool(b) , TCppScalar("Bool")
@@ -1901,10 +1892,10 @@ let retype_expression ctx request_type expression_tree =
          | TLocal tvar ->
             let name = tvar.v_name in
             if (Hashtbl.mem !declarations name) then
-               CppLocalVar(tvar), cpp_type_of tvar.v_type
+               CppVar(VarLocal(tvar)), cpp_type_of tvar.v_type
             else begin
                Hashtbl.replace !undeclared name tvar;
-               CppClosureVar(tvar), cpp_type_of tvar.v_type
+               CppVar(VarClosure(tvar)), cpp_type_of tvar.v_type
             end
 
          | TBreak ->
@@ -1929,19 +1920,19 @@ let retype_expression ctx request_type expression_tree =
                let retypedObj = retype clazzType obj in
                let exprType = cpp_type_of member.cf_type in
                if is_var_field member then
-                  CppInstanceVariable(retypedObj, member ), exprType
+                  CppVar(VarInstance(retypedObj,member) ), exprType
                else if (clazz.cl_interface) then
-                  CppInterfaceFunction(retypedObj, member ), exprType
+                  CppFunction( FuncInterface(retypedObj, member) ), exprType
                else
-                  CppInstanceFunction(retypedObj, member ), exprType
+                  CppFunction( FuncInstance(retypedObj, member) ), exprType
             | FStatic (clazz,member) ->
                let clazzType = TCppType(clazz.cl_path) in
                let retypedObj = retype clazzType obj in
                let exprType = cpp_type_of member.cf_type in
                if is_var_field member then
-                  CppStaticVariable(retypedObj, member ), exprType
+                  CppVar(VarStatic(retypedObj, member)), exprType
                else
-                  CppStaticFunction(retypedObj, member ), exprType
+                  CppFunction( FuncStatic(retypedObj, member) ), exprType
             | FClosure (_,field)
             | FAnon field ->
                   CppDynamicField(retype TCppDynamic obj, field.cf_name), TCppDynamic
@@ -1971,13 +1962,11 @@ let retype_expression ctx request_type expression_tree =
             *)
             let retypedArgs = List.map (retype TCppDynamic ) args in
             (match retypedFunc.cppexpr with
-            |  CppInstanceFunction(inst,member)   -> CppInstanceCall(inst,member,retypedArgs), cppType
-            |  CppStaticFunction(clazz,field)    -> CppStaticCall(clazz,field,retypedArgs), cppType
-            |  CppInterfaceFunction(inst, intf) -> CppInterfaceCall(inst,intf,retypedArgs), cppType
-            |  CppEnumField(enum, field)        -> CppEnumCreate(enum,field,retypedArgs), cppType
-            |  CppSuper                         -> CppSuperCall(retypedArgs), cppType
+            |  CppFunction(func)          -> CppCall(func,retypedArgs), cppType
+            |  CppEnumField(enum, field)  -> CppEnumCreate(enum,field,retypedArgs), cppType
+            |  CppSuper                   -> CppSuperCall(retypedArgs), cppType
             | _ ->
-               CppDynamicCall(retypedFunc, retypedArgs), TCppDynamic
+               CppCallDynamic(retypedFunc, retypedArgs), TCppDynamic
             )
 
          | TNew (clazz,params,args) ->
@@ -2033,19 +2022,14 @@ let retype_expression ctx request_type expression_tree =
          | TBinop (op,e1,e2) ->
             let e2 = retype (cpp_type_of e2.etype) e2 in
             let e1 = retype (cpp_type_of e1.etype) e1 in
+            let op = if op=OpAssign then OpAssignOp op else op in
             let reference = match op with
-               | OpAssign ->
+               | OpAssignOp op ->
                   (match e1.cppexpr with
                      | CppArray(obj,index)
                         -> CppArraySet(obj,index,op,e2)
-                     | CppLocalVar(tvar)
-                        -> CppLocalVarSet(tvar,op,e2)
-                     | CppClosureVar(tvar)
-                        -> CppClosureVarSet(tvar,op,e2)
-                     | CppInstanceVariable(obj, member)
-                        -> CppInstanceVariableSet(obj,member,op,e2)
-                     | CppStaticVariable(obj, member)
-                        -> CppStaticVariableSet(obj,member,op,e2)
+                     | CppVar(loc)
+                        -> CppVarSet(loc,op,e2)
                      | CppDynamicField(obj, member)
                         -> CppDynamicFieldSet(obj,member,op,e2)
                      | _ -> error "Unknown assignment left-hand-side" expr.epos
@@ -2060,12 +2044,12 @@ let retype_expression ctx request_type expression_tree =
                | Increment
                | Decrement ->
                   (match e1.cppexpr with
-                     | CppArray(obj,index) -> CppArrayCrement(obj,index,pre=Prefix,op=Increment)
-                     | CppLocalVar(tvar) -> CppLocalVarCrement(tvar,pre=Prefix,op=Increment)
-                     | CppClosureVar(tvar) -> CppClosureVarCrement(tvar,pre=Prefix,op=Increment)
-                     | CppInstanceVariable(obj, member) -> CppInstanceVariableCrement(obj,member,pre=Prefix,op=Increment)
-                     | CppStaticVariable(obj, member) -> CppStaticVariableCrement(obj,member,pre=Prefix,op=Increment)
-                     | CppDynamicField(obj, member) -> CppDynamicFieldCrement(obj,member,pre=Prefix,op=Increment)
+                     | CppArray(obj,index) ->
+                         CppArrayCrement(obj,index,pre=Prefix,op=Increment)
+                     | CppVar(loc) ->
+                         CppVarCrement(loc,pre=Prefix,op=Increment)
+                     | CppDynamicField(obj, member) ->
+                         CppDynamicFieldCrement(obj,member,pre=Prefix,op=Increment)
                      | _ -> error "Unknown increment left-hand-side" expr.epos
                   )
                | _ -> CppUnop(op,e1)
@@ -2081,7 +2065,7 @@ let retype_expression ctx request_type expression_tree =
 
          | TWhile (e1,e2,flag) ->
             let condition = retype (TCppScalar("Bool")) e1 in
-            let block = retype TCppVoid e1 in
+            let block = retype TCppVoid e2 in
             CppWhile(condition, block, flag), TCppVoid
 
          | TArrayDecl el ->
@@ -2130,7 +2114,7 @@ let retype_expression ctx request_type expression_tree =
             let varType = cpp_type_of v.v_type in
             let init = match eo with None -> None | Some e -> Some (retype varType e) in
             Hashtbl.add !declarations v.v_name ();
-            CppVar(v, init), varType
+            CppVarDecl(v, init), varType
 
          | TIf (ec,e1,e2) ->
             let ec = retype (TCppScalar("Bool")) ec in
@@ -2241,66 +2225,233 @@ let debug_expression_tree ctx tree =
          List.iter (fun e -> out !indent; dbgexpr e; out ";\n" ) exprs;
          indent := oldIndent;
          out (!indent ^ "}\n")
-   | CppVar(var,init) ->
+   | CppVarDecl(var,init) ->
          out ("var " ^ var.v_name);
          (match init with Some init -> out " = "; dbgexpr init | _ -> () )
-   (*
-   | CppCode of string * tcppexpr list
-   | CppClosure of tcpp_closure
-   | CppLocalVar of tvar
-   | CppLocalVarCrement of tvar * bool * bool
-   | CppLocalVarSet of tvar * Ast.binop * tcppexpr
-   | CppClosureVar of tvar
-   | CppClosureVarCrement of tvar * bool * bool
-   | CppClosureVarSet of tvar * Ast.binop * tcppexpr
-   | CppInstanceVariable of tcppexpr * tclass_field
-   | CppInstanceVariableCrement of tcppexpr * tclass_field * bool * bool
-   | CppInstanceVariableSet of tcppexpr * tclass_field * Ast.binop * tcppexpr
-   | CppInstanceFunction of tcppexpr * tclass_field
-   | CppInterfaceFunction of tcppexpr * tclass_field
-   | CppStaticVariable of tcppexpr * tclass_field
-   | CppStaticVariableCrement of tcppexpr * tclass_field * bool * bool
-   | CppStaticVariableSet of tcppexpr * tclass_field * Ast.binop * tcppexpr
-   | CppStaticFunction of tcppexpr * tclass_field
-   | CppDynamicField of tcppexpr * string
-   | CppDynamicFieldCrement of tcppexpr * string * bool * bool
-   | CppDynamicFieldSet of tcppexpr * string * Ast.binop * tcppexpr
-   | CppInstanceCall of tcppexpr * tclass_field * tcppexpr list
-   | CppStaticCall of tcppexpr * tclass_field * tcppexpr list
-   | CppInterfaceCall of tcppexpr * tclass_field * tcppexpr list
-   | CppEnumCreate of tenum * tenum_field * tcppexpr list
-   | CppSuperCall of tcppexpr list
-   | CppNewCall of tclass * tparams * tcppexpr list
-   | CppDynamicCall of tcppexpr * tcppexpr list
-   | CppEnumField of tenum * tenum_field
-   | CppArray of tcppexpr * tcppexpr
-   | CppArrayCrement of tcppexpr * tcppexpr * bool * bool
-   | CppArraySet of tcppexpr * tcppexpr * Ast.binop * tcppexpr
-   | CppBinop of Ast.binop * tcppexpr * tcppexpr
-   | CppField of tcppexpr * tfield_access
-   | CppTypeExpr of module_type
-   | CppObjectDecl of (string * tcppexpr) list
-   | CppPosition of string * int32 * string * string
-   | CppArrayDecl of tcppexpr list
-   | CppNew of tclass * (string list) * tcppexpr list
-   | CppUnop of Ast.unop * tcppexpr
-   | CppReturnBlock of tcpp_block
-   | CppFor of tvar * tcppexpr * tcppexpr
-   | CppIf of tcppexpr * tcppexpr * tcppexpr option
-   | CppWhile of tcppexpr * tcppexpr * Ast.while_flag
-   | CppSwitch of tcppexpr * (tcppexpr list * tcppexpr) list * tcppexpr option
-   | CppTry of tcppexpr * (tvar * tcppexpr) list
-   | CppBreak
-   | CppContinue
-   | CppType of path
-   | CppReturn of tcppexpr option
-   | CppThrow of tcppexpr
-   | CppCast of tcppexpr * module_type option
-   | CppEnumParameter of tcppexpr * tenum_field * int
-
-   *)
-
-   | _ -> out "<unknown expr>"
+   | CppBreak -> out "break"
+   | CppContinue -> out "continue"
+   | CppClosure closure -> out ("call(closure" ^ (string_of_int(closure.close_id)) ^ ")")
+   | CppReturnBlock block ->out ("call(block" ^ (string_of_int(block.block_id)) ^ ")")
+   | CppVar(loc) ->
+         out_val_loc loc;
+   | CppVarCrement(loc,pre,inc) ->
+         let op = if inc then "++" else "--" in
+         if (pre) then out op;
+         out_val_loc loc;
+         if (not pre) then out op
+   | CppVarSet(loc,op,value) ->
+         out_val_loc loc;
+         out (string_of_op_eq op expr.cpppos);
+         dbgexpr value
+
+   | CppFunction(func) ->
+         (match func with
+         | FuncInstance(expr,field) ->
+              dbgexpr expr; out ("->" ^ field.cf_name ^ "_dyn()");
+         | FuncInterface(expr,field) ->
+              dbgexpr expr; out ("->" ^ field.cf_name ^ "_dyn()");
+         | FuncStatic(expr,field) ->
+              dbgexpr expr; out ("::" ^ field.cf_name ^ "_dyn()");
+         );
+   | CppCall(func, args) ->
+         (match func with
+         | FuncInstance(expr,field) ->
+              dbgexpr expr; out ("->" ^ field.cf_name );
+         | FuncInterface(expr,field) ->
+              dbgexpr expr; out ("->" ^ field.cf_name );
+         | FuncStatic(expr,field) ->
+              dbgexpr expr; out ("::" ^ field.cf_name);
+         );
+         call_out args;
+   | CppDynamicField(obj,name) ->
+         dbgexpr obj;
+         out ("->__Field('" ^ name  ^ "')");
+   | CppCallDynamic(obj,args) ->
+         dbgexpr obj;
+         out ("->run");
+         call_out args;
+   | CppPosition(name,line,clazz,func) ->
+         out ("Pos('" ^ name ^ "'," ^ string_of_int(Int32.to_int line) ^ ",'" ^ clazz ^ "','" ^ func ^ "')")
+
+   | CppObjectDecl values ->
+         out "{";
+         List.iter (fun(name,value) ->
+            out ("'" ^ name ^ "'=");
+            dbgexpr value;
+            out ", ";
+         ) values;
+         out "}";
+   | CppType path -> out (string_of_path path)
+   | CppArray(obj,index) ->
+         dbgexpr obj; out "["; dbgexpr index; out "]";
+   | CppArrayDecl(exprList) ->
+         out "["; List.iter (fun value -> dbgexpr value; out ",";) exprList; out "]";
+   | CppBinop(op, left, right) ->
+         out "("; dbgexpr left; out ") ";
+         out (string_of_op op expr.cpppos);
+         out " ("; dbgexpr right; out ")";
+   | CppArraySet(obj,index,op,value) ->
+         dbgexpr obj; out "["; dbgexpr index; out "]";
+         out (string_of_op_eq op expr.cpppos);
+         dbgexpr value;
+   | CppArrayCrement(obj,index,pre,inc) ->
+         let op = if inc then "++" else "--" in
+         if (pre) then out op;
+         dbgexpr obj; out "["; dbgexpr index; out "]";
+         if (not pre) then out op
+   | CppDynamicFieldSet(obj,name,op,value) ->
+         out "DynamicRef("; dbgexpr obj; out (",'" ^ name ^ "')");
+         out (string_of_op_eq op expr.cpppos);
+         dbgexpr value;
+   | CppDynamicFieldCrement(obj,name,pre,inc) ->
+         let op = if inc then "++" else "--" in
+         if (pre) then out op;
+         out "DynamicRef("; dbgexpr obj; out (",'" ^ name ^ "')");
+         if (not pre) then out op
+   | CppThrow(value) -> out "throw "; dbgexpr value;
+   | CppReturn None -> out "return";
+   | CppReturn Some value -> out "return "; dbgexpr value;
+   | CppSuperCall(args) -> out "super"; call_out args;
+   | CppNewCall(clazz, params, args) ->
+         out ("new " ^ (string_of_path clazz.cl_path));
+         call_out args;
+   | CppEnumField(enum,field) ->
+         out ((string_of_path enum.e_path) ^ "::" ^ field.ef_name);
+   | CppEnumCreate(enum,field,args) ->
+         out ((string_of_path enum.e_path) ^ "::" ^ field.ef_name);
+         call_out args;
+   | CppEnumParameter(obj,field,index) ->
+         dbgexpr obj;
+         out ("->EnumParam[" ^ (string_of_int index) ^ "]");
+   | CppSwitch(condition, cases, defVal) ->
+      out "switch("; dbgexpr condition; out ")\n";
+      out (!indent ^ "{\n");
+      let oldIndent = !indent in
+      indent := oldIndent ^ "   ";
+      List.iter (fun (values,expr) ->
+         List.iter (fun value -> out (!indent ^ "case "); dbgexpr value; out ":\n" ) values;
+         let oldIndent = !indent in
+         out !indent; dbgexpr expr; out ";\n";
+         indent := oldIndent;
+      ) cases;
+      (match defVal with
+      | Some expr ->
+         out (!indent ^ "default:\n");
+         let oldIndent = !indent in
+         dbgexpr expr;
+         indent := oldIndent;
+      | _ -> ()  );
+      indent := oldIndent;
+      out (!indent ^ "}\n")
+
+
+   | CppUnop(unop,value) ->
+        out (match unop with
+        | Not -> "!"
+        | Neg -> "-"
+        | NegBits -> "~"
+        | _ -> error "Invalid unop" expr.cpppos
+        );
+        out "(";  dbgexpr value; out ")"
+
+   | CppWhile(condition, block, while_flag) ->
+       (match while_flag with
+       | NormalWhile ->
+           out "while("; dbgexpr condition; out (")\n" ^ !indent);
+           dbgexpr block;
+       | DoWhile ->
+           out ("do\n" ^ !indent);
+           dbgexpr block;
+           out "while("; dbgexpr condition; out ")"
+       );
+   | CppIf (condition,block,None) ->
+       out "if ("; dbgexpr condition; out (")\n" ^ !indent);
+       dbgexpr block;
+
+   | CppIf (condition,block,Some elze) when expr.cpptype = TCppVoid ->
+       out "if ("; dbgexpr condition; out (")\n" ^ !indent);
+       dbgexpr block;
+       out ("\n" ^ !indent ^ "else\n" ^ "!indent");
+       dbgexpr elze;
+
+   | CppIf (condition,block,Some elze) ->
+       dbgexpr condition; out " ? "; dbgexpr block; out " : "; dbgexpr elze;
+
+   | CppFor(tvar, init, block) ->
+       out ("for(var " ^ tvar.v_name ^ "-"); dbgexpr init; out (")\n" ^ !indent);
+       dbgexpr block;
+
+   | CppTry(block,catches) ->
+       out ("try\n");
+       dbgexpr block;
+       List.iter (fun (var,block) ->
+         let oldIndent = !indent in
+         out (!indent ^ "catch(var " ^ var.v_name ^ ")" );
+         dbgexpr block; out "\n";
+         indent := oldIndent;
+       ) catches;
+
+   | CppCast(expr,None) ->
+       out "cast("; dbgexpr expr; out ")";
+
+   | CppCast(expr,Some _) ->
+       out "castTo("; dbgexpr expr; out ")";
+
+   | CppCode(value, exprs) ->
+       Codegen.interpolate_code ctx.ctx_common (format_code value) exprs out (fun e -> dbgexpr e) expr.cpppos
+
+   and out_val_loc loc = 
+      match loc with
+      | VarClosure(var) -> out ("_this->" ^ var.v_name)
+      | VarLocal(local) -> out local.v_name
+      | VarStatic(obj,member) -> dbgexpr obj; out ("::" ^ member.cf_name)
+      | VarInstance(obj,member) -> dbgexpr obj; out ("->" ^ member.cf_name)
+
+   and string_of_op_eq op pos = match op with
+      | OpAdd -> "+="
+      | OpMult -> "*="
+      | OpDiv -> "/="
+      | OpSub -> "-="
+      | OpAssign -> "="
+      | OpShl -> "<<="
+      | OpShr -> ">>="
+      | OpUShr -> "<<<="
+      | OpMod -> "%="
+      | _ -> error "Bad assign op" pos
+   and string_of_op op pos = match op with
+      | OpAdd -> "+"
+      | OpMult -> "*"
+      | OpDiv -> "/"
+      | OpSub -> "-"
+      | OpEq -> "=="
+      | OpNotEq -> "!="
+      | OpGt -> ">"
+      | OpGte -> ">="
+      | OpLt -> "<"
+      | OpLte -> "<="
+      | OpAnd -> "+"
+      | OpOr -> "|"
+      | OpXor -> "^"
+      | OpBoolAnd -> "&&"
+      | OpBoolOr -> "||"
+      | OpShl -> "<<"
+      | OpShr -> ">>"
+      | OpUShr -> "<<<"
+      | OpMod -> "%"
+      | OpInterval -> "..."
+      | OpArrow -> "->"
+      | OpAssign | OpAssignOp _ -> error "Unprocessed OpAssign" pos
+   and string_of_path path =
+      String.concat "::" (fst path) ^ "::" ^ (snd path) ^ "_obj"
+   and call_out args =
+      let is_first = ref true in
+      out "(";
+      List.iter (fun arg ->
+         if not !is_first then out ",";
+         is_first := false;
+         dbgexpr arg;
+         ) args;
+      out ")";
    in
 
    List.iter (fun block ->
@@ -2316,7 +2467,6 @@ let debug_expression_tree ctx tree =
 
 ;;
 
-
 *)
 (* } *)
 
@@ -2336,7 +2486,7 @@ let gen_expression_tree ctx retval expression_tree set_var tail_code =
  let output_i = writer#write_i in
  let output = ctx.ctx_output in
 
- (*debug_expression_tree ctx expression_tree;*)
+ (*debug_expression_tree ctx expression_tree; *)
 
  let rec define_local_function_ctx func_name func_def =
    let remap_this = function | "this" -> "__this" | other -> other in