-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Hi,
I've recently updated to the latest cxml, to the CVS HEAD, and am having trouble with openmcl64. All in all, it looks like rune-is-integer has been poorly tested. I've had trouble with the asd files, compiling the tester, and with parsing XML. I've included lots of detail below. I am happy to help debug cxml, but I don't understand the system and will need guidance.
I'm finding that the asd files for cxml don't work as written for #+rune-is-integer. Consider what happens in the script below:
? (asdf:operate 'asdf:load-op 'cxml) ; loading system definition from /usr/local/asdf-install/site-systems/cxml.asd into #<Package "ASDF0"> ; registering #<SYSTEM :CXML-XML #x300040E0D25D> as CXML-XML ; registering #<SYSTEM :CXML-DOM #x300040E4A05D> as CXML-DOM ; registering #<SYSTEM :CXML-KLACKS #x300040E78FAD> as CXML-KLACKS ; registering #<SYSTEM :CXML-TEST #x300040E67EAD> as CXML-TEST ; registering #<SYSTEM :CXML #x300040E9841D> as CXML ; loading system definition from /usr/local/asdf-install/site-systems/trivial-gray-streams.asd into #<Package "ASDF0"> ; registering #<SYSTEM :TRIVIAL-GRAY-STREAMS #x300040E8191D> as TRIVIAL-GRAY-STREAMS ; loading system definition from /usr/local/asdf-install/site-systems/puri.asd into #<Package "ASDF0"> ; registering #<SYSTEM PURI #x300040EAA8FD> as PURI ; registering #<SYSTEM PURI-TESTS #x300040ED2FAD> as PURI-TESTS ; loading system definition from /usr/local/asdf-install/site-systems/runes.asd into #<Package "ASDF0"> ;;; Checking for wide character support... no, reverting to octet strings. ;;; Building Closure with (UNSIGNED-BYTE 16) RUNES ; registering #<SYSTEM :RUNES #x300040F11DFD> as RUNES
Error: There is no package named "UTF8-DOM" . While executing: CCL::%FASL-NVPACKAGE, in process listener(1). Type :GO to continue, :POP to abort, :R for a list of available restarts. If continued: Retry finding package with name "UTF8-DOM". Type :? for other options.
1 > :pop
;;; *** At this point, go off to the shell and force reloading cxml.asd $ touch cxml.asd ;;; *** Now back to lisp...
? (asdf:operate 'asdf:load-op 'cxml) ; loading system definition from /usr/local/asdf-install/site-systems/cxml.asd into #<Package "ASDF0"> NIL ?
I think what's happening here is that the feature rune-is-integer is not yet defined when cxml.asd is loaded. So the system definition cxml-dom is defined incorrectly. Only *after* cxml.asd is loaded, we load rune.asd, which is where rune-is-integer is defined. When I touch cxml.asd, it is reloaded and things work fine as rune-is-integer is now correctly defined. Splitting rune.asd and cxml.asd is currently clearly not working.
I think you will be able to replicate this problem if you define cxml-dom as follows:
(asdf:defsystem :cxml-dom :default-component-class closure-source-file :pathname (merge-pathnames "dom/" (make-pathname :name nil :type nil :defaults *load-truename*)) :components ((:file "package") #+rune-is-character (:file rune-impl :pathname "dom-impl" :depends-on ("package")) #+rune-is-character (:file rune-builder :pathname "dom-builder" :depends-on (rune-impl)) #+rune-is-integer (utf8dom-file utf8-impl :pathname "dom-impl" :depends-on ("package")) #+rune-is-integer (utf8dom-file utf8-builder :pathname "dom-builder" :depends-on (utf8-impl)) (:file "dom-sax" :depends-on ("package"))) :depends-on (:cxml-xml))
Concatenating the files runes.asd followed by cxml.asd, and using the result as cxml.asd, allows cxml to load. However, even parsing an XML document currently is non-functional. All this used to work fine in the previous build of cxml.
In addition, the files test/domtest.lisp and test/xmlconf.lisp have repeated references to the package rune-dom, which does not work for rune-is-integer.
Parsing an XML document breaks in the function compute-base. When #+rune-is-integer, sax:find-attribute is called with a string name of an attribute while document data is stored as an integer array. Here's a part of the stack trace:
0: (STRING) 1: (CCL::STRING-START-END "xml:base" #(120 109 108 110 115) 0) 2: (STRING= "xml:base" #(120 109 108 110 115)) 3: (MEMBER "xml:base" '(#S(SAX::ATTRIBUTE :NAMESPACE-URI #(104 116 116 112 58 47 47 119 119 119 ...) :LOCAL-NAME NIL :QNAME #(120 109 108 110 115) :VALUE #(104 116 116 112 58 47 47 119 119 119 ...) :SPECIFIED-P ...))) 4: (CCL::FIND-POSITIONAL-TEST-KEY "xml:base" #<Compiled-function SAX::%ROD= #x30004143E34F> #<Anonymous Function #x30004143F5AF> 'NIL) 5: (CXML::COMPUTE-BASE) Locals: CXML::ATTRS = (#S(SAX::ATTRIBUTE :NAMESPACE-URI #(104 116 116 112 58 47 47 119 119 119 ...) :LOCAL-NAME NIL :QNAME #(120 109 108 110 115) :VALUE #(104 116 116 112 58 47 47 119 119 119 ...) :SPECIFIED-P ...)) 6: (CXML::P/SZTAG #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429E545D>>))) Locals: CXML::INPUT = #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429C8E4D>>)) CXML::CAT = :STAG CXML::SEM = (#(104 116 109 108) (#(120 109 108 110 115) . #(104 116 116 112 58 47 47 119 119 119 ...))) #:ARGS3257 = #<DESTRUCTURE-STATE #x4216E6D> CXML::NAME = #(104 116 109 108) #:REST3258 = ((#(120 109 108 110 115) . #(104 116 116 112 58 47 47 119 119 119 ...))) CXML::*NAMESPACE-BINDINGS* = ((#()) (#(120 109 108 110 115) . #(104 116 116 112 58 47 47 119 119 119 ...)) (#(120 109 108) . #(104 116 116 112 58 47 47 119 119 119 ...))) CXML::NEW-NAMESPACES = ((NIL . #(104 116 116 112 58 47 47 119 119 119 ...))) 7: (CXML::P/ELEMENT #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429E545D>>))) Locals: 8: (CXML::P/DOCUMENT #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429E545D>>)) #UTF8-DOM::DOM-BUILDER #x3000429EBCAD) Locals: CXML::VALIDATE = NIL CXML::ROOT = NIL CXML::ENTITY-RESOLVER = #<Compiled-function HAXL::DEFAULT-ENTITY-RESOLVER #x30004161DECF> CXML::DISALLOW-INTERNAL-SUBSET = NIL CXML::RECODE = T RUNES:XSTREAM = #<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429C8E4D>> CXML::NAME = #<error printing CXML::STREAM-NAME #x3000429C8E4D> CXML::BASE = #<URI file://+/Users/smishra/lisp/wessal/templates/error.xml> CXML::*CTX* = NIL CXML::*VALIDATE* = T CXML::*NAMESPACE-BINDINGS* = ((#()) (#(120 109 108 110 115) . #(104 116 116 112 58 47 47 119 119 119 ...)) (#(120 109 108) . #(104 116 116 112 58 47 47 119 119 119 ...))) CXML::*DATA-BEHAVIOUR* = #<Unbound> CXML::*DATA-BEHAVIOUR* = :DTD 9: (#<Anonymous Function #x3000414D19AF> '(:ENTITY-RESOLVER #<Compiled-function HAXL::DEFAULT-ENTITY-RESOLVER #x30004161DECF>) #<UTF8-DOM::DOM-BUILDER #x3000429EBCAD> #<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429E545D>> #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429E545D>>))) Locals: CXML::ARGS = (:ENTITY-RESOLVER #<Compiled-function HAXL::DEFAULT-ENTITY-RESOLVER #x30004161DECF>) CXML::HANDLER = #<UTF8-DOM::DOM-BUILDER #x3000429CF69D> RUNES:XSTREAM = #<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429C8E4D>> CXML::ZSTREAM = #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429C8E4D>>)) CXML::*SCRATCH-PAD* = #<Unbound> CXML::*SCRATCH-PAD-2* = #<Unbound> CXML::*SCRATCH-PAD-3* = #<Unbound> CXML::*SCRATCH-PAD-4* = #<Unbound> 10: (CXML::CALL-WITH-ZSTREAM #<COMPILED-LEXICAL-CLOSURE #x3000429E53EF> #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429E545D>>))) Locals: CXML::FN = #<COMPILED-LEXICAL-CLOSURE #x3000429C8DDF> CXML::ZSTREAM = #S(CXML::ZSTREAM :TOKEN-CATEGORY NIL :TOKEN-SEMANTIC NIL :INPUT-STACK (#<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429C8E4D>>)) CCL::*INTERRUPT-LEVEL* = 0 CCL::*INTERRUPT-LEVEL* = -1 Catch-tags: NIL 11: (CXML::PARSE-XSTREAM #<RUNES:XSTREAM #<error printing CXML::STREAM-NAME #x3000429E545D>> #<UTF8-DOM::DOM-BUILDER #x3000429EBCAD>) Locals: CXML::HANDLER = #<UTF8-DOM::DOM-BUILDER #x3000429CF69D> CXML::ARGS = (:ENTITY-RESOLVER #<Compiled-function HAXL::DEFAULT-ENTITY-RESOLVER #x30004161DECF>) CXML::*CTX* = NIL #:G3378 = (RUNES-ENCODING:ENCODING-ERROR) CCL::%HANDLERS% = ((PROCESS-RESET)) Catch-tags: NIL 12: (CXML::CALL-WITH-OPEN-XFILE #<COMPILED-LEXICAL-CLOSURE #x3000429EB9FF>) Locals: CXML::CONTINUATION = #<COMPILED-LEXICAL-CLOSURE #x3000429CF3EF> CXML::OPEN-ARGS = (#P"/Users/smishra/lisp/wessal/templates/error.xml") CXML::INPUT = #<BASIC-FILE-BINARY-INPUT-STREAM ("/Users/smishra/lisp/wessal/templates/error.xml"/12 ISO-8859-1) #x3000429CF36D> CCL::*INTERRUPT-LEVEL* = 0 CCL::*INTERRUPT-LEVEL* = -1 Catch-tags: NIL
I know that the particular invocation of parse-xml matters. Here's how I'm doing mine:
(cxml:parse-file document-path #+allegro (rune-dom:make-dom-builder) #+openmcl (cxml-dom:make-dom-builder) :entity-resolver #'default-entity-resolver)
Any help will be much appreciated.
Thanks,
Sunil
Hi,
Quoting Sunil Mishra (smishra@sfmishras.com):
I've recently updated to the latest cxml, to the CVS HEAD, and am having trouble with openmcl64. All in all, it looks like rune-is-integer has been poorly tested. I've had trouble with the asd files, compiling the tester, and with parsing XML. I've included lots of detail below. I am happy to help debug cxml, but I don't understand the system and will need guidance.
thank you for the report. Obviously I broke cxml on non-unicode Lisps completely when I split up cxml.asd and runes.asd before making the last release. I will look into those issues and make a new release as soon as possible.
I am not sure where to find an OpenMCL without Unicode support for AMD 64 though. (But I have previously tested rune-is-integer using CMUCL, and OpenMCL support using the Linux/AMD64 snapshots with Unicode support, so probably those two combinations will be good enough to reproduce the issues you are seeing.)
I think what's happening here is that the feature rune-is-integer is not yet defined when cxml.asd is loaded. So the system definition cxml-dom is defined incorrectly. Only *after* cxml.asd is loaded, we load rune.asd, which is where rune-is-integer is defined. When I touch cxml.asd, it is reloaded and things work fine as rune-is-integer is now correctly defined. Splitting rune.asd and cxml.asd is currently clearly not working.
Right. I'll either go back to one common .asd file or hack an explicit call to (asdf:find-system :runes) at the top of cxml.asd. Not sure what the latter method means for packaging tools that want to parse .asd files though.
d.