Re: libseed-list js extensions for native modules
- From: Jonatan Liljedahl <lijon kymatica com>
- To: Alan Knowles <alan akbkhome com>, Seed - Gnome Javascript <libseed-list gnome org>
- Subject: Re: libseed-list js extensions for native modules
- Date: Tue, 29 Jun 2010 11:57:15 +0200
Doesn't work here, but now something else is strange (first try to get
sandbox failed):
> imports.sandbox.Context.prototype.foo = function() { print("test") };
function () { print("test"); }
> c = new imports.sandbox.Context
TypeError Result of expression 'imports.sandbox' [undefined] is not an
object.
> c = new imports.sandbox.Context
[object Context]
> c.foo()
TypeError Result of expression 'c.foo' [undefined] is not a function.
>
Alan Knowles wrote:
Did I miss something - this works perfectly..
GLib = imports.gi.GLib;
imports.sandbox.Context.prototype.eval_file = function(fn) {
var script = {};
print("load " + fn);
GLib.file_get_contents(fn,script);
return this.eval(script.contents);
};
c = new imports.sandbox.Context;
c.eval_file("test.js");
#output>>>
load test.js
** (seed:3644): CRITICAL **: Line 10 in /tmp/seedtest.js: GFileError Failed to open file 'test.js': No such file or directory
Regards
Alan
--- On 29/Jun/2010, Jonatan Liljedahl wrote:
This should be made to work - It's probably going to take a bit of
> working out how to support it...
I'm trying to understand how this works, am I right that native modules
create their classes with seed_create_class() (JSClassCreate()), while
the Gir importer sets up an object with a 'prototype' property "by hand"?
From the JSC API docs:
"Standard JavaScript practice calls for storing function objects in
prototypes, so they can be shared. The default JSClass created by
JSClassCreate follows this idiom, instantiating objects with a shared,
automatically generating prototype containing the class's function
objects. The kJSClassAttributeNoAutomaticPrototype attribute specifies
that a JSClass should not automatically generate such a prototype."
So, the question is why the prototype is not writable and if it can be
made to be that. I tried this hackish function on the constructor but it
didn't work:
gboolean
seed_make_extendable (JSContextRef ctx, JSObjectRef object)
{
JSStringRef jname = JSStringCreateWithUTF8CString ("prototype");
JSValueRef exception = NULL;
JSValueRef proto = JSObjectGetPrototype(ctx, object);
if (proto)
{
JSObjectSetProperty (ctx, (JSObjectRef) object, jname, proto,
kJSPropertyAttributeDontEnum|kJSPropertyAttributeDontDelete,
&exception);
}
JSStringRelease (jname);
return TRUE;
}
Once JSClassCreate has made the prototype, it seems to be fixed and
read-only.
Perhaps one should create classes more "manually" like the Gir importer
does instead of using JSClassCreate()?
Looking through the code, it's either we have to explicitly overlay
the prototype properties in the constructor, or we set the
parent_class of Context to a standard object..
parent_class can only be a JSClassRef, and it says it should be NULL for
the normal Object class, which I guess it should be. Seems like
JavaScriptCore has classic inherited OOP internally, and that
parent_class has nothing to do with prototype. (but that all objects has
Object as parent_class)
I'm not sure I understand what you mean by overlay the prototype
properties..
/Jonatan
Regarsd Alan
--- On 21/Jun/2010, Jonatan Liljedahl wrote:
Also, it should work to add methods to SomeClass.prototype in
native modules. Currently it does not:
imports.sandbox.Context.prototype.eval_file = function(fn) { var
script = {}; GLib.file_get_contents(fn,script); return
this.eval(script.contents); };
c = new imports.sandbox.Context; c.eval_file(foobar);
TypeError Result of expression 'ctx.eval_file' [undefined] is not a
function.
It does work for GI modules, as seen in extensions/Gtk.js
/Jonatan
Jonatan Liljedahl wrote:
The gi_importer tries to import extensions/name.js by evaluating
"imports.extensions.name". It would be nice if this also worked
for native modules, I imagine it to be quite common that you
write a module with core parts in C and some high-level stuff in
js.
The question is, how should this be handled regarding searchpaths
etc?
If your module is installed in /usr/local/lib/seed, then you
probably installed the extension js in
/usr/local/share/seed/extensions, and imports.extensions would be
the right thing.
But what happens if your module is installed somewhere else? It
should probably start with the same dir as the native module,
then go on with imports.searchPath, and if the file is found call
seed_importer_handle_file() on it..
BTW, what happens if you have 'extensions' folder in more than
one search path? will extensions.foo search for 'foo' in all of
those or only the first match for 'extensions'? Just doing a
'imports.extensions' will of course create only one dir_importer
for that folder, hiding possible 'extensions' folders later in
the searchpath. I don't know if this is a good thing...
/Jonatan _______________________________________________
libseed-list mailing list libseed-list gnome org
http://mail.gnome.org/mailman/listinfo/libseed-list
_______________________________________________ libseed-list
mailing list libseed-list gnome org
http://mail.gnome.org/mailman/listinfo/libseed-list
_______________________________________________ libseed-list mailing
list libseed-list gnome org
http://mail.gnome.org/mailman/listinfo/libseed-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]