From 8258d4b8db5c12dbfe0f9a876b02a48f71824b18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20V=C3=A1zquez=20P=C3=BAa?= Date: Sun, 20 Jun 2021 21:52:28 +0200 Subject: [PATCH] WIP: Experimental support for integers as JS bigints --- src/compiler/compiler.lisp | 30 +++++++++++++++++++----------- src/prelude.js | 6 ++++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/compiler/compiler.lisp b/src/compiler/compiler.lisp index c1ca6291..1aa1455b 100644 --- a/src/compiler/compiler.lisp +++ b/src/compiler/compiler.lisp @@ -575,7 +575,7 @@ (defun literal (sexp &optional recursive) (cond - ((integerp sexp) sexp) + ((integerp sexp) `(call-internal |n| ,sexp)) ((floatp sexp) sexp) ((characterp sexp) (string sexp)) (t @@ -1067,12 +1067,13 @@ (with-collector (fargs) (with-collector (prelude) (dolist (x args) - (if (or (floatp x) (numberp x)) - (collect-fargs x) + (if (or (floatp x) (integerp x)) + (collect-fargs (convert x)) (let ((v (make-symbol (concat "x" (integer-to-string (incf counter)))))) (collect-fargs v) (collect-prelude `(var (,v ,(convert x)))) - (collect-prelude `(if (!= (typeof ,v) "number") + (collect-prelude `(if (and (!= (typeof ,v) "number") + (!= (typeof ,v) "bigint")) (throw "Not a number!")))))) `(selfcall (progn ,@prelude) @@ -1155,13 +1156,17 @@ (define-builtin-comparison /= !=) (define-builtin numberp (x) - (convert-to-bool `(== (typeof ,x) "number"))) + (convert-to-bool `(or (== (typeof ,x) "number") + (== (typeof ,x) "bigint")))) (define-builtin %integer-p (x) - (convert-to-bool `(method-call |Number| "isInteger" ,x))) + (convert-to-bool `(or (method-call |Number| "isInteger" ,x) + (== (typeof ,x) "bigint")))) (define-builtin %truncate (x) -`(method-call |Math| "trunc" ,x)) + `(if (== (typeof ,x) "bigint") + ,x + (method-call |Math| "trunc" ,x))) (define-builtin %floor (x) `(method-call |Math| "floor" ,x)) @@ -1170,11 +1175,14 @@ `(method-call |Math| "ceil" ,x)) (define-builtin expt (x y) - `(method-call |Math| "pow" ,x ,y)) + `(method-call |Math| "pow" (call |Number| ,x) (call |Number| ,y))) (define-builtin sqrt (x) `(method-call |Math| "sqrt" ,x)) +(define-builtin float (x) + `(call |Number| ,x)) + (define-builtin float-to-string (x) `(call-internal |make_lisp_string| (method-call ,x |toString|))) @@ -1331,14 +1339,14 @@ (define-builtin make-storage-vector (n) `(selfcall (var (r #())) - (= (get r "length") ,n) + (= (get r "length") (call |Number| ,n)) (return r))) (define-builtin storage-vector-size (x) - `(get ,x "length")) + `(call |BigInt| (get ,x "length"))) (define-builtin resize-storage-vector (vector new-size) - `(= (get ,vector "length") ,new-size)) + `(= (get ,vector "length") (call |Number| ,new-size))) (define-builtin storage-vector-ref (vector n) `(selfcall diff --git a/src/prelude.js b/src/prelude.js index 2bd9b390..a8b57fcd 100644 --- a/src/prelude.js +++ b/src/prelude.js @@ -60,6 +60,11 @@ internals.forcemv = function(x) { }; +internals.n = function(n) { + return BigInt(n); +} + + // // Workaround the problems with `new` for arbitrary number of // arguments. Some primitive constructors (like Date) differ if they @@ -195,6 +200,7 @@ internals.char_to_codepoint = function(ch) { }; internals.char_from_codepoint = function(x) { + x = Number(x) if (x <= 0xFFFF) { return String.fromCharCode(x); } else {