code: def convert_to_push(ir, node):
      
  
  
      lvalue = ir.lvalue
      if isinstance(ir.arguments[0], list):
          ret = []
  
          val = TemporaryVariable(node)
          operation = InitArray(ir.arguments[0], val)
          ret.append(operation)
  
          ir = Push(ir.destination, val)
  
          length = Literal(len(operation.init_values))
          t = operation.init_values[0].type
          ir.lvalue.set_type(ArrayType(t, length))
  
          ret.append(ir)
  
          if lvalue:
              length = Length(ir.array, lvalue)
              length.lvalue.points_to = ir.lvalue
              ret.append(length)
  
          return ret
  
      ir = Push(ir.destination, ir.arguments[0])
  
      if lvalue:
          ret = []
          ret.append(ir)
  
          length = Length(ir.array, lvalue)
          length.lvalue.points_to = ir.lvalue
          ret.append(length)
          return ret
  
      return ir
docs: Convert a call to a PUSH operaiton
  
      The funciton assume to receive a correct IR
      The checks must be done by the caller
  
      May necessitate to create an intermediate operation (InitArray)
      Necessitate to return the lenght (see push documentation)
      As a result, the function return may return a list