From 226abedbf8364069e453291e655d6967098da47f Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Fri, 17 Aug 2018 16:02:55 +0200 Subject: from_bytes --- modules/language/python/bytes.scm | 15 +++++++++++++ modules/language/python/module/_python.scm | 2 +- modules/language/python/number.scm | 34 +++++++++++++++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/modules/language/python/bytes.scm b/modules/language/python/bytes.scm index 494fd28..8cca953 100644 --- a/modules/language/python/bytes.scm +++ b/modules/language/python/bytes.scm @@ -1278,6 +1278,21 @@ (slot-set! out 'd 1) out)) +(define-method (wrap-in (s )) + (let ((out (make ))) + (slot-set! out 'bytes (slot-ref s 'bytes)) + (slot-set! out 'i 0) + (slot-set! out 'd 1) + out)) + +(define-method (wrap-in (s )) + (let ((out (make ))) + (slot-set! out 'vec (slot-ref s 'vec)) + (slot-set! out 'n (slot-ref s 'n)) + (slot-set! out 'i 0) + (slot-set! out 'd 1) + out)) + (define-method (py-reversed (s )) (let ((out (make ))) (slot-set! out 'bytes (slot-ref s 'bytes)) diff --git a/modules/language/python/module/_python.scm b/modules/language/python/module/_python.scm index 46f840e..11d6710 100644 --- a/modules/language/python/module/_python.scm +++ b/modules/language/python/module/_python.scm @@ -39,7 +39,7 @@ SyntaxError bool compile len dir next dict None property range tuple bytes bytearray eval locals globals - exec type object open __import__ + exec type object open __import__ frozenset Warning BytesWarning DeprecationWarning ) diff --git a/modules/language/python/number.scm b/modules/language/python/number.scm index b51cd6b..e25c612 100644 --- a/modules/language/python/number.scm +++ b/modules/language/python/number.scm @@ -4,7 +4,10 @@ #:use-module (language python hash) #:use-module (language python list) #:use-module (language python try) + #:use-module (language python for) + #:use-module (language python def) #:use-module (language python exceptions) + #:use-module (language python bytes) #:use-module (language python persist) #:export (py-int py-float py-complex py-/ py-logand py-logior py-logxor py-abs py-trunc @@ -307,6 +310,35 @@ (apply write (slot-ref o 'x) l)) (define-python-class int ( ) + (define from_bytes + (class-method + (lam (self bytes byteorder (= signed #f)) + (for ((x : bytes)) ((l '())) + (cons + (let ((i (if (and (number? x) (integer? x)) + x + (list-ref (bv-scm x) 0)))) + (if (not (and (number? i) (integer? i) + (>= i 0) (<= i 356))) + (raise (ValueError "wrong bytevector in from_bytes")) + i)) + l) + #:final + (begin + (if (equal? byteorder "big") + (set! l (reverse l))) + (let lp ((s 0) (i 0) (l l)) + (if (pair? l) + (let ((x (car l))) + (if (null? (cdr l)) + (if (and signed (not (= 0 (logand x #x80)))) + (set! x (logand x #x7f)) + (set! signed #f))) + (lp (logior s (ash x i)) (+ i 8) (cdr l))) + (if signed + (let ((mask (ash 1 (- i 1)))) + (- s mask)) + s)))))))) (define __new__ (letrec ((__new__ (case-lambda @@ -440,7 +472,7 @@ __rpow__ __rrshift__ __rshift__ __rsub__ __rtruediv__ __rxor__ __setattr__ __sizeof__ __str__ __sub__ __subclasshook__ __truediv__ __trunc__ __xor__ - bit_length conjugate denominator imag numerator + bit_length conjugate denominator imag numerator from_bytes real))))) (pylist-sort! l) l)) -- cgit v1.2.3