Changeset 14297


Ignore:
Timestamp:
Sep 22, 2010, 3:13:43 AM (9 years ago)
Author:
gb
Message:

Some small changes to ACODE-FORM-TYPE: try to intersect, don't return
the NIL type as often, more careful with FLOAT subtypes. Still needs
lots of work, but this is a start.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/nx0.lisp

    r14258 r14297  
    440440                 (let* ((op (acode-operator form)))
    441441                   (if (eq op (%nx1-operator fixnum))
    442                      'fixnum
     442                     (let* ((val (cadr form)))
     443                       `(integer ,val ,val))
    443444                     (if (eq op (%nx1-operator immediate))
    444445                       (type-of (%cadr form))
     
    449450                                (%cadr form))
    450451                              (if (eq op (%nx1-operator typed-form))
    451                                 (progn
    452                                   (when (and assert (null (nth 3 form)))
     452                                (destructuring-bind (type subform &optional check) (%cdr form)                                 
     453                                  (when (and assert (null check))
    453454                                    (setf (%car form) (%nx1-operator type-asserted-form)
     455                                          (%cadr form)
     456                                          (type-specifier
     457                                           (specifier-type `(and ,type ,(acode-form-type subform trust-decls assert))))
    454458                                          assert nil))
    455                                   (if (eq (%cadr form) 'number)
    456                                     (or (acode-form-type (nx-untyped-form form) trust-decls)
    457                                         'number)
    458                                     (%cadr form)))
     459                                  (%cadr form))
    459460                                (if (eq op (%nx1-operator lexical-reference))
    460461                                  (locally (declare (special *nx-in-frontend*))
     
    481482                                                                      (caddr form)
    482483                                                                      trust-decls)
    483                                         (if (and (acode-form-typep f1 'float trust-decls)
    484                                                  (acode-form-typep f2 'float trust-decls))
     484                                        (if (and (acode-form-typep f1 'real trust-decls)
     485                                                 (acode-form-typep f2 'real trust-decls))
    485486
    486487                                          (if (or (acode-form-typep f1 'double-float trust-decls)
    487488                                                  (acode-form-typep f2 'double-float trust-decls))
    488489                                            'double-float
    489                                             'single-float)))
     490                                            (if (or (acode-form-typep f1 'single-float trust-decls)
     491                                                    (acode-form-typep f2 'single-float trust-decls))
     492                                              'single-float
     493                                              'float))))
    490494                                      (cdr (assq op *nx-operator-result-types*)))))))))))))))))
     495    (if (or (null typespec) (eq typespec '*)) (setq typespec t))
    491496    (when (and (acode-p form) (typep (acode-operator form) 'fixnum) assert)
    492       (unless typespec (setq typespec t))
    493497      (let* ((new (cons typespec (cons (cons (%car form) (%cdr form)) nil))))
    494498        (setf (%car form) (%nx1-operator type-asserted-form)
Note: See TracChangeset for help on using the changeset viewer.