[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