From 3c6beba19730ea86d423a9970fe6a600fe3c3ef3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20V=C3=A1zquez?= Date: Sun, 20 Jan 2013 16:37:22 +0000 Subject: [PATCH] Array out-of-range checks --- ecmalisp.lisp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ecmalisp.lisp b/ecmalisp.lisp index c7097c6..de2fe68 100644 --- a/ecmalisp.lisp +++ b/ecmalisp.lisp @@ -846,6 +846,7 @@ (ecase (%read-char stream) (#\' (list 'function (ls-read stream))) + (#\( (list-to-vector (%read-list stream))) (#\\ (let ((cname (concat (string (%read-char stream)) @@ -1819,10 +1820,17 @@ "return typeof x === 'object' && 'length' in x;"))) (define-builtin aref (array n) - (concat "(" array ")[" n "]")) + (js!selfcall + "var x = " "(" array ")[" n "];" *newline* + "if (x === undefined) throw 'Out of range';" *newline* + "return x;" *newline*)) (define-builtin aset (array n value) - (concat "(" array ")[" n "] = " value)) + (js!selfcall + "var x = " array ";" *newline* + "var i = " n ";" *newline* + "if (i < 0 || i >= x.length) throw 'Out of range';" *newline* + "return x[i] = " value ";" *newline*)) (defun macro (x) -- 1.7.10.4