[Pkg-mozext-commits] [adblock-plus] 122/464: Update for the compartments world. Yuck.
David Prévot
taffit at moszumanska.debian.org
Tue Jul 22 20:44:09 UTC 2014
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository adblock-plus.
commit 72a3ce7a0a0df30c37093f9fafe1b7e5c1be69c6
Author: Joshua Cranmer <Pidgeot18 at gmail.com>
Date: Mon Jan 10 22:55:22 2011 -0500
Update for the compartments world. Yuck.
---
Makefile | 4 +-
jshydra.cpp | 304 ++++++++++++++++++++++++++---------------------------
jshydra_bridge.cpp | 35 +++---
jshydra_funcs.cpp | 147 ++++++++++++++++----------
jshydra_funcs.h | 2 +-
5 files changed, 268 insertions(+), 224 deletions(-)
diff --git a/Makefile b/Makefile
index 9ac8c3d..b852f61 100644
--- a/Makefile
+++ b/Makefile
@@ -9,13 +9,11 @@ MODULE := js
include $(MOZ_OBJDIR)/js/src/config/autoconf.mk
include $(MOZ_SRCDIR)/js/src/config/config.mk
-LINK := -L$(MOZ_OBJDIR)/dist/lib -lnspr4 -lm
-
jshydra$(BIN_SUFFIX): jshydra.$(OBJ_SUFFIX) jshydra_funcs.$(OBJ_SUFFIX) jshydra_bridge.$(OBJ_SUFFIX) $(MOZ_OBJDIR)/js/src/$(LIB_PREFIX)js_static.$(LIB_SUFFIX)
ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
$(LD) -nologo -out:$@ $^ $(LDFLAGS) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
else
- g++ -o $@ $^ $(LDFLAGS) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS)
+ g++ -o $@ $^ $(LDFLAGS) $(LIBS) $(EXTRA_LIBS) $(OS_LIBS) -lnspr4
endif
.deps:
diff --git a/jshydra.cpp b/jshydra.cpp
index 84ec3f0..7562e56 100644
--- a/jshydra.cpp
+++ b/jshydra.cpp
@@ -5,37 +5,31 @@
#include "jsscript.h" // jsparse.h
#include "jsinterp.h" // jsparse.h
#include "jsparse.h"
+#include "jsregexp.h"
#include <stdio.h>
+#include <sys/stat.h>
#include "jshydra_bridge.h"
-struct ASTNode {
- JSTokenType type;
- JSTokenPos position;
- ASTNode *firstChild;
- ASTNode *nextSibling;
- void *data;
-};
-
-extern ASTNode *parseNodeToASTNode(JSParseNode *node);
+using namespace js;
void setIntProperty(JSObject *obj, const char *name, int value) {
- jshydra_defineProperty(cx, obj, name, INT_TO_JSVAL(value));
+ jshydra_defineProperty(cx, obj, name, INT_TO_JSVAL(value));
}
void setObjectProperty(JSObject *obj, const char *name, JSObject *value) {
- jshydra_defineProperty(cx, obj, name, OBJECT_TO_JSVAL(value));
+ jshydra_defineProperty(cx, obj, name, OBJECT_TO_JSVAL(value));
}
void setArrayElement(JSObject *array, jsint index, JSObject *value) {
- jsval argv[1];
- if (value)
- argv[0] = OBJECT_TO_JSVAL(value);
- else
- argv[0] = JSVAL_NULL;
- JS_SetElement(cx, array, index, argv);
+ jsval argv[1];
+ if (value)
+ argv[0] = OBJECT_TO_JSVAL(value);
+ else
+ argv[0] = JSVAL_NULL;
+ JS_SetElement(cx, array, index, argv);
}
typedef enum TokenValue {
- FUNCTION, LIST, TERNARY, BINARY, UNARY, NAME, LEXICAL, APAIR, OBJLITERAL, DOUBLELITERAL, NULLARY, NAMESET, ERROR
+ FUNCTION, LIST, TERNARY, BINARY, UNARY, NAME, LEXICAL, APAIR, OBJLITERAL, DOUBLELITERAL, NULLARY, NAMESET, ERROR
} TokenValue;
TokenValue tokens[] = {
@@ -48,54 +42,55 @@ TokenValue tokens[] = {
TokenValue arityFix[] = {NULLARY, UNARY, BINARY, TERNARY, FUNCTION, LIST, NAME};
JSObject *makeNode(JSParseNode *node) {
- if (!node)
- return NULL;
- if (!JS_EnterLocalRootScope(cx))
- return NULL;
- JSObject *object = JS_NewObject(cx, &js_node_class, NULL, NULL);
- setIntProperty(object, "line", node->pn_pos.begin.lineno);
- setIntProperty(object, "column", node->pn_pos.begin.index);
- setIntProperty(object, "op", node->pn_op);
- setIntProperty(object, "type", node->pn_type);
+ if (!node)
+ return NULL;
+ if (!JS_EnterLocalRootScope(cx))
+ return NULL;
+ JSObject *object = JS_NewObject(cx, &js_node_class, NULL, NULL);
+ setIntProperty(object, "line", node->pn_pos.begin.lineno);
+ setIntProperty(object, "column", node->pn_pos.begin.index);
+ setIntProperty(object, "op", node->pn_op);
+ setIntProperty(object, "type", node->pn_type);
- // Some of our nodes actually need the arity to work right.
- TokenValue value = tokens[node->pn_type];
- if (node->pn_type == TOK_COLON ||
+ // Some of our nodes actually need the arity to work right.
+ TokenValue value = tokens[node->pn_type];
+ if (node->pn_type == TOK_COLON ||
(node->pn_type >= TOK_OR && node->pn_type <= TOK_DIVOP))
- value = arityFix[node->pn_arity];
+ value = arityFix[node->pn_arity];
- switch (value) {
- case FUNCTION: {
- setIntProperty(object, "flags", node->pn_dflags);
- JSFunction *func = (JSFunction *) node->pn_funbox->object;
- if (func->atom)
- jshydra_defineProperty(cx, object, "name", ATOM_KEY(func->atom));
+ switch (value) {
+ case FUNCTION: {
+ setIntProperty(object, "flags", node->pn_dflags);
+ JSFunction *func = (JSFunction *) node->pn_funbox->object;
+ if (func->atom)
+ jshydra_defineProperty(cx, object, "name", ATOM_TO_JSVAL(func->atom));
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- setArrayElement(array, 0, makeNode(node->pn_body));
- setObjectProperty(object, "kids", array);
- break;
- }
- case LIST: {
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- int i = 0;
- JSParseNode *element = node->pn_head;
- for (; element; element = element->pn_next) {
- setArrayElement(array, i++, makeNode(element));
- }
- setObjectProperty(object, "kids", array);
- break;
- }
- case TERNARY: {
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- setArrayElement(array, 0, makeNode(node->pn_kid1));
- setArrayElement(array, 1, makeNode(node->pn_kid2));
- setArrayElement(array, 2, makeNode(node->pn_kid3));
- setObjectProperty(object, "kids", array);
- break;
- }
+ JSObject *array = JS_NewArrayObject(cx, 0, NULL);
+ setArrayElement(array, 0, makeNode(node->pn_body));
+ setObjectProperty(object, "kids", array);
+ break;
+ }
+ case LIST: {
+ JSObject *array = JS_NewArrayObject(cx, 0, NULL);
+ int i = 0;
+ JSParseNode *element = node->pn_head;
+ for (; element; element = element->pn_next) {
+ setArrayElement(array, i++, makeNode(element));
+ }
+ setObjectProperty(object, "kids", array);
+ break;
+ }
+ case TERNARY: {
+ JSObject *array = JS_NewArrayObject(cx, 0, NULL);
+ setArrayElement(array, 0, makeNode(node->pn_kid1));
+ setArrayElement(array, 1, makeNode(node->pn_kid2));
+ setArrayElement(array, 2, makeNode(node->pn_kid3));
+ setObjectProperty(object, "kids", array);
+ break;
+ }
case BINARY: {
- jshydra_defineProperty(cx, object, "value", node->pn_val);
+ if (node->pn_pval)
+ jshydra_defineProperty(cx, object, "value", *Jsvalify(node->pn_pval));
// This is how for and for each are distinguished...
if (node->pn_type == TOK_FOR)
setIntProperty(object, "iflags", node->pn_iflags);
@@ -105,36 +100,36 @@ JSObject *makeNode(JSParseNode *node) {
setObjectProperty(object, "kids", array);
break;
}
- case UNARY: {
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- setArrayElement(array, 0, makeNode(node->pn_kid));
- setObjectProperty(object, "kids", array);
+ case UNARY: {
+ JSObject *array = JS_NewArrayObject(cx, 0, NULL);
+ setArrayElement(array, 0, makeNode(node->pn_kid));
+ setObjectProperty(object, "kids", array);
jshydra_defineProperty(cx, object, "number", INT_TO_JSVAL(node->pn_num));
- break;
- }
- case NAME: {
- JS_DefineProperty(cx, object, "atom", ATOM_KEY(node->pn_atom), NULL, NULL, JSPROP_READONLY | JSPROP_ENUMERATE);
- setIntProperty(object, "flags", node->pn_dflags);
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- // This is only valid for PN_NAME objects--some are not quite PN_NAME.
- if (!node->pn_used && node->pn_arity == PN_NAME)
- setArrayElement(array, 0, makeNode(node->pn_expr));
- setObjectProperty(object, "kids", array);
- break;
- }
- case NAMESET: {
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- setArrayElement(array, 0, makeNode(node->pn_tree));
- setObjectProperty(object, "kids", array);
- break;
- }
- case LEXICAL: {
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- setArrayElement(array, 0, makeNode(node->pn_expr));
- setObjectProperty(object, "kids", array);
- break;
- }
- //case APAIR:
+ break;
+ }
+ case NAME: {
+ JS_DefineProperty(cx, object, "atom", ATOM_TO_JSVAL(node->pn_atom), NULL, NULL, JSPROP_READONLY | JSPROP_ENUMERATE);
+ setIntProperty(object, "flags", node->pn_dflags);
+ JSObject *array = JS_NewArrayObject(cx, 0, NULL);
+ // This is only valid for PN_NAME objects--some are not quite PN_NAME.
+ if (!node->pn_used && node->pn_arity == PN_NAME)
+ setArrayElement(array, 0, makeNode(node->pn_expr));
+ setObjectProperty(object, "kids", array);
+ break;
+ }
+ case NAMESET: {
+ JSObject *array = JS_NewArrayObject(cx, 0, NULL);
+ setArrayElement(array, 0, makeNode(node->pn_tree));
+ setObjectProperty(object, "kids", array);
+ break;
+ }
+ case LEXICAL: {
+ JSObject *array = JS_NewArrayObject(cx, 0, NULL);
+ setArrayElement(array, 0, makeNode(node->pn_expr));
+ setObjectProperty(object, "kids", array);
+ break;
+ }
+ //case APAIR:
case OBJLITERAL: {
// The object in the parse tree is not itself sufficient to really act as a
// parse node, so we clone the object to get the right prototype stuff.
@@ -146,79 +141,84 @@ JSObject *makeNode(JSParseNode *node) {
setObjectProperty(object, "kids", array);
break;
}
- case DOUBLELITERAL: {
- jsval dval;
- if (!JS_NewDoubleValue(cx, node->pn_dval, &dval)) {
- fprintf(stderr, "I think I ran out of memory...\n");
- return NULL;
- }
- jshydra_defineProperty(cx, object, "value", dval);
- break;
- }
- case NULLARY: {
+ case DOUBLELITERAL: {
+ jshydra_defineProperty(cx, object, "value", DOUBLE_TO_JSVAL(node->pn_dval));
+ break;
+ }
+ case NULLARY: {
jshydra_defineProperty(cx, object, "number", INT_TO_JSVAL(node->pn_num));
- break;
+ break;
}
- case ERROR:
- default:
- fprintf(stderr, "Unexpected type: %d (arity %d)\n", node->pn_type, node->pn_arity);
- break;
- }
- JS_LeaveLocalRootScopeWithResult(cx, OBJECT_TO_JSVAL(object));
- return object;
+ case ERROR:
+ default:
+ fprintf(stderr, "Unexpected type: %d (arity %d)\n", node->pn_type, node->pn_arity);
+ break;
+ }
+ JS_LeaveLocalRootScopeWithResult(cx, OBJECT_TO_JSVAL(object));
+ return object;
}
bool parseFile(FILE *file, char *filename, char *argstr) {
- JSCompiler compiler(cx, NULL, NULL);
- if (!compiler.init(NULL, 0, file, filename, 1))
- return false;
- JSParseNode *root = compiler.parse(globalObj);
- JSObject *ast = makeNode(root);
- jshydra_rootObject(cx, ast);
- jsval func = jshydra_getToplevelFunction(cx, "process_js");
- if (JS_TypeOfValue(cx, func) != JSTYPE_FUNCTION) {
- fprintf(stderr, "No function process_js!\n");
- return false;
- }
- jsval rval, argv[3];
- argv[0] = OBJECT_TO_JSVAL(ast);
- JSString *newfname = JS_NewStringCopyZ(cx, filename);
- argv[1] = STRING_TO_JSVAL(newfname);
- JSString *jsArgStr = JS_NewStringCopyZ(cx, argstr);
- argv[2] = STRING_TO_JSVAL(jsArgStr);
- return JS_CallFunctionValue(cx, globalObj, func, 3, argv, &rval);
+ js::Compiler compiler(cx, NULL, NULL);
+ // Read in the file into a buffer
+ struct stat st;
+ int ok = fstat(fileno(file), &st);
+ if (ok != 0)
+ return false;
+ jschar *buf = (jschar*)malloc(st.st_size * sizeof(jschar));
+ int i = 0, c;
+ while ((c = getc(file)) != EOF)
+ buf[i++] = (jschar)(unsigned char)c;
+ if (!compiler.init(buf, st.st_size, filename, 1))
+ return false;
+ JSParseNode *root = compiler.parser.parse(globalObj);
+ free(buf);
+ JSObject *ast = makeNode(root);
+ jshydra_rootObject(cx, ast);
+ jsval func = jshydra_getToplevelFunction(cx, "process_js");
+ if (JS_TypeOfValue(cx, func) != JSTYPE_FUNCTION) {
+ fprintf(stderr, "No function process_js!\n");
+ return false;
+ }
+ jsval rval, argv[3];
+ argv[0] = OBJECT_TO_JSVAL(ast);
+ JSString *newfname = JS_NewStringCopyZ(cx, filename);
+ argv[1] = STRING_TO_JSVAL(newfname);
+ JSString *jsArgStr = JS_NewStringCopyZ(cx, argstr);
+ argv[2] = STRING_TO_JSVAL(jsArgStr);
+ return JS_CallFunctionValue(cx, globalObj, func, 3, argv, &rval);
}
int main(int argc, char **argv) {
- if (argc < 3) {
- fprintf(stderr, "Usage: %s script filename...\n", argv[0]);
- return -1;
- }
- jshydra_init(argv[1]);
- jshydra_includeScript(cx, argv[1]);
- argc--;
- argv++;
- char *argstr = NULL;
+ if (argc < 3) {
+ fprintf(stderr, "Usage: %s script filename...\n", argv[0]);
+ return -1;
+ }
+ jshydra_init(argv[1]);
+ jshydra_includeScript(cx, argv[1]);
+ argc--;
+ argv++;
+ char *argstr = NULL;
bool failure = false;
- do {
- argc--;
- argv++;
- if (!strcmp(argv[0], "--arg")) {
- argc--;
- argv++;
- argstr = argv[0];
- continue;
- }
- FILE *input = fopen(argv[0], "r");
- if (!input) {
- fprintf(stderr, "No such file %s\n", argv[0]);
- continue;
- }
- failure |= !parseFile(input, argv[0], argstr);
+ do {
+ argc--;
+ argv++;
+ if (!strcmp(argv[0], "--arg")) {
+ argc--;
+ argv++;
+ argstr = argv[0];
+ continue;
+ }
+ FILE *input = fopen(argv[0], "r");
+ if (!input) {
+ fprintf(stderr, "No such file %s\n", argv[0]);
+ continue;
+ }
+ failure |= !parseFile(input, argv[0], argstr);
if (failure)
fprintf(stderr, "Failure happened on input %s\n", argv[0]);
- } while (argc > 1);
+ } while (argc > 1);
- return !!failure;
+ return !!failure;
}
diff --git a/jshydra_bridge.cpp b/jshydra_bridge.cpp
index 4067e7b..f379b80 100644
--- a/jshydra_bridge.cpp
+++ b/jshydra_bridge.cpp
@@ -31,6 +31,14 @@ JSObject *globalObj;
JSObject *rootArray;
+static JSClass global_class = {
+ "global", JSCLASS_GLOBAL_FLAGS,
+ JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
+ JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
+ JSCLASS_NO_OPTIONAL_MEMBERS
+
+};
+
static char *my_dirname (char *path);
JSClass js_node_class = {
@@ -43,13 +51,13 @@ JSClass js_node_class = {
void jshydra_init(const char *file) {
static JSFunctionSpec shell_functions[] = {
- {"_print", Print, 0},
- {"include", Include, 1},
- {"write_file", WriteFile, 1},
- {"read_file", ReadFile, 1},
- {"diagnostic", Diagnostic, 0},
- {"require", Require, 1},
- {"hashcode", Hashcode, 1},
+ JS_FN("_print", Print, 0, 0),
+ JS_FN("include", Include, 1, 0),
+ JS_FN("write_file", WriteFile, 1, 0),
+ JS_FN("read_file", ReadFile, 1, 0),
+ JS_FN("diagnostic", Diagnostic, 0, 0),
+ JS_FN("require", Require, 1, 0),
+ JS_FN("hashcode", Hashcode, 1, 0),
{0}
};
@@ -61,7 +69,8 @@ void jshydra_init(const char *file) {
//JS_SetContextPrivate (this->cx, this);
- globalObj = JS_NewObject (cx, NULL, 0, 0);
+ globalObj = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
+ JS_EnterCrossCompartmentCall(cx, globalObj);
JS_InitStandardClasses (cx, globalObj);
/* register error handler */
JS_SetErrorReporter (cx, ErrorReporter);
@@ -117,7 +126,7 @@ void jshydra_init(const char *file) {
jshydra_defineProperty(cx, globalObj, *name++, INT_TO_JSVAL(index++));
rootArray = JS_NewArrayObject(cx, 0, NULL);
- JS_AddRoot(cx, &rootArray);
+ JS_AddObjectRoot(cx, &rootArray);
jshydra_rootObject(cx, globalObj);
}
@@ -131,7 +140,8 @@ int jshydra_includeScript (JSContext *cx, const char *script) {
if (!JS_EnterLocalRootScope(cx))
return -1;
jsval rval;
- int ret = !Include (cx, globalObj, 1, &strval, &rval);
+
+ int ret = !JS_CallFunctionName(cx, globalObj, "include", 1, &strval, &rval);
JS_LeaveLocalRootScope(cx);
return ret;
}
@@ -186,12 +196,13 @@ FILE *jshydra_searchPath (JSContext *cx, const char *filename, char **realname)
JSString *dir_str = JS_ValueToString(cx, val);
if (!dir_str) continue;
- char *dir = JS_GetStringBytes(dir_str);
+ char *dir = JS_EncodeString(cx, dir_str);
char *buf = static_cast<char *>(malloc(strlen(dir) + strlen(filename) + 2));
/* Doing a little extra work here to get rid of unneeded '/'. */
const char *sep = dir[strlen(dir)-1] == '/' ? "" : "/";
sprintf(buf, "%s%s%s", dir, sep, filename);
+ JS_free(cx, dir);
FILE *f = fopen(buf, "r");
if (f) {
*realname = buf;
@@ -280,7 +291,7 @@ JSObject *jshydra_getRegexPrototype(JSContext *cx) {
static JSObject *proto = NULL;
if (proto == NULL) {
char str[1];
- JSObject *regex = JS_NewRegExpObject(cx, str, 0, 0);
+ JSObject *regex = JS_NewRegExpObjectNoStatics(cx, str, 0, 0);
proto = JS_GetPrototype(cx, regex);
}
return proto;
diff --git a/jshydra_funcs.cpp b/jshydra_funcs.cpp
index d5c87fd..29fec40 100644
--- a/jshydra_funcs.cpp
+++ b/jshydra_funcs.cpp
@@ -12,7 +12,7 @@
JSBool require_version(JSContext *cx, jsval val) {
JSString *version_str = JS_ValueToString(cx, val);
if (!version_str) return JS_FALSE;
- char *version_cstr = JS_GetStringBytes(version_str);
+ char *version_cstr = JS_EncodeString(cx, version_str);
JSVersion version = JS_StringToVersion(version_cstr);
JSBool retval;
if (version == JSVERSION_UNKNOWN) {
@@ -22,6 +22,7 @@ JSBool require_version(JSContext *cx, jsval val) {
JS_SetVersion(cx, version);
retval = JS_TRUE;
}
+ JS_free(cx, version_cstr);
return retval;
}
@@ -75,11 +76,10 @@ jsval get_version(JSContext *cx)
return STRING_TO_JSVAL(version_str);
}
-JSBool Require(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
- jsval *rval)
+JSBool Require(JSContext *cx, uintN argc, jsval *vp)
{
JSObject *args;
- if (!JS_ConvertArguments(cx, argc, argv, "o", &args)) return JS_FALSE;
+ if (!JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "o", &args)) return JS_FALSE;
JSIdArray *prop_ids = JS_Enumerate(cx, args);
if (!prop_ids) return JS_FALSE;
@@ -87,18 +87,21 @@ JSBool Require(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
JSBool retval = JS_TRUE;
int i;
for (i = 0; i < prop_ids->length; ++i) {
+ xassert(JS_EnterLocalRootScope(cx));
jsval prop;
JSBool rv = JS_IdToValue(cx, prop_ids->vector[i], &prop);
- argv[argc+1] = prop;
xassert(rv);
JSString *prop_str = JSVAL_TO_STRING(prop);
- char *prop_name = JS_GetStringBytes(prop_str);
+ char *prop_name = JS_EncodeString(cx, prop_str);
+ xassert(prop_name);
jsval prop_val;
rv = JS_GetProperty(cx, args, prop_name, &prop_val);
xassert(rv);
rv = dispatch_require(cx, prop_name, prop_val);
if (rv == JS_FALSE) retval = JS_FALSE;
+ JS_free(cx, prop_name);
+ JS_LeaveLocalRootScope(cx);
}
JS_DestroyIdArray(cx, prop_ids);
if (!retval) return retval;
@@ -106,7 +109,7 @@ JSBool Require(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
/* Report the now-current options. */
JSObject *rvalo = JS_NewObject(cx, NULL, NULL, NULL);
if (!rvalo) return JS_FALSE;
- *rval = OBJECT_TO_JSVAL(rvalo);
+ JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(rvalo));
JS_DefineProperty(
cx, rvalo, "version", get_version(cx), NULL, NULL, JSPROP_ENUMERATE);
uint32 options = JS_GetOptions(cx);
@@ -151,10 +154,10 @@ static JSBool jshydra_loadScript (JSContext *cx, const char *filename,
}
JSObject *sobj = JS_NewScriptObject(cx, script);
- JS_AddNamedRoot(cx, &sobj, filename);
+ JS_AddNamedObjectRoot(cx, &sobj, filename);
jsval rval;
JSBool rv = JS_ExecuteScript(cx, ns, script, &rval);
- JS_RemoveRoot(cx, &sobj);
+ JS_RemoveObjectRoot(cx, &sobj);
if (!rv) {
xassert(JS_IsExceptionPending(cx));
return JS_FALSE;
@@ -163,14 +166,21 @@ static JSBool jshydra_loadScript (JSContext *cx, const char *filename,
}
/* should use this function to load all objects to avoid possibity of objects including themselves */
-JSBool Include(JSContext *cx, JSObject *obj, uintN argc,
- jsval *argv, jsval *rval) {
- char *filename;
+JSBool Include(JSContext *cx, uintN argc, jsval *vp)
+{
+ jsval *argv = JS_ARGV(cx, vp);
+ if (!JSVAL_IS_STRING(argv[0]))
+ return JS_FALSE;
+
+ char *filename = JS_EncodeString(cx, JSVAL_TO_STRING(argv[0]));
+ xassert(filename);
+
JSObject *ns = globalObj;
- if (!JS_ConvertArguments(cx, argc, argv, "s/o", &filename, &ns))
+ if (!JS_ConvertArguments(cx, argc, argv, "*/o", &filename, &ns))
return JS_FALSE;
+
+ JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(ns));
- *rval = OBJECT_TO_JSVAL (ns);
JSObject *includedArray = NULL;
jsval val;
JS_GetProperty(cx, ns, "_includedArray", &val);
@@ -186,27 +196,33 @@ JSBool Include(JSContext *cx, JSObject *obj, uintN argc,
if (JSVAL_TO_INT (val) != -1) return JS_TRUE;
}
- JS_CallFunctionName (cx, includedArray, "push", 1, argv, rval);
- return jshydra_loadScript (cx, filename, ns);
+ JS_CallFunctionName (cx, includedArray, "push", 1, argv, &JS_RVAL(cx,vp));
+ JSBool rv = jshydra_loadScript (cx, filename, ns);
+ JS_free(cx, filename);
+ return rv;
}
-JSBool Diagnostic(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
- jsval *rval) {
+JSBool Diagnostic(JSContext *cx, uintN argc, jsval *vp)
+{
+ jsval *argv = JS_ARGV(cx, vp);
JSBool is_error;
- const char *msg, *file, *error_string;
+ const char *msg, *error_string;
+ char *file;
jsint line;
JSObject *loc_obj = NULL;
- if (!JS_ConvertArguments(cx, argc, argv, "bs/o", &is_error, &msg, &loc_obj))
+ if (!JS_ConvertArguments(cx, argc, argv, "b*/o", &is_error, &msg, &loc_obj))
return JS_FALSE;
+ JS_SET_RVAL(cx, vp, JSVAL_VOID);
error_string = is_error ? "error" : "warning";
if (loc_obj) {
jsval jsfile, jsline;
if (JS_GetProperty(cx, loc_obj, "file", &jsfile) &&
JS_GetProperty(cx, loc_obj, "line", &jsline)) {
- file = JS_GetStringBytes(JSVAL_TO_STRING(jsfile));
+ file = JS_EncodeString(cx, JSVAL_TO_STRING(jsfile));
line = JSVAL_TO_INT(jsline);
printf("%s:%d: %s: %s\n", file, line, error_string, msg);
+ JS_free(cx, file);
return JS_TRUE;
}
}
@@ -215,53 +231,73 @@ JSBool Diagnostic(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
return JS_TRUE;
}
-JSBool Print(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
- jsval *rval)
+JSBool Print(JSContext *cx, uintN argc, jsval *vp)
{
uintN i;
+ jsval *argv = JS_ARGV(cx, vp);
for (i = 0; i < argc; i++) {
JSString *str = JS_ValueToString(cx, argv[i]);
if (!str)
return JS_FALSE;
- printf("%s", JS_GetStringBytes(str));
+ char *c_str = JS_EncodeString(cx, str);
+ printf("%s", c_str);
+ JS_free(cx, c_str);
}
printf("\n");
+ JS_SET_RVAL(cx, vp, JSVAL_VOID);
return JS_TRUE;
}
-JSBool WriteFile(JSContext *cx, JSObject *obj, uintN argc,
- jsval *argv, jsval *rval) {
- const char *filename;
+JSBool WriteFile(JSContext *cx, uintN argc, jsval *vp)
+{
+ jsval *argv = JS_ARGV(cx, vp);
JSString *str;
- JSBool rv = JS_ConvertArguments(cx, argc, argv, "sS", &filename, &str);
- if (!rv) return JS_FALSE;
+ if (!JS_ConvertArguments(cx, argc, argv, "*S", &str))
+ return JS_FALSE;
+ if (!JSVAL_IS_STRING(argv[0]))
+ return JS_FALSE;
+ char *filename = JS_EncodeString(cx, JSVAL_TO_STRING(argv[0]));
+ xassert(filename);
+
+ JSBool rv = JS_FALSE;
FILE *f = fopen (filename, "w");
if (!f) {
REPORT_ERROR_2(cx, "write_file: error opening file '%s': %s",
filename, strerror(errno));
- return JS_FALSE;
+ } else {
+ char *bytes = JS_EncodeString(cx, str);
+ xassert(bytes);
+ fwrite (bytes, 1, JS_GetStringLength(str), f);
+ fclose (f);
+ JS_free(cx, bytes);
+ JS_SET_RVAL(cx, vp, JSVAL_VOID);
+ rv = JS_TRUE;
}
- fwrite (JS_GetStringBytes(str), 1, JS_GetStringLength(str), f);
- fclose (f);
- return JS_TRUE;
+ JS_free(cx, filename);
+ return rv;
}
-JSBool ReadFile(JSContext *cx, JSObject *obj, uintN argc,
- jsval *argv, jsval *rval) {
- const char *filename;
- JSBool rv = JS_ConvertArguments(cx, argc, argv, "s", &filename);
- if (!rv) return JS_FALSE;
-
+JSBool ReadFile(JSContext *cx, uintN argc, jsval *vp)
+{
+ jsval *argv = JS_ARGV(cx, vp);
+ if (!JSVAL_IS_STRING(argv[0]))
+ return JS_FALSE;
+ char *filename = JS_EncodeString(cx, JSVAL_TO_STRING(argv[0]));
+ xassert(filename);
long size = 0;
char *buf = readFile (filename, &size);
+ JSBool rv = JS_FALSE;
if(!buf) {
REPORT_ERROR_2(cx, "read_file: error opening file '%s': %s",
filename, strerror(errno));
- return JS_FALSE;
+ } else {
+ JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyN(cx, buf, size)));
+ rv = JS_TRUE;
}
- *rval = STRING_TO_JSVAL(JS_NewString(cx, buf, size));
- return JS_TRUE;
+ free(buf);
+ JS_free(cx, filename);
+ return rv;
}
/* author: tglek
@@ -269,33 +305,31 @@ JSBool ReadFile(JSContext *cx, JSObject *obj, uintN argc,
The ES4 spec says that it shouldn't be a pointer(with good reason).
A counter is morally wrong because in theory it could loop around and bite me,
but I lack in moral values and don't enjoy abusing pointers any further */
-JSBool Hashcode(JSContext *cx, JSObject *obj_this, uintN argc,
- jsval *argv, jsval *rval)
+JSBool Hashcode(JSContext *cx, uintN argc, jsval *vp)
{
if (!argc)
- return JSVAL_FALSE;
- jsval o = *argv;
+ return JS_FALSE;
+ jsval o = *JS_ARGV(cx, vp);
if (!JSVAL_IS_OBJECT (o)) {
- *rval = o;
- return JSVAL_TRUE;
+ JS_SET_RVAL(cx, vp, o);
+ return JS_TRUE;
}
- JSObject *obj = JSVAL_TO_OBJECT (*argv);
+ JSObject *obj = JSVAL_TO_OBJECT (o);
JSBool has_prop;
/* Need to check for property first to keep treehydra from getting angry */
-#if JS_VERSION < 180
-#define JS_AlreadyHasOwnProperty JS_HasProperty
-#endif
if (JS_AlreadyHasOwnProperty(cx, obj, "_hashcode", &has_prop) && has_prop) {
- JS_GetProperty(cx, obj, "_hashcode", rval);
+ jsval rval;
+ JS_GetProperty(cx, obj, "_hashcode", &rval);
+ JS_SET_RVAL(cx, vp, rval);
} else {
static int counter = 0;
char str[256];
jsval val;
- JS_snprintf (str, sizeof (str), "%x", ++counter);
+ snprintf (str, sizeof (str), "%x", ++counter);
val = STRING_TO_JSVAL (JS_NewStringCopyZ (cx, str));
JS_DefineProperty (cx, obj, "_hashcode", val,
NULL, NULL, JSPROP_PERMANENT | JSPROP_READONLY);
- *rval = val;
+ JS_SET_RVAL(cx, vp, val);
}
return JS_TRUE;
}
@@ -394,7 +428,7 @@ ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
/* reformat the spidermonkey stack */
JS_GetProperty(cx, JSVAL_TO_OBJECT (exn), "stack", &stack);
if (JS_TypeOfValue (cx, stack) == JSTYPE_STRING) {
- char *str = JS_GetStringBytes (JSVAL_TO_STRING (stack));
+ char *str = JS_EncodeString(cx, JSVAL_TO_STRING (stack));
int counter = 0;
do {
char *eol = strchr (str, '\n');
@@ -413,6 +447,7 @@ ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
break;
}
} while (*str);
+ JS_free(cx, str);
}
}
fflush(stderr);
diff --git a/jshydra_funcs.h b/jshydra_funcs.h
index deccf0b..65f5cc1 100644
--- a/jshydra_funcs.h
+++ b/jshydra_funcs.h
@@ -4,7 +4,7 @@
/* JS Natives */
-#define DH_JSNATIVE(fname) JSBool fname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+#define DH_JSNATIVE(fname) JSBool fname(JSContext *cx, uintN argc, jsval *vp)
DH_JSNATIVE(Require);
DH_JSNATIVE(Include);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/adblock-plus.git
More information about the Pkg-mozext-commits
mailing list