! Copyright (C) 2010 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. USING: alien.c-types alien.data byte-arrays continuations fry io.encodings.string io.encodings.utf8 io.files javascriptcore.ffi javascriptcore.ffi.hack kernel namespaces sequences ; IN: javascriptcore ERROR: javascriptcore-error error ; SYMBOL: js-context : with-global-context ( quot -- ) [ [ f JSGlobalContextCreate dup js-context set ] dip [ nip '[ @ ] ] [ drop '[ _ JSGlobalContextRelease ] ] 2bi [ ] cleanup ] with-scope ; inline : with-javascriptcore ( quot -- ) set-callstack-bounds with-global-context ; inline : JSString>string ( JSString -- string ) dup JSStringGetMaximumUTF8CStringSize [ ] keep [ JSStringGetUTF8CString drop ] [ drop ] 2bi utf8 decode [ 0 = ] trim-tail ; : JSValueRef>string ( ctx JSValueRef/f -- string/f ) [ f JSValueToStringCopy [ JSString>string ] [ JSStringRelease ] bi ] [ drop f ] if* ; : eval-js ( string -- result-string ) [ js-context get dup ] dip JSStringCreateWithUTF8CString f f 0 { { void* initial: f } } [ JSEvaluateScript ] with-out-parameters dup [ nip JSValueRef>string javascriptcore-error ] [ drop JSValueRef>string ] if ; : eval-js-standalone ( string -- result-string ) '[ _ eval-js ] with-javascriptcore ; : eval-js-path-standalone ( path -- result-string ) utf8 file-contents eval-js-standalone ;