From 5d0f4b47673c627630f7f2a75f8b5c7cd2268c11 Mon Sep 17 00:00:00 2001 From: John Lorentzson Date: Fri, 16 May 2025 15:09:11 +0200 Subject: [PATCH] Move definition of REFERENCE classes to its own file Dereferencing is still defined in high-level.lisp, this might change in the future since I'm sort of restructuring a little bit. --- wip-duuqnd/user-side-compiler/high-level.lisp | 24 +----------------- wip-duuqnd/user-side-compiler/reference.lisp | 25 +++++++++++++++++++ .../user-side-compiler/user-side-compiler.asd | 1 + 3 files changed, 27 insertions(+), 23 deletions(-) create mode 100644 wip-duuqnd/user-side-compiler/reference.lisp diff --git a/wip-duuqnd/user-side-compiler/high-level.lisp b/wip-duuqnd/user-side-compiler/high-level.lisp index 3aa9616..ad85311 100644 --- a/wip-duuqnd/user-side-compiler/high-level.lisp +++ b/wip-duuqnd/user-side-compiler/high-level.lisp @@ -22,33 +22,11 @@ (defmacro format-inst (destination control-string &rest format-arguments) `(format ,destination "~C~A~%" #\Tab (format nil ,control-string ,@format-arguments))) -(defclass reference () ()) - -(defgeneric ref-constantp (reference) (:method (reference) nil)) - -(defclass reference-constant (reference) - ((%value :accessor ref-value :initarg :value))) - -(defmethod ref-constantp ((reference reference-constant)) - t) - -(defmethod print-object ((object reference-constant) stream) - (print-unreadable-object (object stream :type t) - (format stream "~D" (ref-value object)))) - -(defmethod ref= ((a reference-constant) (b reference-constant)) - (= (value a) (value b))) +;;; Dereferencing (defmethod dereference ((ref reference-constant)) (produce-instruction 'inst-lda-immediate (ref-value ref))) -(defclass reference-variable (reference) - ((%index :accessor ref-index :initarg :index))) - -(defmethod print-object ((object reference-variable) stream) - (print-unreadable-object (object stream :type t) - (format stream "@~D" (ref-index object)))) - (defmethod dereference ((ref reference-variable)) (produce-instruction 'inst-lda-absolute (make-offset-label *varvec* (ref-index ref)))) diff --git a/wip-duuqnd/user-side-compiler/reference.lisp b/wip-duuqnd/user-side-compiler/reference.lisp new file mode 100644 index 0000000..302eb10 --- /dev/null +++ b/wip-duuqnd/user-side-compiler/reference.lisp @@ -0,0 +1,25 @@ +(in-package #:user-side-compiler) + +(defclass reference () ()) + +(defgeneric ref-constantp (reference) (:method (reference) nil)) + +(defclass reference-constant (reference) + ((%value :accessor ref-value :initarg :value))) + +(defmethod ref-constantp ((reference reference-constant)) + t) + +(defmethod print-object ((object reference-constant) stream) + (print-unreadable-object (object stream :type t) + (format stream "~D" (ref-value object)))) + +(defmethod ref= ((a reference-constant) (b reference-constant)) + (= (value a) (value b))) + +(defclass reference-variable (reference) + ((%index :accessor ref-index :initarg :index))) + +(defmethod print-object ((object reference-variable) stream) + (print-unreadable-object (object stream :type t) + (format stream "@~D" (ref-index object)))) diff --git a/wip-duuqnd/user-side-compiler/user-side-compiler.asd b/wip-duuqnd/user-side-compiler/user-side-compiler.asd index 3fa1525..8f4bb76 100644 --- a/wip-duuqnd/user-side-compiler/user-side-compiler.asd +++ b/wip-duuqnd/user-side-compiler/user-side-compiler.asd @@ -4,6 +4,7 @@ :serial t :components ((:file "package") + (:file "reference") (:file "transform") (:file "tokenizer") (:file "label")