from starkware.cairo.common.alloc import alloc from starkware.cairo.common.invoke import invoke from starkware.cairo.common.registers import get_ap, get_label_location struct Class: member _ : felt* member name : felt member super : Class* member size : felt member ctor : codeoffset # constructor member differ : codeoffset member puto : codeoffset end struct Object: member class : Class* end const CLASS_NAME = 427020088179 # str_to_felt('Class') const OBJECT_NAME = 122468482507636 # str_to_felt('Object') namespace _Class: func compare(self : Class, b : Class) -> (f : felt): if self.name == b.name: return (0) else: return (1) end end func display(): %{ print('Class:') %} return () end func class__() -> (class_ : Class*): alloc_locals let (class_ : Class*) = alloc() let (obj_instance) = _Object.class__() assert class_[0] = Class( _=cast(class_, felt*), name=CLASS_NAME, super=obj_instance, size=Class.SIZE, ctor=make_class, differ=compare, puto=display, ) return (class_=class_) end func make_class(): let (class_) = class__() let obj = Object(class=class_) return () end end namespace _Object: func make_object(class_ : Class*) -> (obj : Object): let obj = Object(class=class_) return (obj) end func compare(self : Object, b : Object) -> (f : felt): if self.class.name == b.class.name: return(0) else: return (1) end end func display(): %{ print('Object:') %} return () end func class__() -> (class : Class*): let (class_ : Class*) = alloc() assert class_[0] = Class( _=class_, name=OBJECT_NAME, super=class_, size=Object.SIZE, ctor=make_object, differ=compare, puto=display, ) return (class=class_) end end func main(): let (cls) = _Class.class__() let c : Class = cls[0] let d : Class* = cast(c._, Class*) let e : Class* = cast(d._, Class*) let f : Class* = cast(e._, Class*) let g : Object* = cast(f[0].super, Object*) return () end