def impersonator_args(struct, overrides, handlers, prop_keys, prop_vals): from pycket.prims.struct_structinfo import struct_info assert len(overrides) == len(handlers) _handlers = None struct_props = None struct_prop_keys = None struct_prop_vals = None handler_map = W_InterposeStructBase.EMPTY_HANDLER_MAP struct_type = jit.promote(struct.struct_type()) for i, op in enumerate(overrides): base = get_base_object(op) if isinstance(base, values_struct.W_StructFieldAccessor): if handlers[i] is not values.w_false: field = base.get_absolute_index(struct_type) idx = tag_handler_accessor(field) _handlers, handler_map = add_handler_field( handler_map, _handlers, idx, handlers[i]) if type(op) is not values_struct.W_StructFieldAccessor: field = base.get_absolute_index(struct_type) idx = tag_override_accessor(field) _handlers, handler_map = add_handler_field( handler_map, _handlers, idx, op) elif isinstance(base, values_struct.W_StructFieldMutator): if handlers[i] is not values.w_false: field = base.get_absolute_index(struct_type) idx = tag_handler_mutator(field) _handlers, handler_map = add_handler_field( handler_map, _handlers, idx, handlers[i]) if type(op) is not values_struct.W_StructFieldAccessor: field = base.get_absolute_index(struct_type) idx = tag_override_mutator(field) _handlers, handler_map = add_handler_field( handler_map, _handlers, idx, op) elif base is struct_info and handlers[i] is not values.w_false: idx = INFO_HANDLER_IDX _handlers, handler_map = add_handler_field(handler_map, _handlers, idx, handlers[i]) elif isinstance(base, values_struct.W_StructPropertyAccessor): if struct_prop_keys is None: struct_prop_keys = [] struct_prop_vals = [] struct_prop_keys.append(base) struct_prop_vals.append(Pair(op, handlers[i])) else: assert False EMPTY = W_InterposeStructBase.EMPTY_PROPERTY_MAP property_map = make_property_map(struct_prop_keys, make_property_map(prop_keys, EMPTY)) vals = concat(_handlers, concat(prop_vals, struct_prop_vals)) storage = vals[:] if vals is not None else None map = CompositeMap.instantiate(handler_map, property_map) return map, storage
def impersonator_args(struct, overrides, handlers, prop_keys, prop_vals): from pycket.prims.struct_structinfo import struct_info assert len(overrides) == len(handlers) _handlers = None struct_props = None struct_prop_keys = None struct_prop_vals = None handler_map = W_InterposeStructBase.EMPTY_HANDLER_MAP struct_type = jit.promote(struct.struct_type()) for i, op in enumerate(overrides): base = get_base_object(op) if isinstance(base, values_struct.W_StructFieldAccessor): if handlers[i] is not values.w_false: field = base.get_absolute_index(struct_type) idx = tag_handler_accessor(field) _handlers, handler_map = add_handler_field(handler_map, _handlers, idx, handlers[i]) if type(op) is not values_struct.W_StructFieldAccessor: field = base.get_absolute_index(struct_type) idx = tag_override_accessor(field) _handlers, handler_map = add_handler_field(handler_map, _handlers, idx, op) elif isinstance(base, values_struct.W_StructFieldMutator): if handlers[i] is not values.w_false: field = base.get_absolute_index(struct_type) idx = tag_handler_mutator(field) _handlers, handler_map = add_handler_field(handler_map, _handlers, idx, handlers[i]) if type(op) is not values_struct.W_StructFieldAccessor: field = base.get_absolute_index(struct_type) idx = tag_override_mutator(field) _handlers, handler_map = add_handler_field(handler_map, _handlers, idx, op) elif base is struct_info and handlers[i] is not values.w_false: idx = INFO_HANDLER_IDX _handlers, handler_map = add_handler_field(handler_map, _handlers, idx, handlers[i]) elif isinstance(base, values_struct.W_StructPropertyAccessor): if struct_prop_keys is None: struct_prop_keys = [] struct_prop_vals = [] struct_prop_keys.append(base) struct_prop_vals.append(Pair(op, handlers[i])) else: assert False EMPTY = W_InterposeStructBase.EMPTY_PROPERTY_MAP property_map = make_property_map(struct_prop_keys, make_property_map(prop_keys, EMPTY)) vals = concat(_handlers, concat(prop_vals, struct_prop_vals)) storage = vals[:] if vals is not None else None map = CompositeMap.instantiate(handler_map, property_map) return map, storage
def valid_struct_proc(x): v = get_base_object(x) return (isinstance(v, values_struct.W_StructFieldAccessor) or isinstance(v, values_struct.W_StructFieldMutator) or isinstance(v, values_struct.W_StructPropertyAccessor))
def get_arity(self): return get_base_object(self.base).get_arity()
def vals(self): base = get_base_object(self.base) assert isinstance(base, values_struct.W_RootStruct) return base.vals()
def struct_type(self): return get_base_object(self.base).struct_type()
def tostring(self): return get_base_object(self.base).tostring()
def immutable(self): return get_base_object(self.base).immutable()
def get_arity(self, promote=False): return get_base_object(self.base).get_arity(promote)
def valid_struct_proc(x): v = get_base_object(x) return (isinstance(v, values_struct.W_StructFieldAccessor) or isinstance(v, values_struct.W_StructFieldMutator) or isinstance(v, values_struct.W_StructPropertyAccessor))
def vals(self): base = get_base_object(self.base) assert isinstance(base, values_struct.W_RootStruct) return base.vals()
def get_arity(self, promote=False): return get_base_object(self.base).get_arity(promote)
def struct_type(self): return get_base_object(self.base).struct_type()
def tostring(self): return get_base_object(self.base).tostring()
def immutable(self): return get_base_object(self.base).immutable()