diff --git a/private/class-system.rkt b/private/class-system.rkt index b5c33d9..43c047f 100644 --- a/private/class-system.rkt +++ b/private/class-system.rkt @@ -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 @@ -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 ...) @@ -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)) @@ -480,7 +478,7 @@ (object-info 'name map-fields - (vector-immutable 'interface-token ...) + (vector-immutable interface-token ...) (vector-immutable (method-info '__class__ diff --git a/private/interface.rkt b/private/interface.rkt index 4682e5c..228ac4d 100644 --- a/private/interface.rkt +++ b/private/interface.rkt @@ -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 @@ -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 @@ -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)) @@ -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)