diff --git a/extra/javascriptcore/javascriptcore-tests.factor b/extra/javascriptcore/javascriptcore-tests.factor new file mode 100644 index 0000000000..f04ada89f2 --- /dev/null +++ b/extra/javascriptcore/javascriptcore-tests.factor @@ -0,0 +1,10 @@ +! Copyright (C) 2010 Doug Coleman. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors javascriptcore kernel tools.test ; +IN: javascriptcore.tests + +[ "2" ] [ "1+1" eval-js ] unit-test + +[ "1+shoes" eval-js ] +[ error>> "ReferenceError: Can't find variable: shoes" = ] must-fail-with + diff --git a/extra/javascriptcore/javascriptcore.factor b/extra/javascriptcore/javascriptcore.factor index bfd222f9e8..eabb97df61 100644 --- a/extra/javascriptcore/javascriptcore.factor +++ b/extra/javascriptcore/javascriptcore.factor @@ -6,6 +6,8 @@ javascriptcore.ffi javascriptcore.ffi.hack kernel namespaces sequences ; IN: javascriptcore +ERROR: javascriptcore-error error ; + : with-javascriptcore ( quot -- ) set-callstack-bounds call ; inline @@ -33,16 +35,14 @@ SYMBOL: js-context drop f ] if* ; -: eval-js ( string -- ret/f exception/f ) - [ +: eval-js ( string -- result-string ) + '[ [ - [ - swap JSStringCreateWithUTF8CString f f 0 JSValueRef - [ JSEvaluateScript ] keep *void* - ] - [ '[ [ _ ] dip JSValueRef>string ] bi@ ] bi + dup _ JSStringCreateWithUTF8CString f f 0 JSValueRef + [ JSEvaluateScript ] keep *void* + dup [ nip JSValueRef>string javascriptcore-error ] [ drop JSValueRef>string ] if ] with-global-context ] with-javascriptcore ; -: eval-js-path ( path -- ret/f exception/f ) utf8 file-contents eval-js ; +: eval-js-path ( path -- result-string ) utf8 file-contents eval-js ;