[webkit-dev] JSC binding code question

Maciej Stachowiak mjs at apple.com
Tue Sep 28 23:02:58 PDT 2010


On Sep 28, 2010, at 10:48 PM, Kinuko Yasuda wrote:

> Hi Webkit folks,
> 
> I'm writing a JSC binding code (custom binding code for now) for a
> method that can take JSON-format parameters, and I want to know what
> would be the right/recommended way.
> I mean, I want to write a binding code that can executes javascript code like:
> 
>   directoryEntry.getFile("lockfile.txt", {create: true, exclusive: true});
> 
> Where the getFile() method is defined as:
> 
>   interface DirectoryEntry : Entry {
>     void getFile(in DOMString path, in Flags flags, /* ... */);
>   };
>   interface Flags {
>     attribute boolean create;
>     attribute boolean exclusive;
>   };
> 
> (They are from the File API: Directories and System's draft [1])
> 
> And what I have written for this is like following:
> 
> if (!exec->argument(1).isNull() && !exec->argument(1).isUndefined() &&
> exec->argument(1).isObject() &&
> !exec->argument(1).inherits(&JSFlags::s_info)) {
>        JSObject* object = exec->argument(1).getObject();
>        flags = Flags::create();
>        JSValue jsCreate = object->get(exec, Identifier(exec, "create"));
>        flags->setCreate(jsCreate.toBoolean(exec));
>        JSValue jsExclusive = object->get(exec, Identifier(exec, "exclusive"));
>        flags->setExclusive(jsExclusive.toBoolean(exec));
> }
> 
> Basically the code calls JSObject::get() to get values for the given
> property names.
> This looked straightforward, but I was told that the get(exec)
> re-enters Javascript and could do any arbitrary thing.

This much is true. In principle, any property can be a getter, so get() could re-enter into arbitrary JS code.

> This means that during the get() even the parameter object or the
> calling object (imp) may get deallocated.

This part, I think not. As long as they are referenced by currently executing code (either by JS or by the machine stack via a local variable) they won't get deallocated.

That being said, others may have suggestions for better ways to code this. Perhaps Geoff or Oliver have suggestions.

> 
> So here I have two questions:
> 
> 1) How can I write a safe binding code that reads JSON-format
> parameters?  Is there some recommended way or any good idea?
> 
> 2) I saw several other code doing the same/similar thing as I do
> (calling JSObject::get()) to get arbitrary parameter values.
> Are they safe?  Is there a guarantee that the code executed during
> get() doesn't deallocate some objects?

Nothing that has a live reference to it will get collected, and there's no such thing as explicit deallocation in JS.

> 
> Any help/suggestions/comments would be highly appreciated.
> Thanks!
> Kinuko
> 
> 
> [1] http://dev.w3.org/2009/dap/file-system/file-dir-sys.html
> [2] http://trac.webkit.org/browser/trunk/WebCore/bindings/js/JSDirectoryEntryCustom.cpp
> _______________________________________________
> webkit-dev mailing list
> webkit-dev at lists.webkit.org
> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev



More information about the webkit-dev mailing list