from_bytes
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Fri, 17 Aug 2018 14:02:55 +0000 (16:02 +0200)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Fri, 17 Aug 2018 14:02:55 +0000 (16:02 +0200)
modules/language/python/bytes.scm
modules/language/python/module/_python.scm
modules/language/python/number.scm

index 494fd287d1314f386bfc9e89c15448e95a496472..8cca953feb20b1ec4beb66b597aca2df89ab4ca0 100644 (file)
     (slot-set! out 'd   1)
     out))
 
+(define-method (wrap-in (s <py-bytes>))
+  (let ((out (make <bytes-iter>)))
+    (slot-set! out 'bytes (slot-ref s 'bytes))
+    (slot-set! out 'i   0)
+    (slot-set! out 'd   1)
+    out))
+
+(define-method (wrap-in (s <py-bytearray>))
+  (let ((out (make <bytes-iter>)))
+    (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 <py-bytes>))
   (let ((out (make <bytes-iter>)))
     (slot-set! out 'bytes (slot-ref s 'bytes))
index 46f840e698e1a8d65e431f14d92001e4abb82108..11d6710ea79fd565ff986d04f9a9d489bb122eab 100644 (file)
@@ -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
                              )
   
index b51cd6b2f999abe5d1db23a82b72b50225d91ad2..e25c6122094a1597df706a64154086e906170aa1 100644 (file)
@@ -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
   (apply write (slot-ref o 'x) l))
 
 (define-python-class int (<py> <py-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
                          __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))