[webkit-dev] JavaScriptCore: Accessing things created in C from script

Oliver Hunt oliver at apple.com
Thu Dec 11 03:06:16 PST 2008


On Dec 11, 2008, at 2:27 AM, Thomas Gutteridge wrote:

> Hello
>
> Can you help me? I'm using WebKit's JavaScriptCore from within an
> application to allow some logic to be implemented in script and
> therefore modified without recompilation. Although, I can create
> JavaScript functions and objects using the C API, I can't see how to
> give them names that can be used to reference them from script.
>
> For example, I'm trying to use JSObjectMakeFunctionWithCallback to
> create a JavaScript function with a native implementation. Crucially,
> I'd like to then invoke this function from a script. However, the
> "name" parameter is apparently only "used when converting the function
> to string". The name I give is undefined if I use it in a script.
>
> Is what I'm trying to do possible?
>

The "name" property that you're specifying is what will be used if you  
want to do myFunction.toString().  Accessing a function by name  
requires the function (or other object) being on an object in scope.

The easiest way to achieve this is by putting it on the global  
object.  This will let you call it in the same way people use 'alert',  
'document', etc on js in a web page.

Something akin to the following should work (assuming jsFunction is  
your JSC function wrapper, and context is your JSC context):
JSValueRef exception = 0;
JSObjectRef global = JSContextGetGlobalObject(context);
JSObjectSetProperty(context, global,  
JSStringCreateWithUTF8CString("myCFunction"), jsFunction,  
kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly,  
&exception);
if (exception)
     printf("Argh! an exception!!!!");

Now your function will be available in JS as "myCFunction" on the  
global object.

--Oliver




More information about the webkit-dev mailing list