Skip to content

Instantly share code, notes, and snippets.

@rlkelly
Created August 30, 2022 05:27
Show Gist options
  • Save rlkelly/b317e1b73a6de2f041347f8f2803413a to your computer and use it in GitHub Desktop.
Save rlkelly/b317e1b73a6de2f041347f8f2803413a to your computer and use it in GitHub Desktop.
The Hierarchy of an Object + Class
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment