X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=specs%2Fstdapi.py;h=51ee67482eac51eb1a45635e639c40462219235a;hb=f182eda5cee47f8f6220bc57756484df9e958727;hp=7aa60a111f6331c33f3fad03a0ab672355cb2f6d;hpb=b89c59301b6bedebe35e35e9bda913683ad265b3;p=apitrace diff --git a/specs/stdapi.py b/specs/stdapi.py index 7aa60a1..51ee674 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -134,8 +134,19 @@ class IntPointer(Type): return visitor.visitIntPointer(self, *args, **kwargs) +class ObjPointer(Type): + '''Pointer to an object.''' + + def __init__(self, type): + Type.__init__(self, type.expr + " *", 'P' + type.tag) + self.type = type + + def visit(self, visitor, *args, **kwargs): + return visitor.visitObjPointer(self, *args, **kwargs) + + class LinearPointer(Type): - '''Integer encoded as a pointer.''' + '''Pointer to a linear range of memory.''' def __init__(self, type, size = None): Type.__init__(self, type.expr + " *", 'P' + type.tag) @@ -483,6 +494,9 @@ class Visitor: def visitIntPointer(self, pointer, *args, **kwargs): raise NotImplementedError + def visitObjPointer(self, pointer, *args, **kwargs): + raise NotImplementedError + def visitLinearPointer(self, pointer, *args, **kwargs): raise NotImplementedError @@ -535,7 +549,11 @@ class Rebuilder(Visitor): return string def visitConst(self, const): - return Const(const.type) + const_type = self.visit(const.type) + if const_type is const.type: + return const + else: + return Const(const_type) def visitStruct(self, struct): members = [(self.visit(type), name) for type, name in struct.members] @@ -557,27 +575,49 @@ class Rebuilder(Visitor): return Bitmask(type, bitmask.values) def visitPointer(self, pointer): - type = self.visit(pointer.type) - return Pointer(type) + pointer_type = self.visit(pointer.type) + if pointer_type is pointer.type: + return pointer + else: + return Pointer(pointer_type) def visitIntPointer(self, pointer): return pointer + def visitObjPointer(self, pointer): + pointer_type = self.visit(pointer.type) + if pointer_type is pointer.type: + return pointer + else: + return ObjPointer(pointer_type) + def visitLinearPointer(self, pointer): - type = self.visit(pointer.type) - return LinearPointer(type, pointer.size) + pointer_type = self.visit(pointer.type) + if pointer_type is pointer.type: + return pointer + else: + return LinearPointer(pointer_type) def visitReference(self, reference): - type = self.visit(reference.type) - return Reference(type) + reference_type = self.visit(reference.type) + if reference_type is reference.type: + return reference + else: + return Reference(reference_type) def visitHandle(self, handle): - type = self.visit(handle.type) - return Handle(handle.name, type, range=handle.range, key=handle.key) + handle_type = self.visit(handle.type) + if handle_type is handle.type: + return handle + else: + return Handle(handle.name, handle_type, range=handle.range, key=handle.key) def visitAlias(self, alias): - type = self.visit(alias.type) - return Alias(alias.expr, type) + alias_type = self.visit(alias.type) + if alias_type is alias.type: + return alias + else: + return Alias(alias.expr, alias_type) def visitOpaque(self, opaque): return opaque @@ -640,6 +680,9 @@ class Collector(Visitor): def visitIntPointer(self, pointer): pass + def visitObjPointer(self, pointer): + self.visit(pointer.type) + def visitLinearPointer(self, pointer): self.visit(pointer.type)