+(defun ez-get-prop-default (prop)
+ (ez-mem-ref-word (+ ez-objtab-addr (* 2 (+ 1 prop)))))
+
+(defun ez-get-prop-len (prop-size-byte)
+ (lsh prop-size-byte -5))
+
+(defun ez-get-prop-num (prop-size-byte)
+ (logand #b00011111 prop-size-byte))
+
+(defun ez-get-obj-prop-addr (obj prop)
+ (let* ((plist-addr (ez-get-obj-plist-addr obj))
+ (prop-addr (+ plist-addr 1 (* 2 (ez-mem-ref-byte plist-addr))))
+ (size-byte (ez-mem-ref-byte prop-addr)))
+ (while (not (or (= size-byte 0)
+ (= prop (ez-get-prop-num size-byte))))
+ (setq prop-addr (+ prop-addr (ez-get-prop-len size-byte) 2)
+ size-byte (ez-mem-ref-byte prop-addr)))
+ prop-addr))
+
+(defun ez-get-obj-prop (obj prop)
+ (let* ((prop-addr (ez-get-obj-prop-addr obj prop))
+ (size-byte (ez-mem-ref-byte prop-addr)))
+ (if (= prop-addr 0)
+ (ez-get-prop-default prop)
+ (let ((prop-len (ez-get-prop-len size-byte))
+ (data-addr (+ prop-addr 1)))
+ (cond
+ ((= prop-len 0)
+ (ez-mem-ref-byte data-addr))
+ ((>= prop-len 1)
+ (ez-mem-ref-word data-addr)))))))
+
+(defun ez-set-obj-prop (obj prop value)
+ (let* ((prop-addr (ez-get-obj-prop-addr obj prop))
+ (size-byte (ez-mem-ref-byte prop-addr)))
+ (cond
+ ((= size-byte 0)
+ (error "Tried to set non-existant property"))
+ ((= (ez-get-prop-len size-byte) 1)
+ (ez-mem-set-byte (+ prop-addr 1) value))
+ (t
+ (ez-mem-set-word (+ prop-addr 1) value)))))