Previous: , Up: Compiler   [Contents][Index]


4.5.3 Run-Time Compiler Back-End

The run-time compiler back-end is also provided by the (rpc compiler) module. It reads XDR/RPC definitions and returns data structures readily usable to deal with the XDR data types or RPC programs described, at run-time. Actually, as of version 0.4, it does not have an API to deal with RPC programs, only with XDR data types.

Scheme Procedure: rpc-language->xdr-types input

Read XDR type definitions from input and return an alist; element of the returned alist is a pair whose car is a string naming an XDR data type and whose cdr is an XDR data type object (see XDR Type Representations). input can be either an input port, a string, or an AST as returned by rpc-language->sexp (see Parser).

This procedure can raise error conditions having a sub-type of &compiler-error.

Here is an example of two procedures that, given XDR type definitions, decode (respectively encode) an object of that type:

(use-modules (rpc compiler)
             (rpc xdr)
             (rnrs bytevectors)
             (rnrs io ports))

(define (decode-data type-defs type-name port)
  ;; Read binary data from PORT as an object of type
  ;; TYPE-NAME whose definition is given in TYPE-DEFS.
  (let* ((types (rpc-language->xdr-types type-defs))
         (type  (cdr (assoc type-name types))))
    (xdr-decode type port)))

(define (encode-data type-defs type-name object)
  ;; Encode OBJECT as XDR data type named TYPE-NAME from
  ;; the XDR type definitions in TYPE-DEFS.
  (let* ((types (rpc-language->xdr-types type-defs))
         (type  (cdr (assoc type-name types)))
         (size  (xdr-type-size type object))
         (bv    (make-bytevector size)))
    (xdr-encode! bv 0 type object)
    (open-bytevector-input-port bv)))

These procedures can then be used as follows:

(let ((type-defs (string-append "typedef hyper chbouib<>;"
                                "struct foo { "
                                "  int x; float y; chbouib z;"
                                "};"))
      (type-name "foo")
      (object    '(1 2.0 #(3 4 5))))
  (equal? (decode-data type-defs type-name
                       (encode-data type-defs type-name
                                    object))
          object))

=>

#t

Note that in this example type-defs contains two type definitions, which is why the type-name argument is absolutely needed.


Previous: , Up: Compiler   [Contents][Index]