summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-08-17 16:02:55 +0200
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>2018-08-17 16:02:55 +0200
commit226abedbf8364069e453291e655d6967098da47f (patch)
tree2c1adc4f0a194e8d257f85998791764412eb963c
parent9888817163554b3b9013bc26659b5b6854e6d61e (diff)
from_bytes
-rw-r--r--modules/language/python/bytes.scm15
-rw-r--r--modules/language/python/module/_python.scm2
-rw-r--r--modules/language/python/number.scm34
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 <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))
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 (<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
@@ -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))