Optimize eof-object?
authorAndy Wingo <wingo@pobox.com>
Wed, 3 Feb 2021 21:52:54 +0000 (22:52 +0100)
committerAndy Wingo <wingo@pobox.com>
Wed, 3 Feb 2021 22:02:27 +0000 (23:02 +0100)
* module/language/cps/types.scm (constant-type): Add case for EOF.
* module/language/tree-il/primitives.scm (*interesting-primitive-names*):
  (*effect+exception-free-primitives*): Add case for eof-object?.
  (eof-object?): Expand to eq? on the-eof-object.

module/language/cps/types.scm
module/language/tree-il/primitives.scm

index db52956e7524d6a8fc09a7cbf1f5fed50bc7df2d..574c39bd27237918a49580f3a0887260799489d2 100644 (file)
@@ -1,5 +1,5 @@
 ;;; Type analysis on CPS
-;;; Copyright (C) 2014-2020 Free Software Foundation, Inc.
+;;; Copyright (C) 2014-2021 Free Software Foundation, Inc.
 ;;;
 ;;; This library is free software: you can redistribute it and/or modify
 ;;; it under the terms of the GNU Lesser General Public License as
@@ -368,6 +368,7 @@ minimum, and maximum."
    ((eq? val #t) (return &special-immediate &true))
    ((eq? val #f) (return &special-immediate &false))
    ((eqv? val *unspecified*) (return &special-immediate &unspecified))
+   ((eof-object? val) (return &special-immediate &eof))
    ((char? val) (return &char (char->integer val)))
    ((symbol? val) (return &symbol #f))
    ((keyword? val) (return &keyword #f))
index b257aa17ca6cff1763aa61997035459df06da681..1cc7907a8b68f15af125004fb7b108225b1aa028 100644 (file)
@@ -1,6 +1,6 @@
 ;;; open-coding primitive procedures
 
-;; Copyright (C) 2009-2015, 2017-2020 Free Software Foundation, Inc.
+;; Copyright (C) 2009-2015, 2017-2021 Free Software Foundation, Inc.
 
 ;;;; This library is free software; you can redistribute it and/or
 ;;;; modify it under the terms of the GNU Lesser General Public
@@ -52,6 +52,7 @@
     sqrt abs floor ceiling sin cos tan asin acos atan
     not
     pair? null? list? symbol? vector? string? struct? number? char? nil?
+    eof-object?
     bytevector? keyword? bitvector?
 
     symbol->string string->symbol
     eq? eqv? equal?
     not
     pair? null? nil? list?
-    symbol? variable? vector? struct? string? number? char?
+    symbol? variable? vector? struct? string? number? char? eof-object?
     exact-integer?
     bytevector? keyword? bitvector?
     procedure? thunk? atomic-box?
 (define-primitive-expander module-define! (mod sym val)
   (%variable-set! (module-ensure-local-variable! mod sym) val))
 
+(define-primitive-expander! 'eof-object?
+  (match-lambda*
+   ((src obj)
+    (make-primcall src 'eq? (list obj (make-const #f the-eof-object))))
+   (_ #f)))
+
 (define-primitive-expander zero? (x)
   (= x 0))