Changeset 15146
- Timestamp:
- 11/05/19 13:03:33 (4 years ago)
- Location:
- trunk/abcl
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abcl/contrib/jss/collections.lisp
r15096 r15146 160 160 (declare (optimize (speed 3) (safety 0))) 161 161 (flet ((iterator-collect (iterator) 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 162 (with-constant-signature ((has-next "hasNext") 163 (next "next")) 164 (loop :while (has-next iterator) 165 :collect (next iterator)))) 166 (enumeration-collect (enumeration) 167 (with-constant-signature ((has-next "hasMoreElements") 168 (next "nextElement")) 169 (loop :while (has-next enumeration) 170 :collect (next enumeration)))) 171 (map-collect (map) 172 (with-constant-signature ((has-next "hasMoreElements") 173 (next "nextElement")) 174 (let ((keyiterator (#"iterator" (#"keyset" map)))) 175 (loop :while (has-next keyiterator) 176 :for key = (next keyiterator) 177 177 :collect (cons key (#"get" map key))))))) 178 178 (let ((isinstance -
trunk/abcl/contrib/jss/invoke.lisp
r15134 r15146 257 257 (when (boundp '*class-lookup-overrides*) 258 258 (let ((found (find-if (lambda(el) (#"matches" (string el) (concatenate 'string "(?i).*" (string name) "$"))) 259 260 261 262 259 *class-lookup-overrides*))) 260 (if found 261 (let ((*class-lookup-overrides* nil)) 262 (lookup-class-name found)))))) 263 263 264 264 … … 288 288 (length full))) 289 289 (ambiguous (choices) 290 291 292 290 (if return-ambiguous 291 (return-from lookup-class-name choices) 292 (error "Ambiguous class name: ~a can be ~{~a~^, ~}" name choices)))) 293 293 (if (zerop bucket-length) 294 294 (progn (unless muffle-warning (warn "can't find class named ~a" name)) nil) 295 295 (let ((matches (loop for el in bucket when (matches-end name el 'char=) collect el))) 296 296 (if (= (length matches) 1) … … 301 301 (car matches) 302 302 (if (= (length matches) 0) 303 303 (progn (unless muffle-warning (warn "can't find class named ~a" name)) nil) 304 304 (ambiguous matches)))) 305 305 (ambiguous matches)))))))))) -
trunk/abcl/contrib/jss/javaparser.lisp
r15066 r15146 10 10 (setf (gethash ,jclass *class-to-last-component*) ',ast-class) 11 11 (defmethod ,ast-class ((obj ,class) node &optional 12 13 14 12 ,@(loop for field in fields 13 collect `(,(intern (string-upcase field)) (get-java-field node ,field t)))) 14 ,@body)))) 15 15 16 16 (defvar *object-for-this* (new 'lang.object)) … … 45 45 (setq raw (#"replaceAll" raw "_" "")) 46 46 (if (#"matches" raw ".*[dD]$") 47 48 49 50 47 (read-from-string (#"replaceFirst" (subseq raw 0 (1- (length raw))) "e" "d")) 48 (if (#"matches" raw ".*[fF]$") 49 (read-from-string (subseq raw 0 (1- (length raw)))) 50 (read-from-string raw))))) 51 51 52 52 (def-java-read CharLiteralExpr javaparser nil -
trunk/abcl/contrib/jss/jss.asd
r15116 r15146 3 3 :author "Alan Ruttenberg, Mark Evenson" 4 4 :long-description "<urn:abcl.org/release/1.6.0/contrib/jss#>" 5 :version "3. 5.0"5 :version "3.6.0" 6 6 :components ((:module base :pathname "" :serial t 7 7 :components ((:file "packages") … … 12 12 (:file "transform-to-field") 13 13 (:file "compat") 14 (:file "jtypecase")))) 14 (:file "jtypecase") 15 (:file "util")))) 15 16 :perform (asdf:test-op (op c) 16 17 (asdf:test-system :jss-tests))) -
trunk/abcl/contrib/jss/jtypecase.lisp
r15116 r15146 6 6 (declare (optimize (speed 3) (safety 0))) 7 7 (let ((class (or (gethash type *jtypecache*) 8 9 8 (ignore-errors (setf (gethash type *jtypecache*) (find-java-class type))))) 9 (method (load-time-value (jmethod "java.lang.Class" "isInstance" "java.lang.Object")))) 10 10 (and class 11 11 (jcall method class object)))) 12 12 13 13 (defmacro jtypecase (keyform &body cases) -
trunk/abcl/contrib/jss/optimize-java-call.lisp
r15117 r15146 10 10 (precompiler::precompile-function-call 11 11 `(jss::invoke-restargs-macro 12 13 12 ,(second form) 13 ,(car args) (list ,@(cdr args)) ,(fifth form))))) 14 14 15 15 (defmacro invoke-restargs-macro ( method object args &optional (raw? nil)) … … 18 18 (if (and (consp object) (eq (car object) 'quote)) 19 19 (let ((object (eval object))) 20 21 22 23 24 25 20 (let* ((object-as-class 21 (or (ignore-errors (let ((*muffle-warnings* t)) (find-java-class object))) 22 `(find-java-class ',object)))) 23 (if raw? 24 `(jstatic-raw ,method ,object-as-class ,@args) 25 `(jstatic ,method ,object-as-class ,@args)))) 26 26 (let ((objectvar (make-symbol "INVOKE-RESTARGS-ARG1"))) 27 28 29 30 31 32 33 34 35 27 (if raw? 28 `(let ((,objectvar ,object)) 29 (if (symbolp ,objectvar) 30 (jstatic-raw ,method (find-java-class ,objectvar) ,@args) 31 (jcall-raw ,method ,objectvar ,@args))) 32 `(let ((,objectvar ,object)) 33 (if (symbolp ,objectvar) 34 (jstatic ,method (find-java-class ,objectvar) ,@args) 35 (jcall ,method ,objectvar ,@args))))))) 36 36 37 37 -
trunk/abcl/contrib/jss/read-sharp-quote-expression.lisp
r15063 r15146 7 7 (with-output-to-string (s) 8 8 (loop with embedded-string = nil 9 10 11 12 13 14 15 16 17 18 19 20 21 22 9 for last = #\space then char 10 for char = (read-char stream) 11 until (and (char= char #\") 12 ;; really end if: we've established embedded string and the peek is a space 13 ;; we're not about to start embedded string. We're about to start embedded string if next character isn't #\). 14 ;; we're not embedded-string and not about to start one 15 (cond ((null (peek-char nil stream nil)) t) ;; eof 16 (embedded-string (system:whitespacep (peek-char nil stream))) ; embedded " needs "<space>" to end 17 ((find last ",(+=" :test 'char=) 18 (setq embedded-string t) 19 nil) 20 (t t))) 21 do 22 (write-char char s))))) 23 23 24 24 … … 27 27 (let ((read (read-java-expression (make-instance 'sharp-quote-expression-reader) de-lisped))) 28 28 (loop for (var nil) in bindings 29 do (setq read (cl-user::tree-replace (lambda(e) (if (equalp e (string var)) var e)) read )))29 do (setq read (tree-replace (lambda(e) (if (equalp e (string var)) var e)) read ))) 30 30 (if bindings 31 32 31 `(let ,bindings ,read) 32 read)))) 33 33 34 34 (defun extract-lisp-expressions (string) 35 35 (let ((bindings nil)) 36 36 (let ((de-lisped 37 (cl-user::replace-all string "\\{(.*?)\\}"38 39 40 41 42 37 (replace-all string "\\{(.*?)\\}" 38 (lambda(match) 39 (let ((replacevar (find-symbol-not-matching string (mapcar 'car bindings)))) 40 (push (list replacevar (read-from-string match)) bindings) 41 (string replacevar))) 42 1))) 43 43 (values bindings de-lisped)))) 44 44 45 45 (defun find-symbol-not-matching (string already) 46 46 (loop for candidate = (format nil "JSS_~a" (random 10000)) 47 48 49 50 47 until (and (not (member candidate already :test 'equalp :key 'string)) 48 (not (search string already))) 49 finally (return-from find-symbol-not-matching (intern candidate :jss)))) 50 51 51 (defun maybe-class (el) 52 52 (if (and (symbolp el) (upper-case-p (char (string el) 0)) (not (eql (search "JSS_" (string el)) 0))) 53 53 `(find-java-class ',el) 54 54 (if (symbolp el) 55 (intern (string-upcase el) :jss)56 55 (intern (string-upcase el)) 56 el))) 57 57 58 58 (def-java-read ObjectCreationExpr sharp-quote-expression-reader () … … 62 62 (def-java-read MethodCallExpr sharp-quote-expression-reader () 63 63 (let* ((scope1 (process-node obj (process-node obj (#"getScope" node)))) 64 65 66 64 (how (if (and (symbolp scope1) (not (null scope1)) (upper-case-p (char (string scope1) 0))) 65 'jstatic 66 'jcall))) 67 67 (if (and (symbolp scope1) (not (null scope1)) (upper-case-p (char (string scope1) 0))) 68 (setq scope1 `',scope1))68 (setq scope1 `(find-java-class ',scope1))) 69 69 `(,how ,(#"getIdentifier" (#"getName" node)) ,(or scope1 'this) ,@(mapcar 'maybe-class 70 71 70 (mapcar (lambda(el) (process-node obj el)) 71 (j2list (#"getArguments" node))))) 72 72 )) 73 74 73 75 74 (def-java-read FieldAccessExpr sharp-quote-expression-reader () 76 75 (let ((scope (process-node obj (#"getScope" node)))) 77 76 (if (and (symbolp scope) (upper-case-p (char (string scope) 0))) 78 79 77 `(get-java-field ',(process-node obj (#"getScope" node)) ,(#"getIdentifier" (#"getField" node)) t) 78 `(get-java-field ,(maybe-class (process-node obj (#"getScope" node))) ,(#"getIdentifier" (#"getField" node)) t)))) 80 79 81 80 (def-java-read ArrayAccessExpr sharp-quote-expression-reader () … … 87 86 (let ((name (process-node obj (#"getName" (#"getType" node))))) 88 87 (if (eql (search "JSS_" (string name) :test 'equalp) 0) 89 90 88 name 89 `(find-java-class ',name)))) 91 90 92 91 (def-java-read NameExpr sharp-quote-expression-reader () -
trunk/abcl/contrib/jss/t/javaparser.lisp
r15066 r15146 2 2 3 3 (defparameter expanded '(let ((jss::this jss::*object-for-this*)) 4 5 6 7 8 9 10 11 12 13 14 '|ElementMatchers| 15 16 17 '|FixedValue| 18 19 20 4 (jcall "getLoaded" 5 (jcall "load" 6 (jcall "make" 7 (jcall "intercept" 8 (jcall "method" 9 (jcall "subclass" 10 (new '|ByteBuddy|) 11 (find-java-class '|Object|) 12 t) 13 (jstatic "named" 14 (find-java-class '|ElementMatchers|) 15 "toString")) 16 (jstatic "value" 17 (find-java-class '|FixedValue|) 18 "Hello World!"))) 19 (jcall "getClassLoader" 20 (jcall "getClass" jss::this)))))) 21 21 22 22 (defparameter source '#1"new ByteBuddy().subclass(Object.class,t) -
trunk/abcl/contrib/jss/transform-to-field.lisp
r15087 r15146 24 24 (defun jss-transform-to-field (string sharp-arg) 25 25 (let* ((pattern (#"compile" 'java.util.regex.Pattern "((==){0,1})(.*)\\.([^.]+)$")) 26 26 (matcher (#"matcher" pattern string))) 27 27 (#"find" matcher) 28 28 (let ((parts (list (#"group" matcher 3) (#"group" matcher 4))) 29 29 (scope (#"group" matcher 1))) 30 30 (check-class-or-eval (first parts)) 31 31 (check-field-or-eval (second parts)) … … 41 41 (defun check-field-or-eval (string) 42 42 (assert (or (#"matches" string "^(\\p{javaJavaIdentifierStart}(\\p{javaJavaIdentifierPart})*)+$") 43 44 45 43 (#"matches" string "^\\{.+\\}$")) 44 (string) 45 "inside #\"..\" expected either a field name or an expression surrounded by {}. Found: #~s" string)) 46 46 47 47 (defun field-access-expression (sharp-arg scope thing field ) … … 49 49 (static-field-ref-transform thing field sharp-arg scope) 50 50 (if (and (equal scope "==") (char= (char thing 0) #\{) (not (char= (char field 0) #\{))) 51 52 53 54 55 56 57 58 51 (always-same-signature-field-ref-transform sharp-arg thing field) 52 `(get-java-field ,(if (char= (char thing 0) #\{) 53 (read-from-string (subseq thing 1 (- (length thing) 1))) 54 `(load-time-value (find-java-class ,thing))) 55 ,(if (char= (char field 0) #\{) 56 (read-from-string (subseq field 1 (- (length field) 1))) 57 field) 58 t)))) 59 59 60 60 ;; If a class name and explicit field name we can look everything up at load time … … 63 63 `(load-time-value (get-java-field (find-java-class ,class) ,field t)) 64 64 `(,(if (eql sharp-arg 0) 'jcall-raw 'jcall) 65 66 67 68 69 70 65 (load-time-value (jmethod "java.lang.reflect.Field" "get" "java.lang.Object")) 66 (load-time-value 67 (let ((jfield (find-declared-field ,field (find-java-class ,class)))) 68 (#"setAccessible" jfield t) 69 jfield)) 70 (load-time-value (find-java-class ',class))))) 71 71 72 72 ;; 1 case: =={var}.foo … … 74 74 (defun always-same-signature-field-ref-transform (sharp-arg object field) 75 75 (let ((cached (make-symbol (format nil "CACHED-FIELD-field"))) 76 76 (object (intern (string-upcase (subseq object 1 (- (length object) 1)))))) 77 77 `(,(if (eql sharp-arg 0) 'jcall-raw 'jcall) 78 78 (load-time-value (jmethod "java.lang.reflect.Field" "get" "java.lang.Object")) 79 79 (locally (declare (special ,cached)) 80 81 82 83 84 85 80 (if (boundp ',cached) 81 ,cached 82 (progn (setq ,cached 83 (find-declared-field ,field (jcall (load-time-value (jmethod "java.lang.Object" "getClass")) ,object))) 84 (jcall (load-time-value (jmethod "java.lang.reflect.Field" "setAccessible" "boolean")) ,cached t) 85 ,cached))) 86 86 ,object))) 87 87 -
trunk/abcl/test/lisp/ansi/ansi-test-failures
r15145 r15146 813 813 :jvm "OpenJDK_64-Bit_Server_VM-Oracle_Corporation-11.0.5+10-1" 814 814 :id oxi-java11 815 ( (SHIFTF.7 LOOP.1.40 LOOP.1.41 LOOP.1.42 LOOP.1.43815 (SHIFTF.7 LOOP.1.40 LOOP.1.41 LOOP.1.42 LOOP.1.43 816 816 DEFGENERIC.ERROR.1 DEFGENERIC.ERROR.2 DEFGENERIC.ERROR.3 817 817 CALL-NEXT-METHOD.ERROR.1 CALL-NEXT-METHOD.ERROR.2 … … 831 831 SYNTAX.SHARP-COLON.ERROR.1 APROPOS.ERROR.2 832 832 APROPOS-LIST.ERROR.2 DISASSEMBLE.ERROR.3 TRACE.8 833 DECODE-UNIVERSAL-TIME.5))) 833 DECODE-UNIVERSAL-TIME.5)) 834 834 835 ;; 55 out of 21836 total tests failed: 835 (compileit 836 (compileit abcl-1.6.0-dev-20190111a 836 837 :uname "amd64-FreeBSD-12.0-RELEASE-p10" 837 :vm " "OpenJDK_64-Bit_Server_VM-Oracle_Corporation-1.8.0_232-b09"838 :vm "OpenJDK_64-Bit_Server_VM-Oracle_Corporation-1.8.0_232-b09" 838 839 :id oxi-java8 839 ( (SHIFTF.7 LOOP.1.40 LOOP.1.41 LOOP.1.42 LOOP.1.43 DEFGENERIC.ERROR.1840 (SHIFTF.7 LOOP.1.40 LOOP.1.41 LOOP.1.42 LOOP.1.43 DEFGENERIC.ERROR.1 840 841 DEFGENERIC.ERROR.2 DEFGENERIC.ERROR.3 CALL-NEXT-METHOD.ERROR.1 841 842 CALL-NEXT-METHOD.ERROR.2 INVOKE-DEBUGGER.1 MAKE-CONDITION.3 … … 852 853 DISASSEMBLE.ERROR.3 TRACE.8 DECODE-UNIVERSAL-TIME.5)) 853 854 855 (compileit abcl-1.6.0-dev-20191105a 856 :id oxi-java8 857 (SHIFTF.7 LOOP.1.40 LOOP.1.41 LOOP.1.42 LOOP.1.43 DEFGENERIC.ERROR.1 858 DEFGENERIC.ERROR.2 DEFGENERIC.ERROR.3 CALL-NEXT-METHOD.ERROR.1 859 CALL-NEXT-METHOD.ERROR.2 INVOKE-DEBUGGER.1 MAKE-CONDITION.3 860 MAKE-CONDITION.4 DEFPACKAGE.2B EXPT.29 MAP.48 DEFSTRUCT.ERROR.3 861 DEFSTRUCT.ERROR.4 TYPE-OF.1 TYPE-OF.4 LOGICAL-PATHNAME.3 862 DIRECTORY.8 ENSURE-DIRECTORIES-EXIST.8 RENAME-FILE.5 DELETE-FILE.3 863 DELETE-FILE.4 READ-BYTE.ERROR.5 WRITE-BYTE.ERROR.4 OPEN.64 864 OPEN.OUTPUT.3 OPEN.IO.3 CLEAR-INPUT.ERROR.5 FINISH-OUTPUT.ERROR.3 865 FORCE-OUTPUT.ERROR.3 CLEAR-OUTPUT.ERROR.3 PRINT.RANDOM-STATE.1 866 PRINT-STRUCTURE.1 PPRINT-FILL.2 PPRINT-LINEAR.2 PPRINT-TABULAR.2 867 PPRINT-LOGICAL-BLOCK.17 FORMAT.F.5 FORMAT.F.8 FORMAT.F.45 868 FORMATTER.F.45 FORMAT.F.46 FORMATTER.F.46 FORMAT.F.46B 869 FORMATTER.F.46B FORMAT.F.47 FORMATTER.F.47 FORMAT.E.1 FORMAT.E.2 870 FORMAT.E.3 FORMAT.E.6 FORMAT.E.20 FORMAT.E.26 871 SYNTAX.SHARP-COLON.ERROR.1 COMPILE-FILE.17 COMPILE-FILE.18 LOAD.19 872 APROPOS.ERROR.2 APROPOS-LIST.ERROR.2 DISASSEMBLE.ERROR.3 TRACE.8 873 DECODE-UNIVERSAL-TIME.5)) 874
Note: See TracChangeset
for help on using the changeset viewer.