Fix to catching exceptions
svn: r786
This commit is contained in:
parent
4b7a8dece0
commit
38f85dce57
|
@ -1142,12 +1142,15 @@
|
|||
(if (null? catches)
|
||||
new-env
|
||||
(let* ((catch (car catches))
|
||||
(type (field-type-spec (catch-cond catch))))
|
||||
(type (type-spec-to-type (field-type-spec (catch-cond catch)) #f 'full type-recs)))
|
||||
(unless (and (ref-type? type)
|
||||
(is-eq-subclass? type throw-type type-recs))
|
||||
(catch-error type (field-src (catch-cond catch))))
|
||||
(set-field-type! (catch-cond catch) type)
|
||||
(add-required '("" "") (ref-type-class/iface type) (ref-type-path type) type-recs)
|
||||
(loop (cdr catches) (add-exn-to-env type env))))))
|
||||
(body-res (check-s body new-env)))
|
||||
(add-required '("" "") "Throwable" '("java" "lang") type-recs)
|
||||
(for-each (lambda (catch)
|
||||
(let* ((field (catch-cond catch))
|
||||
(name (id-string (field-name field)))
|
||||
|
@ -1155,10 +1158,10 @@
|
|||
(if (and in-env? (not (properties-field? (var-type-properties in-env?))))
|
||||
(illegal-redefinition (field-name field) (field-src field))
|
||||
(check-s (catch-body catch)
|
||||
(add-var-to-env name (field-type-spec field) parm env)))))
|
||||
(add-var-to-env name (field-type field) parm env)))))
|
||||
catches)
|
||||
(when finally (check-s finally env))
|
||||
(make-type/env 'void (unnest-var (type/env-e body-res)))))
|
||||
(make-type/env 'void (unnest-var env (type/env-e body-res)))))
|
||||
|
||||
;INCORRECT!!! This doesn't properly type check and I'm just raising an error for now
|
||||
;Skipping proper checks of the statements + proper checking that constants aren't repeated
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
("getMessage" (public) ("String" "java" "lang") () () ("Throwable" "java" "lang"))
|
||||
("getStackTrace" (public) (1 ("StackTraceElement" "java" "lang")) () () ("Throwable" "java" "lang"))
|
||||
("printStackTrace" (public) void () () ("Throwable" "java" "lang"))
|
||||
("printStackTrace" (public) void (("PrintString" "java" "io")) () ("Throwable" "java" "lang"))
|
||||
("printStackTrace" (public) void (("PrintStream" "java" "io")) () ("Throwable" "java" "lang"))
|
||||
("printStackTrace" (public) void (("PrintWriter" "java" "io")) () ("Throwable" "java" "lang"))
|
||||
("setStackTrace" (public) void ((1 ("StackTraceElement" "java" "lang"))) () ("Throwable" "java" "lang"))
|
||||
;("toString" (public) ("String" "java" "lang") () () ("Throwable" "java" "lang"))
|
||||
|
|
|
@ -542,7 +542,7 @@
|
|||
((null? reqs) null)
|
||||
((member (cadr (car reqs))
|
||||
(list (make-req "Class" '("java" "lang"))
|
||||
(make-req "PrintString" '("java" "io"))
|
||||
(make-req "PrintStream" '("java" "io"))
|
||||
(make-req "PrintWriter" '("java" "io"))))
|
||||
(translate-require (cdr reqs) type-recs))
|
||||
(else
|
||||
|
@ -932,7 +932,10 @@
|
|||
(cond
|
||||
((and (equal? string-type type) from-dynamic?) `(make-java-string ,value))
|
||||
((equal? string-type type) `(send ,value get-mzscheme-string))
|
||||
((equal? type (make-ref-type "Class" '("java" "lang"))) value)
|
||||
((member type (list
|
||||
(make-ref-type "Class" '("java" "lang"))
|
||||
(make-ref-type "PrintStream" '("java" "io"))
|
||||
(make-ref-type "PrintWriter" '("java" "io")))) value)
|
||||
(from-dynamic? `(,(build-identifier (string-append "wrap-convert-assert-" (ref-type-class/iface type)))
|
||||
,value pos-blame neg-blame src cc-marks))
|
||||
(else `(make-object ,(build-identifier (string-append "guard-convert-" (ref-type-class/iface type)))
|
||||
|
@ -1714,7 +1717,7 @@
|
|||
(if isRuntime?
|
||||
(make-syntax #f `exn? (build-src var-src))
|
||||
(make-syntax #f
|
||||
`(javaException:exception-is-a? ,class-name)
|
||||
`(exception-is-a? ,class-name)
|
||||
(build-src var-src))))
|
||||
(parm (translate-id (build-var-name (id-string (field-name catch-var)))
|
||||
(id-src (field-name catch-var))))
|
||||
|
@ -2624,7 +2627,14 @@
|
|||
(build-identifier (var-access-class vaccess))))))
|
||||
((not obj) (set-h (translate-id (build-var-name field) field-src)))
|
||||
(else
|
||||
(let ((setter (create-set-name field (var-access-class vaccess)))
|
||||
(let ((setter (if (var-access-final? vaccess)
|
||||
(make-syntax #f
|
||||
`(lambda (my-dummy new-val)
|
||||
((class-field-mutator ,(build-identifier (var-access-class vaccess))
|
||||
,(build-identifier field))
|
||||
this new-val))
|
||||
#f)
|
||||
(create-set-name field (var-access-class vaccess))))
|
||||
(getter (create-get-name field (var-access-class vaccess)))
|
||||
(name (gensym 'field-obj))
|
||||
(new-val (gensym 'val)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user