;;;----- Licensing notice ---------------------------------------------------
;;;
-;;; This file is part of the Sensble Object Design, an object system for C.
+;;; This file is part of the Sensible Object Design, an object system for C.
;;;
;;; SOD is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
(:documentation
"Base class for temporary variable and argument names."))
-;; Important variables.
-
-(defparameter *temporary-index* 0
- "Index for temporary name generation.
-
- This is automatically reset to zero before the output functions are
- invoked to write a file. This way, we can ensure that the same output
- file is always produced from the same input.")
-
-(define-clear-the-decks reset-codegen-index
- (setf *temporary-index* 0))
-
;; Important temporary names.
(export '(*sod-ap* *sod-master-ap*))
(make-instance 'temporary-name :tag "sod__master_ap"))
(defparameter *sod-tmp-ap*
(make-instance 'temporary-name :tag "sod__tmp_ap"))
+(defparameter *sod-tmp-val*
+ (make-instance 'temporary-name :tag "sod__t"))
;;;--------------------------------------------------------------------------
;;; Instructions.
(print-unreadable-object (,inst-var ,streamvar :type t)
(format stream "~@<~@{~S ~@_~S~^ ~_~}~:>"
,@(mappend #'list keys args)))
- (progn ,@body))))
+ (block ,code ,@body))))
,@(and export `((export '(,class-name ,constructor-name
,@(mapcar (lambda (arg)
(symbolicate 'inst- arg))
During BODY, VAR will be marked in-use; when BODY ends, VAR will be marked
available for re-use."
- `(let ((,var (temporary-var ,codegen ,type)))
- (unwind-protect
- (progn ,@body)
- (setf (var-in-use-p ,var) nil))))
+ (multiple-value-bind (doc decls body) (parse-body body :docp nil)
+ (declare (ignore doc))
+ `(let ((,var (temporary-var ,codegen ,type)))
+ ,@decls
+ (unwind-protect
+ (progn ,@body)
+ (setf (var-in-use-p ,var) nil)))))
;;;--------------------------------------------------------------------------
;;; Code generation idioms.
(emit-inst codegen (make-return-inst nil)))
(t (funcall func target))))
+(export 'deliver-call)
+(defun deliver-call (codegen target func &rest args)
+ "Emit a statement to call FUNC with ARGS and deliver the result to TARGET."
+ (deliver-expr codegen target (make-call-inst func args)))
+
;;;----- That's all, folks --------------------------------------------------