def box_set(typ, val, c): """ Convert native set *val* to a set object. """ inst = setobj.SetInstance(c.context, c.builder, typ, val) obj = inst.parent res = cgutils.alloca_once_value(c.builder, obj) with c.builder.if_else(cgutils.is_not_null(c.builder, obj)) as (has_parent, otherwise): with has_parent: # Set is actually reflected => return the original object # (note not all set instances whose *type* is reflected are # actually reflected; see numba.tests.test_sets for an example) c.pyapi.incref(obj) with otherwise: # Build a new Python list and then create a set from that payload = inst.payload ok, listobj = _native_set_to_python_list(typ, payload, c) with c.builder.if_then(ok, likely=True): obj = c.pyapi.set_new(listobj) c.pyapi.decref(listobj) c.builder.store(obj, res) # Steal NRT ref c.context.nrt.decref(c.builder, typ, val) return c.builder.load(res)
def reflect_set(typ, val, c): """ Reflect the native set's contents into the Python object. """ if not typ.reflected: return inst = setobj.SetInstance(c.context, c.builder, typ, val) payload = inst.payload with c.builder.if_then(payload.dirty, likely=False): obj = inst.parent # XXX errors are not dealt with below c.pyapi.set_clear(obj) # Build a new Python list and then update the set with that ok, listobj = _native_set_to_python_list(typ, payload, c) with c.builder.if_then(ok, likely=True): c.pyapi.set_update(obj, listobj) c.pyapi.decref(listobj) # Mark the set clean, in case it is reflected twice inst.set_dirty(False)