- ;; g_cells[10].type
- ((d-sel (ident ,field) (array-ref (p-expr (fixed ,index)) (p-expr (ident ,array))))
- (let* ((type (ident->type info array))
- (fields (or (type->description info type) '()))
- (size (type->size info type))
- (count (length fields))
- (field-size 4) ;; FIXME:4, not fixed
- (offset (* field-size (1- (length (member field (reverse fields) (lambda (a b) (equal? a (cdr b))))))))
- (index (cstring->number index))
- (text (.text info)))
- (append-text info (append
- (wrap-as (append (i386:value->base index)
- (i386:base->accu)
- (if (<= count 1) '() (i386:accu+accu))
- (if (<= count 2) '() (i386:accu+base))
- (i386:accu-shl 2)))
- ((ident->base info) array)
- (wrap-as (i386:base-mem+n->accu offset))))))
-
- ;; g_cells[x].type
- ((d-sel (ident ,field) (array-ref (p-expr (ident ,index)) (p-expr (ident ,array))))
- (let* ((type (ident->type info array))
- (fields (or (type->description info type) '()))
- (size (type->size info type))
- (count (length fields))
- (field-size 4) ;; FIXME:4, not fixed
- (offset (* field-size (1- (length (member field (reverse fields) (lambda (a b) (equal? a (cdr b))))))))
- (text (.text info)))
- (append-text info (append ((ident->base info) index)
- (wrap-as (append (i386:base->accu)
- (if (<= count 1) '() (i386:accu+accu))
- (if (<= count 2) '() (i386:accu+base))
- (i386:accu-shl 2)))
- ((ident->base info) array)
- (wrap-as (i386:base-mem+n->accu offset))))))
-
- ;; g_functions[g_cells[fn].cdr].arity
- ;; INDEX0: g_cells[fn].cdr
-
- ;;; index: (d-sel (ident ,cdr) (array-ref (p-expr (ident ,fn)) (p-expr (ident ,g_cells))))
- ;;((d-sel (ident ,arity) (array-ref (d-sel (ident ,cdr) (array-ref (p-expr (ident ,fn)) (p-expr (ident ,g_cells)))) (p-expr (ident ,g_functions)))))