[pypy-dev] Fwd: Re: Adding init/variables to W_Root

Frank Wang frankw at mit.edu
Wed Jan 11 21:35:57 EST 2017


Hi William,

Good catch! I was just trying to get something to work, but it seems like
you found another bug. I am now checking if it is None:

        # union flags in w_1 and w_2 and propagate to result
        if isinstance(w_result, W_Root) and w_result is not None:
            rb_results = {}
            if isinstance(w_1, W_Root) and w_1 is not None:
                w_1_rbflags = w_1.get_rbflags()
                rb_results.update(w_1_rbflags)
            if isinstance(w_2, W_Root) and w_2 is not None:
                w_2_rbflags = w_2.get_rbflags()
                rb_results.update(w_2_rbflags)
            w_result.set_rbflags(rb_results)

I now get this error:

[translation:ERROR] UnionError:

Offending annotations:
  SomeInstance(can_be_None=False,
classdef=pypy.interpreter.baseobjspace.W_Root)
  SomeOrderedDict(dictdef=<{SomeImpossibleValue(): SomeImpossibleValue()}>)


Occurred processing the following simple_call:
  <MethodDesc 'set_rbflags' of <ClassDef
'pypy.interpreter.baseobjspace.W_Root'> bound to <ClassDef
'pypy.interpreter.baseobjspace.W_Root'> {}> returning

    v831 = simple_call(v830, rb_results_0)

In <FunctionGraph of
(pypy.interpreter.pyopcode:40)opcode_impl_for_div__star_2 at 0x1c190b10>:
Happened at file /home/ubuntu/pypy2-v5.3.1-src/pypy/interpreter/pyopcode.py
line 55

==>             w_result.set_rbflags(rb_results)

Known variable annotations:
 v830 = SomePBC(can_be_None=False, descriptions={...1...},
knowntype=method, subset_of=None)
 rb_results_0 = SomeOrderedDict(dictdef=<{SomeImpossibleValue():
SomeImpossibleValue()}>)

Processing block:
 block at 203 is a <class 'rpython.flowspace.flowcontext.SpamBlock'>
 in (pypy.interpreter.pyopcode:40)opcode_impl_for_div__star_2
 containing the following operations:
       v830 = getattr(w_result_0, ('set_rbflags'))
       v831 = simple_call(v830, rb_results_0)
 --end--

I assume this happens because w_result can be a "subset" of None. What is
the proper way to check if it's None?

Frank

On Wed, Jan 11, 2017 at 3:00 PM, William ML Leslie <
william.leslie.ttg at gmail.com> wrote:

> On 12 January 2017 at 09:08, Frank Wang <frankw at mit.edu> wrote:
> > def binaryoperation(operationname):
> >     """NOT_RPYTHON"""
> >     def opimpl(self, *ignored):
> >         operation = getattr(self.space, operationname)
> >         w_2 = self.popvalue()
> >         w_1 = self.popvalue()
> >         w_result = operation(w_1, w_2)
> >
> >         # union flags in w_1 and w_2 and propagate to result
> >         w_1_rbflags = w_1.get_rbflags()
> >         w_2_rbflags = w_2.get_rbflags()
> >         w_1_rbflags.update(w_2_rbflags)
> >         w_result.set_rbflags(w_1_rbflags)
> >
> >         self.pushvalue(w_result)
>
> It looks like, if an app-level exception is in progress, w_result may
> be None.  Try checking for that before setting the flags.
>
> Also:  did you mean to alter w_1's rbflags?  Seems strange that you'd
> alter w_1 but not w_2.
>
> --
> William Leslie
>
> Notice:
> Likely much of this email is, by the nature of copyright, covered
> under copyright law.  You absolutely MAY reproduce any part of it in
> accordance with the copyright law of the nation you are reading this
> in.  Any attempt to DENY YOU THOSE RIGHTS would be illegal without
> prior contractual agreement.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pypy-dev/attachments/20170111/8ea9731c/attachment-0001.html>


More information about the pypy-dev mailing list