[Pkg-mozext-commits] [adblock-plus] 301/464: Removed SpiderMonkey compilation code, automated downloading of the JS shell instead
David Prévot
taffit at moszumanska.debian.org
Tue Jul 22 20:44:27 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 c7eea730c393a6e58907d9850fb6220a9a7ff07e
Author: Wladimir Palant <trev at adblockplus.org>
Date: Fri Oct 12 14:16:37 2012 +0200
Removed SpiderMonkey compilation code, automated downloading of the JS shell instead
---
.hgignore | 5 -
Makefile | 61 -------
abp_rewrite.py | 37 ++++-
configure | 114 -------------
jshydra.cpp | 242 ----------------------------
jshydra_bridge.cpp | 302 -----------------------------------
jshydra_bridge.h | 34 ----
jshydra_funcs.cpp | 457 -----------------------------------------------------
jshydra_funcs.h | 39 -----
jshydra_tokens.h | 88 -----------
10 files changed, 32 insertions(+), 1347 deletions(-)
diff --git a/.hgignore b/.hgignore
index 7b91165..7db5146 100644
--- a/.hgignore
+++ b/.hgignore
@@ -1,7 +1,2 @@
-^config\.mk$
-^jshydra$
-\.o$
-^\.deps/
-
^mozilla/
^jstest/
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 17bfa3e..0000000
--- a/Makefile
+++ /dev/null
@@ -1,61 +0,0 @@
-include config.mk
-
-# Defines for the mozilla build system
-DEPTH := $(MOZ_OBJDIR)/js/src
-topsrcdir := $(MOZ_SRCDIR)/js/src
-srcdir := $(MOZ_SRCDIR)/js/src
-MODULE := js
-
-include $(MOZ_OBJDIR)/js/src/config/autoconf.mk
-include $(MOZ_SRCDIR)/js/src/config/config.mk
-
-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) -lnspr4
-endif
-
-.deps:
- @if [ ! -e .deps ]; then mkdir .deps; fi
-
-%.$(OBJ_SUFFIX): %.cpp .deps $(MOZ_OBJDIR)/js/src/$(LIB_PREFIX)js_static.$(LIB_SUFFIX)
- $(CXX) -o $@ -c $(COMPILE_CXXFLAGS) $<
-
-clean:
- @rm -rf jshydra$(BIN_SUFFIX) *.$(OBJ_SUFFIX) *.$(LIB_SUFFIX) .deps
-
--include $(wildcard .deps/*.pp)
-
-TESTS := $(notdir $(wildcard autotest/test_*.js))
-check::
- @cd autotest && for f in $(TESTS); do \
- eval $$(cat $$f | sed -e '/^\/\/ [A-Za-z]*:/!q' -e 's+^// \([A-Za-z]*\): \(.*\)$$+export \1="\2"+'); \
- echo -n "$$Name... "; \
- ../mozilla/js/src/shell/js$(BIN_SUFFIX) ../jshydra.js $$f $$Arguments > .$$f.out 2>&1; \
- if diff -w -q ".$$f.out" "$$f.expected" >/dev/null 2>&1; then \
- echo ' passed!'; \
- else \
- echo ' failed! Log:'; \
- cat .$$f.out; \
- fi \
- done && rm .*.out
-
-.PHONY: check
-
-echo-variable-%:
- @echo "$($*)"
-
-full-check:: jshydra$(BIN_SUFFIX)
- @mkdir -p jstest
- @cp -R $(srcdir)/tests/* jstest
- @cp check.py jstest
- @echo "Decompiling JS ASTs.."
- @set -e; \
- for f in $$(cd jstest && python check.py | grep -v '^warning:'); do \
- echo $$f; \
- ./jshydra$(BIN_SUFFIX) scripts/astDecompile.js --trueast "$(srcdir)/tests/$$f" >jstest/$$f; \
- done
- python $(srcdir)/tests/jstests.py --tinderbox $(MOZ_OBJDIR)/js/src/js > before.log
- python jstest/jstests.py --tinderbox $(MOZ_OBJDIR)/js/src/js > after.log
- diff before.log after.log
diff --git a/abp_rewrite.py b/abp_rewrite.py
index d91aae7..eb6e38e 100644
--- a/abp_rewrite.py
+++ b/abp_rewrite.py
@@ -5,7 +5,37 @@
# version 2.0 (the "License"). You can obtain a copy of the License at
# http://mozilla.org/MPL/2.0/.
-import sys, os, subprocess
+import sys, os, subprocess, urllib, zipfile
+from StringIO import StringIO
+
+def ensureJSShell(basedir):
+ shell_dir = os.path.join(basedir, 'mozilla')
+ if not os.path.exists(shell_dir):
+ os.makedirs(shell_dir)
+ if sys.platform == 'win32':
+ path = os.path.join(shell_dir, 'js.exe')
+ else:
+ path = os.path.join(shell_dir, 'js')
+ if os.path.exists(path):
+ return path
+
+ platform_map = {
+ 'win32': 'win32',
+ 'linux2': 'linux-i686',
+ 'darwin': 'mac',
+ }
+ if sys.platform not in platform_map:
+ raise Exception('Unknown platform, is there a JS shell version for it?')
+
+ download_url = 'http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/16.0.1-candidates/build1/jsshell-%s.zip' % platform_map[sys.platform]
+ data = StringIO(urllib.urlopen(download_url).read())
+ zip = zipfile.ZipFile(data)
+ zip.extractall(shell_dir)
+ zip.close()
+
+ if not os.path.exists(path):
+ raise Exception('Downloaded package didn\'t contain JS shell executable')
+ return path
def doRewrite():
if len(sys.argv) < 4:
@@ -23,10 +53,7 @@ def doRewrite():
if not basedir:
basedir = '.'
- if os.name == 'nt':
- application = os.path.join(basedir, 'mozilla', 'js', 'src', 'shell', 'js.exe')
- else:
- application = os.path.join(basedir, 'mozilla', 'js', 'src', 'shell', 'js')
+ application = ensureJSShell(basedir)
command = [application, os.path.join(basedir, 'jshydra.js'), os.path.join(basedir, 'scripts', 'abprewrite.js'), '--arg', 'module=true source_repo=https://hg.adblockplus.org/adblockplus/']
for module in ('filterNotifier', 'filterClasses', 'subscriptionClasses', 'filterStorage', 'elemHide', 'matcher', 'filterListener', 'synchronizer'):
sourceFile = os.path.join(sourceDir, 'lib', module + '.js')
diff --git a/configure b/configure
deleted file mode 100755
index b074c97..0000000
--- a/configure
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/bash
-
-# The mozilla-central known-good revision
-REV=5b8812d6950b
-
-usage() {
-echo "Usage: $0 ...
-The following options control the setup for the SpiderMonkey build. Only set these if you wish to reuse source; otherwise, it will be downloaded for you:
---moz-src Location of the mozilla source directory
---moz-obj Location of the object directory for the above tree.
-
-Other arguments:
---moz-repo Repository to clone the source from
---enable-parse-test Enables use of parse tests for jshydra"
-}
-
-VAL=
-arg() {
- VAL=${1#*=}
-}
-
-srcdir=mozilla
-objdir=""
-repo='http://hg.mozilla.org/mozilla-central'
-
-until [ -z "$1" ]
-do
- case "$1" in
- --moz-src=*)
- arg $1
- srcdir="$VAL"
- ;;
- --moz-obj=*)
- arg $1
- objdir="$VAL"
- ;;
- --moz-repo=*)
- arg $1
- repo="$VAL"
- ;;
- --enable-parse-test)
- parse="TRUE"
- ;;
- -h|--help)
- usage
- exit 1
- esac
- shift
-done
-
-if [ -z "$objdir"]; then objdir=$srcdir; fi
-
-echo "Source directory: $srcdir"
-echo "Object directory: $objdir"
-echo "Source repository: $repo"
-
-cat >config.mk <<EOF
-MOZ_OBJDIR := $objdir
-MOZ_SRCDIR := $srcdir
-EOF
-
-NEEDSBUILD=
-if [ ! -e "$srcdir" ]; then
- # Time to pull from the repo
- echo "Cloning from $repo:"
- hg clone -r $REV $repo $srcdir
- NEEDSBUILD="true"
-elif hg id -r $REV $srcdir; then
- # Newer or older?
- if [[ "$(hg id -n -r $REV $srcdir)" < "$(hg id -n $srcdir)" ]]; then
- echo "You are using a newer revision than the gold standard."
- echo "This probably isn't a big deal, but stuff might not work."
- echo "To get the gold standard, use the following command:"
- echo "hg up -r $REV -R $srcdir"
- elif [[ "$(hg id -n -r $REV $srcdir)" > "$(hg id -n $srcdir)" ]]; then
- echo "You are using an older revision than the gold standard."
- echo "It is highly recommended that you update to at least this revision."
- echo "To get the gold standard, use the following command:"
- echo "hg up -r $REV -R $srcdir"
- fi
-else
- # The revision isn't found.. pull and update
- echo "Updating from $repo:"
- hg pull -u -r $REV -R $srcdir $repo
- NEEDSBUILD="true"
-fi
-
-if [ ! -z $parse ]; then
- cvs -d :pserver:anonymous at cvs-mirror.mozilla.org:/cvsroot co -d jstest \
- mozilla/js/tests
-fi
-
-AUTOCONF=$(which autoconf-2.13 autoconf2.13 autoconf213 2>/dev/null | grep -v '^no autoconf' | head -1)
-if [ ! -e $objdir ]; then
- # We need to make the objdir and configure
- abssrc=$(cd $srcdir && pwd)
- mkdir -p $objdir/js/src
- pushd $objdir/js/src
- pushd $srcdir/js/src
- $AUTOCONF
- popd
- # Now in objdir
- $abssrc/js/src/configure
- make
- popd
-elif [ $srcdir = $objdir ]; then
- if [ -n "$NEEDSBUILD" ]; then
- pushd $srcdir/js/src
- $AUTOCONF
- ./configure
- make
- popd
- fi
-fi
diff --git a/jshydra.cpp b/jshydra.cpp
deleted file mode 100644
index 564ee96..0000000
--- a/jshydra.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#include <string.h> // Needed for jsparse.h
-#include "jsapi.h"
-#include "jscntxt.h"
-#include "jsbit.h" // jsparse.h
-#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"
-
-#ifndef ATOM_TO_JSVAL
-#define ATOM_TO_JSVAL(atom) IdToJsval(ATOM_TO_JSID(atom))
-#endif
-
-using namespace js;
-
-bool useReflect = false;
-
-void setIntProperty(JSObject *obj, const char *name, int 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));
-}
-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);
-}
-
-typedef enum TokenValue {
- FUNCTION, LIST, TERNARY, BINARY, UNARY, NAME, LEXICAL, APAIR, OBJLITERAL, DOUBLELITERAL, NULLARY, NAMESET, ERROR
-} TokenValue;
-
-TokenValue tokens[] = {
-#define TOK(name, value) value,
-#include "jshydra_tokens.h"
-#undef TOK
- ERROR //TOK_LIMIT
-};
-
-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);
-
- // 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];
-
- 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;
- }
- case BINARY: {
- 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);
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- setArrayElement(array, 0, makeNode(node->pn_left));
- setArrayElement(array, 1, makeNode(node->pn_right));
- 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);
- jshydra_defineProperty(cx, object, "number", INT_TO_JSVAL(node->pn_num));
- 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.
- JSObject *regex = js_CloneRegExpObject(cx, node->pn_objbox->object,
- jshydra_getRegexPrototype(cx));
- setObjectProperty(object, "value", regex);
- JSObject *array = JS_NewArrayObject(cx, 0, NULL);
- setArrayElement(array, 0, makeNode(node->pn_expr));
- setObjectProperty(object, "kids", array);
- break;
- }
- 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;
- }
- 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) {
- 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, JSVERSION_LATEST))
- return false;
- jsval rval, argv[3];
- if (useReflect) {
- JS_GetProperty(cx, globalObj, "Reflect", &rval);
- JSObject *reflect = JSVAL_TO_OBJECT(rval);
- JSString *str = JS_NewUCStringCopyN(cx, buf, st.st_size);
- argv[0] = STRING_TO_JSVAL(str);
- JS_CallFunctionName(cx, reflect, "parse", 1, argv, &rval);
- argv[0] = rval;
- } else {
- JSParseNode *root = compiler.parser.parse(globalObj);
- JSObject *ast = makeNode(root);
- argv[0] = OBJECT_TO_JSVAL(ast);
- jshydra_rootObject(cx, ast);
- }
- free(buf);
- jsval func = jshydra_getToplevelFunction(cx, "process_js");
- if (JS_TypeOfValue(cx, func) != JSTYPE_FUNCTION) {
- fprintf(stderr, "No function process_js!\n");
- return false;
- }
- 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;
-
- bool failure = false;
- do {
- argc--;
- argv++;
- if (!strcmp(argv[0], "--arg")) {
- argc--;
- argv++;
- argstr = argv[0];
- continue;
- } else if(!strcmp(argv[0], "--trueast")) {
- useReflect = true;
- 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);
-
- return !!failure;
-}
diff --git a/jshydra_bridge.cpp b/jshydra_bridge.cpp
deleted file mode 100644
index 408c3cc..0000000
--- a/jshydra_bridge.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-#include "jsapi.h"
-#ifndef XP_WIN
-#include <unistd.h>
-#endif // XP_WIN
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "jshydra_bridge.h"
-#include "jshydra_funcs.h"
-
-static const char *opcodes[] = {
-#define OPDEF(op, val, name, image, len, use, def, prec, format) \
- #op,
-#include "jsopcode.tbl"
-#undef OPDEF
- NULL
-};
-
-static const char *tokens[] = {
-#define TOK(name, value) #name,
-#include "jshydra_tokens.h"
-#undef TOK
- NULL
-};
-
-JSRuntime *rt;
-JSContext *cx;
-JSObject *globalObj;
-
-JSObject *rootArray;
-
-static JSClass global_class = {
- "global", JSCLASS_GLOBAL_FLAGS,
- JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
- JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
- JSCLASS_NO_OPTIONAL_MEMBERS
-
-};
-
-static char *my_dirname (char *path);
-
-JSClass js_node_class = {
- "JSHydraNode", /* name */
- JSCLASS_CONSTRUCT_PROTOTYPE, /* flags */
- JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
- JS_EnumerateStub,JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
-};
-
-extern JSObject *js_InitReflectClass(JSContext *cx, JSObject *obj);
-
-void jshydra_init(const char *file) {
- static JSFunctionSpec shell_functions[] = {
- 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}
- };
-
- //this->fndeclMap = pointer_map_create ();
- rt = JS_NewRuntime (0x9000000L);
- cx = JS_NewContext (rt, 8192);
- JS_BeginRequest(cx);
- JS_SetVersion(cx, JSVERSION_LATEST);
- //JS_SetGCZeal(cx, 2);
-
- //JS_SetContextPrivate (this->cx, this);
-
- globalObj = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
- JS_EnterCrossCompartmentCall(cx, globalObj);
- JS_InitStandardClasses (cx, globalObj);
- js_InitReflectClass(cx, globalObj);
- /* register error handler */
- JS_SetErrorReporter (cx, ErrorReporter);
- xassert (JS_DefineFunctions (cx, globalObj, shell_functions));
- if (jshydra_getToplevelFunction(cx, "include") == JSVAL_VOID) {
- fprintf (stderr, "Your version of spidermonkey has broken JS_DefineFunctions, upgrade it or ./configure with another version\n");
- exit(1);
- }
- //this->rootedArgDestArray =
- // JS_NewArrayObject (this->cx, 0, NULL);
- //JS_AddRoot (this->cx, &this->rootedArgDestArray);
- // this is to be added at function_decl time
- //this->rootedFreeArray = JS_NewArrayObject (this->cx, 0, NULL);
- //JS_DefineElement (this->cx, this->rootedArgDestArray, 0,
- // OBJECT_TO_JSVAL (this->rootedFreeArray),
- // NULL, NULL, JSPROP_ENUMERATE);
- JS_SetVersion (cx, (JSVersion) 170);
-
-
- /* Initialize namespace for plugin system stuff. */
- JSObject *sys = jshydra_defineObjectProperty(cx, globalObj, "sys");
- /* Set version info */
- //dehydra_defineStringProperty (this, sys, VERSION_STRING, version_string);
- //dehydra_defineStringProperty (this, sys, FRONTEND, lang_hooks.name);
- /* Initialize include path. */
- jshydra_defineArrayProperty (cx, sys, "include_path", 0);
-
- char *filename_copy = strdup(file);
- char *dir = my_dirname(filename_copy);
- jshydra_appendToPath(cx, dir);
- char *libdir = static_cast<char *>(malloc(strlen(dir) + strlen("libs") + 2));
- sprintf(libdir, "%s/%s", dir, "libs");
- jshydra_appendToPath(cx, libdir);
- free(libdir);
- free(filename_copy);
-
- /* Output filename info */
- //if (aux_base_name) {
- // dehydra_defineStringProperty (this, sys, "aux_base_name", aux_base_name);
- //}
- xassert (JS_InitClass(cx, globalObj, NULL
- ,&js_node_class , NULL, 0, NULL, NULL, NULL, NULL));
-
- /* Define the token properties. */
- const char **name = opcodes;
- jsint index = 0;
- while (*name) {
- jshydra_defineProperty(cx, globalObj, *name++, INT_TO_JSVAL(index++));
- }
- index = 0;
- name = tokens;
- while (*name)
- jshydra_defineProperty(cx, globalObj, *name++, INT_TO_JSVAL(index++));
-
- rootArray = JS_NewArrayObject(cx, 0, NULL);
- JS_AddObjectRoot(cx, &rootArray);
- jshydra_rootObject(cx, globalObj);
-}
-
-/*int dehydra_startup (Dehydra *this) {
- return dehydra_includeScript (this, "dehydra.js");
-}*/
-
-int jshydra_includeScript (JSContext *cx, const char *script) {
- jsval strval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, script));
- //int key = dehydra_rootObject (this, strval);
- if (!JS_EnterLocalRootScope(cx))
- return -1;
- jsval rval;
-
- int ret = !JS_CallFunctionName(cx, globalObj, "include", 1, &strval, &rval);
- JS_LeaveLocalRootScope(cx);
- return ret;
-}
-
-JSObject *jshydra_getIncludePath (JSContext *cx)
-{
- jsval sys_val, path_val;
- JS_GetProperty(cx, globalObj, "sys", &sys_val);
- JS_GetProperty(cx, JSVAL_TO_OBJECT(sys_val), "include_path", &path_val);
- return JSVAL_TO_OBJECT(path_val);
-}
-
-/* Append a directory name to the script include path. */
-void jshydra_appendToPath (JSContext *cx, const char *dir)
-{
- JSObject *path = jshydra_getIncludePath(cx);
- unsigned int length = jshydra_getArrayLength(cx, path);
- JSString *dir_str = JS_NewStringCopyZ(cx, dir);
- jsval dir_val = STRING_TO_JSVAL(dir_str);
- JS_DefineElement(cx, path, length, dir_val, NULL, NULL,
- JSPROP_ENUMERATE);
-}
-
-/* Avoiding bug 431100. Spec from man 2 dirname */
-static char *my_dirname (char *path) {
- char *r = strrchr(path, '/');
- if (!r) {
- strcpy (path, ".");
- return path;
- } else if (r == path && r[1] == 0) {
- return path; // '/'
- } else if (r[1] == 0) {
- // /foo/ foo/ cases
- *r = 0;
- return my_dirname (path);
- }
- *r = 0;
- return path;
-}
-
-/* Search the include path for a file matching the given name. The current
- * directory will be searched last. */
-FILE *jshydra_searchPath (JSContext *cx, const char *filename, char **realname)
-{
- if (filename && filename[0] != '/') {
- JSObject *path = jshydra_getIncludePath(cx);
- int length = jshydra_getArrayLength(cx, path);
- int i;
- for (i = 0; i < length; ++i) {
- jsval val;
- JS_GetElement(cx, path, i, &val);
-
- JSString *dir_str = JS_ValueToString(cx, val);
- if (!dir_str) continue;
- 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;
- return f;
- } else {
- free(buf);
- }
- }
- }
-
- FILE *f = fopen(filename, "r");
- if (f) {
- *realname = strdup(filename);
- return f;
- }
-
- return NULL;
-}
-
-jsuint jshydra_getArrayLength (JSContext *cx, JSObject *array) {
- jsuint length = 0;
- xassert (JS_GetArrayLength (cx, array, &length));
- return length;
-}
-
-JSObject *definePropertyObject (JSContext *cx, JSObject *obj,
- const char *name, JSClass *clasp,
- JSObject *proto, uintN flags) {
- JSObject *nobj = JS_NewObject (cx, clasp, proto, NULL);
- JS_DefineProperty (cx, obj, name, OBJECT_TO_JSVAL(nobj), NULL, NULL, flags);
- return nobj;
-}
-
-void jshydra_defineProperty (JSContext *cx, JSObject *obj,
- char const *name, jsval value)
-{
- JS_DefineProperty (cx, obj, name, value,
- NULL, NULL, JSPROP_ENUMERATE);
-}
-/*
-void dehydra_defineStringProperty (Dehydra *this, JSObject *obj,
- char const *name, char const *value)
-{
- JSString *str = JS_NewStringCopyZ (this->cx, value);
- dehydra_defineProperty (this, obj, name, STRING_TO_JSVAL(str));
-}
-*/
-JSObject *jshydra_defineArrayProperty (JSContext *cx, JSObject *obj,
- char const *name, int length) {
- JSObject *destArray = JS_NewArrayObject (cx, length, NULL);
- jshydra_defineProperty (cx, obj, name, OBJECT_TO_JSVAL (destArray));
- return destArray;
-}
-
-JSObject *jshydra_defineObjectProperty (JSContext *cx, JSObject *obj,
- char const *name) {
- return definePropertyObject(
- cx, obj, name, NULL, NULL,
- JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT);
-}
-
-/* Load and execute a Javascript file.
- * Return: 0 on success
- * 1 on failure if a Javascript exception is pending
- * does not return if a Javascript error is reported
- * The general behavior of (De|Tree)hydra is to print a message and
- * exit if a JS error is reported at the top level. But if this function
- * is called from JS, then the JS_* functions will instead set an
- * exception, which will be propgated back up to the callers for
- * eventual handling or exit. */
-
-jsval jshydra_getToplevelFunction(JSContext *cx, char const *name) {
- jsval val = JSVAL_VOID;
- return (JS_GetProperty(cx, globalObj, name, &val)
- && val != JSVAL_VOID
- && JS_TypeOfValue(cx, val) == JSTYPE_FUNCTION) ? val : JSVAL_VOID;
-}
-
-void jshydra_rootObject(JSContext *cx, JSObject *obj) {
- jsval rval, argv[1];
- argv[0] = OBJECT_TO_JSVAL(obj);
- JS_CallFunctionName(cx, rootArray, "push", 1, argv, &rval);
-}
-
-JSObject *jshydra_getRegexPrototype(JSContext *cx) {
- static JSObject *proto = NULL;
- if (proto == NULL) {
- char str[1];
- JSObject *regex = JS_NewRegExpObjectNoStatics(cx, str, 0, 0);
- proto = JS_GetPrototype(cx, regex);
- }
- return proto;
-}
diff --git a/jshydra_bridge.h b/jshydra_bridge.h
deleted file mode 100644
index 0fd7229..0000000
--- a/jshydra_bridge.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-#ifndef JSHYDRA_BRIDGE_H
-#define JSHYDRA_BRIDGE_H
-
-extern JSContext *cx;
-extern JSObject *globalObj;
-
-extern JSClass js_node_class;
-
-void jshydra_init(const char *file);
-FILE *jshydra_searchPath(JSContext *cx, const char *filename, char **realname);
-void jshydra_appendToPath (JSContext *cx, const char *dir);
-int jshydra_includeScript(JSContext *cx, const char *filename);
-
-/* Drop-in replacement for JS_DefineObject, required as a workaround
- * because JS_DefineObject always sets the parent property. */
-JSObject *definePropertyObject (JSContext *cx, JSObject *obj,
- const char *name, JSClass *clasp,
- JSObject *proto, uintN flags);
-JSObject *jshydra_defineArrayProperty (JSContext *cx, JSObject *obj,
- char const *name, int length);
-JSObject *jshydra_defineObjectProperty (JSContext *cx, JSObject *obj,
- char const *name);
-void jshydra_defineProperty(JSContext *cx, JSObject *obj,
- char const *name, jsval value);
-
-jsuint jshydra_getArrayLength(JSContext *cx, JSObject *array);
-jsval jshydra_getToplevelFunction(JSContext *cx, char const *name);
-
-void jshydra_rootObject(JSContext *cx, JSObject *obj);
-JSObject *jshydra_getRegexPrototype(JSContext *cx);
-
-JSObject *jshydra_getRegexPrototype(JSContext *cx);
-#endif
diff --git a/jshydra_funcs.cpp b/jshydra_funcs.cpp
deleted file mode 100644
index d43b667..0000000
--- a/jshydra_funcs.cpp
+++ /dev/null
@@ -1,457 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-#include <string.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-#include "jsapi.h"
-#include "jsprf.h"
-#include "jshydra_funcs.h"
-#include "jshydra_bridge.h"
-
-JSBool require_version(JSContext *cx, jsval val) {
- JSString *version_str = JS_ValueToString(cx, val);
- if (!version_str) return JS_FALSE;
- char *version_cstr = JS_EncodeString(cx, version_str);
- JSVersion version = JS_StringToVersion(version_cstr);
- JSBool retval;
- if (version == JSVERSION_UNKNOWN) {
- JS_ReportError(cx, "Invalid version '%s'", version_cstr);
- retval = JS_FALSE;
- } else {
- JS_SetVersion(cx, version);
- retval = JS_TRUE;
- }
- JS_free(cx, version_cstr);
- return retval;
-}
-
-JSBool require_option(JSContext *cx, jsval val, uint32 option) {
- JSBool flag;
- if (!JS_ValueToBoolean(cx, val, &flag)) return JS_FALSE;
- if (flag) {
- JS_SetOptions(cx, JS_GetOptions(cx) | option);
- } else {
- JS_SetOptions(cx, JS_GetOptions(cx) & ~option);
- }
- return JS_TRUE;
-}
-
-JSBool dispatch_require(JSContext *cx, const char *prop_name, jsval prop_val) {
- if (strcmp(prop_name, "version") == 0) {
- return require_version(cx, prop_val);
- } else if (strcmp(prop_name, "strict") == 0) {
- return require_option(cx, prop_val, JSOPTION_STRICT);
- } else if (strcmp(prop_name, "werror") == 0) {
- return require_option(cx, prop_val, JSOPTION_WERROR);
- } else if (strcmp(prop_name, "gczeal") == 0) {
-#ifdef JS_GC_ZEAL
- uintN zeal;
- if (!JS_ValueToECMAUint32(cx, prop_val, &zeal))
- return JS_FALSE;
- JS_SetGCZeal(cx, zeal);
-#else
-#ifdef DEBUG
- JS_ReportWarning(cx, "gczeal not available: xhydra built with a SpiderMonkey version"
- " lacking JS_SetGCZeal");
-#else
- JS_ReportWarning(cx, "gczeal not available: xhydra built without -DDEBUG");
-#endif //DEBUG
-#endif //JS_GC_ZEAL
- return JS_TRUE;
- } else {
- JS_ReportWarning(cx, "Unrecognized require keyword '%s'", prop_name);
- return JS_TRUE;
- }
-}
-
-/* Helper to return the current version as a JS string. */
-jsval get_version(JSContext *cx)
-{
- const char *version_cstr = JS_VersionToString(JS_GetVersion(cx));
- if (version_cstr == NULL) {
- return JSVAL_VOID;
- }
- JSString *version_str = JS_NewStringCopyZ(cx, version_cstr);
- return STRING_TO_JSVAL(version_str);
-}
-
-JSBool Require(JSContext *cx, uintN argc, jsval *vp)
-{
- JSObject *args;
- 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;
-
- /* Apply the options. */
- 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);
- xassert(rv);
- JSString *prop_str = JSVAL_TO_STRING(prop);
- 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;
-
- /* Report the now-current options. */
- JSObject *rvalo = JS_NewObject(cx, NULL, NULL, NULL);
- if (!rvalo) return JS_FALSE;
- 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);
- JS_DefineProperty(
- cx, rvalo, "strict",
- (options | JSOPTION_STRICT) ? JSVAL_TRUE : JSVAL_FALSE,
- NULL, NULL, JSPROP_ENUMERATE);
- JS_DefineProperty(
- cx, rvalo, "werror",
- (options | JSOPTION_WERROR) ? JSVAL_TRUE : JSVAL_FALSE,
- NULL, NULL, JSPROP_ENUMERATE);
- return JS_TRUE;
-}
-
-/* Load and run the named script. The last argument is the object to use
- as "this" when evaluating the script, which is effectively a namespace
- for the script. */
-static JSBool jshydra_loadScript (JSContext *cx, const char *filename,
- JSObject *ns) {
- /* Read the file. There's a JS function for reading scripts, but Dehydra
- wants to search for the file in different dirs. */
- long size = 0;
- char *realname;
- FILE *f = jshydra_searchPath(cx, filename, &realname);
- if (!f) {
- REPORT_ERROR_1(cx, "Cannot find include file '%s'", filename);
- return JS_FALSE;
- }
- char *content = readEntireFile(f, &size);
- if (!content) {
- REPORT_ERROR_1(cx, "Cannot read include file '%s'", realname);
- free(realname);
- return JS_FALSE;
- }
-
- JSObject *script = JS_CompileScript(cx, ns,
- content, size, realname, 1);
- free(realname);
- if (script == NULL) {
- xassert(JS_IsExceptionPending(cx));
- return JS_FALSE;
- }
-
- JS_AddNamedObjectRoot(cx, &script, filename);
- jsval rval;
- JSBool rv = JS_ExecuteScript(cx, ns, script, &rval);
- JS_RemoveObjectRoot(cx, &script);
- if (!rv) {
- xassert(JS_IsExceptionPending(cx));
- return JS_FALSE;
- }
- return JS_TRUE;
-}
-
-/* should use this function to load all objects to avoid possibity of objects including themselves */
-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, "*/o", &filename, &ns))
- return JS_FALSE;
-
- JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(ns));
-
- JSObject *includedArray = NULL;
- jsval val;
- JS_GetProperty(cx, ns, "_includedArray", &val);
- if (!JSVAL_IS_OBJECT (val)) {
- includedArray = JS_NewArrayObject (cx, 0, NULL);
- jshydra_defineProperty (cx, ns, "_includedArray",
- OBJECT_TO_JSVAL (includedArray));
- } else {
- includedArray = JSVAL_TO_OBJECT (val);
- xassert (JS_CallFunctionName (cx, includedArray, "lastIndexOf",
- 1, argv, &val));
- /* Return if file was already included in this namespace. */
- if (JSVAL_TO_INT (val) != -1) return JS_TRUE;
- }
-
- 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, uintN argc, jsval *vp)
-{
- jsval *argv = JS_ARGV(cx, vp);
- JSBool is_error;
- const char *msg, *error_string;
- char *file;
- jsint line;
- JSObject *loc_obj = NULL;
-
- 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_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;
- }
- }
-
- printf("%s: %s\n", error_string, msg);
- return JS_TRUE;
-}
-
-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;
- 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, uintN argc, jsval *vp)
-{
- jsval *argv = JS_ARGV(cx, vp);
- JSString *str;
- 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));
- } 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;
- }
- JS_free(cx, filename);
- return rv;
-}
-
-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));
- } else {
- JS_SET_RVAL(cx, vp, STRING_TO_JSVAL(JS_NewStringCopyN(cx, buf, size)));
- rv = JS_TRUE;
- }
- free(buf);
- JS_free(cx, filename);
- return rv;
-}
-
-/* author: tglek
- Return the primitive if it's a primitive, otherwise compute a seq #
- 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, uintN argc, jsval *vp)
-{
- if (!argc)
- return JS_FALSE;
- jsval o = *JS_ARGV(cx, vp);
- if (!JSVAL_IS_OBJECT (o)) {
- JS_SET_RVAL(cx, vp, o);
- return JS_TRUE;
- }
- JSObject *obj = JSVAL_TO_OBJECT (o);
- JSBool has_prop;
- /* Need to check for property first to keep treehydra from getting angry */
- if (JS_AlreadyHasOwnProperty(cx, obj, "_hashcode", &has_prop) && has_prop) {
- 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);
- val = STRING_TO_JSVAL (JS_NewStringCopyZ (cx, str));
- JS_DefineProperty (cx, obj, "_hashcode", val,
- NULL, NULL, JSPROP_PERMANENT | JSPROP_READONLY);
- JS_SET_RVAL(cx, vp, val);
- }
- return JS_TRUE;
-}
-
-/* Read the entire contents of a file.
- * path path of the file to read
- * size (out) number of bytes of file data read
- * return null-terminated file contents, or NULL on error. Caller
- * should free when done. */
-char *readFile(const char *path, long *size) {
- FILE *f = fopen(path, "r");
- if (!f) return NULL;
- return readEntireFile(f, size);
-}
-
-/* Find a file, searching another dir if necessary. If the file is
- * found, return a file handle open for reading and store the malloc'd
- * name where the file was found in realname. Otherwise, return
- * NULL. */
-FILE *findFile(const char *filename, const char *dir, char **realname) {
- FILE *f = fopen(filename, "r");
- if (f) {
- *realname = strdup(filename);
- return f;
- }
- if (dir && dir[0] && filename[0] && filename[0] != '/') {
- 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);
- f = fopen(buf, "r");
- if (f) {
- *realname = buf;
- return f;
- } else {
- free(buf);
- }
- }
- return NULL;
-}
-
-char *readEntireFile(FILE *f, long *size) {
- xassert(f);
- if (fseek(f, 0, SEEK_END)) return NULL;
- *size = ftell(f);
- if (fseek(f, 0, SEEK_SET)) return NULL;
- char *buf = static_cast<char *>(malloc(*size + 1));
- xassert(*size == fread(buf, 1, *size, f));
- buf[*size] = 0;
- fclose(f);
- return buf;
-}
-
-/* Report an error.
- * If we are currently inside JS, we'll report an error to JS. But
- * otherwise, we'll report it to the user and then exit. */
-void reportError(JSContext *cx, const char *file, int line,
- const char *fmt, ...)
-{
- char msg[1024];
- const int size = sizeof(msg) / sizeof(msg[0]);
- va_list ap;
- va_start(ap, fmt);
- int nw = vsnprintf(msg, size, fmt, ap);
- va_end(ap);
- if (nw >= size) msg[size-1] = '\0';
-
- if (JS_IsRunning(cx)) {
- JS_ReportError(cx, "%s (from %s:%d)", msg, file, line);
- } else {
- fflush(stdout);
- fprintf(stderr, "%s:%d: Error: %s\n", file, line, msg);
- exit(1);
- }
-}
-
-void
-ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report)
-{
- int error = JSREPORT_IS_EXCEPTION(report->flags);
- jsval exn;
- fflush(stdout);
- fprintf(stderr, "%s:%d: ", (report->filename ? report->filename : "NULL"),
- report->lineno);
- if (JSREPORT_IS_WARNING(report->flags)) fprintf(stderr, "JS Warning");
- if (JSREPORT_IS_STRICT(report->flags)) fprintf(stderr, "JS STRICT");
- if (error) fprintf(stderr, "JS Exception");
-
- fprintf(stderr, ": %s\n", message);
- if (report->linebuf) {
- fprintf(stderr, "%s\n", report->linebuf);
- }
- if (error && JS_GetPendingException(cx, &exn)
- && JS_TypeOfValue (cx, exn) == JSTYPE_OBJECT) {
- jsval stack;
- /* reformat the spidermonkey stack */
- JS_GetProperty(cx, JSVAL_TO_OBJECT (exn), "stack", &stack);
- if (JS_TypeOfValue (cx, stack) == JSTYPE_STRING) {
- char *str = JS_EncodeString(cx, JSVAL_TO_STRING (stack));
- char *save_str = str;
- int counter = 0;
- do {
- char *eol = strchr (str, '\n');
- if (eol)
- *eol = 0;
- char *at = strrchr (str, '@');
- if (!at) break;
- *at = 0;
- if (!*str) break;
- fprintf (stderr, "%s:\t#%d: %s\n", at+1, counter++, str);
- *at = '@';
- if (eol) {
- *eol = '\n';
- str = eol + 1;
- } else {
- break;
- }
- } while (*str);
- JS_free(cx, save_str);
- }
- }
- fflush(stderr);
-
- if (!JSREPORT_IS_WARNING(report->flags))
- exit(1);
-}
diff --git a/jshydra_funcs.h b/jshydra_funcs.h
deleted file mode 100644
index 65f5cc1..0000000
--- a/jshydra_funcs.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-#ifndef JSHYDRA_FUNCS_H
-#define JSHYDRA_FUNCS_H
-
-/* JS Natives */
-
-#define DH_JSNATIVE(fname) JSBool fname(JSContext *cx, uintN argc, jsval *vp)
-
-DH_JSNATIVE(Require);
-DH_JSNATIVE(Include);
-
-DH_JSNATIVE(Diagnostic);
-DH_JSNATIVE(Print);
-
-DH_JSNATIVE(WriteFile);
-DH_JSNATIVE(ReadFile);
-DH_JSNATIVE(Hashcode);
-
-void ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report);
-
-/* Related C functions */
-
-char *readFile(const char *path, long *size);
-FILE *findFile(const char *filename, const char *dir, char **realname);
-char *readEntireFile(FILE *f, long *size);
-void reportError(JSContext *cx, const char *file, int line,
- const char *fmt, ...);
-
-#define REPORT_ERROR_0(cx, fmt) reportError(cx, __FILE__, __LINE__, fmt);
-#define REPORT_ERROR_1(cx, fmt, arg1) reportError(cx, __FILE__, __LINE__, fmt, arg1);
-#define REPORT_ERROR_2(cx, fmt, arg1, arg2) reportError(cx, __FILE__, __LINE__, fmt, arg1, arg1);
-
-#define xassert(cond) \
- if (!(cond)) { \
- fprintf(stderr, "%s:%d: Assertion failed:" #cond "\n", __FILE__, __LINE__);\
- exit(1); \
- }
-
-#endif
diff --git a/jshydra_tokens.h b/jshydra_tokens.h
deleted file mode 100644
index a50e35c..0000000
--- a/jshydra_tokens.h
+++ /dev/null
@@ -1,88 +0,0 @@
-TOK(TOK_EOF, NULLARY)
-TOK(TOK_EOL, ERROR) /* (not present) */
-TOK(TOK_SEMI, UNARY)
-TOK(TOK_COMMA, LIST)
-TOK(TOK_ASSIGN, BINARY)
-TOK(TOK_HOOK, TERNARY)
-TOK(TOK_COLON, NAME)
-TOK(TOK_OR, BINARY)
-TOK(TOK_AND, BINARY)
-TOK(TOK_BITOR, BINARY)
-TOK(TOK_BITXOR, BINARY)
-TOK(TOK_BITAND, BINARY)
-TOK(TOK_EQOP, BINARY)
-TOK(TOK_RELOP, BINARY)
-TOK(TOK_SHOP, BINARY)
-TOK(TOK_PLUS, BINARY)
-TOK(TOK_MINUS, BINARY)
-TOK(TOK_STAR, BINARY)
-TOK(TOK_DIVOP, BINARY)
-TOK(TOK_UNARYOP, UNARY)
-TOK(TOK_INC, UNARY)
-TOK(TOK_DEC, UNARY)
-TOK(TOK_DOT, NAME)
-TOK(TOK_LB, BINARY)
-TOK(TOK_RB, LIST)
-TOK(TOK_LC, LIST)
-TOK(TOK_RC, LIST)
-TOK(TOK_LP, LIST)
-TOK(TOK_RP, UNARY)
-TOK(TOK_NAME, NAME)
-TOK(TOK_NUMBER, DOUBLELITERAL)
-TOK(TOK_STRING, NAME)
-TOK(TOK_REGEXP, OBJLITERAL)
-TOK(TOK_PRIMARY, NULLARY)
-TOK(TOK_FUNCTION, FUNCTION)
-TOK(TOK_IF, TERNARY)
-TOK(TOK_ELSE, ERROR) /* (not present) */
-TOK(TOK_SWITCH, BINARY)
-TOK(TOK_CASE, BINARY)
-TOK(TOK_DEFAULT, BINARY)
-TOK(TOK_WHILE, BINARY)
-TOK(TOK_DO, BINARY)
-TOK(TOK_FOR, BINARY)
-TOK(TOK_BREAK, NAME)
-TOK(TOK_CONTINUE, NAME)
-TOK(TOK_IN, BINARY)
-TOK(TOK_VAR, LIST)
-TOK(TOK_WITH, BINARY)
-TOK(TOK_RETURN, UNARY)
-TOK(TOK_NEW, LIST)
-TOK(TOK_DELETE, UNARY)
-TOK(TOK_DEFSHARP, UNARY)
-TOK(TOK_USESHARP, NULLARY)
-TOK(TOK_TRY, TERNARY)
-TOK(TOK_CATCH, TERNARY)
-TOK(TOK_FINALLY, ERROR) /* (not present) */
-TOK(TOK_THROW, UNARY)
-TOK(TOK_INSTANCEOF, BINARY)
-TOK(TOK_DEBUGGER, NULLARY)
-// We don't support E4X yet.
-TOK(TOK_XMLSTAGO, ERROR)
-TOK(TOK_XMLETAGO, ERROR)
-TOK(TOK_XMLPTAGC, ERROR)
-TOK(TOK_XMLTAGC, ERROR)
-TOK(TOK_XMLNAME, ERROR)
-TOK(TOK_XMLATTR, ERROR)
-TOK(TOK_XMLSPACE, ERROR)
-TOK(TOK_XMLTEXT, NAME)
-TOK(TOK_XMLCOMMENT, ERROR)
-TOK(TOK_XMLCDATA, ERROR)
-TOK(TOK_XMLPI, ERROR)
-TOK(TOK_AT, ERROR)
-TOK(TOK_DBLCOLON, ERROR)
-TOK(TOK_ANYNAME, ERROR)
-TOK(TOK_DBLDOT, NAME)
-TOK(TOK_FILTER, ERROR)
-TOK(TOK_XMLELEM, LIST)
-TOK(TOK_XMLLIST, ERROR)
-TOK(TOK_YIELD, UNARY)
-TOK(TOK_ARRAYCOMP, LIST)
-TOK(TOK_ARRAYPUSH, UNARY)
-TOK(TOK_LEXICALSCOPE, LEXICAL) // XXX: I don't think this is right?
-TOK(TOK_LET, LIST)
-TOK(TOK_SEQ, ERROR) /* (not present) */
-TOK(TOK_FORHEAD, TERNARY)
-TOK(TOK_ARGSBODY, LIST)
-TOK(TOK_UPVARS, NAMESET)
-TOK(TOK_RESERVED, LIST) /*[I don't understand this...]*/
--
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