guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] primitive resolution for public refs


From: BT Templeton
Subject: Re: [PATCH] primitive resolution for public refs
Date: Mon, 12 Mar 2012 14:03:06 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.94 (gnu/linux)

Noah Lavine <address@hidden> writes:

> Hello,
>
> Are you sure this is correct? What if someone calls the module-set!
> function on that module between the definition and use of whatever
> function you're compiling?
>
> I agree very strongly that we need to be able to do this sort of
> optimization, but I think we might need some sort of caching mechanism
> to do it right, where the cache of compiled function bodies is
> invalidated by module-set!.

I don't think I've changed the correctness wrt `module-set!' and the
like -- the current, private-refs-only optimization already exhibits the
problem you describe:

| scheme@(guile-user)> (define old-car car)
| scheme@(guile-user)> (module-set! (current-module)
|                                   'car
|                                   (lambda (x) (format #t "car ~A~%" x) 
(old-car x)))
| scheme@(guile-user)> ,x (lambda (x) ((@@ (guile) car) x))
| [...]
| Disassembly of #<procedure 1d23ae0 at <current input>:4:0 (x)>:
|   
|   0    (assert-nargs-ee/locals 1)      ;; 1 arg, 0 locals
|   2    (local-ref 0)                   ;; `x'
|   4    (car)
|   5    (return)

I'm not certain it's otherwise correct; I just added a workaround for
the specific issue mentioned in the comment.

> On Mon, Mar 12, 2012 at 12:42 PM, BT Templeton <address@hidden> wrote:
>> * module/language/tree-il/primitives.scm (resolve-primitives!): Resolve
>>  public module-refs to primitives.
>> ---
>>  module/language/tree-il/primitives.scm |   16 +++++++++-------
>>  1 files changed, 9 insertions(+), 7 deletions(-)
>>
>> diff --git a/module/language/tree-il/primitives.scm 
>> b/module/language/tree-il/primitives.scm
>> index 3c6769d..1dcab20 100644
>> --- a/module/language/tree-il/primitives.scm
>> +++ b/module/language/tree-il/primitives.scm
>> @@ -265,13 +265,15 @@
>>                                (module-variable mod name)))
>>                (lambda (name) (make-primitive-ref src name))))
>>        ((<module-ref> src mod name public?)
>> -        ;; for the moment, we're disabling primitive resolution for
>> -        ;; public refs because resolve-interface can raise errors.
>> -        (let ((m (and (not public?) (resolve-module mod))))
>> -          (and m
>> -               (and=> (hashq-ref *interesting-primitive-vars*
>> -                                 (module-variable m name))
>> -                      (lambda (name) (make-primitive-ref src name))))))
>> +        (and=> (and=> (resolve-module mod)
>> +                      (if public?
>> +                          module-public-interface
>> +                          identity))
>> +               (lambda (m)
>> +                 (and=> (hashq-ref *interesting-primitive-vars*
>> +                                   (module-variable m name))
>> +                        (lambda (name)
>> +                          (make-primitive-ref src name))))))
>>        ((<call> src proc args)
>>         (and (primitive-ref? proc)
>>              (make-primcall src (primitive-ref-name proc) args)))
>> --
>> 1.7.9.1

-- 
Inteligenta persono lernas la lingvon Esperanton rapide kaj facile.
Esperanto estas moderna, kultura lingvo por la mondo. Simpla, fleksebla,
belsona, Esperanto estas la praktika solvo de la problemo de universala
interkompreno. Lernu la interlingvon Esperanton!




reply via email to

[Prev in Thread] Current Thread [Next in Thread]