+(define (data-tor env e)
+ (and (list? e)
+ (assoc (car e) (flat-map data-tors (env-data-layouts env)))))
+
+(define (codegen-data-tor e si env)
+
+ (define (codegen-destructor tor)
+ (when (not (eqv? 'stack (ast-type (cadr e))))
+ (error #f "expected stack value"))
+ (let* ([stack-expr (cadr e)]
+ [stack-body (caddr stack-expr)]
+ [stack-type (cadr stack-expr)])
+
+ (codegen-expr stack-body si env)
+ (let ([index (cadr tor)]
+ [products 2]
+ [to-traverse (list-head products index)]
+ [offset (fold-left
+ (lambda (acc t) (+ acc (type-size t)))
+ wordsize ; skip tag in first word
+ to-traverse)])
+ 3
+ )))
+
+ (let* ([tor (data-tor env e)]
+ [constructor (eqv? 'constructor (cadr tor))])
+ (if constructor
+ (codegen-constructor tor)
+ (codegen-destructor tor))))
+