Message ID | 1392115505-21969-1-git-send-email-famz@redhat.com |
---|---|
State | New |
Headers | show |
On Tue, Feb 11, 2014 at 06:45:05PM +0800, Fam Zheng wrote: > diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell > index d374b35..9c84551 100755 > --- a/scripts/qmp/qmp-shell > +++ b/scripts/qmp/qmp-shell > @@ -112,7 +112,14 @@ class QMPShell(qmp.QEMUMonitorProtocol): > value = json.loads(opt[1]) > else: > value = opt[1] > - qmpcmd['arguments'][opt[0]] = value > + optpath = opt[0].split('.') > + parent = qmpcmd['arguments'] > + for p in optpath[:-1]: > + if not p in parent: > + d = dict() > + parent[p] = d > + parent = d d is a stale reference when the path component already exists (e.g. a.b.c=1 a.d=2). Since 'a' already exists when processing 'a.d' we'll the value of d will actually be the a.b dict! I think you need the following instead: for p in optpath[:-1]: d = parent.get(p, {}) parent[p] = d parent = d
On Tue, 02/11 14:28, Stefan Hajnoczi wrote: > On Tue, Feb 11, 2014 at 06:45:05PM +0800, Fam Zheng wrote: > > diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell > > index d374b35..9c84551 100755 > > --- a/scripts/qmp/qmp-shell > > +++ b/scripts/qmp/qmp-shell > > @@ -112,7 +112,14 @@ class QMPShell(qmp.QEMUMonitorProtocol): > > value = json.loads(opt[1]) > > else: > > value = opt[1] > > - qmpcmd['arguments'][opt[0]] = value > > + optpath = opt[0].split('.') > > + parent = qmpcmd['arguments'] > > + for p in optpath[:-1]: > > + if not p in parent: > > + d = dict() > > + parent[p] = d > > + parent = d > > d is a stale reference when the path component already exists (e.g. > a.b.c=1 a.d=2). Since 'a' already exists when processing 'a.d' we'll > the value of d will actually be the a.b dict! > > I think you need the following instead: > > for p in optpath[:-1]: > d = parent.get(p, {}) > parent[p] = d > parent = d Yes, thanks. And we should check the contradictive case "foo=a foo.bar=b". Will send v2. Fam
diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell index d374b35..9c84551 100755 --- a/scripts/qmp/qmp-shell +++ b/scripts/qmp/qmp-shell @@ -112,7 +112,14 @@ class QMPShell(qmp.QEMUMonitorProtocol): value = json.loads(opt[1]) else: value = opt[1] - qmpcmd['arguments'][opt[0]] = value + optpath = opt[0].split('.') + parent = qmpcmd['arguments'] + for p in optpath[:-1]: + if not p in parent: + d = dict() + parent[p] = d + parent = d + parent[optpath[-1]] = value return qmpcmd def _execute_cmd(self, cmdline):