Update of /project/movitz/cvsroot/movitz/losp/muerte In directory clnet:/tmp/cvs-serv17716
Modified Files: primitive-functions.lisp Log Message: Wrote primitive function decode-keyargs-default for new &key parsing implementation.
--- /project/movitz/cvsroot/movitz/losp/muerte/primitive-functions.lisp 2005/05/05 20:51:43 1.65 +++ /project/movitz/cvsroot/movitz/losp/muerte/primitive-functions.lisp 2007/02/18 14:52:24 1.66 @@ -10,7 +10,7 @@ ;;;; Author: Frode Vatvedt Fjeld frodef@acm.org ;;;; Created at: Tue Oct 2 21:02:18 2001 ;;;; -;;;; $Id: primitive-functions.lisp,v 1.65 2005/05/05 20:51:43 ffjeld Exp $ +;;;; $Id: primitive-functions.lisp,v 1.66 2007/02/18 14:52:24 ffjeld Exp $ ;;;; ;;;;------------------------------------------------------------------
@@ -734,3 +734,109 @@ (:jnz 'copy-jumpers) (:locally (:movl 0 (:edi (:edi-offset atomically-continuation)))) (:ret))) + + +(define-primitive-function decode-keyargs-default () + "Decode keyword arguments." + (with-inline-assembly (:returns :multiple-values) + ;; EAX: arg0 (if needed) + ;; EBX: arg1 (if needed) + ;; ECX: numargs (fixnum) + ;; EDX: arg-position of first keyword (fixnum) + + (:subl :edx :ecx) ; find stop-pos + (:jbe '(:sub-program (no-key-args) + (:ret))) + + (:locally (:movl #xffffffff (:edi (:edi-offset scratch1)))) ; unbond-value + (:locally (:movl #xffffffff (:edi (:edi-offset scratch2)))) ; unbond-value + (:cmpl 4 :edx) ; keys start at 0 or 1? + (:jbe '(:sub-program (save-eax-ebx) + (:je 'save-ebx-only) + (:locally (:movl :eax (:edi (:edi-offset scratch1)))) + save-ebx-only + (:locally (:movl :ebx (:edi (:edi-offset scratch2)))) + (:subl 8 :ecx) + (:jmp 'continue-save-eax-ebx))) + continue-save-eax-ebx + (:testl 4 :ecx) + (:jnz '(:sub-program (odd-keywords) + (:orl 32 (:ebp -16)) + (:andl -8 :ecx) + (:jmp 'continue-from-odd-keywords))) + continue-from-odd-keywords + (:locally (:movl :ecx (:edi (:edi-offset raw-scratch0)))) ; save stop-pos + (:xorl :edx :edx) ; EDX scans the args, last-to-first. + + (:cmpl :edx :ecx) ; might occur if key-arg-pos is 0 or 1, + (:jbe 'check-arg0-arg1) ; and numargs is 2 or 3. + + scan-args-loop + ;; Load current argument keyword and value into EAX and EBX + (:movl (:ebp :edx 12) :eax) + (:movl (:ebp :edx 8) :ebx) + + start-keyword-search + ;; EAX: (presumed) keyword, EBX corresponding value. + (:globally (:cmpl :eax (:edi (:edi-offset allow-other-keys-symbol)))) + (:je '(:sub-program (found-allow-other-keys) + ;; store boolean EBX in bit 2 of (ebx -16). + (:andl -8 (:ebp -16)) + (:cmpl :edi :ebx) + (:je 'finished-keyword-search) + (:orl 4 (:ebp -16)) ; Signal :allow-other-keys t + (:jmp 'finished-keyword-search))) + (:leal (:eax -5) :ecx) + (:testb 5 :cl) + (:jnz '(:sub-program (keyword-not-symbol) + (:orl 16 (:ebp -16)) ; Signal keyword-not-symbol + (:jmp 'finished-keyword-search))) + (:movl (:esi (:offset movitz-funobj num-jumpers)) + :ecx) + (:andl #xfffc :ecx) + position-search-loop + ;; ECX scans funobj's keyword vector for position of keyword in EAX + (:cmpl :eax (:esi :ecx (:offset movitz-funobj constant0))) + (:je 'found-keyword) + (:testb 1 (:esi :ecx (:offset movitz-funobj constant0))) + (:jz '(:sub-program (keyword-not-fund) + (:orl 8 (:ebp -16)) ; signal unknown-keyword + (:jmp 'finished-keyword-search))) + (:addl 4 :ecx) + (:jmp 'position-search-loop) + + found-keyword + (:subw (:esi (:offset movitz-funobj num-jumpers)) :cx) + (:negl :ecx) + (:movl :ebx (:ebp -20 (:ecx 2))) + (:globally (:movl (:edi (:edi-offset t-symbol)) :ebx)) + (:movl :ebx (:ebp -20 (:ecx 2) -4)) + + finished-keyword-search + (:addl 8 :edx) + (:locally (:cmpl :edx (:edi (:edi-offset raw-scratch0)))) ; more args? + (:ja 'scan-args-loop) + + check-arg0-arg1 + (:locally (:cmpl -1 (:edi (:edi-offset scratch1)))) + (:jne '(:sub-program (search-eax-ebx) + ;; Search one more keyword, in arg0 and arg1 + (:locally (:movl (:edi (:edi-offset scratch1)) :eax)) + (:locally (:movl (:edi (:edi-offset scratch2)) :ebx)) + (:locally (:movl #xffffffff (:edi (:edi-offset scratch1)))) + (:locally (:movl #xffffffff (:edi (:edi-offset scratch2)))) + (:jmp 'start-keyword-search))) + (:locally (:cmpl -1 (:edi (:edi-offset scratch2)))) + (:jne '(:sub-program (search-ebx) + ;; Search one more keyword, in arg1 and last on-stack. + (:locally (:movl (:edi (:edi-offset scratch2)) :eax)) + (:movl (:ebp :edx 8) :ebx) + (:locally (:movl #xffffffff (:edi (:edi-offset scratch2)))) + (:jmp 'start-keyword-search))) + (:ret))) + +(define-primitive-function decode-keyargs-foo () + "foo" + (with-inline-assembly (:returns :multiple-values) + (:ret))) +