diff --git a/collects/tests/racket/optimize.rktl b/collects/tests/racket/optimize.rktl index 4bd46570cc..50e486183c 100644 --- a/collects/tests/racket/optimize.rktl +++ b/collects/tests/racket/optimize.rktl @@ -1616,6 +1616,21 @@ (unsafe-s16vector-set! x x x) (unsafe-u16vector-set! x x x)))) +(test-comp '(lambda (x) + (hash-ref '#hash((x . y)) x (lambda () 10))) + '(lambda (x) + (hash-ref '#hash((x . y)) x 10))) +(test-comp '(lambda (x) + (hash-ref x x (lambda () 10))) + '(lambda (x) + (hash-ref x x 10)) + #f) +(test-comp '(lambda (x) + (hash-ref '#hash((x . y)) x (lambda () add1))) + '(lambda (x) + (hash-ref '#hash((x . y)) x add1)) + #f) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Check bytecode verification of lifted functions diff --git a/src/racket/src/optimize.c b/src/racket/src/optimize.c index 4bab5e73e3..8238543bd3 100644 --- a/src/racket/src/optimize.c +++ b/src/racket/src/optimize.c @@ -1921,6 +1921,17 @@ static Scheme_Object *optimize_application(Scheme_Object *o, Optimize_Info *info le = direct_apply((Scheme_Object *)app, app->args[0], app->args[app->num_args]); if (le) return finish_optimize_app(le, info, context, rator_flags); + /* Convert (hash-ref '#hash... key (lambda () literal)) + to (hash-ref '#hash... key literal) */ + if ((app->num_args == 3) + && SAME_OBJ(scheme_hash_ref_proc, app->args[0]) + && SCHEME_HASHTRP(app->args[1]) + && SAME_TYPE(scheme_compiled_unclosed_procedure_type, SCHEME_TYPE(app->args[3])) + && (SCHEME_TYPE(((Scheme_Closure_Data *)app->args[3])->code) > _scheme_compiled_values_types_) + && !SCHEME_PROCP(((Scheme_Closure_Data *)app->args[3])->code)) { + app->args[3] = ((Scheme_Closure_Data *)app->args[3])->code; + } + return finish_optimize_application(app, info, context, rator_flags); }