shithub: libmujs

Download patch

ref: 8e20fae71a16f5e9564cce2aebec0a1ad8fbf9f4
parent: a3aa9e7dccf3392395789a33048bd2a88a14b565
author: Tor Andersson <tor@ccxvii.net>
date: Sat Jan 18 11:49:00 EST 2014

Don't pass pointless 'sp' pointer throughout lexer now that we use
a real next() function to advance through the source.

--- a/jslex.c
+++ b/jslex.c
@@ -133,17 +133,17 @@
 }
 
 #define PEEK (J->lexchar)
-#define NEXT() next(J, sp)
+#define NEXT() next(J)
 #define ACCEPT(x) (PEEK == x ? (NEXT(), 1) : 0)
 #define EXPECT(x) (ACCEPT(x) || (jsP_error(J, "expected '%c'", x), 0))
 
-static void next(js_State *J, const char **sp)
+static void next(js_State *J)
 {
 	Rune c;
-	(*sp) += chartorune(&c, *sp);
+	J->source += chartorune(&c, J->source);
 	/* consume CR LF as one unit */
 	if (c == '\r' && PEEK == '\n')
-		(*sp)++;
+		++J->source;
 	if (isnewline(c)) {
 		J->line++;
 		c = '\n';
@@ -151,7 +151,7 @@
 	J->lexchar = c;
 }
 
-static void unescape(js_State *J, const char **sp)
+static void unescape(js_State *J)
 {
 	if (ACCEPT('\\')) {
 		if (ACCEPT('u')) {
@@ -193,13 +193,13 @@
 	return J->buf.text;
 }
 
-static inline void lexlinecomment(js_State *J, const char **sp)
+static inline void lexlinecomment(js_State *J)
 {
 	while (PEEK && PEEK != '\n')
 		NEXT();
 }
 
-static inline int lexcomment(js_State *J, const char **sp)
+static inline int lexcomment(js_State *J)
 {
 	/* already consumed initial '/' '*' sequence */
 	while (PEEK != 0) {
@@ -214,7 +214,7 @@
 	return -1;
 }
 
-static inline double lexhex(js_State *J, const char **sp)
+static inline double lexhex(js_State *J)
 {
 	double n = 0;
 	if (!ishex(PEEK))
@@ -226,7 +226,7 @@
 	return n;
 }
 
-static inline double lexinteger(js_State *J, const char **sp)
+static inline double lexinteger(js_State *J)
 {
 	double n = 0;
 	if (!isdec(PEEK))
@@ -238,7 +238,7 @@
 	return n;
 }
 
-static inline double lexfraction(js_State *J, const char **sp)
+static inline double lexfraction(js_State *J)
 {
 	double n = 0;
 	double d = 1;
@@ -250,7 +250,7 @@
 	return n / d;
 }
 
-static inline double lexexponent(js_State *J, const char **sp)
+static inline double lexexponent(js_State *J)
 {
 	double sign;
 	if (ACCEPT('e') || ACCEPT('E')) {
@@ -257,18 +257,18 @@
 		if (ACCEPT('-')) sign = -1;
 		else if (ACCEPT('+')) sign = 1;
 		else sign = 1;
-		return sign * lexinteger(J, sp);
+		return sign * lexinteger(J);
 	}
 	return 0;
 }
 
-static inline int lexnumber(js_State *J, const char **sp)
+static inline int lexnumber(js_State *J)
 {
 	double n;
 
 	if (ACCEPT('0')) {
 		if (ACCEPT('x') || ACCEPT('X')) {
-			J->number = lexhex(J, sp);
+			J->number = lexhex(J);
 			return TK_NUMBER;
 		}
 		if (isdec(PEEK))
@@ -275,18 +275,18 @@
 			return jsP_error(J, "number with leading zero");
 		n = 0;
 		if (ACCEPT('.'))
-			n += lexfraction(J, sp);
-		n *= pow(10, lexexponent(J, sp));
+			n += lexfraction(J);
+		n *= pow(10, lexexponent(J));
 	} else if (ACCEPT('.')) {
 		if (!isdec(PEEK))
 			return '.';
-		n = lexfraction(J, sp);
-		n *= pow(10, lexexponent(J, sp));
+		n = lexfraction(J);
+		n *= pow(10, lexexponent(J));
 	} else {
-		n = lexinteger(J, sp);
+		n = lexinteger(J);
 		if (ACCEPT('.'))
-			n += lexfraction(J, sp);
-		n *= pow(10, lexexponent(J, sp));
+			n += lexfraction(J);
+		n *= pow(10, lexexponent(J));
 	}
 
 	if (isidentifierstart(PEEK))
@@ -296,7 +296,7 @@
 	return TK_NUMBER;
 }
 
-static inline int lexescape(js_State *J, const char **sp)
+static inline int lexescape(js_State *J)
 {
 	int x = 0;
 
@@ -335,7 +335,7 @@
 	return 0;
 }
 
-static inline int lexstring(js_State *J, const char **sp)
+static inline int lexstring(js_State *J)
 {
 	const char *s;
 
@@ -348,7 +348,7 @@
 		if (PEEK == 0 || PEEK == '\n')
 			return jsP_error(J, "string not terminated");
 		if (ACCEPT('\\')) {
-			if (lexescape(J, sp))
+			if (lexescape(J))
 				return jsP_error(J, "malformed escape sequence");
 		} else {
 			textpush(J, PEEK);
@@ -383,7 +383,7 @@
 	}
 }
 
-static int lexregexp(js_State *J, const char **sp)
+static int lexregexp(js_State *J)
 {
 	const char *s;
 	int g, m, i;
@@ -448,7 +448,7 @@
 	}
 }
 
-static int lex(js_State *J, const char **sp)
+static int lex(js_State *J)
 {
 	J->newline = 0;
 
@@ -467,14 +467,14 @@
 
 		if (ACCEPT('/')) {
 			if (ACCEPT('/')) {
-				lexlinecomment(J, sp);
+				lexlinecomment(J);
 				continue;
 			} else if (ACCEPT('*')) {
-				if (lexcomment(J, sp))
+				if (lexcomment(J))
 					return jsP_error(J, "multi-line comment not terminated");
 				continue;
 			} else if (isregexpcontext(J->lasttoken)) {
-				return lexregexp(J, sp);
+				return lexregexp(J);
 			} else if (ACCEPT('=')) {
 				return TK_DIV_ASS;
 			} else {
@@ -483,7 +483,7 @@
 		}
 
 		if (PEEK >= '0' && PEEK <= '9') {
-			return lexnumber(J, sp);
+			return lexnumber(J);
 		}
 
 		switch (PEEK) {
@@ -501,10 +501,10 @@
 
 		case '\'':
 		case '"':
-			return lexstring(J, sp);
+			return lexstring(J);
 
 		case '.':
-			return lexnumber(J, sp);
+			return lexnumber(J);
 
 		case '<':
 			NEXT();
@@ -606,17 +606,17 @@
 		}
 
 		/* Handle \uXXXX escapes in identifiers */
-		unescape(J, sp);
+		unescape(J);
 		if (isidentifierstart(PEEK)) {
 			textinit(J);
 			textpush(J, PEEK);
 
 			NEXT();
-			unescape(J, sp);
+			unescape(J);
 			while (isidentifierpart(PEEK)) {
 				textpush(J, PEEK);
 				NEXT();
-				unescape(J, sp);
+				unescape(J);
 			}
 
 			textend(J);
@@ -636,10 +636,10 @@
 	J->source = source;
 	J->line = 1;
 	J->lasttoken = 0;
-	next(J, &J->source); /* load first lookahead character */
+	next(J); /* load first lookahead character */
 }
 
 int jsP_lex(js_State *J)
 {
-	return J->lasttoken = lex(J, &J->source);
+	return J->lasttoken = lex(J);
 }