diff --git a/libs/fjsc/fjsc.factor b/libs/fjsc/fjsc.factor index 635db934ad..ccb28425ac 100644 --- a/libs/fjsc/fjsc.factor +++ b/libs/fjsc/fjsc.factor @@ -11,7 +11,7 @@ TUPLE: ast-quotation expression ; TUPLE: ast-array elements ; TUPLE: ast-define name expression ; TUPLE: ast-expression values ; -TUPLE: ast-alien return object method args ; +TUPLE: ast-alien return method args ; LAZY: 'digit' ( -- parser ) [ digit? ] satisfy [ digit> ] <@ ; @@ -84,9 +84,8 @@ LAZY: 'atom' ( -- parser ) LAZY: 'alien' ( -- parser ) 'array' [ ast-array-elements ast-expression-values [ ast-string-value ] map ] <@ 'string' [ ast-string-value ] <@ <&> - 'string' [ ast-string-value ] <@ <:&> 'array' [ ast-array-elements ast-expression-values [ ast-string-value ] map ] <@ <:&> - "alien-invoke" token sp <& [ first4 ] <@ ; + "alien-invoke" token sp <& [ first3 ] <@ ; LAZY: 'expression' ( -- parser ) 'define' sp @@ -165,12 +164,11 @@ M: ast-alien (compile) dup ast-alien-return empty? not [ "factor.data_stack.push(" , ] when - dup ast-alien-object , - "." , dup ast-alien-method , - "(" , + ".apply(" , + "factor.data_stack.pop(), [" , dup ast-alien-args [ drop "factor.data_stack.pop()" , ] [ "," , ] interleave - ")" , + "])" , ast-alien-return empty? not [ ")" , ] when ; diff --git a/libs/fjsc/tests.factor b/libs/fjsc/tests.factor index 11f451d133..9c1b33ec09 100644 --- a/libs/fjsc/tests.factor +++ b/libs/fjsc/tests.factor @@ -36,10 +36,10 @@ IN: temporary ": foo 123 \"hello\" ;" 'expression' parse car parse-result-parsed fjsc-compile ] unit-test -{ "window.alert(factor.data_stack.pop())" } [ - "{ } \"window\" \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile +{ "alert.apply(factor.data_stack.pop(), [factor.data_stack.pop()])" } [ + "{ } \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile ] unit-test -{ "factor.data_stack.push(window.alert(factor.data_stack.pop()))" } [ - "{ \"string\" } \"window\" \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile +{ "factor.data_stack.push(alert.apply(factor.data_stack.pop(), [factor.data_stack.pop()]))" } [ + "{ \"string\" } \"alert\" { \"string\" } alien-invoke" 'expression' parse car parse-result-parsed fjsc-compile ] unit-test