2
0
Эх сурвалжийг харах

[cs] Fixed traversing problems on CSharpSpecific module. Fixes Issue # 807; Fixed also problem with >>>= operator

Caue Waneck 13 жил өмнө
parent
commit
cce40ab5b1
1 өөрчлөгдсөн 37 нэмэгдсэн , 4 устгасан
  1. 37 4
      gencs.ml

+ 37 - 4
gencs.ml

@@ -159,11 +159,11 @@ struct
         (* end Std.int() *)
         
         | TField(ef, "length") when is_string ef.etype ->
-          { e with eexpr = TField(ef, "Length") }
+          { e with eexpr = TField(run ef, "Length") }
         | TField(ef, ("toLowerCase")) when is_string ef.etype ->
-          { e with eexpr = TField(ef, "ToLower") }
+          { e with eexpr = TField(run ef, "ToLower") }
         | TField(ef, ("toUpperCase")) when is_string ef.etype ->
-          { e with eexpr = TField(ef, "ToUpper") }
+          { e with eexpr = TField(run ef, "ToUpper") }
         
         | TCall( ( { eexpr = TField({ eexpr = TTypeExpr (TClassDecl cl) }, "fromCharCode") } ), [cc] ) ->
           { e with eexpr = TNew(get_cl_from_t basic.tstring, [], [mk_cast tchar cc; mk_int gen 1 cc.epos]) }
@@ -175,7 +175,7 @@ struct
         | TCall( ( { eexpr = TField(ef, ("lastIndexOf" as field)) } ), args )
         | TCall( ( { eexpr = TField(ef, ("split" as field)) } ), args )
         | TCall( ( { eexpr = TField(ef, ("substr" as field)) } ), args ) when is_string ef.etype ->
-          { e with eexpr = TCall(mk_static_field_access_infer string_ext field e.epos [], [ef] @ args) }
+          { e with eexpr = TCall(mk_static_field_access_infer string_ext field e.epos [], [run ef] @ (List.map run args)) }
         
         | TCast(expr, _) when is_int_float e.etype && not (is_int_float expr.etype) ->
           let needs_cast = match gen.gfollow#run_f e.etype with
@@ -204,6 +204,39 @@ struct
           
         | TBinop( Ast.OpUShr, e1, e2 ) ->
           mk_cast e.etype { e with eexpr = TBinop( Ast.OpShr, mk_cast (TType(uint,[])) (run e1), run e2 ) }
+        
+        | TBinop( Ast.OpAssignOp Ast.OpUShr, e1, e2 ) ->
+          let mk_ushr local = 
+            { e with eexpr = TBinop(Ast.OpAssign, local, run { e with eexpr = TBinop(Ast.OpUShr, local, run e2) }) }
+          in
+          
+          let mk_local obj =
+            let var = mk_temp gen "opUshr" obj.etype in
+            let added = { obj with eexpr = TVars([var, Some(obj)]); etype = basic.tvoid } in
+            let local = mk_local var obj.epos in
+            local, added
+          in
+          
+          let e1 = run e1 in
+          
+          let ret = match e1.eexpr with
+            | TField({ eexpr = TLocal _ }, _)
+            | TField({ eexpr = TTypeExpr _ }, _)
+            | TArray({ eexpr = TLocal _ }, _)
+            | TLocal(_) -> 
+              mk_ushr e1
+            | TField(fexpr, field) ->
+              let local, added = mk_local fexpr in
+              { e with eexpr = TBlock([ added; mk_ushr { e1 with eexpr = TField(local, field) }  ]); }
+            | TArray(ea1, ea2) ->
+              let local, added = mk_local ea1 in
+              { e with eexpr = TBlock([ added; mk_ushr { e1 with eexpr = TArray(local, ea2) }  ]); }
+            | _ -> (* invalid left-side expression *)
+              assert false
+          in
+          
+          ret
+        
         | _ -> Type.map_expr run e
     in
     run