Opened 3 months ago

#1476 new task

(scrutinizer) Should global types be smashed in local contexts?

Reported by: megane Owned by:
Priority: minor Milestone: 5.1
Component: scrutinizer Version: 5.0
Keywords: smashing Cc:
Estimated difficulty:

Description

Currently types for globals are not smashed. Should they be smashed in, say functions?

Similar to #1475.

(define-type type (vector (or fixnum symbol)))
(: g type)
(define g (vector (the * 1)))

;; define pure alias, so printing doesn't smash
(: p (* --> undefined))
(define p print)

(define (foo)
  (compiler-typecase g (type (p "global ok")))
  (vector-set! g 0 'foo)
  (compiler-typecase g (type (p "global not smashed")))

  (let ([l g])
    (compiler-typecase l (type (p "alias ok")))
    (compiler-typecase l (type (p "alias ok after printing")))
    (vector-set! g 0 'foo)
    (compiler-typecase g (type (p "global not smashed")))
    (compiler-typecase l
      (type 'oop)
      ((vector *) (p "alias smashed"))))

  (compiler-typecase g
    (type (p "global not smashed"))
    ((vector *) (p "global smashed"))))
(foo)

;; $ csc -O3 global-smashing.scm && ./global-smashing 
;; global ok
;; global not smashed
;; alias ok
;; alias ok after printing
;; global not smashed
;; alias smashed
;; global not smashed

Change History (0)

Note: See TracTickets for help on using tickets.