(in-package #:user-side-compiler) (defclass ir-data () ((%definition :accessor definition :initarg :definition) (%last-use :accessor last-use))) (defclass ir-result (ir-data) ((%user :accessor user :initarg :user :initform nil))) (defmethod users ((data ir-result)) (if (user data) (list (user data)) nil)) (defmethod add-user ((data ir-result) user) (assert (null (user data))) (setf (user data) user)) (defmethod remove-user ((data ir-result) user) (assert (eql user (user data))) (setf (user data) nil)) (defclass ir-reusable (ir-data) ((%users :accessor users :initarg :users :initform '()))) (defmethod add-user ((data ir-reusable) user) (pushnew user (users data))) (defmethod remove-user ((data ir-reusable) user) (setf (users data) (remove user (users data)))) (defclass ir-variable (ir-reusable) ((%name :accessor name :initarg :name) (%writers :accessor writers :initform '()))) (tlk:define-simple-print-object (ir-variable %name)) (defclass ir-constant (ir-reusable) ((%definition :accessor definition :initarg :definition) (%value :accessor value :initarg :value))) (defmethod add-user ((data number) user)) (defmethod remove-user ((data number) user)) (tlk:define-simple-print-object (ir-constant %value)) (defmethod ir-constant-p ((obj ir-data)) (typep (definition obj) 'ir-getconst)) (defmethod ir-constant-p ((obj ir-constant)) t) (defmethod ir-constant-value ((obj ir-result)) (assert (ir-constant-p obj)) (first (inputs (definition obj)))) (defmethod ir-constant-value ((obj ir-constant)) (value obj))