瀏覽代碼

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

Vladislav Folts 11 年之前
父節點
當前提交
69f6f3f8a4
共有 2 個文件被更改,包括 13 次插入22 次删除
  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 quote = "\"";
 var commentBegin = "(*";
 var commentBegin = "(*";
 var commentEnd = "*)";
 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({
 var Context = RTL$.extend({
 	init: function Context(){
 	init: function Context(){
 		this.handleChar = null;
 		this.handleChar = null;
@@ -20,8 +22,6 @@ var Literal = RTL$.extend({
 		this.s = RTL$.makeCharArray(1);
 		this.s = RTL$.makeCharArray(1);
 	}
 	}
 });
 });
-var reservedWords = null;
-var jsReservedWords = null;
 
 
 function isDigit(c/*CHAR*/){
 function isDigit(c/*CHAR*/){
 	return c >= 48 && c <= 57;
 	return c >= 48 && c <= 57;
@@ -98,14 +98,14 @@ function string(stream/*Type*/, context/*Context*/){
 	return result;
 	return result;
 }
 }
 
 
-function isReservedWorld(s/*Type*/, words/*Type*/){
+function isReservedWorld(s/*Type*/, words/*ARRAY OF CHAR*/){
 	var i = 0;var w = 0;
 	var i = 0;var w = 0;
 	while (true){
 	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;
 			++w;
 			++i;
 			++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;
 			++w;
 			i = 0;
 			i = 0;
 		} else break;
 		} else break;
@@ -199,8 +199,6 @@ function literal(l/*Literal*/, stream/*Type*/, context/*Context*/){
 	}
 	}
 	return result;
 	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.digit = digit;
 exports.hexDigit = hexDigit;
 exports.hexDigit = hexDigit;
 exports.point = point;
 exports.point = point;

+ 8 - 15
src/oberon/Lexer.ob

@@ -5,6 +5,8 @@ CONST
     quote = 22X; (* " *)
     quote = 22X; (* " *)
     commentBegin = "(*";
     commentBegin = "(*";
     commentEnd = "*)";
     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
 TYPE
     Context = RECORD
     Context = RECORD
@@ -20,10 +22,6 @@ TYPE
         s: ARRAY 1 OF CHAR
         s: ARRAY 1 OF CHAR
     END;
     END;
 
 
-VAR
-    reservedWords: JsString.Type;
-    jsReservedWords: JsString.Type;
-
 PROCEDURE isDigit(c: CHAR): BOOLEAN;
 PROCEDURE isDigit(c: CHAR): BOOLEAN;
     RETURN (c >= "0") & (c <= "9")
     RETURN (c >= "0") & (c <= "9")
 END isDigit;
 END isDigit;
@@ -108,18 +106,18 @@ BEGIN
     RETURN result
     RETURN result
 END string;
 END string;
 
 
-PROCEDURE isReservedWorld(s: JsString.Type; words: JsString.Type): BOOLEAN;
+PROCEDURE isReservedWorld(s: JsString.Type; words: ARRAY OF CHAR): BOOLEAN;
 VAR
 VAR
     i, w: INTEGER;
     i, w: INTEGER;
 BEGIN
 BEGIN
-    WHILE (w < JsString.len(words))
+    WHILE (w < LEN(words))
         & (i < JsString.len(s))
         & (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(w);
         INC(i);
         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);
         INC(w);
         i := 0;
         i := 0;
     END;
     END;
@@ -224,9 +222,4 @@ BEGIN
     RETURN result
     RETURN result
 END literal;
 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.
 END Lexer.