diff options
-rw-r--r-- | src/boot/strap/ast.clisp | 154 | ||||
-rw-r--r-- | src/boot/strap/parser.clisp | 4 | ||||
-rw-r--r-- | src/boot/strap/tokens.clisp | 15 | ||||
-rw-r--r-- | src/boot/strap/translator.clisp | 2 |
4 files changed, 166 insertions, 9 deletions
diff --git a/src/boot/strap/ast.clisp b/src/boot/strap/ast.clisp index 94c01076..7f7e52ce 100644 --- a/src/boot/strap/ast.clisp +++ b/src/boot/strap/ast.clisp @@ -2136,7 +2136,8 @@ ((|%hasFeature| :SBCL) (LIST (|bfColonColon| 'SB-ALIEN 'UNSIGNED) 8)) ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'UINT8)) - ((|%hasFeature| :ECL) :UNSIGNED-BYTE) + ((OR (|%hasFeature| :ECL) (|%hasFeature| :CLOZURE)) + :UNSIGNED-BYTE) (T (|nativeType| '|char|)))) ((EQ |t| '|int16|) (COND @@ -2145,6 +2146,7 @@ ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'INT16)) ((AND (|%hasFeature| :ECL) (|%hasFeature| :UINT16-T)) :INT16-T) + ((|%hasFeature| :CLOZURE) :SIGNED-HALFWORD) (T (|unknownNativeTypeError| |t|)))) ((EQ |t| '|uint16|) (COND @@ -2153,6 +2155,7 @@ ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'UINT16)) ((AND (|%hasFeature| :ECL) (|%hasFeature| :UINT16-T)) :UINT16-T) + ((|%hasFeature| :CLOZURE) :UNSIGNED-HALFWORD) (T (|unknownNativeTypeError| |t|)))) ((EQ |t| '|int32|) (COND @@ -2161,6 +2164,7 @@ ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'INT32)) ((AND (|%hasFeature| :ECL) (|%hasFeature| :UINT32-T)) :INT32-T) + ((|%hasFeature| :CLOZURE) :SIGNED-FULLWORD) (T (|unknownNativeTypeError| |t|)))) ((EQ |t| '|uint32|) (COND @@ -2169,6 +2173,7 @@ ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'INT32)) ((AND (|%hasFeature| :ECL) (|%hasFeature| :UINT32-T)) :UINT32-T) + ((|%hasFeature| :CLOZURE) :UNSIGNED-FULLWORD) (T (|unknownNativeTypeError| |t|)))) ((EQ |t| '|int64|) (COND @@ -2177,6 +2182,7 @@ ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'INT64)) ((AND (|%hasFeature| :ECL) (|%hasFeature| :UINT64-T)) :INT64-T) + ((|%hasFeature| :CLOZURE) :SIGNED-DOUBLEWORD) (T (|unknownNativeTypeError| |t|)))) ((EQ |t| '|uint64|) (COND @@ -2185,6 +2191,7 @@ ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'UINT64)) ((AND (|%hasFeature| :ECL) (|%hasFeature| :UINT64-T)) :UINT64-T) + ((|%hasFeature| :CLOZURE) :UNSIGNED-DOUBLEWORD) (T (|unknownNativeTypeError| |t|)))) ((EQ |t| '|float32|) (|nativeType| '|float|)) ((EQ |t| '|float64|) (|nativeType| '|double|)) @@ -2195,6 +2202,7 @@ ((|%hasFeature| :SBCL) (LIST '* (|bfColonColon| 'SB-ALIEN 'VOID))) ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'C-POINTER)) + ((|%hasFeature| :CLOZURE) :ADDRESS) (T (|unknownNativeTypeError| |t|)))) (T (|unknownNativeTypeError| |t|)))) ((EQ (CAR |t|) '|buffer|) @@ -2203,6 +2211,8 @@ ((|%hasFeature| :ECL) :OBJECT) ((|%hasFeature| :SBCL) (LIST '* (|nativeType| (CADR |t|)))) ((|%hasFeature| :CLISP) (|bfColonColon| 'FFI 'C-POINTER)) + ((|%hasFeature| :CLOZURE) + (LIST :* (|nativeType| (CADR |t|)))) (T (|unknownNativeTypeError| |t|)))) ((EQ (CAR |t|) '|pointer|) (|nativeType| '|pointer|)) (T (|unknownNativeTypeError| |t|)))))) @@ -2246,7 +2256,7 @@ (RETURN (COND ((OR (|%hasFeature| :GCL) (|%hasFeature| :ECL) - (|%hasFeature| :CLISP)) + (|%hasFeature| :CLISP) (|%hasFeature| :CLOZURE)) |a|) ((|%hasFeature| :SBCL) (COND @@ -2808,6 +2818,144 @@ (CONS |rettype| |argtypes|))) (NREVERSE |newArgs|)))))))))))) +(DEFUN |genCLOZUREnativeTranslation| (|op| |s| |t| |op'|) + (PROG (|call| |p'| |ISTMP#3| |ISTMP#2| |ISTMP#1| |aryPairs| + |strPairs| |parms| |argtypes| |rettype|) + (RETURN + (PROGN + (SETQ |rettype| (|nativeReturnType| |t|)) + (SETQ |argtypes| + (LET ((|bfVar#173| NIL) (|bfVar#172| |s|) (|x| NIL)) + (LOOP + (COND + ((OR (ATOM |bfVar#172|) + (PROGN (SETQ |x| (CAR |bfVar#172|)) NIL)) + (RETURN (NREVERSE |bfVar#173|))) + (T (SETQ |bfVar#173| + (CONS (|nativeArgumentType| |x|) + |bfVar#173|)))) + (SETQ |bfVar#172| (CDR |bfVar#172|))))) + (SETQ |parms| + (LET ((|bfVar#175| NIL) (|bfVar#174| |s|) (|x| NIL)) + (LOOP + (COND + ((OR (ATOM |bfVar#174|) + (PROGN (SETQ |x| (CAR |bfVar#174|)) NIL)) + (RETURN (NREVERSE |bfVar#175|))) + (T (SETQ |bfVar#175| + (CONS (GENSYM "parm") |bfVar#175|)))) + (SETQ |bfVar#174| (CDR |bfVar#174|))))) + (SETQ |strPairs| NIL) + (SETQ |aryPairs| NIL) + (LET ((|bfVar#176| |parms|) (|p| NIL) (|bfVar#177| |s|) + (|x| NIL)) + (LOOP + (COND + ((OR (ATOM |bfVar#176|) + (PROGN (SETQ |p| (CAR |bfVar#176|)) NIL) + (ATOM |bfVar#177|) + (PROGN (SETQ |x| (CAR |bfVar#177|)) NIL)) + (RETURN NIL)) + (T (COND + ((EQ |x| '|string|) + (SETQ |strPairs| + (CONS (CONS |p| (GENSYM "loc")) |strPairs|))) + ((AND (CONSP |x|) + (PROGN + (SETQ |ISTMP#1| (CDR |x|)) + (AND (CONSP |ISTMP#1|) + (NULL (CDR |ISTMP#1|)) + (PROGN + (SETQ |ISTMP#2| (CAR |ISTMP#1|)) + (AND (CONSP |ISTMP#2|) + (EQ (CAR |ISTMP#2|) '|buffer|) + (PROGN + (SETQ |ISTMP#3| + (CDR |ISTMP#2|)) + (AND (CONSP |ISTMP#3|) + (NULL (CDR |ISTMP#3|))))))))) + (SETQ |aryPairs| + (CONS (CONS |p| (GENSYM "loc")) |aryPairs|)))))) + (SETQ |bfVar#176| (CDR |bfVar#176|)) + (SETQ |bfVar#177| (CDR |bfVar#177|)))) + (COND + ((|%hasFeature| :DARWIN) (SETQ |op'| (CONCAT '_ |op'|)))) + (SETQ |call| + (CONS (|bfColonColon| 'CCL 'EXTERNAL-CALL) + (CONS (STRING |op'|) + (APPEND (LET ((|bfVar#180| NIL) + (|bfVar#178| |argtypes|) + (|x| NIL) (|bfVar#179| |parms|) + (|p| NIL)) + (LOOP + (COND + ((OR (ATOM |bfVar#178|) + (PROGN + (SETQ |x| + (CAR |bfVar#178|)) + NIL) + (ATOM |bfVar#179|) + (PROGN + (SETQ |p| + (CAR |bfVar#179|)) + NIL)) + (RETURN + (NREVERSE |bfVar#180|))) + (T + (SETQ |bfVar#180| + (APPEND + (REVERSE + (LIST |x| + (COND + ((SETQ |p'| + (ASSOC |p| |strPairs|)) + (CDR |p'|)) + ((SETQ |p'| + (ASSOC |p| |aryPairs|)) + (CDR |p'|)) + (T |p|)))) + |bfVar#180|)))) + (SETQ |bfVar#178| + (CDR |bfVar#178|)) + (SETQ |bfVar#179| + (CDR |bfVar#179|)))) + (CONS |rettype| NIL))))) + (COND + ((EQ |t| '|string|) + (SETQ |call| + (LIST (|bfColonColon| 'CCL 'GET-CSTRING) |call|)))) + (LET ((|bfVar#181| |aryPairs|) (|arg| NIL)) + (LOOP + (COND + ((OR (ATOM |bfVar#181|) + (PROGN (SETQ |arg| (CAR |bfVar#181|)) NIL)) + (RETURN NIL)) + (T (SETQ |call| + (LIST (|bfColonColon| 'CCL + 'WITH-POINTER-TO-IVECTOR) + (LIST (CDR |arg|) (CAR |arg|)) |call|)))) + (SETQ |bfVar#181| (CDR |bfVar#181|)))) + (COND + (|strPairs| + (SETQ |call| + (LIST (|bfColonColon| 'CCL 'WITH-CSTRS) + (LET ((|bfVar#183| NIL) + (|bfVar#182| |strPairs|) (|arg| NIL)) + (LOOP + (COND + ((OR (ATOM |bfVar#182|) + (PROGN + (SETQ |arg| (CAR |bfVar#182|)) + NIL)) + (RETURN (NREVERSE |bfVar#183|))) + (T (SETQ |bfVar#183| + (CONS + (LIST (CDR |arg|) (CAR |arg|)) + |bfVar#183|)))) + (SETQ |bfVar#182| (CDR |bfVar#182|)))) + |call|)))) + (LIST (LIST 'DEFUN |op| |parms| |call|)))))) + (DEFUN |genImportDeclaration| (|op| |sig|) (PROG (|s| |t| |m| |ISTMP#2| |op'| |ISTMP#1|) (RETURN @@ -2846,6 +2994,8 @@ (|genCLISPnativeTranslation| |op| |s| |t| |op'|)) ((|%hasFeature| :ECL) (|genECLnativeTranslation| |op| |s| |t| |op'|)) + ((|%hasFeature| :CLOZURE) + (|genCLOZUREnativeTranslation| |op| |s| |t| |op'|)) (T (|fatalError| "import declaration not implemented for this Lisp")))))))) diff --git a/src/boot/strap/parser.clisp b/src/boot/strap/parser.clisp index 5683aef5..a63057f2 100644 --- a/src/boot/strap/parser.clisp +++ b/src/boot/strap/parser.clisp @@ -758,6 +758,10 @@ (AND (OR (|bpException|) (|bpTrap|)) (|bpPush| (|%Catch| (|bpPop1|))))) +(DEFUN |bpLeave| () + (AND (|bpEqKey| 'LEAVE) (OR (|bpLogical|) (|bpTrap|)) + (|bpPush| (|%LeaveAst| (|bpPop1|))))) + (DEFUN |bpReturn| () (OR (AND (|bpEqKey| 'RETURN) (OR (|bpAssign|) (|bpTrap|)) (|bpPush| (|bfReturnNoName| (|bpPop1|)))) diff --git a/src/boot/strap/tokens.clisp b/src/boot/strap/tokens.clisp index da929d44..518c43ef 100644 --- a/src/boot/strap/tokens.clisp +++ b/src/boot/strap/tokens.clisp @@ -10,13 +10,14 @@ (LIST "catch" 'CATCH) (LIST "cross" 'CROSS) (LIST "else" 'ELSE) (LIST "for" 'FOR) (LIST "has" 'HAS) (LIST "if" 'IF) (LIST "import" 'IMPORT) (LIST "in" 'IN) - (LIST "is" 'IS) (LIST "isnt" 'ISNT) (LIST "module" 'MODULE) - (LIST "namespace" 'NAMESPACE) (LIST "of" 'OF) (LIST "or" 'OR) - (LIST "repeat" 'REPEAT) (LIST "return" 'RETURN) - (LIST "structure" 'STRUCTURE) (LIST "then" 'THEN) - (LIST "throw" 'THROW) (LIST "try" 'TRY) (LIST "until" 'UNTIL) - (LIST "where" 'WHERE) (LIST "while" 'WHILE) (LIST "." 'DOT) - (LIST ":" 'COLON) (LIST "::" 'COLON-COLON) (LIST "," 'COMMA) + (LIST "is" 'IS) (LIST "isnt" 'ISNT) (LIST "leave" 'LEAVE) + (LIST "module" 'MODULE) (LIST "namespace" 'NAMESPACE) + (LIST "of" 'OF) (LIST "or" 'OR) (LIST "repeat" 'REPEAT) + (LIST "return" 'RETURN) (LIST "structure" 'STRUCTURE) + (LIST "then" 'THEN) (LIST "throw" 'THROW) (LIST "try" 'TRY) + (LIST "until" 'UNTIL) (LIST "where" 'WHERE) + (LIST "while" 'WHILE) (LIST "." 'DOT) (LIST ":" 'COLON) + (LIST "::" 'COLON-COLON) (LIST "," 'COMMA) (LIST ";" 'SEMICOLON) (LIST "*" 'TIMES) (LIST "**" 'POWER) (LIST "/" 'SLASH) (LIST "+" 'PLUS) (LIST "-" 'MINUS) (LIST "<" 'LT) (LIST ">" 'GT) (LIST "<=" 'LE) (LIST ">=" 'GE) diff --git a/src/boot/strap/translator.clisp b/src/boot/strap/translator.clisp index d7fb9f62..59251588 100644 --- a/src/boot/strap/translator.clisp +++ b/src/boot/strap/translator.clisp @@ -1307,6 +1307,8 @@ (EVAL (LIST (|bfColonColon| 'FFI 'DEFAULT-FOREIGN-LIBRARY) |m|))) ((|%hasFeature| :ECL) (EVAL (LIST (|bfColonColon| 'FFI 'LOAD-FOREIGN-LIBRARY) |m|))) + ((|%hasFeature| :CLOZURE) + (EVAL (LIST (|bfColonColon| 'CCL 'OPEN-SHARED-LIBRARY) |m|))) (T (|coreError| "don't know how to load a dynamically linked module")))) |