58 lines
1.6 KiB
Common Lisp
58 lines
1.6 KiB
Common Lisp
(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))
|