]> gitweb.factorcode.org Git - factor.git/commitdiff
fjsc: refactor alien calls
authorchris.double <chris.double@double.co.nz>
Sat, 16 Dec 2006 22:58:35 +0000 (22:58 +0000)
committerchris.double <chris.double@double.co.nz>
Sat, 16 Dec 2006 22:58:35 +0000 (22:58 +0000)
apps/furnace-fjsc/resources/bootstrap.factor
apps/furnace-fjsc/resources/bootstrap.js
libs/fjsc/fjsc.factor

index d506d6851893872658b592070389d96fbed7e925..6b60cce60429cb928ff42af5fec4276c798e2e03 100644 (file)
@@ -1,5 +1,5 @@
 : alert ( string -- )
   #! Display the string in an alert box
-  window { } "alert" { "string" } alien-invoke ;
+  window { } "" "alert" { "string" } alien-invoke ;
 
 "Bootstrap code loaded" alert
\ No newline at end of file
index 797dcceb261e977e149248b200dcc4bdfa71fc19..36dd7dd187e82c32626a0b5df10799afb4d43903 100644 (file)
@@ -202,6 +202,23 @@ factor.words["continue"] = new Word("continue", "primitive", function(world, nex
   (cont.next)(world);
 });
 
+factor.words["alien-invoke"] = new Word("alien-invoke", "primitive", function(world, next) {  
+  var stack = world.data_stack.stack;
+  var arg_types = stack.pop();
+  var method_name = stack.pop();
+  var library_name = stack.pop();
+  var return_values = stack.pop();
+  var obj = stack.pop();
+  var args = [ ];
+  for(var i = 0; i < arg_types.length; ++i) {
+    args[i] = stack.pop();
+  }
+  var v = obj[method_name].apply(obj, args);
+  if(return_values.length > 0)
+    stack.push(v);
+  next(world);
+});
+
 Factor.prototype.define_word = function(name, source, func, world, next) {
   factor.words[name] = new Word(name, source, function(world, next) {
     var old = world.next;
index 7110ee9abf1c6749bca5c1569aced243e9aa0a22..f9e3b220048cee79acce977c4c8d3eb362ba59d5 100644 (file)
@@ -12,7 +12,6 @@ TUPLE: ast-array elements ;
 TUPLE: ast-define name stack-effect expression ;
 TUPLE: ast-expression values ;
 TUPLE: ast-word value ;
-TUPLE: ast-alien return method args ;
 TUPLE: ast-comment ;
 TUPLE: ast-stack-effect in out ;
 
@@ -28,7 +27,7 @@ LAZY: 'quote' ( -- parser )
 LAZY: 'string' ( -- parser )
   'quote' sp [
     CHAR: " = not
-  ] satisfy <+> [ >string <ast-string> ] <@ &> 'quote' <& ;
+  ] satisfy <*> [ >string <ast-string> ] <@ &> 'quote' <& ;
  
 : identifier-middle? ( ch -- bool )
   [ blank? not ] keep
@@ -98,12 +97,6 @@ LAZY: 'word' ( -- parser )
 LAZY: 'atom' ( -- parser )
   'identifier' 'number' <|> 'string' <|> ;
 
-LAZY: 'alien' ( -- parser )
-  'array' [ ast-array-elements ] <@
-  'string' [ ast-string-value ] <@ <&>
-  'array' [ ast-array-elements ] <@ <:&>
-  "alien-invoke" token sp <& [ first3 <ast-alien> ] <@ ;
-
 LAZY: 'comment' ( -- parser )
   "#!" token sp
   "!" token sp <|> [
@@ -112,7 +105,6 @@ LAZY: 'comment' ( -- parser )
 
 LAZY: 'expression' ( -- parser )
   'comment' 
-  'alien' sp <|>
   'quotation' sp <|> 
   'array' sp <|>
   'define' sp <|>
@@ -199,18 +191,6 @@ M: ast-expression (literal)
 M: ast-expression (compile)
   ast-expression-values do-expressions ;
 
-M: ast-alien (compile)
-  "world.call_alien(" ,
-  dup ast-alien-return empty? not [
-    "true," ,
-  ] [
-    "false," ,
-  ] if
-  dup ast-alien-method "\"" , , "\"," ,
-  "factor.data_stack.stack.pop(), [" ,
-  ast-alien-args [ drop "factor.data_stack.stack.pop()" , ] [ "," , ] interleave 
-  "],world," , ;
-
 M: ast-word (literal)   
   "factor.words[\"" , 
   ast-word-value ,
@@ -260,7 +240,7 @@ M: string fjsc-parse ( object -- ast )
   'expression' parse car parse-result-parsed ;
 
 M: quotation fjsc-parse ( object -- ast )
-  (parse-factor-quotation) ;
+  (parse-factor-quotation) <ast-expression> ;
 
 : fjsc-compile ( ast -- string )
   [