Cylinder BMesh UV mapping for Blender 2.6 or later

It seems that bmesh data are refreshed when the mode is changed from "edit" to "object", though I have not figured out the exact moment yet. The code is the same as ever.

import bmesh
import math

msh = bpy.data.meshes.new('cylinderMesh')
obj = bpy.data.objects.new('cylinder', msh)
bpy.context.scene.objects.link(obj)

#########################
m = 10
n = 10
#########################
w = 1.0/float(m)
h = 2.0/float(n)
dt = 2.0*math.pi/float(m)

obj = bpy.context.active_object
me = obj.data
bm = bmesh.from_edit_mesh(me)

#uv_layer = bm.loops.layers.uv.verify()
#bm.faces.layers.tex.verify()  # currently blender needs both layers.

uv_lay = bm.loops.layers.uv.active

x = 0
y = 0
loopNode = 0
for face in bm.faces:
    for loop in face.loops:
        uv = loop[uv_lay].uv
#           print("Loop UV: %f, %f" % uv[:])
        vert = loop.vert
        print("Loop Vert: (%f,%f,%f)" % vert.co[:])
        if loopNode == 0:
            loop[uv_lay].uv = (float(x)*w, float(y)*h)
        elif loopNode == 1:
            loop[uv_lay].uv = (float(x)*w, float(y+1)*h)
        elif loopNode == 2:
            loop[uv_lay].uv = (float(x+1)*w, float(y)*h)
        elif loopNode == 3:
            loop[uv_lay].uv = (float(x)*w, float(y+1)*h)
        elif loopNode == 4:
            loop[uv_lay].uv = (float(x+1)*w, float(y)*h)
        elif loopNode == 5:
            loop[uv_lay].uv = (float(x+1)*w, float(y+1)*h)
        print("Loop UV: %f, %f" % loop[uv_lay].uv[:])
        loopNode += 1
        if loopNode == 6:
            loopNode = 0
            x += 1
        if x == m:
            x = 0
            y += 1