blob: 5ba0f32a8fc6f794c4ae7a7d5b9da05eb0b6de00 [file] [log] [blame]
diff -ur a/Makefile.PL b/Makefile.PL
--- a/Makefile.PL 2010-05-29 02:43:06.000000000 -0400
+++ b/Makefile.PL 2012-10-11 14:56:18.000000000 -0400
@@ -12,6 +12,7 @@
######################################################################
use ExtUtils::MakeMaker;
+use ExtUtils::PkgConfig;
use Getopt::Long;
# Get the right lib and include dirs for different platforms
@@ -37,7 +38,7 @@
"/usr/lib/firefox" => "/usr/include/firefox",
);
-my ($JS_LIB_DIR, @JS_INCL_DIRS, $JS_LIB_NAME);
+my ($JS_LIB_DIR, @JS_INCL_DIRS, $JS_LIB_NAME, $JS_LIBS, $JS_INCLUDES);
#### Determine compile options
##############################
@@ -57,6 +58,19 @@
"JS_LIB_DIR=s" => \$JS_LIB_DIR,
"JS_LIB_NAME=s" => \$JS_LIB_NAME,
);
+
+# try to find spidermonkey via pkg-config first
+
+$JS_LIBS = ExtUtils::PkgConfig->libs ('mozjs187');
+if ("".$JS_LIBS ne "") {
+ $JS_INCLUDES = ExtUtils::PkgConfig->cflags ('mozjs187');
+} else {
+ $JS_LIBS = ExtUtils::PkgConfig->libs ('mozjs185');
+ if ("".$JS_LIBS ne "") {
+ $JS_INCLUDES = ExtUtils::PkgConfig->cflags ('mozjs185');
+ } else {
+
+# pkg-config did not work, use the old (direct) way to find older libs
if ($JS_LIB_DIR) {
push @JS_INCL_DIRS, $JS_LIB_DIR;
}
@@ -78,13 +92,15 @@
}
}
if (scalar(@JS_INCL_DIRS) == scalar(@c_header_files)) {
- $JS_LIB_DIR = $libfile;
+ $JS_LIB_DIR = "-L".$libfile;
$JS_LIB_DIR =~ s/$possible_lib$//;
$JS_LIB_NAME = $possible_lib;
$JS_LIB_NAME =~ s/\.(a|so|dll)$//;
$JS_LIB_NAME =~ s/^lib//;
+ $JS_LIBS = "-l".$JS_LIB_NAME;
+
last;
} else {
@JS_INCL_DIRS = ();
@@ -94,15 +110,22 @@
}
last if $JS_LIB_DIR;
}
+foreach my $include_dir(@JS_INCL_DIRS) {
+ $JS_INCLUDES.=" -I".$include_dir;
+}
if ($JS_INCL_DIRS[0] eq $JS_INCL_DIRS[1]) {
shift @JS_INCL_DIRS;
}
+} # end of pkgcfg mozjs185
+} # end of pkgcfg mozjs187
+
+
## If no SpiderMonkey library found report that and exit.
## Otherwise print lib and include paths.
-if (!$JS_LIB_DIR) {
+if (!$JS_LIBS) {
print <<EOT;
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -111,17 +134,13 @@
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
EOT
- exit 0;
+ exit 1;
} else {
- print "JS_LIB_DIR: $JS_LIB_DIR\n";
- foreach my $include_dir(@JS_INCL_DIRS) {
- print "JS_INCL_DIR: $include_dir\n";
- }
- print "JS_LIB_NAME: $JS_LIB_NAME\n";
+ print "JS_LIBS: $JS_LIBS\n";
+ print "JS_INCLUDES: $include_dir\n";
}
-
## Determine library name and system-related defines
if ($^O ne 'MSWin32') {
$JS_DEFINE = '-DXP_UNIX';
@@ -160,10 +179,11 @@
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'SpiderMonkey.pm', # retrieve abstract from module
AUTHOR => 'Mike Schilli <m@perlmeister.com>') : ()),
- 'LIBS' => ["-L$JS_LIB_DIR -l$JS_LIB_NAME"],
+ 'LIBS' => ["$JS_LIB_DIR $JS_LIBS"],
'DEFINE' => $JS_DEFINE, # e.g., '-DHAVE_SOMETHING'
# Insert -I. if you add *.h files later:
- 'INC' => "-I".join " -I", @JS_INCL_DIRS,
+# 'INC' => "-I".join " -I", @JS_INCL_DIRS,
+ 'INC' => $JS_INCLUDES,
# Un-comment this if you add C files to link with later:
# 'OBJECT' => '$(O_FILES)', # link all the C files too
);
diff -ur a/SpiderMonkey.pm b/SpiderMonkey.pm
--- a/SpiderMonkey.pm 2010-05-29 02:49:31.000000000 -0400
+++ b/SpiderMonkey.pm 2012-10-11 14:56:18.000000000 -0400
@@ -161,9 +161,8 @@
$self->{global_class} =
JavaScript::SpiderMonkey::JS_GlobalClass();
$self->{global_object} =
- JavaScript::SpiderMonkey::JS_NewObject(
- $self->{context}, $self->{global_class},
- $self->{global_class}, $self->{global_class});
+ JavaScript::SpiderMonkey::JS_NewCompartmentAndGlobalObject(
+ $self->{context}, $self->{global_class});
JavaScript::SpiderMonkey::JS_InitStandardClasses($self->{context},
$self->{global_object});
diff -ur a/SpiderMonkey.xs b/SpiderMonkey.xs
--- a/SpiderMonkey.xs 2010-05-29 02:49:31.000000000 -0400
+++ b/SpiderMonkey.xs 2012-10-11 14:56:18.000000000 -0400
@@ -20,10 +20,13 @@
#define snprintf _snprintf
#endif
+#ifndef JSCLASS_GLOBAL_FLAGS
+#define JSCLASS_GLOBAL_FLAGS 0
+#endif
/* JSRuntime needs this global class */
static
JSClass global_class = {
- "Global", 0,
+ "Global", JSCLASS_GLOBAL_FLAGS,
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
};
@@ -67,10 +70,18 @@
* I hope all reasonable machines can hold an address in
* an int.
*/
- XPUSHs(sv_2mortal(newSViv((int)obj)));
+ XPUSHs(sv_2mortal(newSViv(PTR2IV(obj))));
+#if JS_VERSION < 185
XPUSHs(sv_2mortal(newSVpv(JS_GetStringBytes(JSVAL_TO_STRING(id)), 0)));
+#else
+ XPUSHs(sv_2mortal(newSVpv(JS_EncodeString(cx, JSVAL_TO_STRING(id)), 0)));
+#endif
XPUSHs(sv_2mortal(newSVpv(what, 0)));
+#if JS_VERSION < 185
XPUSHs(sv_2mortal(newSVpv(JS_GetStringBytes(JSVAL_TO_STRING(*vp)), 0)));
+#else
+ XPUSHs(sv_2mortal(newSVpv(JS_EncodeString(cx, JSVAL_TO_STRING(*vp)), 0)));
+#endif
PUTBACK;
call_pv("JavaScript::SpiderMonkey::getsetter_dispatcher", G_DISCARD);
FREETMPS;
@@ -83,10 +94,21 @@
JSBool getter_dispatcher(
JSContext *cx,
JSObject *obj,
+#if JS_VERSION < 185
jsval id,
+#else
+ jsid iid,
+#endif
jsval *vp
/* --------------------------------------------------------------------- */
) {
+#if JS_VERSION >= 185
+ jsval id;
+ if (!JS_IdToValue(cx,iid,&id)) {
+ fprintf(stderr, "getter_dispatcher: JS_IdToValue failed.\n");
+ return JS_FALSE;
+ }
+#endif
return getsetter_dispatcher(cx, obj, id, vp, "getter");
}
@@ -94,10 +116,22 @@
JSBool setter_dispatcher(
JSContext *cx,
JSObject *obj,
+#if JS_VERSION < 185
jsval id,
+#else
+ jsid iid,
+ JSBool strict,
+#endif
jsval *vp
/* --------------------------------------------------------------------- */
) {
+#if JS_VERSION >= 185
+ jsval id;
+ if (!JS_IdToValue(cx,iid,&id)) {
+ fprintf(stderr, "setter_dispatcher: JS_IdToValue failed.\n");
+ return JS_FALSE;
+ }
+#endif
return getsetter_dispatcher(cx, obj, id, vp, "setter");
}
@@ -128,10 +162,19 @@
/* --------------------------------------------------------------------- */
static JSBool
+#if JS_VERSION < 185
FunctionDispatcher(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval) {
+#else
+FunctionDispatcher(JSContext *cx, uintN argc, jsval *vp) {
+#endif
/* --------------------------------------------------------------------- */
dSP;
+#if JS_VERSION >= 185
+ JSObject *obj = JS_THIS_OBJECT(cx,vp);
+ jsval *argv = JS_ARGV(cx,vp);
+ jsval rval;
+#endif
SV *sv;
char *n_jstr;
int n_jnum;
@@ -149,12 +192,20 @@
ENTER ;
SAVETMPS ;
PUSHMARK(SP);
- XPUSHs(sv_2mortal(newSViv((int)obj)));
+ XPUSHs(sv_2mortal(newSViv(PTR2IV(obj))));
XPUSHs(sv_2mortal(newSVpv(
- JS_GetFunctionName(fun), 0)));
+#if JS_VERSION < 185
+ JS_GetStringBytes(JS_GetFunctionId(fun)), 0)));
+#else
+ JS_EncodeString(cx, JS_GetFunctionId(fun)), 0)));
+#endif
for(i=0; i<argc; i++) {
XPUSHs(sv_2mortal(newSVpv(
+#if JS_VERSION < 185
JS_GetStringBytes(JS_ValueToString(cx, argv[i])), 0)));
+#else
+ JS_EncodeString(cx, JS_ValueToString(cx, argv[i])), 0)));
+#endif
}
PUTBACK;
count = call_pv("JavaScript::SpiderMonkey::function_dispatcher", G_SCALAR);
@@ -174,7 +225,11 @@
if(Debug)
fprintf(stderr, "DEBUG: %lx is a ref!\n", (long) sv);
- *rval = OBJECT_TO_JSVAL(SvIV(SvRV(sv)));
+#if JS_VERSION < 185
+ *rval = OBJECT_TO_JSVAL(INT2PTR(JSObject *,SvIV(SvRV(sv))));
+#else
+ JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(INT2PTR(JSObject *,SvIV(SvRV(sv)))));
+#endif
}
else if(SvIOK(sv)) {
/* It appears that we have been sent an int return
@@ -183,7 +238,11 @@
n_jnum=SvIV(sv);
if(Debug)
fprintf(stderr, "DEBUG: %lx is an int (%d)\n", (long) sv,n_jnum);
+#if JS_VERSION < 185
*rval = INT_TO_JSVAL(n_jnum);
+#else
+ JS_SET_RVAL(cx,vp,INT_TO_JSVAL(n_jnum));
+#endif
} else if(SvNOK(sv)) {
/* It appears that we have been sent an double return
* value. Thats fine we can give javascript an double
@@ -192,11 +251,20 @@
if(Debug)
fprintf(stderr, "DEBUG: %lx is a double(%f)\n", (long) sv,n_jdbl);
+#if JS_VERSION < 185
*rval = DOUBLE_TO_JSVAL(JS_NewDouble(cx, n_jdbl));
+#else
+ JS_NewNumberValue(cx, n_jdbl, &rval);
+ JS_SET_RVAL(cx,vp,rval);
+#endif
} else if(SvPOK(sv)) {
n_jstr = SvPV(sv, PL_na);
//warn("DEBUG: %s (%d)\n", n_jstr);
+#if JS_VERSION < 185
*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, n_jstr));
+#else
+ JS_SET_RVAL(cx,vp,STRING_TO_JSVAL(JS_NewStringCopyZ(cx, n_jstr)));
+#endif
}
}
@@ -240,8 +308,13 @@
}
/* --------------------------------------------------------------------- */
+#if JS_VERSION < 181
static JSBool
BranchHandler(JSContext *cx, JSScript *script) {
+#else
+static JSBool
+BranchHandler(JSContext *cx) {
+#endif
/* --------------------------------------------------------------------- */
PJS_Context* pcx = (PJS_Context*) JS_GetContextPrivate(cx);
@@ -374,11 +447,46 @@
JSObject *obj;
CODE:
{
+#ifdef JS_THREADSAFE
+ JS_BeginRequest(cx);
+#endif
obj = JS_NewObject(cx, class, NULL, NULL);
if(!obj) {
XSRETURN_UNDEF;
}
RETVAL = obj;
+#ifdef JS_THREADSAFE
+ JS_EndRequest(cx);
+#endif
+ }
+ OUTPUT:
+ RETVAL
+
+######################################################################
+JSObject *
+JS_NewCompartmentAndGlobalObject(cx, class)
+ JSContext * cx
+ JSClass * class
+######################################################################
+ PREINIT:
+ JSObject *obj;
+ CODE:
+ {
+#ifdef JS_THREADSAFE
+ JS_BeginRequest(cx);
+#endif
+#if JS_VERSION < 185
+ obj = JS_NewObject(cx, class, NULL, NULL);
+#else
+ obj = JS_NewCompartmentAndGlobalObject(cx, class, NULL);
+#endif
+ if(!obj) {
+ XSRETURN_UNDEF;
+ }
+ RETVAL = obj;
+#ifdef JS_THREADSAFE
+ JS_EndRequest(cx);
+#endif
}
OUTPUT:
RETVAL
@@ -404,6 +512,9 @@
na = (uintN) nargs;
CODE:
{
+#ifdef JS_THREADSAFE
+ JS_BeginRequest(cx);
+#endif
obj = JS_InitClass(cx, iobj, parent_proto, clasp,
constructor, nargs, ps, fs, static_ps,
static_fs);
@@ -411,6 +522,9 @@
XSRETURN_UNDEF;
}
RETVAL = obj;
+#ifdef JS_THREADSAFE
+ JS_EndRequest(cx);
+#endif
}
OUTPUT:
RETVAL
@@ -469,11 +583,17 @@
JSBool rc;
CODE:
{
+#ifdef JS_THREADSAFE
+ JS_BeginRequest(cx);
+#endif
rc = JS_InitStandardClasses(cx, gobj);
if(!rc) {
XSRETURN_UNDEF;
}
RETVAL = (int) rc;
+#ifdef JS_THREADSAFE
+ JS_BeginRequest(cx);
+#endif
}
OUTPUT:
RETVAL
@@ -582,10 +702,18 @@
rc = JS_GetProperty(cx, obj, name, &vp);
if(rc) {
str = JS_ValueToString(cx, vp);
+#if JS_VERSION < 185
if(strcmp(JS_GetStringBytes(str), "undefined") == 0) {
+#else
+ if(strcmp(JS_EncodeString(cx, str), "undefined") == 0) {
+#endif
sv = &PL_sv_undef;
} else {
+#if JS_VERSION < 185
sv_setpv(sv, JS_GetStringBytes(str));
+#else
+ sv_setpv(sv, JS_EncodeString(cx, str));
+#endif
}
} else {
sv = &PL_sv_undef;
@@ -675,10 +803,18 @@
rc = JS_GetElement(cx, obj, idx, &vp);
if(rc) {
str = JS_ValueToString(cx, vp);
+#if JS_VERSION < 185
if(strcmp(JS_GetStringBytes(str), "undefined") == 0) {
+#else
+ if(strcmp(JS_EncodeString(cx, str), "undefined") == 0) {
+#endif
sv = &PL_sv_undef;
} else {
+#if JS_VERSION < 185
sv_setpv(sv, JS_GetStringBytes(str));
+#else
+ sv_setpv(sv, JS_EncodeString(cx, str));
+#endif
}
} else {
sv = &PL_sv_undef;
@@ -718,7 +854,11 @@
PJS_Context* pcx = (PJS_Context *) JS_GetContextPrivate(cx);
pcx->branch_count = 0;
pcx->branch_max = max_branch_operations;
+#if JS_VERSION < 181
JS_SetBranchCallback(cx, BranchHandler);
+#else
+ JS_SetOperationCallback(cx, BranchHandler);
+#endif
}
OUTPUT:
diff -ur a/t/error.t b/t/error.t
--- a/t/error.t 2010-05-28 13:02:43.000000000 -0400
+++ b/t/error.t 2012-10-11 14:56:18.000000000 -0400
@@ -9,7 +9,7 @@
$js1->init ();
ok (!$js1->eval ($jscode1));
ok ($@ !~ "\n");
-ok ($@ =~ "SyntaxError");
+ok ($@ =~ "SyntaxError" || $@ =~ "ReferenceError: invalid assignment left-hand side");
#print "$@\n";
my $jscode2 =<<EOF;
var fruit = non_existant_function ();