diff --git a/compiler/kernel-primitives.rkt b/compiler/kernel-primitives.rkt index d207226..1141792 100644 --- a/compiler/kernel-primitives.rkt +++ b/compiler/kernel-primitives.rkt @@ -95,6 +95,8 @@ 'make-hasheq 'hash-ref 'hash-set! + 'equal-hash-code + )) (define-predicate KernelPrimitiveName? KernelPrimitiveName) diff --git a/js-assembler/runtime-src/baselib-bytes.js b/js-assembler/runtime-src/baselib-bytes.js index a8500c2..3d701c0 100644 --- a/js-assembler/runtime-src/baselib-bytes.js +++ b/js-assembler/runtime-src/baselib-bytes.js @@ -63,7 +63,7 @@ Bytes.prototype.hashCode = function(depth) { var i; var k = baselib.hashes.getEqualHashCode('Bytes'); - for (i = 0; i < n; i++) { + for (i = 0; i < this.bytes.length; i++) { k += this.bytes[i]; k = baselib.hashes.hashMix(k); } diff --git a/js-assembler/runtime-src/baselib-hashes.js b/js-assembler/runtime-src/baselib-hashes.js index aa59f33..4ee70ea 100644 --- a/js-assembler/runtime-src/baselib-hashes.js +++ b/js-assembler/runtime-src/baselib-hashes.js @@ -199,7 +199,7 @@ return 1; } - if (typeof (x) === 'object' && typeof (y) === 'object' && + if (typeof(x) === 'object' && typeof(x.hashCode) === 'function') { return x.hashCode(depth + 1); } diff --git a/js-assembler/runtime-src/baselib-primitives.js b/js-assembler/runtime-src/baselib-primitives.js index e9ce002..7cf7019 100644 --- a/js-assembler/runtime-src/baselib-primitives.js +++ b/js-assembler/runtime-src/baselib-primitives.js @@ -2591,6 +2591,15 @@ return hash.containsKey(key); }); + installPrimitiveProcedure( + 'equal-hash-code', + 1, + function(M) { + return baselib.hashes.getEqualHashCode(checkAny(M, 'equal-hash-code', 0)); + }); + + + exports['Primitives'] = Primitives; exports['installPrimitiveProcedure'] = installPrimitiveProcedure; diff --git a/lang/kernel.rkt b/lang/kernel.rkt index 2e751cd..135d78a 100644 --- a/lang/kernel.rkt +++ b/lang/kernel.rkt @@ -155,6 +155,8 @@ make-hasheq hash-ref hash-set! + equal-hash-code + ;; Kernel inlinable diff --git a/tests/more-tests/hash-code.rkt b/tests/more-tests/hash-code.rkt index e5b4739..cbb3ed2 100644 --- a/tests/more-tests/hash-code.rkt +++ b/tests/more-tests/hash-code.rkt @@ -1,14 +1,51 @@ #lang planet dyoo/whalesong/base +(require (planet dyoo/whalesong/lang/private/shared)) ;; boxes +(equal-hash-code (box 42)) + ;; bytes +(equal-hash-code #"testing") ;; chars + +(equal-hash-code #\A) +(equal-hash-code #\B) ;; hashes + +(equal-hash-code (make-hash '((1 . x) + (2 . y) + (3 . z)))) +(define ht (make-hash)) +(hash-set! ht 'self ht) +(hash-set! ht 'foo 4) +(equal-hash-code ht) + ;; keywords +; + ;; lists +(equal-hash-code (list 1 2 3 4 5)) +(equal-hash-code (shared ([a (cons 1 b)] + [b (cons 2 a)]) + a)) + + ;; paths +; ;; placeholders +;; + ;; strings +(equal-hash-code "Hello world") + ;; structs +(define-struct thing (name age) #:mutable) +(equal-hash-code (make-thing "danny" 32)) +(equal-hash-code (shared ([a (make-thing a a)]) a)) + ;; symbols -;; vectors \ No newline at end of file +(equal-hash-code 'hello) + +;; vectors +(equal-hash-code #(1 2 3 4 5)) +(equal-hash-code (shared ([v (vector 1 2 v 3 v)]) v)) diff --git a/version.rkt b/version.rkt index 70734d3..e35c42b 100644 --- a/version.rkt +++ b/version.rkt @@ -6,4 +6,4 @@ (provide version) (: version String) -(define version "1.55") +(define version "1.56")