Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 19 additions & 21 deletions private/class-system.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -135,24 +135,8 @@
(define super-infos
(for/list ([super-name (in-syntax #'(super-name ...))])
(lookup-interface super-name)))
(define interface-token (gensym))
(define interface-token-id (car (generate-temporaries (list #'name))))
(define interface-runtime-name (datum->syntax stx (gensym)))
(define interface-static-info
(interface-info
#'name
interface-token
interface-runtime-name
super-infos
(for/list ([name (in-syntax #'(method-name ...))]
[m-cvs (in-syntax #'((method-cv ...) ...))]
[params (in-syntax #'((method-param-contract ...) ...))])
(with-syntax
([(param ...) params])
(imethod-info
name
(syntax-length m-cvs)
(syntax-length params))))))
(check-interface-consistency interface-static-info)
(define name-length (string-length (symbol->string (syntax-e #'name))))
; Code generation
(define base-interface-table
Expand Down Expand Up @@ -191,10 +175,24 @@
#,(interface-contract-name #'name))
(define (#,interface-runtime-name cv ...)
#,extended-interface-table)
(define-syntax name #,(reflect-interface interface-static-info))
(define #,interface-token-id (box 'an-interface-token))
(define-syntax name
(interface-info
#'name
#'#,interface-token-id
#'#,interface-runtime-name
(list (lookup-interface #'super-name) ...)
(list
#,@(for/list ([method-name (in-syntax #'(method-name ...))]
[params (in-syntax #'((method-param-contract ...) ...))]
[m-cvs (in-syntax #'((method-cv ...) ...))])
#`(imethod-info #'#,method-name
#,(syntax-length m-cvs)
#,(syntax-length params))))))
(begin-for-syntax (check-interface-consistency #'name))
(define (first-order? obj)
(and (object-base? obj)
(vector-memq '#,interface-token
(vector-memq #,interface-token-id
(object-info-interfaces
(object-base-info obj)))))
(define (make-projection cv ...)
Expand All @@ -204,7 +202,7 @@
'name
interface-table
contract-parameters
'#,interface-token
#,interface-token-id
first-order?))
(define (#,(struct-predicate-name #'name) obj)
(and (first-order? obj) #t))
Expand Down Expand Up @@ -480,7 +478,7 @@
(object-info
'name
map-fields
(vector-immutable 'interface-token ...)
(vector-immutable interface-token ...)
(vector-immutable
(method-info
'__class__
Expand Down
17 changes: 3 additions & 14 deletions private/interface.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

(provide (struct-out imethod-info)
(struct-out interface-info)
reflect-interface
compare-imethod-info
interface-info-all-tokens
interface-info-all-tokens/list
Expand All @@ -17,7 +16,7 @@
#:transparent)
(struct interface-info
[name ; syntax? - the name of the interface
token ; symbol? - the runtime identity of the interface
token ; identifier? - bound to the runtime identity of the interface (and super interfaces)
runtime ; syntax? - the name of the runtime method table
supers ; (ListOf interface-info?) - list of super interfaces
methods] ; (ListOf imethod-info?) - list of methods
Expand All @@ -28,17 +27,6 @@
#,(imethod-info-cvs info)
#,(imethod-info-arity info)))

(define (reflect-interface info)
#`(interface-info #'#,(interface-info-name info)
'#,(interface-info-token info)
#'#,(interface-info-runtime info)
(list
#,@(map reflect-interface
(interface-info-supers info)))
(list
#,@(map reflect-imethod
(interface-info-methods info)))))

(define (compare-imethod-info i-name expected actual)
(define expected-cvs (imethod-info-cvs expected))
(define actual-cvs (imethod-info-cvs actual))
Expand Down Expand Up @@ -66,7 +54,8 @@
(define (interface-info-all-tokens/list infos)
(apply append (map interface-info-all-tokens infos)))

(define (check-interface-consistency info0)
(define (check-interface-consistency info0-id)
(define info0 (syntax-local-value info0-id))
(define method-infos (make-hasheq))
(define (loop info)
(define (add-method m-info)
Expand Down