2
0
Эх сурвалжийг харах

Rewrite errors.js in Oberon.

Vladislav Folts 11 жил өмнө
parent
commit
3625c91e07

+ 2 - 5
src/context.js

@@ -2,7 +2,7 @@
 
 
 var Cast = require("cast.js");
 var Cast = require("cast.js");
 var Code = require("code.js");
 var Code = require("code.js");
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors.js");
 var Module = require("module.js");
 var Module = require("module.js");
 var op = require("operator.js");
 var op = require("operator.js");
 var Parser = require("parser.js");
 var Parser = require("parser.js");
@@ -111,10 +111,7 @@ var ChainedContext = Class.extend({
     genTypeName: function(){return this.__parent.genTypeName();},
     genTypeName: function(){return this.__parent.genTypeName();},
     genVarName: function(id){return this.__parent.genVarName(id);},
     genVarName: function(id){return this.__parent.genVarName(id);},
     qualifyScope: function(scope){return this.__parent.qualifyScope(scope);},
     qualifyScope: function(scope){return this.__parent.qualifyScope(scope);},
-    rtl: function(){return this.__parent.rtl();},
-    
-    // called from oberon code
-    raiseException: function(s){throw new Errors.Error(s);}
+    rtl: function(){return this.__parent.rtl();}
 });
 });
 
 
 exports.Integer = ChainedContext.extend({
 exports.Integer = ChainedContext.extend({

+ 0 - 20
src/errors.js

@@ -1,20 +0,0 @@
-"use strict";
-/*
-do not use Class here - IE8 does not understand overloeded toString method (using Class.extend).
-
-var Class = require("rtl.js").Class;
-
-exports.Error = Class.extend({
-	init: function CompileError(msg) {this.__msg = msg;},
-	toString: function(){return this.__msg;}
-});
-*/
-function CompileError(msg){
-    this.__msg = msg;
-}
-
-CompileError.prototype.toString = function(){
-    return this.__msg;
-};
-
-exports.Error = CompileError;

+ 1 - 1
src/module.js

@@ -1,7 +1,7 @@
 "use strict";
 "use strict";
 
 
 var Code = require("code.js");
 var Code = require("code.js");
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var Procedure = require("procedure.js");
 var Procedure = require("procedure.js");
 var Symbol = require("symbol.js");
 var Symbol = require("symbol.js");
 var Type = require("type.js");
 var Type = require("type.js");

+ 15 - 0
src/oberon.js/Errors.js

@@ -0,0 +1,15 @@
+var RTL$ = require("rtl.js");
+var JS = GLOBAL;
+var JsString = require("JsString.js");
+var Error = RTL$.extend({
+	init: function Error(){
+	}
+});
+
+function raise(msg/*Type*/){
+	throw new Error(msg);
+}
+Error = function(msg){this.__msg = msg;};
+Error.prototype.toString = function(){return this.__msg;};;
+exports.Error = Error;
+exports.raise = raise;

+ 3 - 3
src/oberon.js/Lexer.js

@@ -1,6 +1,7 @@
 var RTL$ = require("rtl.js");
 var RTL$ = require("rtl.js");
 var JS = GLOBAL;
 var JS = GLOBAL;
 var JsString = require("JsString.js");
 var JsString = require("JsString.js");
+var Errors = require("Errors.js");
 var Stream = require("Stream.js");
 var Stream = require("Stream.js");
 var quote = "\"";
 var quote = "\"";
 var commentBegin = "(*";
 var commentBegin = "(*";
@@ -14,7 +15,6 @@ var Context = RTL$.extend({
 		this.handleString = null;
 		this.handleString = null;
 		this.handleIdent = null;
 		this.handleIdent = null;
 		this.isLexem = null;
 		this.isLexem = null;
-		this.raiseException = null;
 	}
 	}
 });
 });
 var Literal = RTL$.extend({
 var Literal = RTL$.extend({
@@ -89,7 +89,7 @@ function string(stream/*Type*/, context/*Context*/){
 				}
 				}
 			}
 			}
 			if (s == null || c != 34){
 			if (s == null || c != 34){
-				context.raiseException("unexpected end of string");
+				Errors.raise(JsString.make("unexpected end of string"));
 			}
 			}
 			context.handleString(s);
 			context.handleString(s);
 			result = true;
 			result = true;
@@ -154,7 +154,7 @@ function skipComment(stream/*Type*/, context/*Context*/){
 				if (!skipComment(stream, context)){
 				if (!skipComment(stream, context)){
 					Stream.next(stream, 1);
 					Stream.next(stream, 1);
 					if (Stream.eof(stream)){
 					if (Stream.eof(stream)){
-						context.raiseException("comment was not closed");
+						Errors.raise(JsString.make("comment was not closed"));
 					}
 					}
 				}
 				}
 			} else break;
 			} else break;

+ 15 - 0
src/oberon/Errors.ob

@@ -0,0 +1,15 @@
+MODULE Errors;
+IMPORT JS, JsString;
+
+TYPE Error* = RECORD END;
+
+PROCEDURE raise*(msg: JsString.Type);
+BEGIN
+    JS.do("throw new Error(msg)")
+END raise;
+
+BEGIN
+    (* do not use Rtl.Class here - IE8 does not understand overloeded toString method (using Class.extend). *)
+    JS.do("Error = function(msg){this.__msg = msg;}");
+    JS.do("Error.prototype.toString = function(){return this.__msg;};");
+END Errors.

+ 4 - 5
src/oberon/Lexer.ob

@@ -1,5 +1,5 @@
 MODULE Lexer;
 MODULE Lexer;
-IMPORT JS, JsString, Stream;
+IMPORT JS, JsString, Errors, Stream;
 
 
 CONST
 CONST
     quote = 22X; (* " *)
     quote = 22X; (* " *)
@@ -14,8 +14,7 @@ TYPE
         handleLiteral: PROCEDURE(s: JsString.Type): BOOLEAN;
         handleLiteral: PROCEDURE(s: JsString.Type): BOOLEAN;
         handleString: PROCEDURE(s: JsString.Type);
         handleString: PROCEDURE(s: JsString.Type);
         handleIdent: PROCEDURE(s: JsString.Type);
         handleIdent: PROCEDURE(s: JsString.Type);
-        isLexem: PROCEDURE(): BOOLEAN;
-        raiseException: PROCEDURE(s: ARRAY OF CHAR)
+        isLexem: PROCEDURE(): BOOLEAN
     END;
     END;
 
 
     Literal = POINTER TO RECORD
     Literal = POINTER TO RECORD
@@ -97,7 +96,7 @@ BEGIN
                 END;
                 END;
             END;
             END;
             IF (s = NIL) OR (c # quote) THEN
             IF (s = NIL) OR (c # quote) THEN
-                context.raiseException("unexpected end of string");
+                Errors.raise(JsString.make("unexpected end of string"));
             END;
             END;
             context.handleString(s);
             context.handleString(s);
             result := TRUE;
             result := TRUE;
@@ -166,7 +165,7 @@ BEGIN
             IF ~skipComment(stream, context) THEN
             IF ~skipComment(stream, context) THEN
                 Stream.next(stream, 1);
                 Stream.next(stream, 1);
                 IF Stream.eof(stream) THEN
                 IF Stream.eof(stream) THEN
-                    context.raiseException("comment was not closed");
+                    Errors.raise(JsString.make("comment was not closed"));
                 END
                 END
             END
             END
         END;
         END;

+ 1 - 1
src/oc.js

@@ -3,7 +3,7 @@
 var Class = require("rtl.js").Class;
 var Class = require("rtl.js").Class;
 var Code = require("code.js");
 var Code = require("code.js");
 var Context = require("context.js");
 var Context = require("context.js");
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var Grammar = require("grammar.js");
 var Grammar = require("grammar.js");
 var Lexer = require("oberon.js/lexer.js");
 var Lexer = require("oberon.js/lexer.js");
 var RTL = require("rtl_code.js").RTL;
 var RTL = require("rtl_code.js").RTL;

+ 1 - 1
src/operator.js

@@ -2,7 +2,7 @@
 
 
 var Cast = require("cast.js");
 var Cast = require("cast.js");
 var Code = require("code.js");
 var Code = require("code.js");
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var Type = require("type.js");
 var Type = require("type.js");
 
 
 var precedence = {
 var precedence = {

+ 1 - 1
src/parser.js

@@ -1,7 +1,7 @@
 "use strict";
 "use strict";
 
 
 var assert = require("assert.js").ok;
 var assert = require("assert.js").ok;
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var Lexer = require("oberon.js/lexer.js");
 var Lexer = require("oberon.js/lexer.js");
 var Stream = require("oberon.js/Stream.js");
 var Stream = require("oberon.js/Stream.js");
 
 

+ 1 - 1
src/procedure.js

@@ -3,7 +3,7 @@
 var Cast = require("cast.js");
 var Cast = require("cast.js");
 var Class = require("rtl.js").Class;
 var Class = require("rtl.js").Class;
 var Code = require("code.js");
 var Code = require("code.js");
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var op = require("operator.js");
 var op = require("operator.js");
 var precedence = require("operator.js").precedence;
 var precedence = require("operator.js").precedence;
 var Symbol = require("symbol.js");
 var Symbol = require("symbol.js");

+ 1 - 1
src/scope.js

@@ -1,7 +1,7 @@
 "use strict";
 "use strict";
 
 
 var Class = require("rtl.js").Class;
 var Class = require("rtl.js").Class;
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var Procedure = require("procedure.js");
 var Procedure = require("procedure.js");
 var Symbol = require("symbol.js");
 var Symbol = require("symbol.js");
 var Type = require("type.js");
 var Type = require("type.js");

+ 1 - 1
src/symbol.js

@@ -1,7 +1,7 @@
 "use strict";
 "use strict";
 
 
 var Class = require("rtl.js").Class;
 var Class = require("rtl.js").Class;
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var Type = require("type.js");
 var Type = require("type.js");
 
 
 var Symbol = Class.extend({
 var Symbol = Class.extend({

+ 1 - 1
src/type.js

@@ -1,7 +1,7 @@
 "use strict";
 "use strict";
 
 
 var Class = require("rtl.js").Class;
 var Class = require("rtl.js").Class;
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 
 
 var Id = Class.extend({
 var Id = Class.extend({
     init: function Id(){}
     init: function Id(){}

+ 1 - 1
test/test_unit.js

@@ -4,7 +4,7 @@ var assert = require("assert.js").ok;
 var Class = require("rtl.js").Class;
 var Class = require("rtl.js").Class;
 var Code = require("code.js");
 var Code = require("code.js");
 var Context = require("context.js");
 var Context = require("context.js");
-var Errors = require("errors.js");
+var Errors = require("oberon.js/Errors");
 var Grammar = require("grammar.js");
 var Grammar = require("grammar.js");
 var oc = require("oc.js");
 var oc = require("oc.js");
 var RTL = require("rtl_code.js").RTL;
 var RTL = require("rtl_code.js").RTL;