From 6c715d9b21d64a8d6e46563d238c5526cab811a3 Mon Sep 17 00:00:00 2001 From: dos-reis Date: Mon, 15 Oct 2007 07:32:38 +0000 Subject: remove more pamphlets from interp/ --- src/interp/hashcode.boot | 111 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/interp/hashcode.boot (limited to 'src/interp/hashcode.boot') diff --git a/src/interp/hashcode.boot b/src/interp/hashcode.boot new file mode 100644 index 00000000..bcd1a554 --- /dev/null +++ b/src/interp/hashcode.boot @@ -0,0 +1,111 @@ +-- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. +-- All rights reserved. +-- Copyright (C) 2007, Gabriel Dos Reis. +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions are +-- met: +-- +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- +-- - Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- +-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the +-- names of its contributors may be used to endorse or promote products +-- derived from this software without specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +-- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +)package "BOOT" + +-- Type hasher for old compiler style type names which produces a hash code +-- compatible with the asharp compiler. Takes a hard error if the type +-- is parameterized, but has no constructor modemap. +getDomainHash dom == SPADCALL(CDR dom, (CAR dom).4) + +hashType(type, percentHash) == + SYMBOLP type => + type = '$ => percentHash + type = "%" => percentHash + hashString SYMBOL_-NAME type + STRINGP type => hashCombine(hashString type, + hashString('"Enumeration")) + type is ['QUOTE, val] => hashType(val, percentHash) + type is [dom] => hashString SYMBOL_-NAME dom + type is ['_:, ., type2] => hashType(type2, percentHash) + isDomain type => getDomainHash type + [op, :args] := type + hash := hashString SYMBOL_-NAME op + op = 'Mapping => + hash := hashString '"->" + [retType, :mapArgs] := args + for arg in mapArgs repeat + hash := hashCombine(hashType(arg, percentHash), hash) + retCode := hashType(retType, percentHash) + EQL(retCode, $VoidHash) => hash + hashCombine(retCode, hash) + op = 'Enumeration => + for arg in args repeat + hash := hashCombine(hashString(STRING arg), hash) + hash + op in $DomainsWithoutLisplibs => + for arg in args repeat + hash := hashCombine(hashType(arg, percentHash), hash) + hash + + cmm := CDDAR getConstructorModemap(op) + cosig := CDR GETDATABASE(op, 'COSIG) + for arg in args for c in cosig for ct in cmm repeat + if c then + hash := hashCombine(hashType(arg, percentHash), hash) + else + hash := hashCombine(7, hash) +-- !!! If/when asharp hashes values using their type, use instead +-- ctt := EQSUBSTLIST(args, $FormalMapVariableList, ct) +-- hash := hashCombine(hashType(ctt, percentHash), hash) + + + hash + +--The following are in cfuns.lisp +$hashModulus := 1073741789 -- largest 30-bit prime + +-- Produce a 30-bit hash code. This function must produce the same codes +-- as the asharp string hasher in src/strops.c +hashString str == + h := 0 + for i in 0..#str-1 repeat + j := CHAR_-CODE char str.i + h := LOGXOR(h, ASH(h, 8)) + h := h + j + 200041 + h := LOGAND(h, 1073741823) -- 0x3FFFFFFF + REM(h, $hashModulus) + +-- Combine two hash codes to make a new one. Must be the same as in +-- the hashCombine function in aslib/runtime.as in asharp. +hashCombine(hash1, hash2) == + MOD(ASH(LOGAND(hash2, 16777215), 6) + hash1, $hashModulus) + + +$VoidHash := hashString '"Void" + + +-- following two lines correct bad coSig properties due to SubsetCategory +--putConstructorProperty('LocalAlgebra,'coSig,'(NIL T T T)) +--putConstructorProperty('Localize,'coSig,'(NIL T T T)) -- cgit v1.2.3