Przeglądaj źródła

follow up to zero-cost JavaScript strings convertion to ARRAY OF CHAR

Vladislav Folts 11 lat temu
rodzic
commit
69f6f3f8a4
2 zmienionych plików z 13 dodań i 22 usunięć
  1. 5 7
      src/oberon.js/Lexer.js
  2. 8 15
      src/oberon/Lexer.ob

+ 5 - 7
src/oberon.js/Lexer.js

@@ -5,6 +5,8 @@ var Stream = require("Stream.js");
 var quote = "\"";
 var commentBegin = "(*";
 var commentEnd = "*)";
+var reservedWords = "ARRAY IMPORT THEN BEGIN IN TO BY IS TRUE CASE MOD TYPE CONST MODULE UNTIL DIV NIL VAR DO OF WHILE ELSE OR ELSIF POINTER END PROCEDURE FALSE RECORD FOR REPEAT IF RETURN";
+var jsReservedWords = "break case catch continue debugger default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with Math";
 var Context = RTL$.extend({
 	init: function Context(){
 		this.handleChar = null;
@@ -20,8 +22,6 @@ var Literal = RTL$.extend({
 		this.s = RTL$.makeCharArray(1);
 	}
 });
-var reservedWords = null;
-var jsReservedWords = null;
 
 function isDigit(c/*CHAR*/){
 	return c >= 48 && c <= 57;
@@ -98,14 +98,14 @@ function string(stream/*Type*/, context/*Context*/){
 	return result;
 }
 
-function isReservedWorld(s/*Type*/, words/*Type*/){
+function isReservedWorld(s/*Type*/, words/*ARRAY OF CHAR*/){
 	var i = 0;var w = 0;
 	while (true){
-		if (w < JsString.len(words) && i < JsString.len(s) && JsString.at(words, w) == JsString.at(s, i) && (i != 0 || w == 0 || JsString.at(words, w - 1 | 0) == 32)){
+		if (w < words.length && i < JsString.len(s) && words.charCodeAt(w) == JsString.at(s, i) && (i != 0 || w == 0 || words.charCodeAt(w - 1 | 0) == 32)){
 			++w;
 			++i;
 		}
-		else if (w < JsString.len(words) && (i < JsString.len(s) || JsString.at(words, w) != 32)){
+		else if (w < words.length && (i < JsString.len(s) || words.charCodeAt(w) != 32)){
 			++w;
 			i = 0;
 		} else break;
@@ -199,8 +199,6 @@ function literal(l/*Literal*/, stream/*Type*/, context/*Context*/){
 	}
 	return result;
 }
-reservedWords = JsString.make("ARRAY IMPORT THEN BEGIN IN TO BY IS TRUE CASE MOD TYPE CONST MODULE UNTIL DIV NIL VAR DO OF WHILE ELSE OR ELSIF POINTER END PROCEDURE FALSE RECORD FOR REPEAT IF RETURN");
-jsReservedWords = JsString.make("break case catch continue debugger default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with Math");
 exports.digit = digit;
 exports.hexDigit = hexDigit;
 exports.point = point;

+ 8 - 15
src/oberon/Lexer.ob

@@ -5,6 +5,8 @@ CONST
     quote = 22X; (* " *)
     commentBegin = "(*";
     commentEnd = "*)";
+    reservedWords = "ARRAY IMPORT THEN BEGIN IN TO BY IS TRUE CASE MOD TYPE CONST MODULE UNTIL DIV NIL VAR DO OF WHILE ELSE OR ELSIF POINTER END PROCEDURE FALSE RECORD FOR REPEAT IF RETURN";
+    jsReservedWords = "break case catch continue debugger default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with Math"; (* Math is used in generated code for some functions so it is reserved word from code generator standpoint *)
 
 TYPE
     Context = RECORD
@@ -20,10 +22,6 @@ TYPE
         s: ARRAY 1 OF CHAR
     END;
 
-VAR
-    reservedWords: JsString.Type;
-    jsReservedWords: JsString.Type;
-
 PROCEDURE isDigit(c: CHAR): BOOLEAN;
     RETURN (c >= "0") & (c <= "9")
 END isDigit;
@@ -108,18 +106,18 @@ BEGIN
     RETURN result
 END string;
 
-PROCEDURE isReservedWorld(s: JsString.Type; words: JsString.Type): BOOLEAN;
+PROCEDURE isReservedWorld(s: JsString.Type; words: ARRAY OF CHAR): BOOLEAN;
 VAR
     i, w: INTEGER;
 BEGIN
-    WHILE (w < JsString.len(words))
+    WHILE (w < LEN(words))
         & (i < JsString.len(s))
-        & (JsString.at(words, w) = JsString.at(s, i))
-        & ((i # 0) OR (w = 0) OR (JsString.at(words, w - 1) = " ")) DO
+        & (words[w] = JsString.at(s, i))
+        & ((i # 0) OR (w = 0) OR (words[w - 1] = " ")) DO
         INC(w);
         INC(i);
-    ELSIF (w < JsString.len(words)) 
-        & ((i < JsString.len(s)) OR (JsString.at(words, w) # " ")) DO
+    ELSIF (w < LEN(words)) 
+        & ((i < JsString.len(s)) OR (words[w] # " ")) DO
         INC(w);
         i := 0;
     END;
@@ -224,9 +222,4 @@ BEGIN
     RETURN result
 END literal;
 
-BEGIN
-    reservedWords := JsString.make(
-        "ARRAY IMPORT THEN BEGIN IN TO BY IS TRUE CASE MOD TYPE CONST MODULE UNTIL DIV NIL VAR DO OF WHILE ELSE OR ELSIF POINTER END PROCEDURE FALSE RECORD FOR REPEAT IF RETURN");
-    jsReservedWords := JsString.make(
-        "break case catch continue debugger default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with Math"); (* Math is used in generated code for some functions so it is reserved word from code generator standpoint *)
 END Lexer.