Browse Source

Merge pull request #62 from gokr/master

Some more fixes to be integrated
Nicolas Petton 13 years ago
parent
commit
1519414fe4
6 changed files with 231 additions and 40 deletions
  1. 1 1
      LICENSE
  2. 3 0
      bin/server.bat
  3. 17 3
      js/Kernel.deploy.js
  4. 34 19
      js/Kernel.js
  5. 135 12
      server/server.js
  6. 41 5
      st/Kernel.st

+ 1 - 1
LICENSE

@@ -1,7 +1,7 @@
 Copyright (C) 2011 by Nicolas Petton <petton.nicolas@gmail.com>
 Copyright (C) 2011 Amber contributors https://github.com/NicolasPetton/amber/contributors
 
-Parts of Amber take ideas from Clamato (http://clamato.net), written by Avi Byrant.
+Parts of Amber take ideas from Clamato (http://clamato.net), written by Avi Bryant.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal

+ 3 - 0
bin/server.bat

@@ -0,0 +1,3 @@
+@cd "%~dp0\.." 
+@node server\server.js
+

File diff suppressed because it is too large
+ 17 - 3
js/Kernel.deploy.js


File diff suppressed because it is too large
+ 34 - 19
js/Kernel.js


+ 135 - 12
server/server.js

@@ -33,6 +33,19 @@
    |
    ==================================================================== */
 
+/* Make that console is defined */
+
+if (typeof console === "undefined") {
+    this.console = {
+	log: function() {},
+	warn: function() {},
+	info: function() {},
+	debug: function() {},
+	error: function() {},
+    };
+}
+
+
 /* Smalltalk constructors definition */
 
 function SmalltalkObject(){};
@@ -48,13 +61,27 @@ function SmalltalkNil(){};
 function Smalltalk(){
 
     var st = this;
-    this.thisContext = undefined;
 
+    /* This is the current call context object. While it is publicly available,
+       Use smalltalk.getThisContext() instead which will answer a safe copy of 
+       the current context */
+
+    st.thisContext = undefined;
+
+    /* List of all reserved words in JavaScript. They may not be used as variables
+       in Smalltalk. */
+
+    st.reservedWords = ['break', 'case', 'catch', 'class', 'continue', 'debugger', 
+			'default', 'delete', 'do', 'else', 'finally', 'for', 'function', 
+			'if', 'in', 'instanceof', 'new', 'private', 'protected', 
+			'public', 'return', 'static', 'switch', 'this', 'throw',
+			'try', 'typeof', 'var', 'void', 'while', 'with', 'yield'];
     
     /* We hold all Packages in a separate Object */
+
     st.packages = {};
 
-    /* Smalltalk Package object. To add a Package, use smalltalk.addPackage() */
+    /* Smalltalk package creation. To add a Package, use smalltalk.addPackage() */
 
     function pkg(spec) {
 	var that      = new SmalltalkPackage();
@@ -345,9 +372,7 @@ function Smalltalk(){
 	   Example:
 	   "self do: aBlock with: anObject" -> "self.do(aBlock, anObject)" */
 
-	var jsSelector = selector
-	    .replace(/^_/, '')
-	    .replace(/_.*/g, '');
+	var jsSelector = selector._asJavaScriptSelector();
 	var jsProperty = receiver[jsSelector];
 	if(typeof jsProperty === "function") {
 	    return jsProperty.apply(receiver, args);
@@ -1323,6 +1348,22 @@ referencedClasses: []
 }),
 smalltalk.Object);
 
+smalltalk.addMethod(
+unescape('_deprecatedAPI'),
+smalltalk.method({
+selector: unescape('deprecatedAPI'),
+category: 'error handling',
+fn: function (){
+var self=this;
+smalltalk.send((typeof console == 'undefined' ? nil : console), "_warn_", [smalltalk.send(smalltalk.send(smalltalk.send((smalltalk.getThisContext()), "_home", []), "_asString", []), "__comma", [unescape("%20is%20deprecated%21")])]);
+return self;},
+args: [],
+source: unescape('deprecatedAPI%0A%09%22Just%20a%20simple%20way%20to%20deprecate%20methods.%0A%09%23deprecatedAPI%20is%20in%20the%20%27error%20handling%27%20protocol%20even%20if%20it%20doesn%27t%20throw%20an%20error%2C%0A%09but%20it%20could%20in%20the%20future.%22%0A%09console%20warn%3A%20thisContext%20home%20asString%2C%20%27%20is%20deprecated%21%27'),
+messageSends: ["warn:", unescape("%2C"), "asString", "home"],
+referencedClasses: []
+}),
+smalltalk.Object);
+
 
 smalltalk.addMethod(
 unescape('_initialize'),
@@ -1593,6 +1634,22 @@ referencedClasses: []
 }),
 smalltalk.Smalltalk);
 
+smalltalk.addMethod(
+unescape('_reservedWords'),
+smalltalk.method({
+selector: unescape('reservedWords'),
+category: 'accessing',
+fn: function (){
+var self=this;
+return self.reservedWords;
+return self;},
+args: [],
+source: unescape('reservedWords%0A%09%22JavaScript%20reserved%20words%22%0A%09%3Creturn%20self.reservedWords%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.Smalltalk);
+
 
 smalltalk.Smalltalk.klass.iVarNames = ['current'];
 smalltalk.addMethod(
@@ -4132,10 +4189,10 @@ selector: unescape('%3C%3D'),
 category: 'comparing',
 fn: function (aDate){
 var self=this;
-self <= aDate;
+return self <= aDate;
 return self;},
 args: ["aDate"],
-source: unescape('%3C%3D%20aDate%0A%09%3Cself%20%3C%3D%20aDate%3E'),
+source: unescape('%3C%3D%20aDate%0A%09%3Creturn%20self%20%3C%3D%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -4148,10 +4205,10 @@ selector: unescape('%3E%3D'),
 category: 'comparing',
 fn: function (aDate){
 var self=this;
-self >= aDate;
+return self >= aDate;
 return self;},
 args: ["aDate"],
-source: unescape('%3E%3D%20aDate%0A%09%3Cself%20%3E%3E%3D%20aDate%3E'),
+source: unescape('%3E%3D%20aDate%0A%09%3Creturn%20self%20%3E%3E%3D%20aDate%3E'),
 messageSends: [],
 referencedClasses: []
 }),
@@ -6187,6 +6244,22 @@ referencedClasses: []
 }),
 smalltalk.String);
 
+smalltalk.addMethod(
+unescape('_asJavaScriptSelector'),
+smalltalk.method({
+selector: unescape('asJavaScriptSelector'),
+category: 'converting',
+fn: function (){
+var self=this;
+return String(self.replace(/^_/, '').replace(/_.*/, ''));
+return self;},
+args: [],
+source: unescape('asJavaScriptSelector%0A%09%3Creturn%20String%28self.replace%28/%5E_/%2C%20%27%27%29.replace%28/_.*/%2C%20%27%27%29%29%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.String);
+
 
 smalltalk.addMethod(
 unescape('_streamClass'),
@@ -8526,6 +8599,22 @@ referencedClasses: []
 }),
 smalltalk.Point);
 
+smalltalk.addMethod(
+unescape('__eq'),
+smalltalk.method({
+selector: unescape('%3D'),
+category: 'arithmetic',
+fn: function (aPoint){
+var self=this;
+return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_class", []), "__eq", [smalltalk.send(self, "_class", [])]), "_and_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.send(aPoint, "_x", []), "__eq", [smalltalk.send(self, "_x", [])]), "_&", [smalltalk.send(smalltalk.send(aPoint, "_y", []), "__eq", [smalltalk.send(self, "_y", [])])]);})]);
+return self;},
+args: ["aPoint"],
+source: unescape('%3D%20aPoint%0A%09%5EaPoint%20class%20%3D%20self%20class%20and%3A%20%5B%0A%09%09%28aPoint%20x%20%3D%20self%20x%29%20%26%20%28aPoint%20y%20%3D%20self%20y%29%5D'),
+messageSends: ["and:", unescape("%3D"), "class", unescape("%26"), "x", "y"],
+referencedClasses: []
+}),
+smalltalk.Point);
+
 
 smalltalk.addMethod(
 unescape('_x_y_'),
@@ -8941,16 +9030,50 @@ fn: function (aMessage){
 var self=this;
 var obj=nil;
 var selector=nil;
+var jsSelector=nil;
 var arguments=nil;
 obj=smalltalk.send(self, "_jsObject", []);
 selector=smalltalk.send(aMessage, "_selector", []);
+jsSelector=smalltalk.send(selector, "_asJavaScriptSelector", []);
 arguments=smalltalk.send(aMessage, "_arguments", []);
-if(obj[selector]) {return smalltalk.send(obj, selector, arguments)};
+if(obj[jsSelector]) {return smalltalk.send(obj, jsSelector, arguments)};
 smalltalk.send(self, "_doesNotUnderstand_", [aMessage], smalltalk.Object);
 return self;},
 args: ["aMessage"],
-source: unescape('doesNotUnderstand%3A%20aMessage%0A%09%7C%20obj%20selector%20arguments%20%7C%0A%09obj%20%3A%3D%20self%20jsObject.%0A%09selector%20%3A%3D%20aMessage%20selector.%0A%09arguments%20%3A%3D%20aMessage%20arguments.%0A%09%3Cif%28obj%5Bselector%5D%29%20%7Breturn%20smalltalk.send%28obj%2C%20selector%2C%20arguments%29%7D%3E.%0A%09super%20doesNotUnderstand%3A%20aMessage'),
-messageSends: ["jsObject", "selector", "arguments", "doesNotUnderstand:"],
+source: unescape('doesNotUnderstand%3A%20aMessage%0A%09%7C%20obj%20selector%20jsSelector%20arguments%20%7C%0A%09obj%20%3A%3D%20self%20jsObject.%0A%09selector%20%3A%3D%20aMessage%20selector.%0A%09jsSelector%20%3A%3D%20selector%20asJavaScriptSelector.%0A%09arguments%20%3A%3D%20aMessage%20arguments.%0A%09%3Cif%28obj%5BjsSelector%5D%29%20%7Breturn%20smalltalk.send%28obj%2C%20jsSelector%2C%20arguments%29%7D%3E.%0A%09super%20doesNotUnderstand%3A%20aMessage'),
+messageSends: ["jsObject", "selector", "asJavaScriptSelector", "arguments", "doesNotUnderstand:"],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
+smalltalk.addMethod(
+unescape('_at_'),
+smalltalk.method({
+selector: unescape('at%3A'),
+category: 'accessing',
+fn: function (aString){
+var self=this;
+return self['@jsObject'][aString];
+return self;},
+args: ["aString"],
+source: unescape('at%3A%20aString%0A%09%3Creturn%20self%5B%27@jsObject%27%5D%5BaString%5D%3E'),
+messageSends: [],
+referencedClasses: []
+}),
+smalltalk.JSObjectProxy);
+
+smalltalk.addMethod(
+unescape('_at_put_'),
+smalltalk.method({
+selector: unescape('at%3Aput%3A'),
+category: 'accessing',
+fn: function (aString, anObject){
+var self=this;
+self['@jsObject'][aString] = anObject;
+return self;},
+args: ["aString", "anObject"],
+source: unescape('at%3A%20aString%20put%3A%20anObject%0A%09%3Cself%5B%27@jsObject%27%5D%5BaString%5D%20%3D%20anObject%3E'),
+messageSends: [],
 referencedClasses: []
 }),
 smalltalk.JSObjectProxy);

+ 41 - 5
st/Kernel.st

@@ -817,7 +817,6 @@ to: aNumber
 	first := self truncated.
 	last := aNumber truncated + 1.
 	count := 1.
-	(first <= last) ifFalse: [self error: 'Wrong interval'].
 	array := Array new.
 	(last - first) timesRepeat: [
 	    array at: count put: first.
@@ -848,6 +847,37 @@ asPoint
 
 asJSONObject
 	^self
+!
+
+to: stop by: step
+	| array value pos |
+	value := self.
+	array := Array new.
+	pos := 1.
+	step = 0 ifTrue: [self error: 'step must be non-zero'].
+	step < 0
+		ifTrue: [[ value >= stop ] whileTrue: [
+	    			array at: pos put: value.
+	    			pos := pos + 1.
+	    			value := value + step]]
+		ifFalse: [[ value <= stop ] whileTrue: [
+	    			array at: pos put: value.
+	  			pos := pos + 1.
+	    			value := value + step]].
+	^array
+!
+
+to: stop by: step do: aBlock
+	| value |
+	value := self.
+	step = 0 ifTrue: [self error: 'step must be non-zero'].
+	step < 0
+		ifTrue: [[ value >= stop ] whileTrue: [
+	    			aBlock value: value.
+	    			value := value + step]]
+		ifFalse: [[ value <= stop ] whileTrue: [
+	    			aBlock value: value.
+	    			value := value + step]]
 ! !
 
 !Number methodsFor: 'enumerating'!
@@ -861,8 +891,14 @@ timesRepeat: aBlock
 	    count := count + 1]
 !
 
-to: aNumber do: aBlock
-	^(self to: aNumber) do: aBlock
+to: stop do: aBlock
+	"Evaluate aBlock for each number from self to aNumber."
+	| nextValue |
+	nextValue := self.
+	[nextValue <= stop]
+		whileTrue: 
+			[aBlock value: nextValue.
+			nextValue := nextValue + 1]
 ! !
 
 !Number methodsFor: 'printing'!
@@ -1209,11 +1245,11 @@ milliseconds
 !
 
 <= aDate
-	<self <= aDate>
+	<return self <= aDate>
 !
 
 >= aDate
-	<self >>= aDate>
+	<return self >>= aDate>
 ! !
 
 !Date methodsFor: 'converting'!

Some files were not shown because too many files changed in this diff