diff options
author | Rene Ladan <rene@FreeBSD.org> | 2021-06-26 11:24:09 +0000 |
---|---|---|
committer | Rene Ladan <rene@FreeBSD.org> | 2021-06-26 11:24:09 +0000 |
commit | e7caeb58488c6a6924571a5297ac8a745c2e1c52 (patch) | |
tree | e3eec343eea7f50c65531c104be2f512e8db3bfc | |
parent | 5e1a89f37052232dfbbf8d53d9812e170ef0a2c4 (diff) | |
download | ports-e7caeb58488c6a6924571a5297ac8a745c2e1c52.tar.gz ports-e7caeb58488c6a6924571a5297ac8a745c2e1c52.zip |
*/*: Remove expired ports:
2021-06-23 multimedia/gxine: Uses EOL Python 2.7 via lang/spidermonkey185
2020-12-31 lang/spidermonkey185: Uses Python 2.7 which is EOLed upstream
25 files changed, 2 insertions, 2912 deletions
@@ -16424,3 +16424,5 @@ lang/pypy||2021-06-26|Has expired: Uses Python 2.7 which is EOLed upstream databases/pypy-gdbm||2021-06-26|Has expired: Uses EOL Python 2.7 via lang/pypy databases/pypy-sqlite3||2021-06-26|Has expired: Uses EOL Python 2.7 via lang/pypy x11-toolkits/pypy-tkinter||2021-06-26|Has expired: Uses EOL Python 2.7 via lang/pypy +multimedia/gxine||2021-06-26|Has expired: Uses EOL Python 2.7 via lang/spidermonkey185 +lang/spidermonkey185||2021-06-26|Has expired: Uses Python 2.7 which is EOLed upstream diff --git a/lang/Makefile b/lang/Makefile index f588858b9b1a..60a3695160bc 100644 --- a/lang/Makefile +++ b/lang/Makefile @@ -334,7 +334,6 @@ SUBDIR += snobol4 SUBDIR += solidity SUBDIR += spidermonkey17 - SUBDIR += spidermonkey185 SUBDIR += spidermonkey60 SUBDIR += spidermonkey78 SUBDIR += spl diff --git a/lang/spidermonkey185/Makefile b/lang/spidermonkey185/Makefile deleted file mode 100644 index 1cc54bc5296d..000000000000 --- a/lang/spidermonkey185/Makefile +++ /dev/null @@ -1,129 +0,0 @@ -# Created by: Kubilay Kocak <koobs@FreeBSD.org> - -PORTNAME= spidermonkey185 -PORTVERSION= 1.8.5 -PORTREVISION= 5 -CATEGORIES= lang -MASTER_SITES= MOZILLA/js -DISTNAME= js185-1.0.0 - -MAINTAINER= koobs@FreeBSD.org -COMMENT= Standalone JavaScript (1.8.5) interpreter from Mozilla - -BUILD_DEPENDS= zip:archivers/zip \ - autoconf-2.13:devel/autoconf213 -LIB_DEPENDS= libnspr4.so:devel/nspr - -USES= gmake pathfix perl5 pkgconfig python:2.7,build -GNU_CONFIGURE= yes -USE_LDCONFIG= yes -USE_PERL5= build - -WRKSRC= ${WRKDIR}/js-${PORTVERSION}/js/src - -BROKEN_aarch64= Does not compile: error: cacheFlush support is missing on this platform -BROKEN_mips64= Does not compile: error: const union jsval_layout has no member named word -BROKEN_riscv64= Does not compile: jsiter.cpp:270:16: cannot initialize return object of type 'bool' with an rvalue of type 'nullptr_t' -BROKEN_sparc64= Does not build: fails to link -BROKEN_FreeBSD_13= does not compile: cannot initialize return object of type 'bool' with an rvalue of type 'nullptr_t' -BROKEN_FreeBSD_14= does not compile: cannot initialize return object of type 'bool' with an rvalue of type 'nullptr_t' - -NOT_FOR_ARCHS= powerpc powerpc64 -NOT_FOR_ARCHS_REASON= PowerPC is not supported - -CONFIGURE_ARGS= --with-pthreads \ - --with-system-nspr - -# This comes from bsd.gecko.mk, fixes linking issues on 9.0 and higher. -post-configure: - ${ECHO_CMD} "fenv.h" >> ${WRKSRC}/config/system-headers - ${ECHO_CMD} "pthread_np.h" >> ${WRKSRC}/config/system-headers - -OPTIONS_DEFINE= DEBUG GCZEAL JEMALLOC METHODJIT OPTIMIZE READLINE \ - THREADSAFE TRACEJIT UTF8 \ - -OPTIONS_DEFAULT= METHODJIT OPTIMIZE READLINE THREADSAFE TRACEJIT - -GCZEAL_DESC= Enable Zealous garbage collecting -JEMALLOC_DESC= Use jemalloc as memory allocator -METHODJIT_DESC= Enable method JIT support -OPTIMIZE_DESC= Enable compiler optimizations -READLINE_DESC= Link js shell to system readline library -THREADSAFE_DESC= Enable multiple thread support -TRACEJIT_DESC= Enable tracing JIT support -UTF8_DESC= Treat strings as UTF8 instead of ISO-8859-1 - -DEBUG_CONFIGURE_ENABLE= debug -DEBUG_CONFIGURE_ON= --enable-debug-sumbols -GCZEAL_CONFIGURE_ENABLE= gczeal -JEMALLOC_CONFIGURE_ENABLE= jemalloc -METHODJIT_CONFIGURE_ENABLE= methodjit -OPTIMIZE_CONFIGURE_ENABLE= optimize -READLINE_CONFIGURE_ENABLE= readline -READLINE_USES= readline -THREADSAFE_CONFIGURE_ENABLE= threadsafe -TRACEJIT_CONFIGURE_ENABLE= tracejit -UTF8_CFLAGS= -DJS_C_STRINGS_ARE_UTF8 - -.include <bsd.port.options.mk> - -.if ${ARCH} == amd64 -CONFIGURE_TARGET= x86_64-portbld-freebsd${OSREL} -.endif - -.if ${ARCH} == "amd64" -PLIST_SUB+= AMD64="" -.else -PLIST_SUB+= AMD64="@comment " -.endif - -.if ${ARCH} == "i386" -PLIST_SUB+= I386="" -.else -PLIST_SUB+= I386="@comment " -.endif - -.if ${ARCH} == "arm" -PLIST_SUB+= ARM="" -.else -PLIST_SUB+= ARM="@comment " -.endif - -.if ${ARCH} == "mips" -PLIST_SUB+= MIPS="" -.else -PLIST_SUB+= MIPS="@comment " -.endif - -.if ${ARCH} == "powerpc" || ${ARCH} == "powerpc64" -PLIST_SUB+= PPC="" -.else -PLIST_SUB+= PPC="@comment " -.endif - -.if ${ARCH} == "sparc64" -PLIST_SUB+= SPARC="" -.else -PLIST_SUB+= SPARC="@comment " -.endif - -pre-configure: - (cd ${WRKSRC} && ${LOCALBASE}/bin/autoconf-2.13) - -do-test: - @${ECHO_MSG} -n "===> Running jstests.py: " - @cd ${WRKSRC} && ${SETENV} TZ=PST8PDT ${PYTHON_CMD} tests/jstests.py \ - --no-progress --worker-count=${MAKE_JOBS_NUMBER} ./js -.if ${PORT_OPTIONS:MMETHODJIT} || ${PORT_OPTIONS:MTRACEJIT} - @${ECHO_MSG} -n "===> Running jit_test.py: " - @cd ${WRKSRC} && ${SETENV} TZ=PST8PDT ${PYTHON_CMD} jit-test/jit_test.py \ - --no-progress --jitflags=,m,j,mj,mjp,am,amj,amjp,amd ./js -.endif - -post-install: - ${LN} -sf libmozjs185.so.1.0.0 ${STAGEDIR}${PREFIX}/lib/libmozjs185.so - ${LN} -sf libmozjs185.so.1.0.0 ${STAGEDIR}${PREFIX}/lib/libmozjs185.so.1 - ${LN} -sf libmozjs185.so.1.0.0 ${STAGEDIR}${PREFIX}/lib/libmozjs185.so.1.0 - @${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/libmozjs185.so.1.0.0 - -.include <bsd.port.mk> diff --git a/lang/spidermonkey185/distinfo b/lang/spidermonkey185/distinfo deleted file mode 100644 index ac820e9f43a3..000000000000 --- a/lang/spidermonkey185/distinfo +++ /dev/null @@ -1,2 +0,0 @@ -SHA256 (js185-1.0.0.tar.gz) = 5d12f7e1f5b4a99436685d97b9b7b75f094d33580227aa998c406bbae6f2a687 -SIZE (js185-1.0.0.tar.gz) = 6164605 diff --git a/lang/spidermonkey185/files/patch-assembler_jit_ExecutableAllocator.h b/lang/spidermonkey185/files/patch-assembler_jit_ExecutableAllocator.h deleted file mode 100644 index 94770e435051..000000000000 --- a/lang/spidermonkey185/files/patch-assembler_jit_ExecutableAllocator.h +++ /dev/null @@ -1,14 +0,0 @@ ---- assembler/jit/ExecutableAllocator.h.orig 2016-09-07 UTC -+++ assembler/jit/ExecutableAllocator.h -@@ -391,6 +391,11 @@ public: - { - CacheRangeFlush(code, size, CACHE_SYNC_ALL); - } -+#elif WTF_CPU_ARM_TRADITIONAL && WTF_PLATFORM_FREEBSD -+ static void cacheFlush(void* code, size_t size) -+ { -+ __clear_cache(code, reinterpret_cast<char*>(code) + size); -+ } - #else - #error "The cacheFlush support is missing on this platform." - #endif diff --git a/lang/spidermonkey185/files/patch-assembler_wtf_Platform.h b/lang/spidermonkey185/files/patch-assembler_wtf_Platform.h deleted file mode 100644 index 9556c0f7e638..000000000000 --- a/lang/spidermonkey185/files/patch-assembler_wtf_Platform.h +++ /dev/null @@ -1,18 +0,0 @@ ---- ./assembler/wtf/Platform.h.orig 2016-09-07 UTC -+++ ./assembler/wtf/Platform.h -@@ -213,6 +213,7 @@ - #elif defined(__ARM_ARCH_6__) \ - || defined(__ARM_ARCH_6J__) \ - || defined(__ARM_ARCH_6K__) \ -+ || defined(__ARM_ARCH_6KZ__) \ - || defined(__ARM_ARCH_6Z__) \ - || defined(__ARM_ARCH_6ZK__) \ - || defined(__ARM_ARCH_6T2__) \ -@@ -243,6 +244,7 @@ - - #elif defined(__ARM_ARCH_6J__) \ - || defined(__ARM_ARCH_6K__) \ -+ || defined(__ARM_ARCH_6KZ__) \ - || defined(__ARM_ARCH_6Z__) \ - || defined(__ARM_ARCH_6ZK__) \ - || defined(__ARM_ARCH_6M__) diff --git a/lang/spidermonkey185/files/patch-bug771281 b/lang/spidermonkey185/files/patch-bug771281 deleted file mode 100644 index 1b59e5dfeafb..000000000000 --- a/lang/spidermonkey185/files/patch-bug771281 +++ /dev/null @@ -1,1839 +0,0 @@ -diff -ruN src/shell/Makefile.in src.new/shell/Makefile.in ---- shell/Makefile.in 2011-04-01 06:08:36.000000000 +1100 -+++ shell/Makefile.in 2013-03-23 22:01:26.876752286 +1100 -@@ -47,7 +47,6 @@ - PROGRAM = js$(BIN_SUFFIX) - CPPSRCS = \ - js.cpp \ -- jsworkers.cpp \ - $(NULL) - - DEFINES += -DEXPORT_JS_API -diff -ruN src/shell/js.cpp src.new/shell/js.cpp ---- shell/js.cpp 2011-04-01 06:08:36.000000000 +1100 -+++ shell/js.cpp 2013-03-23 22:02:46.436700725 +1100 -@@ -91,8 +91,6 @@ - #endif /* JSDEBUGGER_C_UI */ - #endif /* JSDEBUGGER */ - --#include "jsworkers.h" -- - #include "jsinterpinlines.h" - #include "jsobjinlines.h" - #include "jsscriptinlines.h" -@@ -194,10 +192,6 @@ - JSBool gQuitting = JS_FALSE; - FILE *gErrFile = NULL; - FILE *gOutFile = NULL; --#ifdef JS_THREADSAFE --JSObject *gWorkers = NULL; --js::workers::ThreadPool *gWorkerThreadPool = NULL; --#endif - - static JSBool reportWarnings = JS_TRUE; - static JSBool compileOnly = JS_FALSE; -@@ -1315,10 +1309,6 @@ - JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "/ i", &gExitCode); - - gQuitting = JS_TRUE; --#ifdef JS_THREADSAFE -- if (gWorkerThreadPool) -- js::workers::terminateAll(JS_GetRuntime(cx), gWorkerThreadPool); --#endif - return JS_FALSE; - } - -@@ -4150,10 +4140,6 @@ - gCanceled = true; - if (gExitCode == 0) - gExitCode = EXITCODE_TIMEOUT; --#ifdef JS_THREADSAFE -- if (gWorkerThreadPool) -- js::workers::terminateAll(rt, gWorkerThreadPool); --#endif - JS_TriggerAllOperationCallbacks(rt); - - static const char msg[] = "Script runs for too long, terminating.\n"; -@@ -5681,29 +5667,8 @@ - #endif /* JSDEBUGGER_C_UI */ - #endif /* JSDEBUGGER */ - --#ifdef JS_THREADSAFE -- class ShellWorkerHooks : public js::workers::WorkerHooks { -- public: -- JSObject *newGlobalObject(JSContext *cx) { -- return NewGlobalObject(cx, NEW_COMPARTMENT); -- } -- }; -- ShellWorkerHooks hooks; -- if (!JS_AddNamedObjectRoot(cx, &gWorkers, "Workers") || -- (gWorkerThreadPool = js::workers::init(cx, &hooks, glob, &gWorkers)) == NULL) { -- return 1; -- } --#endif -- - int result = ProcessArgs(cx, glob, argv, argc); - --#ifdef JS_THREADSAFE -- js::workers::finish(cx, gWorkerThreadPool); -- JS_RemoveObjectRoot(cx, &gWorkers); -- if (result == 0) -- result = gExitCode; --#endif -- - #ifdef JSDEBUGGER - if (jsdc) { - #ifdef JSDEBUGGER_C_UI -diff -ruN src/shell/jsworkers.cpp src.new/shell/jsworkers.cpp ---- shell/jsworkers.cpp 2011-04-01 06:08:36.000000000 +1100 -+++ shell/jsworkers.cpp 1970-01-01 10:00:00.000000000 +1000 -@@ -1,1280 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- -- * vim: set ts=8 sw=4 et tw=99: -- * -- * ***** BEGIN LICENSE BLOCK ***** -- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 -- * -- * The contents of this file are subject to the Mozilla Public License Version -- * 1.1 (the "License"); you may not use this file except in compliance with -- * the License. You may obtain a copy of the License at -- * http://www.mozilla.org/MPL/ -- * -- * Software distributed under the License is distributed on an "AS IS" basis, -- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -- * for the specific language governing rights and limitations under the -- * License. -- * -- * The Original Code is JavaScript shell workers. -- * -- * The Initial Developer of the Original Code is -- * Mozilla Corporation. -- * Portions created by the Initial Developer are Copyright (C) 2010 -- * the Initial Developer. All Rights Reserved. -- * -- * Contributor(s): -- * Jason Orendorff <jorendorff@mozilla.com> -- * -- * Alternatively, the contents of this file may be used under the terms of -- * either of the GNU General Public License Version 2 or later (the "GPL"), -- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -- * in which case the provisions of the GPL or the LGPL are applicable instead -- * of those above. If you wish to allow use of your version of this file only -- * under the terms of either the GPL or the LGPL, and not to allow others to -- * use your version of this file under the terms of the MPL, indicate your -- * decision by deleting the provisions above and replace them with the notice -- * and other provisions required by the GPL or the LGPL. If you do not delete -- * the provisions above, a recipient may use your version of this file under -- * the terms of any one of the MPL, the GPL or the LGPL. -- * -- * ***** END LICENSE BLOCK ***** */ -- --#ifdef JS_THREADSAFE -- --#include <algorithm> --#include <string.h> --#include "prthread.h" --#include "prlock.h" --#include "prcvar.h" --#include "jsapi.h" --#include "jscntxt.h" --#include "jshashtable.h" --#include "jsstdint.h" --#include "jslock.h" --#include "jsvector.h" --#include "jsworkers.h" -- --extern size_t gMaxStackSize; -- --/* -- * JavaScript shell workers. -- * -- * == Object lifetime rules == -- * -- * - The ThreadPool lasts from init() to finish(). -- * -- * - The ThreadPool owns the MainQueue and the WorkerQueue. Those live from -- * the time the first Worker is created until finish(). -- * -- * - Each JS Worker object has the same lifetime as the corresponding C++ -- * Worker object. A Worker is live if (a) the Worker JSObject is still -- * live; (b) the Worker has an incoming event pending or running; (c) it -- * has sent an outgoing event to its parent that is still pending; or (d) -- * it has any live child Workers. -- * -- * - finish() continues to wait for events until all threads are idle. -- * -- * Event objects, however, are basically C++-only. The JS Event objects are -- * just plain old JSObjects. They don't keep anything alive. -- * -- * == Locking scheme == -- * -- * When mixing mutexes and the JSAPI request model, there are two choices: -- * -- * - Always nest the mutexes in requests. Since threads in requests are not -- * supposed to block, this means the mutexes must be only briefly held. -- * -- * - Never nest the mutexes in requests. Since this allows threads to race -- * with the GC, trace() methods must go through the mutexes just like -- * everyone else. -- * -- * This code uses the latter approach for all locks. -- * -- * In one case, a thread holding a Worker's mutex can acquire the mutex of one -- * of its child Workers. See Worker::terminateSelf. (This can't deadlock because -- * the parent-child relationship is a partial order.) -- */ -- --namespace js { --namespace workers { -- --template <class T, class AllocPolicy> --class Queue { -- private: -- typedef Vector<T, 4, AllocPolicy> Vec; -- Vec v1; -- Vec v2; -- Vec *front; -- Vec *back; -- -- // Queue is not copyable. -- Queue(const Queue &); -- Queue & operator=(const Queue &); -- -- public: -- Queue() : front(&v1), back(&v2) {} -- bool push(T t) { return back->append(t); } -- bool empty() { return front->empty() && back->empty(); } -- -- T pop() { -- if (front->empty()) { -- std::reverse(back->begin(), back->end()); -- Vec *tmp = front; -- front = back; -- back = tmp; -- } -- T item = front->back(); -- front->popBack(); -- return item; -- } -- -- void clear() { -- v1.clear(); -- v2.clear(); -- } -- -- void trace(JSTracer *trc) { -- for (T *p = v1.begin(); p != v1.end(); p++) -- (*p)->trace(trc); -- for (T *p = v2.begin(); p != v2.end(); p++) -- (*p)->trace(trc); -- } --}; -- --class Event; --class ThreadPool; --class Worker; -- --class WorkerParent { -- protected: -- typedef HashSet<Worker *, DefaultHasher<Worker *>, SystemAllocPolicy> ChildSet; -- ChildSet children; -- -- bool initWorkerParent() { return children.init(8); } -- -- public: -- virtual JSLock *getLock() = 0; -- virtual ThreadPool *getThreadPool() = 0; -- virtual bool post(Event *item) = 0; // false on OOM or queue closed -- virtual void trace(JSTracer *trc) = 0; -- -- bool addChild(Worker *w) { -- AutoLock hold(getLock()); -- return children.put(w) != NULL; -- } -- -- // This must be called only from GC or when all threads are shut down. It -- // does not bother with locking. -- void removeChild(Worker *w) { -- ChildSet::Ptr p = children.lookup(w); -- JS_ASSERT(p); -- children.remove(p); -- } -- -- void disposeChildren(); --}; -- --template <class T> --class ThreadSafeQueue --{ -- protected: -- Queue<T, SystemAllocPolicy> queue; -- JSLock *lock; -- PRCondVar *condvar; -- bool closed; -- -- private: -- Vector<T, 8, SystemAllocPolicy> busy; -- -- protected: -- ThreadSafeQueue() : lock(NULL), condvar(NULL), closed(false) {} -- -- ~ThreadSafeQueue() { -- if (condvar) -- JS_DESTROY_CONDVAR(condvar); -- if (lock) -- JS_DESTROY_LOCK(lock); -- } -- -- // Called by take() with the lock held. -- virtual bool shouldStop() { return closed; } -- -- public: -- bool initThreadSafeQueue() { -- JS_ASSERT(!lock); -- JS_ASSERT(!condvar); -- return (lock = JS_NEW_LOCK()) && (condvar = JS_NEW_CONDVAR(lock)); -- } -- -- bool post(T t) { -- AutoLock hold(lock); -- if (closed) -- return false; -- if (queue.empty()) -- JS_NOTIFY_ALL_CONDVAR(condvar); -- return queue.push(t); -- } -- -- void close() { -- AutoLock hold(lock); -- closed = true; -- queue.clear(); -- JS_NOTIFY_ALL_CONDVAR(condvar); -- } -- -- // The caller must hold the lock. -- bool take(T *t) { -- while (queue.empty()) { -- if (shouldStop()) -- return false; -- JS_WAIT_CONDVAR(condvar, JS_NO_TIMEOUT); -- } -- *t = queue.pop(); -- busy.append(*t); -- return true; -- } -- -- // The caller must hold the lock. -- void drop(T item) { -- for (T *p = busy.begin(); p != busy.end(); p++) { -- if (*p == item) { -- *p = busy.back(); -- busy.popBack(); -- return; -- } -- } -- JS_NOT_REACHED("removeBusy"); -- } -- -- bool lockedIsIdle() { return busy.empty() && queue.empty(); } -- -- bool isIdle() { -- AutoLock hold(lock); -- return lockedIsIdle(); -- } -- -- void wake() { -- AutoLock hold(lock); -- JS_NOTIFY_ALL_CONDVAR(condvar); -- } -- -- void trace(JSTracer *trc) { -- AutoLock hold(lock); -- for (T *p = busy.begin(); p != busy.end(); p++) -- (*p)->trace(trc); -- queue.trace(trc); -- } --}; -- --class MainQueue; -- --class Event --{ -- protected: -- virtual ~Event() { JS_ASSERT(!data); } -- -- WorkerParent *recipient; -- Worker *child; -- uint64 *data; -- size_t nbytes; -- -- public: -- enum Result { fail = JS_FALSE, ok = JS_TRUE, forwardToParent }; -- -- virtual void destroy(JSContext *cx) { -- JS_free(cx, data); --#ifdef DEBUG -- data = NULL; --#endif -- delete this; -- } -- -- void setChildAndRecipient(Worker *aChild, WorkerParent *aRecipient) { -- child = aChild; -- recipient = aRecipient; -- } -- -- bool deserializeData(JSContext *cx, jsval *vp) { -- return !!JS_ReadStructuredClone(cx, data, nbytes, JS_STRUCTURED_CLONE_VERSION, vp, -- NULL, NULL); -- } -- -- virtual Result process(JSContext *cx) = 0; -- -- inline void trace(JSTracer *trc); -- -- template <class EventType> -- static EventType *createEvent(JSContext *cx, WorkerParent *recipient, Worker *child, -- jsval v) -- { -- uint64 *data; -- size_t nbytes; -- if (!JS_WriteStructuredClone(cx, v, &data, &nbytes, NULL, NULL)) -- return NULL; -- -- EventType *event = new EventType; -- if (!event) { -- JS_ReportOutOfMemory(cx); -- return NULL; -- } -- event->recipient = recipient; -- event->child = child; -- event->data = data; -- event->nbytes = nbytes; -- return event; -- } -- -- Result dispatch(JSContext *cx, JSObject *thisobj, const char *dataPropName, -- const char *methodName, Result noHandler) -- { -- if (!data) -- return fail; -- -- JSBool found; -- if (!JS_HasProperty(cx, thisobj, methodName, &found)) -- return fail; -- if (!found) -- return noHandler; -- -- // Create event object. -- jsval v; -- if (!deserializeData(cx, &v)) -- return fail; -- JSObject *obj = JS_NewObject(cx, NULL, NULL, NULL); -- if (!obj || !JS_DefineProperty(cx, obj, dataPropName, v, NULL, NULL, 0)) -- return fail; -- -- // Call event handler. -- jsval argv[1] = { OBJECT_TO_JSVAL(obj) }; -- jsval rval = JSVAL_VOID; -- return Result(JS_CallFunctionName(cx, thisobj, methodName, 1, argv, &rval)); -- } --}; -- --typedef ThreadSafeQueue<Event *> EventQueue; -- --class MainQueue : public EventQueue, public WorkerParent --{ -- private: -- ThreadPool *threadPool; -- -- public: -- explicit MainQueue(ThreadPool *tp) : threadPool(tp) {} -- -- ~MainQueue() { -- JS_ASSERT(queue.empty()); -- } -- -- bool init() { return initThreadSafeQueue() && initWorkerParent(); } -- -- void destroy(JSContext *cx) { -- while (!queue.empty()) -- queue.pop()->destroy(cx); -- delete this; -- } -- -- virtual JSLock *getLock() { return lock; } -- virtual ThreadPool *getThreadPool() { return threadPool; } -- -- protected: -- virtual bool shouldStop(); -- -- public: -- virtual bool post(Event *event) { return EventQueue::post(event); } -- -- virtual void trace(JSTracer *trc); -- -- void traceChildren(JSTracer *trc) { EventQueue::trace(trc); } -- -- JSBool mainThreadWork(JSContext *cx, bool continueOnError) { -- JSAutoSuspendRequest suspend(cx); -- AutoLock hold(lock); -- -- Event *event; -- while (take(&event)) { -- JS_RELEASE_LOCK(lock); -- Event::Result result; -- { -- JSAutoRequest req(cx); -- result = event->process(cx); -- if (result == Event::forwardToParent) { -- // FIXME - pointlessly truncates the string to 8 bits -- jsval data; -- JSAutoByteString bytes; -- if (event->deserializeData(cx, &data) && -- JSVAL_IS_STRING(data) && -- bytes.encode(cx, JSVAL_TO_STRING(data))) { -- JS_ReportError(cx, "%s", bytes.ptr()); -- } else { -- JS_ReportOutOfMemory(cx); -- } -- result = Event::fail; -- } -- if (result == Event::fail && continueOnError) { -- if (JS_IsExceptionPending(cx) && !JS_ReportPendingException(cx)) -- JS_ClearPendingException(cx); -- result = Event::ok; -- } -- } -- JS_ACQUIRE_LOCK(lock); -- drop(event); -- event->destroy(cx); -- if (result != Event::ok) -- return false; -- } -- return true; -- } --}; -- --/* -- * A queue of workers. -- * -- * We keep a queue of workers with pending events, rather than a queue of -- * events, so that two threads won't try to run a Worker at the same time. -- */ --class WorkerQueue : public ThreadSafeQueue<Worker *> --{ -- private: -- MainQueue *main; -- -- public: -- explicit WorkerQueue(MainQueue *main) : main(main) {} -- -- void work(); --}; -- --/* The top-level object that owns everything else. */ --class ThreadPool --{ -- private: -- enum { threadCount = 6 }; -- -- JSObject *obj; -- WorkerHooks *hooks; -- MainQueue *mq; -- WorkerQueue *wq; -- PRThread *threads[threadCount]; -- int32_t terminating; -- -- static JSClass jsClass; -- -- static void start(void* arg) { -- ((WorkerQueue *) arg)->work(); -- } -- -- explicit ThreadPool(WorkerHooks *hooks) : hooks(hooks), mq(NULL), wq(NULL), terminating(0) { -- for (int i = 0; i < threadCount; i++) -- threads[i] = NULL; -- } -- -- public: -- ~ThreadPool() { -- JS_ASSERT(!mq); -- JS_ASSERT(!wq); -- JS_ASSERT(!threads[0]); -- } -- -- static ThreadPool *create(JSContext *cx, WorkerHooks *hooks) { -- ThreadPool *tp = new ThreadPool(hooks); -- if (!tp) { -- JS_ReportOutOfMemory(cx); -- return NULL; -- } -- -- JSObject *obj = JS_NewObject(cx, &jsClass, NULL, NULL); -- if (!obj || !JS_SetPrivate(cx, obj, tp)) { -- delete tp; -- return NULL; -- } -- tp->obj = obj; -- return tp; -- } -- -- JSObject *asObject() { return obj; } -- WorkerHooks *getHooks() { return hooks; } -- WorkerQueue *getWorkerQueue() { return wq; } -- MainQueue *getMainQueue() { return mq; } -- bool isTerminating() { return terminating != 0; } -- -- /* -- * Main thread only. Requires request (to prevent GC, which could see the -- * object in an inconsistent state). -- */ -- bool start(JSContext *cx) { -- JS_ASSERT(!mq && !wq); -- mq = new MainQueue(this); -- if (!mq || !mq->init()) { -- mq->destroy(cx); -- mq = NULL; -- return false; -- } -- wq = new WorkerQueue(mq); -- if (!wq || !wq->initThreadSafeQueue()) { -- delete wq; -- wq = NULL; -- mq->destroy(cx); -- mq = NULL; -- return false; -- } -- JSAutoSuspendRequest suspend(cx); -- bool ok = true; -- for (int i = 0; i < threadCount; i++) { -- threads[i] = PR_CreateThread(PR_USER_THREAD, start, wq, PR_PRIORITY_NORMAL, -- PR_LOCAL_THREAD, PR_JOINABLE_THREAD, 0); -- if (!threads[i]) { -- shutdown(cx); -- ok = false; -- break; -- } -- } -- return ok; -- } -- -- void terminateAll(JSRuntime *rt) { -- // See comment about JS_ATOMIC_SET in the implementation of -- // JS_TriggerOperationCallback. -- JS_ATOMIC_SET(&terminating, 1); -- JS_TriggerAllOperationCallbacks(rt); -- } -- -- /* This context is used only to free memory. */ -- void shutdown(JSContext *cx) { -- wq->close(); -- for (int i = 0; i < threadCount; i++) { -- if (threads[i]) { -- PR_JoinThread(threads[i]); -- threads[i] = NULL; -- } -- } -- -- delete wq; -- wq = NULL; -- -- mq->disposeChildren(); -- mq->destroy(cx); -- mq = NULL; -- terminating = 0; -- } -- -- private: -- static void jsTraceThreadPool(JSTracer *trc, JSObject *obj) { -- ThreadPool *tp = unwrap(trc->context, obj); -- if (tp->mq) { -- tp->mq->traceChildren(trc); -- tp->wq->trace(trc); -- } -- } -- -- -- static void jsFinalize(JSContext *cx, JSObject *obj) { -- if (ThreadPool *tp = unwrap(cx, obj)) -- delete tp; -- } -- -- public: -- static ThreadPool *unwrap(JSContext *cx, JSObject *obj) { -- JS_ASSERT(JS_GET_CLASS(cx, obj) == &jsClass); -- return (ThreadPool *) JS_GetPrivate(cx, obj); -- } --}; -- --/* -- * A Worker is always in one of 4 states, except when it is being initialized -- * or destroyed, or its lock is held: -- * - idle (!terminated && current == NULL && events.empty()) -- * - enqueued (!terminated && current == NULL && !events.empty()) -- * - busy (!terminated && current != NULL) -- * - terminated (terminated && current == NULL && events.empty()) -- * -- * Separately, there is a terminateFlag that other threads can set -- * asynchronously to tell the Worker to terminate. -- */ --class Worker : public WorkerParent --{ -- private: -- ThreadPool *threadPool; -- WorkerParent *parent; -- JSObject *object; // Worker object exposed to parent -- JSContext *context; -- JSLock *lock; -- Queue<Event *, SystemAllocPolicy> events; // owning pointers to pending events -- Event *current; -- bool terminated; -- int32_t terminateFlag; -- -- static JSClass jsWorkerClass; -- -- Worker() -- : threadPool(NULL), parent(NULL), object(NULL), -- context(NULL), lock(NULL), current(NULL), terminated(false), terminateFlag(0) {} -- -- bool init(JSContext *parentcx, WorkerParent *parent, JSObject *obj) { -- JS_ASSERT(!threadPool && !this->parent && !object && !lock); -- -- if (!initWorkerParent() || !parent->addChild(this)) -- return false; -- threadPool = parent->getThreadPool(); -- this->parent = parent; -- this->object = obj; -- lock = JS_NEW_LOCK(); -- return lock && -- createContext(parentcx, parent) && -- JS_SetPrivate(parentcx, obj, this); -- } -- -- bool createContext(JSContext *parentcx, WorkerParent *parent) { -- JSRuntime *rt = JS_GetRuntime(parentcx); -- context = JS_NewContext(rt, 8192); -- if (!context) -- return false; -- -- // The Worker has a strong reference to the global; see jsTraceWorker. -- // JSOPTION_UNROOTED_GLOBAL ensures that when the worker becomes -- // unreachable, it and its global object can be collected. Otherwise -- // the cx->globalObject root would keep them both alive forever. -- JS_SetOptions(context, JS_GetOptions(parentcx) | JSOPTION_UNROOTED_GLOBAL | -- JSOPTION_DONT_REPORT_UNCAUGHT); -- JS_SetVersion(context, JS_GetVersion(parentcx)); -- JS_SetContextPrivate(context, this); -- JS_SetOperationCallback(context, jsOperationCallback); -- JS_BeginRequest(context); -- -- JSObject *global = threadPool->getHooks()->newGlobalObject(context); -- JSObject *post, *proto, *ctor; -- if (!global) -- goto bad; -- JS_SetGlobalObject(context, global); -- -- // Because the Worker is completely isolated from the rest of the -- // runtime, and because any pending events on a Worker keep the Worker -- // alive, this postMessage function cannot be called after the Worker -- // is collected. Therefore it's safe to stash a pointer (a weak -- // reference) to the C++ Worker object in the reserved slot. -- post = JS_GetFunctionObject(JS_DefineFunction(context, global, "postMessage", -- (JSNative) jsPostMessageToParent, 1, 0)); -- if (!post || !JS_SetReservedSlot(context, post, 0, PRIVATE_TO_JSVAL(this))) -- goto bad; -- -- proto = JS_InitClass(context, global, NULL, &jsWorkerClass, jsConstruct, 1, -- NULL, jsMethods, NULL, NULL); -- if (!proto) -- goto bad; -- -- ctor = JS_GetConstructor(context, proto); -- if (!ctor || !JS_SetReservedSlot(context, ctor, 0, PRIVATE_TO_JSVAL(this))) -- goto bad; -- -- JS_EndRequest(context); -- JS_ClearContextThread(context); -- return true; -- -- bad: -- JS_EndRequest(context); -- JS_DestroyContext(context); -- context = NULL; -- return false; -- } -- -- static void jsTraceWorker(JSTracer *trc, JSObject *obj) { -- JS_ASSERT(JS_GET_CLASS(trc->context, obj) == &jsWorkerClass); -- if (Worker *w = (Worker *) JS_GetPrivate(trc->context, obj)) { -- w->parent->trace(trc); -- w->events.trace(trc); -- if (w->current) -- w->current->trace(trc); -- JS_CALL_OBJECT_TRACER(trc, JS_GetGlobalObject(w->context), "Worker global"); -- } -- } -- -- static void jsFinalize(JSContext *cx, JSObject *obj) { -- JS_ASSERT(JS_GET_CLASS(cx, obj) == &jsWorkerClass); -- if (Worker *w = (Worker *) JS_GetPrivate(cx, obj)) -- delete w; -- } -- -- static JSBool jsOperationCallback(JSContext *cx) { -- Worker *w = (Worker *) JS_GetContextPrivate(cx); -- JSAutoSuspendRequest suspend(cx); // avoid nesting w->lock in a request -- return !w->checkTermination(); -- } -- -- static JSBool jsResolveGlobal(JSContext *cx, JSObject *obj, jsid id, uintN flags, -- JSObject **objp) -- { -- JSBool resolved; -- -- if (!JS_ResolveStandardClass(cx, obj, id, &resolved)) -- return false; -- if (resolved) -- *objp = obj; -- -- return true; -- } -- -- static JSBool jsPostMessageToParent(JSContext *cx, uintN argc, jsval *vp); -- static JSBool jsPostMessageToChild(JSContext *cx, uintN argc, jsval *vp); -- static JSBool jsTerminate(JSContext *cx, uintN argc, jsval *vp); -- -- bool checkTermination() { -- AutoLock hold(lock); -- return lockedCheckTermination(); -- } -- -- bool lockedCheckTermination() { -- if (terminateFlag || threadPool->isTerminating()) { -- terminateSelf(); -- terminateFlag = 0; -- } -- return terminated; -- } -- -- // Caller must hold the lock. -- void terminateSelf() { -- terminated = true; -- while (!events.empty()) -- events.pop()->destroy(context); -- -- // Tell the children to shut down too. An arbitrarily silly amount of -- // processing could happen before the whole tree is terminated; but -- // this way we don't have to worry about blowing the C stack. -- for (ChildSet::Enum e(children); !e.empty(); e.popFront()) -- e.front()->setTerminateFlag(); // note: nesting locks here -- } -- -- public: -- ~Worker() { -- if (parent) -- parent->removeChild(this); -- dispose(); -- } -- -- void dispose() { -- JS_ASSERT(!current); -- while (!events.empty()) -- events.pop()->destroy(context); -- if (lock) { -- JS_DESTROY_LOCK(lock); -- lock = NULL; -- } -- if (context) { -- JS_SetContextThread(context); -- JS_DestroyContextNoGC(context); -- context = NULL; -- } -- object = NULL; -- -- // Do not call parent->removeChild(). This is called either from -- // ~Worker, which calls it for us; or from parent->disposeChildren or -- // Worker::create, which require that it not be called. -- parent = NULL; -- disposeChildren(); -- } -- -- static Worker *create(JSContext *parentcx, WorkerParent *parent, -- JSString *scriptName, JSObject *obj); -- -- JSObject *asObject() { return object; } -- -- JSObject *getGlobal() { return JS_GetGlobalObject(context); } -- -- WorkerParent *getParent() { return parent; } -- -- virtual JSLock *getLock() { return lock; } -- -- virtual ThreadPool *getThreadPool() { return threadPool; } -- -- bool post(Event *event) { -- AutoLock hold(lock); -- if (terminated) -- return false; -- if (!current && events.empty() && !threadPool->getWorkerQueue()->post(this)) -- return false; -- return events.push(event); -- } -- -- void setTerminateFlag() { -- AutoLock hold(lock); -- terminateFlag = true; -- if (current) -- JS_TriggerOperationCallback(context); -- } -- -- void processOneEvent(); -- -- /* Trace method to be called from C++. */ -- void trace(JSTracer *trc) { -- // Just mark the JSObject. If we haven't already been marked, -- // jsTraceWorker will be called, at which point we'll trace referents. -- JS_CALL_OBJECT_TRACER(trc, object, "queued Worker"); -- } -- -- static bool getWorkerParentFromConstructor(JSContext *cx, JSObject *ctor, WorkerParent **p) { -- jsval v; -- if (!JS_GetReservedSlot(cx, ctor, 0, &v)) -- return false; -- if (JSVAL_IS_VOID(v)) { -- // This means ctor is the root Worker constructor (created in -- // Worker::initWorkers as opposed to Worker::createContext, which sets up -- // Worker sandboxes) and nothing is initialized yet. -- if (!JS_GetReservedSlot(cx, ctor, 1, &v)) -- return false; -- ThreadPool *threadPool = (ThreadPool *) JSVAL_TO_PRIVATE(v); -- if (!threadPool->start(cx)) -- return false; -- WorkerParent *parent = threadPool->getMainQueue(); -- if (!JS_SetReservedSlot(cx, ctor, 0, PRIVATE_TO_JSVAL(parent))) { -- threadPool->shutdown(cx); -- return false; -- } -- *p = parent; -- return true; -- } -- *p = (WorkerParent *) JSVAL_TO_PRIVATE(v); -- return true; -- } -- -- static JSBool jsConstruct(JSContext *cx, uintN argc, jsval *vp) { -- WorkerParent *parent; -- if (!getWorkerParentFromConstructor(cx, JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)), &parent)) -- return false; -- -- -- JSString *scriptName = JS_ValueToString(cx, argc ? JS_ARGV(cx, vp)[0] : JSVAL_VOID); -- if (!scriptName) -- return false; -- -- JSObject *obj = JS_NewObject(cx, &jsWorkerClass, NULL, NULL); -- if (!obj || !create(cx, parent, scriptName, obj)) -- return false; -- JS_SET_RVAL(cx, vp, OBJECT_TO_JSVAL(obj)); -- return true; -- } -- -- static JSFunctionSpec jsMethods[3]; -- static JSFunctionSpec jsStaticMethod[2]; -- -- static ThreadPool *initWorkers(JSContext *cx, WorkerHooks *hooks, JSObject *global, -- JSObject **objp) { -- // Create the ThreadPool object and its JSObject wrapper. -- ThreadPool *threadPool = ThreadPool::create(cx, hooks); -- if (!threadPool) -- return NULL; -- -- // Root the ThreadPool JSObject early. -- *objp = threadPool->asObject(); -- -- // Create the Worker constructor. -- JSObject *proto = JS_InitClass(cx, global, NULL, &jsWorkerClass, -- jsConstruct, 1, -- NULL, jsMethods, NULL, NULL); -- if (!proto) -- return NULL; -- -- // Stash a pointer to the ThreadPool in constructor reserved slot 1. -- // It will be used later when lazily creating the MainQueue. -- JSObject *ctor = JS_GetConstructor(cx, proto); -- if (!JS_SetReservedSlot(cx, ctor, 1, PRIVATE_TO_JSVAL(threadPool))) -- return NULL; -- -- return threadPool; -- } --}; -- --class InitEvent : public Event --{ -- public: -- static InitEvent *create(JSContext *cx, Worker *worker, JSString *scriptName) { -- return createEvent<InitEvent>(cx, worker, worker, STRING_TO_JSVAL(scriptName)); -- } -- -- Result process(JSContext *cx) { -- jsval s; -- if (!deserializeData(cx, &s)) -- return fail; -- JS_ASSERT(JSVAL_IS_STRING(s)); -- JSAutoByteString filename(cx, JSVAL_TO_STRING(s)); -- if (!filename) -- return fail; -- -- JSObject *scriptObj = JS_CompileFile(cx, child->getGlobal(), filename.ptr()); -- if (!scriptObj) -- return fail; -- -- AutoValueRooter rval(cx); -- JSBool ok = JS_ExecuteScript(cx, child->getGlobal(), scriptObj, Jsvalify(rval.addr())); -- return Result(ok); -- } --}; -- --class DownMessageEvent : public Event --{ -- public: -- static DownMessageEvent *create(JSContext *cx, Worker *child, jsval data) { -- return createEvent<DownMessageEvent>(cx, child, child, data); -- } -- -- Result process(JSContext *cx) { -- return dispatch(cx, child->getGlobal(), "data", "onmessage", ok); -- } --}; -- --class UpMessageEvent : public Event --{ -- public: -- static UpMessageEvent *create(JSContext *cx, Worker *child, jsval data) { -- return createEvent<UpMessageEvent>(cx, child->getParent(), child, data); -- } -- -- Result process(JSContext *cx) { -- return dispatch(cx, child->asObject(), "data", "onmessage", ok); -- } --}; -- --class ErrorEvent : public Event --{ -- public: -- static ErrorEvent *create(JSContext *cx, Worker *child) { -- JSString *data = NULL; -- jsval exc; -- if (JS_GetPendingException(cx, &exc)) { -- AutoValueRooter tvr(cx, Valueify(exc)); -- JS_ClearPendingException(cx); -- -- // Determine what error message to put in the error event. -- // If exc.message is a string, use that; otherwise use String(exc). -- // (This is a little different from what web workers do.) -- if (JSVAL_IS_OBJECT(exc)) { -- jsval msg; -- if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(exc), "message", &msg)) -- JS_ClearPendingException(cx); -- else if (JSVAL_IS_STRING(msg)) -- data = JSVAL_TO_STRING(msg); -- } -- if (!data) { -- data = JS_ValueToString(cx, exc); -- if (!data) -- return NULL; -- } -- } -- return createEvent<ErrorEvent>(cx, child->getParent(), child, -- data ? STRING_TO_JSVAL(data) : JSVAL_VOID); -- } -- -- Result process(JSContext *cx) { -- return dispatch(cx, child->asObject(), "message", "onerror", forwardToParent); -- } --}; -- --} /* namespace workers */ --} /* namespace js */ -- --using namespace js::workers; -- --void --WorkerParent::disposeChildren() --{ -- for (ChildSet::Enum e(children); !e.empty(); e.popFront()) { -- e.front()->dispose(); -- e.removeFront(); -- } --} -- --bool --MainQueue::shouldStop() --{ -- // Note: This deliberately nests WorkerQueue::lock in MainQueue::lock. -- // Releasing MainQueue::lock would risk a race -- isIdle() could return -- // false, but the workers could become idle before we reacquire -- // MainQueue::lock and go to sleep, and we would wait on the condvar -- // forever. -- return closed || threadPool->getWorkerQueue()->isIdle(); --} -- --void --MainQueue::trace(JSTracer *trc) --{ -- JS_CALL_OBJECT_TRACER(trc, threadPool->asObject(), "MainQueue"); --} -- --void --WorkerQueue::work() { -- AutoLock hold(lock); -- -- Worker *w; -- while (take(&w)) { // can block outside the mutex -- JS_RELEASE_LOCK(lock); -- w->processOneEvent(); // enters request on w->context -- JS_ACQUIRE_LOCK(lock); -- drop(w); -- -- if (lockedIsIdle()) { -- JS_RELEASE_LOCK(lock); -- main->wake(); -- JS_ACQUIRE_LOCK(lock); -- } -- } --} -- --const bool mswin = --#ifdef XP_WIN -- true --#else -- false --#endif -- ; -- --template <class Ch> bool --IsAbsolute(const Ch *filename) --{ -- return filename[0] == '/' || -- (mswin && (filename[0] == '\\' || (filename[0] != '\0' && filename[1] == ':'))); --} -- --// Note: base is a filename, not a directory name. --static JSString * --ResolveRelativePath(JSContext *cx, const char *base, JSString *filename) --{ -- size_t fileLen = JS_GetStringLength(filename); -- const jschar *fileChars = JS_GetStringCharsZ(cx, filename); -- if (!fileChars) -- return NULL; -- -- if (IsAbsolute(fileChars)) -- return filename; -- -- // Strip off the filename part of base. -- size_t dirLen = -1; -- for (size_t i = 0; base[i]; i++) { -- if (base[i] == '/' || (mswin && base[i] == '\\')) -- dirLen = i; -- } -- -- // If base is relative and contains no directories, use filename unchanged. -- if (!IsAbsolute(base) && dirLen == (size_t) -1) -- return filename; -- -- // Otherwise return base[:dirLen + 1] + filename. -- js::Vector<jschar, 0, js::ContextAllocPolicy> result(cx); -- size_t nchars; -- if (!JS_DecodeBytes(cx, base, dirLen + 1, NULL, &nchars)) -- return NULL; -- if (!result.reserve(dirLen + 1 + fileLen)) { -- JS_ReportOutOfMemory(cx); -- return NULL; -- } -- JS_ALWAYS_TRUE(result.resize(dirLen + 1)); -- if (!JS_DecodeBytes(cx, base, dirLen + 1, result.begin(), &nchars)) -- return NULL; -- JS_ALWAYS_TRUE(result.append(fileChars, fileLen)); -- return JS_NewUCStringCopyN(cx, result.begin(), result.length()); --} -- --Worker * --Worker::create(JSContext *parentcx, WorkerParent *parent, JSString *scriptName, JSObject *obj) --{ -- Worker *w = new Worker(); -- if (!w || !w->init(parentcx, parent, obj)) { -- delete w; -- return NULL; -- } -- -- JSStackFrame *frame = JS_GetScriptedCaller(parentcx, NULL); -- const char *base = JS_GetScriptFilename(parentcx, JS_GetFrameScript(parentcx, frame)); -- JSString *scriptPath = ResolveRelativePath(parentcx, base, scriptName); -- if (!scriptPath) -- return NULL; -- -- // Post an InitEvent to run the initialization script. -- Event *event = InitEvent::create(parentcx, w, scriptPath); -- if (!event) -- return NULL; -- if (!w->events.push(event) || !w->threadPool->getWorkerQueue()->post(w)) { -- event->destroy(parentcx); -- JS_ReportOutOfMemory(parentcx); -- w->dispose(); -- return NULL; -- } -- return w; --} -- --void --Worker::processOneEvent() --{ -- Event *event; -- { -- AutoLock hold1(lock); -- if (lockedCheckTermination() || events.empty()) -- return; -- -- event = current = events.pop(); -- } -- -- JS_SetContextThread(context); -- JS_SetNativeStackQuota(context, gMaxStackSize); -- -- Event::Result result; -- { -- JSAutoRequest req(context); -- result = event->process(context); -- } -- -- // Note: we have to leave the above request before calling parent->post or -- // checkTermination, both of which acquire locks. -- if (result == Event::forwardToParent) { -- event->setChildAndRecipient(this, parent); -- if (parent->post(event)) { -- event = NULL; // to prevent it from being deleted below -- } else { -- JS_ReportOutOfMemory(context); -- result = Event::fail; -- } -- } -- if (result == Event::fail && !checkTermination()) { -- JSAutoRequest req(context); -- Event *err = ErrorEvent::create(context, this); -- if (err && !parent->post(err)) { -- JS_ReportOutOfMemory(context); -- err->destroy(context); -- err = NULL; -- } -- if (!err) { -- // FIXME - out of memory, probably should panic -- } -- } -- -- if (event) -- event->destroy(context); -- JS_ClearContextThread(context); -- -- { -- AutoLock hold2(lock); -- current = NULL; -- if (!lockedCheckTermination() && !events.empty()) { -- // Re-enqueue this worker. OOM here effectively kills the worker. -- if (!threadPool->getWorkerQueue()->post(this)) -- JS_ReportOutOfMemory(context); -- } -- } --} -- --JSBool --Worker::jsPostMessageToParent(JSContext *cx, uintN argc, jsval *vp) --{ -- jsval workerval; -- if (!JS_GetReservedSlot(cx, JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)), 0, &workerval)) -- return false; -- Worker *w = (Worker *) JSVAL_TO_PRIVATE(workerval); -- -- { -- JSAutoSuspendRequest suspend(cx); // avoid nesting w->lock in a request -- if (w->checkTermination()) -- return false; -- } -- -- jsval data = argc > 0 ? JS_ARGV(cx, vp)[0] : JSVAL_VOID; -- Event *event = UpMessageEvent::create(cx, w, data); -- if (!event) -- return false; -- if (!w->parent->post(event)) { -- event->destroy(cx); -- JS_ReportOutOfMemory(cx); -- return false; -- } -- JS_SET_RVAL(cx, vp, JSVAL_VOID); -- return true; --} -- --JSBool --Worker::jsPostMessageToChild(JSContext *cx, uintN argc, jsval *vp) --{ -- JSObject *workerobj = JS_THIS_OBJECT(cx, vp); -- if (!workerobj) -- return false; -- Worker *w = (Worker *) JS_GetInstancePrivate(cx, workerobj, &jsWorkerClass, JS_ARGV(cx, vp)); -- if (!w) { -- if (!JS_IsExceptionPending(cx)) -- JS_ReportError(cx, "Worker was shut down"); -- return false; -- } -- -- jsval data = argc > 0 ? JS_ARGV(cx, vp)[0] : JSVAL_VOID; -- Event *event = DownMessageEvent::create(cx, w, data); -- if (!event) -- return false; -- if (!w->post(event)) { -- JS_ReportOutOfMemory(cx); -- return false; -- } -- JS_SET_RVAL(cx, vp, JSVAL_VOID); -- return true; --} -- --JSBool --Worker::jsTerminate(JSContext *cx, uintN argc, jsval *vp) --{ -- JS_SET_RVAL(cx, vp, JSVAL_VOID); -- -- JSObject *workerobj = JS_THIS_OBJECT(cx, vp); -- if (!workerobj) -- return false; -- Worker *w = (Worker *) JS_GetInstancePrivate(cx, workerobj, &jsWorkerClass, JS_ARGV(cx, vp)); -- if (!w) -- return !JS_IsExceptionPending(cx); // ok to terminate twice -- -- JSAutoSuspendRequest suspend(cx); -- w->setTerminateFlag(); -- return true; --} -- --void --Event::trace(JSTracer *trc) --{ -- if (recipient) -- recipient->trace(trc); -- if (child) -- JS_CALL_OBJECT_TRACER(trc, child->asObject(), "worker"); --} -- --JSClass ThreadPool::jsClass = { -- "ThreadPool", JSCLASS_HAS_PRIVATE | JSCLASS_MARK_IS_TRACE, -- JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, -- JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, jsFinalize, -- NULL, NULL, NULL, NULL, -- NULL, NULL, JS_CLASS_TRACE(jsTraceThreadPool), NULL --}; -- --JSClass Worker::jsWorkerClass = { -- "Worker", JSCLASS_HAS_PRIVATE | JSCLASS_MARK_IS_TRACE, -- JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub, -- JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, jsFinalize, -- NULL, NULL, NULL, NULL, -- NULL, NULL, JS_CLASS_TRACE(jsTraceWorker), NULL --}; -- --JSFunctionSpec Worker::jsMethods[3] = { -- JS_FN("postMessage", Worker::jsPostMessageToChild, 1, 0), -- JS_FN("terminate", Worker::jsTerminate, 0, 0), -- JS_FS_END --}; -- --ThreadPool * --js::workers::init(JSContext *cx, WorkerHooks *hooks, JSObject *global, JSObject **rootp) --{ -- return Worker::initWorkers(cx, hooks, global, rootp); --} -- --void --js::workers::terminateAll(JSRuntime *rt, ThreadPool *tp) --{ -- tp->terminateAll(rt); --} -- --void --js::workers::finish(JSContext *cx, ThreadPool *tp) --{ -- if (MainQueue *mq = tp->getMainQueue()) { -- JS_ALWAYS_TRUE(mq->mainThreadWork(cx, true)); -- tp->shutdown(cx); -- } --} -- --#endif /* JS_THREADSAFE */ -diff -ruN src/shell/jsworkers.h src.new/shell/jsworkers.h ---- shell/jsworkers.h 2011-04-01 06:08:36.000000000 +1100 -+++ shell/jsworkers.h 1970-01-01 10:00:00.000000000 +1000 -@@ -1,93 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- -- * vim: set ts=8 sw=4 et tw=99: -- * -- * ***** BEGIN LICENSE BLOCK ***** -- * Version: MPL 1.1/GPL 2.0/LGPL 2.1 -- * -- * The contents of this file are subject to the Mozilla Public License Version -- * 1.1 (the "License"); you may not use this file except in compliance with -- * the License. You may obtain a copy of the License at -- * http://www.mozilla.org/MPL/ -- * -- * Software distributed under the License is distributed on an "AS IS" basis, -- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -- * for the specific language governing rights and limitations under the -- * License. -- * -- * The Original Code is JavaScript shell workers. -- * -- * The Initial Developer of the Original Code is -- * Mozilla Corporation. -- * Portions created by the Initial Developer are Copyright (C) 2010 -- * the Initial Developer. All Rights Reserved. -- * -- * Contributor(s): -- * Jason Orendorff <jorendorff@mozilla.com> -- * -- * Alternatively, the contents of this file may be used under the terms of -- * either of the GNU General Public License Version 2 or later (the "GPL"), -- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -- * in which case the provisions of the GPL or the LGPL are applicable instead -- * of those above. If you wish to allow use of your version of this file only -- * under the terms of either the GPL or the LGPL, and not to allow others to -- * use your version of this file under the terms of the MPL, indicate your -- * decision by deleting the provisions above and replace them with the notice -- * and other provisions required by the GPL or the LGPL. If you do not delete -- * the provisions above, a recipient may use your version of this file under -- * the terms of any one of the MPL, the GPL or the LGPL. -- * -- * ***** END LICENSE BLOCK ***** */ -- --#ifndef jsworkers_h___ --#define jsworkers_h___ -- --#ifdef JS_THREADSAFE -- --#include "jsapi.h" -- --/* -- * Workers for the JS shell. -- * -- * Note: The real implementation of DOM Workers is in dom/src/threads. -- */ --namespace js { -- namespace workers { -- class ThreadPool; -- -- class WorkerHooks { -- public: -- virtual JSObject *newGlobalObject(JSContext *cx) = 0; -- virtual ~WorkerHooks() {} -- }; -- -- /* -- * Initialize workers. This defines the Worker constructor on global. -- * Requires request. rootp must point to a GC root. -- * -- * On success, *rootp receives a pointer to an object, and init returns -- * a non-null value. The caller must keep the object rooted and must -- * pass it to js::workers::finish later. -- */ -- ThreadPool *init(JSContext *cx, WorkerHooks *hooks, JSObject *global, JSObject **rootp); -- -- /* Asynchronously signal for all workers to terminate. -- * -- * Call this before calling finish() to shut down without waiting for -- * all messages to be proceesed. -- */ -- void terminateAll(JSRuntime *rt, ThreadPool *tp); -- -- /* -- * Finish running any workers, shut down the thread pool, and free all -- * resources associated with workers. The application must call this -- * before shutting down the runtime, and not during GC. -- * -- * Requires request. -- */ -- void finish(JSContext *cx, ThreadPool *tp); -- } --} -- --#endif /* JS_THREADSAFE */ -- --#endif /* jsworkers_h___ */ -diff -ruN src/tests/browser.js src.new/tests/browser.js ---- tests/browser.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/browser.js 2013-03-23 22:03:56.716635673 +1100 -@@ -767,17 +767,6 @@ - document.write(s); - } - --var JSTest = { -- waitForExplicitFinish: function () { -- gDelayTestDriverEnd = true; -- }, -- -- testFinished: function () { -- gDelayTestDriverEnd = false; -- jsTestDriverEnd(); -- } --}; -- - function jsTestDriverEnd() - { - // gDelayTestDriverEnd is used to -diff -ruN src/tests/js1_8_5/extensions/jstests.list src.new/tests/js1_8_5/extensions/jstests.list ---- tests/js1_8_5/extensions/jstests.list 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/jstests.list 2013-03-23 22:29:16.973264001 +1100 -@@ -1,13 +1,6 @@ - url-prefix ../../jsreftest.html?test=js1_8_5/extensions/ - script typedarray.js - script typedarray-prototype.js --skip-if(!xulRuntime.shell) script worker-error.js # these tests sometimes hang in browser, bug 559954, bug 562333 --skip-if(!xulRuntime.shell) script worker-error-propagation.js --skip-if(!xulRuntime.shell) script worker-fib.js --skip-if(!xulRuntime.shell) script worker-init.js --skip-if(!xulRuntime.shell) script worker-simple.js --skip-if(!xulRuntime.shell) script worker-terminate.js --skip-if(!xulRuntime.shell) script worker-timeout.js - script scripted-proxies.js - script array-length-protochange.js - script parseInt-octal.js -diff -ruN src/tests/js1_8_5/extensions/worker-error-child.js src.new/tests/js1_8_5/extensions/worker-error-child.js ---- tests/js1_8_5/extensions/worker-error-child.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-error-child.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,9 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ --function onmessage(event) { -- throw new Error("fail"); --} -diff -ruN src/tests/js1_8_5/extensions/worker-error-propagation-child.js src.new/tests/js1_8_5/extensions/worker-error-propagation-child.js ---- tests/js1_8_5/extensions/worker-error-propagation-child.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-error-propagation-child.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,16 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --function onmessage(event) { -- var n = +event.data; -- if (n == 0) -- throw new Error("boom"); -- var w = new Worker(workerDir + "worker-error-propagation-child.js"); -- w.onmessage = function (event) { postMessage(event.data); }; -- // No w.onerror here. We are testing error propagation when it is absent. -- w.postMessage(n - 1 + ""); --} -diff -ruN src/tests/js1_8_5/extensions/worker-error-propagation.js src.new/tests/js1_8_5/extensions/worker-error-propagation.js ---- tests/js1_8_5/extensions/worker-error-propagation.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-error-propagation.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,20 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --if (typeof Worker != 'undefined') { -- JSTest.waitForExplicitFinish(); -- var w = Worker(workerDir + "worker-error-propagation-child.js"); -- var errors = 0; -- w.onmessage = function () { throw new Error("no reply expected"); }; -- w.onerror = function (event) { -- reportCompare("string", typeof event.message, "typeof event.message"); -- JSTest.testFinished(); -- }; -- w.postMessage("5"); --} else { -- reportCompare(0, 0, " PASSED! Test skipped. Shell workers required."); --} -diff -ruN src/tests/js1_8_5/extensions/worker-error.js src.new/tests/js1_8_5/extensions/worker-error.js ---- tests/js1_8_5/extensions/worker-error.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-error.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,21 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --if (typeof Worker != 'undefined') { -- JSTest.waitForExplicitFinish(); -- -- // The script throws new Error("fail") on first message. -- var w = Worker(workerDir + "worker-error-child.js"); -- var a = []; -- w.onerror = function (event) { -- reportCompare("fail", event.message, "worker-error"); -- JSTest.testFinished(); -- }; -- w.postMessage("hello"); --} else { -- reportCompare(0, 0, "Test skipped. Shell workers required."); --} -diff -ruN src/tests/js1_8_5/extensions/worker-fib-child.js src.new/tests/js1_8_5/extensions/worker-fib-child.js ---- tests/js1_8_5/extensions/worker-fib-child.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-fib-child.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,27 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --function onmessage(event) { -- var a = event.data.split(/\t/); -- var n = Number(a[0]); -- var workerDir = a[1]; -- -- if (n <= 1) { -- postMessage("" + n); -- } else { -- var w1 = new Worker(workerDir + "worker-fib-child.js"), -- w2 = new Worker(workerDir + "worker-fib-child.js"); -- var a = []; -- w1.onmessage = w2.onmessage = function(event) { -- a.push(+event.data); -- if (a.length == 2) -- postMessage(a[0] + a[1] + ""); -- }; -- w1.postMessage(n - 1 + "\t" + workerDir); -- w2.postMessage(n - 2 + "\t" + workerDir); -- } --} -diff -ruN src/tests/js1_8_5/extensions/worker-fib.js src.new/tests/js1_8_5/extensions/worker-fib.js ---- tests/js1_8_5/extensions/worker-fib.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-fib.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,18 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --if (typeof Worker != 'undefined') { -- JSTest.waitForExplicitFinish(); -- var w = Worker(workerDir + "worker-fib-child.js"); -- w.onmessage = function (event) { -- reportCompare("55", event.data, "worker-fib"); -- JSTest.testFinished(); -- }; -- w.postMessage("10\t" + workerDir); // 0 1 1 2 3 5 8 13 21 34 55 --} else { -- reportCompare(0, 0, "Test skipped. Shell workers required."); --} -diff -ruN src/tests/js1_8_5/extensions/worker-init-child.js src.new/tests/js1_8_5/extensions/worker-init-child.js ---- tests/js1_8_5/extensions/worker-init-child.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-init-child.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,8 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ --postMessage('do your worst'); --for (;;) ; -diff -ruN src/tests/js1_8_5/extensions/worker-init.js src.new/tests/js1_8_5/extensions/worker-init.js ---- tests/js1_8_5/extensions/worker-init.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-init.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,19 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --if (typeof Worker != 'undefined') { -- JSTest.waitForExplicitFinish(); -- // Messages sent during initialization are a corner case, but in any case -- // they should be delivered (no waiting until initialization is complete). -- var w = new Worker(workerDir + "worker-init-child.js"); // posts a message, then loops forever -- w.onmessage = function (event) { -- reportCompare(0, 0, "worker-init"); -- JSTest.testFinished(); -- }; --} else { -- reportCompare(0, 0, "Test skipped. Shell workers required."); --} -diff -ruN src/tests/js1_8_5/extensions/worker-simple-child.js src.new/tests/js1_8_5/extensions/worker-simple-child.js ---- tests/js1_8_5/extensions/worker-simple-child.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-simple-child.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,8 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --onmessage = function (event) { postMessage(event.data); }; -diff -ruN src/tests/js1_8_5/extensions/worker-simple.js src.new/tests/js1_8_5/extensions/worker-simple.js ---- tests/js1_8_5/extensions/worker-simple.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-simple.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,20 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --if (typeof Worker != 'undefined') { -- JSTest.waitForExplicitFinish(); -- var w = new Worker(workerDir + "worker-simple-child.js"); -- var a = []; -- w.onmessage = function (event) { -- a.push(event.data); -- reportCompare(0, 0, "worker-simple"); -- JSTest.testFinished(); -- }; -- w.postMessage("hello"); --} else { -- reportCompare(0, 0, "Test skipped. Shell workers required."); --} -diff -ruN src/tests/js1_8_5/extensions/worker-terminate-child.js src.new/tests/js1_8_5/extensions/worker-terminate-child.js ---- tests/js1_8_5/extensions/worker-terminate-child.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-terminate-child.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,13 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --onmessage = function (event) { -- var workerDir = event.message; -- var child = new Worker(workerDir + 'worker-terminate-iloop.js'); // loops forever -- child.terminate(); -- postMessage("killed"); --}; -diff -ruN src/tests/js1_8_5/extensions/worker-terminate-iloop.js src.new/tests/js1_8_5/extensions/worker-terminate-iloop.js ---- tests/js1_8_5/extensions/worker-terminate-iloop.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-terminate-iloop.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,9 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --for (;;) -- ; -diff -ruN src/tests/js1_8_5/extensions/worker-terminate.js src.new/tests/js1_8_5/extensions/worker-terminate.js ---- tests/js1_8_5/extensions/worker-terminate.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-terminate.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,37 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff <jorendorff@mozilla.com> -- */ -- --if (typeof Worker != 'undefined') { -- JSTest.waitForExplicitFinish(); -- -- // This tests that a parent worker can terminate a child. We run the test -- // several times serially. If terminate() doesn't work, the runaway Workers -- // will soon outnumber the number of threads in the thread pool, and we -- // will deadlock. -- var i = 0; -- -- function next() { -- if (++i == 10) { -- reportCompare(0, 0, "worker-terminate"); -- JSTest.testFinished(); -- return; -- } -- -- var w = new Worker(workerDir + "worker-terminate-child.js"); -- w.onmessage = function (event) { -- reportCompare("killed", event.data, "killed runaway worker #" + i); -- next(); -- }; -- w.onerror = function (event) { -- reportCompare(0, 1, "Got error: " + event.message); -- }; -- w.postMessage(workerDir); -- } -- next(); --} else { -- reportCompare(0, 0, "Test skipped. Shell workers required."); --} -diff -ruN src/tests/js1_8_5/extensions/worker-timeout-child.js src.new/tests/js1_8_5/extensions/worker-timeout-child.js ---- tests/js1_8_5/extensions/worker-timeout-child.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-timeout-child.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,9 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff -- */ -- --for (;;) -- ; -diff -ruN src/tests/js1_8_5/extensions/worker-timeout.js src.new/tests/js1_8_5/extensions/worker-timeout.js ---- tests/js1_8_5/extensions/worker-timeout.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/js1_8_5/extensions/worker-timeout.js 1970-01-01 10:00:00.000000000 +1000 -@@ -1,18 +0,0 @@ --/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ --/* -- * Any copyright is dedicated to the Public Domain. -- * http://creativecommons.org/licenses/publicdomain/ -- * Contributor: Jason Orendorff -- */ -- --if (typeof timeout == 'function' && typeof Worker != 'undefined') { -- // We don't actually ever call JSTest.testFinished(); instead we -- // time out and exit the shell with exit code 6. -- JSTest.waitForExplicitFinish(); -- expectExitCode(6); -- timeout(1.0); -- for (var i = 0; i < 5; i++) -- new Worker(workerDir + "worker-timeout-child.js"); // just loops forever --} else { -- reportCompare(0, 0, "Test skipped. Shell workers and timeout required."); --} -diff -ruN src/tests/shell.js src.new/tests/shell.js ---- tests/shell.js 2011-04-01 06:08:36.000000000 +1100 -+++ tests/shell.js 2013-03-23 22:07:41.387249919 +1100 -@@ -833,18 +833,6 @@ - } - } - --var JSTest = { -- waitForExplicitFinish: function () { -- gDelayTestDriverEnd = true; -- }, -- -- testFinished: function () { -- gDelayTestDriverEnd = false; -- jsTestDriverEnd(); -- quit(); -- } --}; -- - function jsTestDriverEnd() - { - // gDelayTestDriverEnd is used to diff --git a/lang/spidermonkey185/files/patch-c++11 b/lang/spidermonkey185/files/patch-c++11 deleted file mode 100644 index 525c295b3332..000000000000 --- a/lang/spidermonkey185/files/patch-c++11 +++ /dev/null @@ -1,291 +0,0 @@ -jsapi.cpp:3988:16: error: cannot initialize return object of type 'JSIdArray *' with an rvalue of type 'bool' - return false; - ^~~~~ -jsarray.cpp:497:1: error: non-constant-expression cannot be narrowed from type 'intptr_t' (aka 'long') to 'uintptr_t' (aka 'unsigned long') in initializer list [-Wc++11-narrowing] -JS_DEFINE_CALLINFO_3(extern, BOOL, js_EnsureDenseArrayCapacity, CONTEXT, OBJECT, INT32, -^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -./jsbuiltins.h:350:5: note: expanded from macro 'JS_DEFINE_CALLINFO_3' - _JS_DEFINE_CALLINFO(linkage, op, \ - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -./jsbuiltins.h:294:11: note: expanded from macro '_JS_DEFINE_CALLINFO' - { (intptr_t) &name, argtypes, nanojit::ABI_FASTCALL, isPure, storeAccSet _JS_CI_NAME(name) }; \ - ^~~~~~~~~~~~~~~~ -jsfun.cpp:2054:16: error: cannot initialize return object of type 'JSString *' with an rvalue of type 'bool' - return false; - ^~~~~ -jsfun.cpp:2660:20: error: cannot initialize return object of type 'const js::Shape *' with an rvalue of type 'bool' - return false; - ^~~~~ -jsiter.cpp:428:20: error: cannot initialize return object of type 'JSObject *' with an rvalue of type 'bool' - return false; - ^~~~~ -jsparse.cpp:3355:20: error: cannot initialize return object of type 'JSParseNode *' with an rvalue of type 'bool' - return false; - ^~~~~ -jsstr.cpp:1737:24: error: cannot initialize return object of type 'const RegExpPair *' with an rvalue of type 'bool' - return false; - ^~~~~ -jsstr.cpp:3403:16: error: cannot initialize return object of type 'JSObject *' with an rvalue of type 'JSIntn' (aka 'int') - return JS_FALSE; - ^~~~~~~~ -./jstypes.h:395:18: note: expanded from macro 'JS_FALSE' -#define JS_FALSE (JSIntn)0 - ^~~~~~~~~ -jstypedarray.cpp:1337:20: error: cannot initialize return object of type 'JSObject *' with an rvalue of type 'bool' - return false; - ^~~~~ -jstypedarray.cpp:1671:16: error: cannot initialize return object of type 'JSObject *' with an rvalue of type 'bool' - return false; - ^~~~~ -jsxml.cpp:285:16: error: cannot initialize return object of type 'JSObject *' with an rvalue of type 'JSIntn' (aka 'int') - return JS_FALSE; - ^~~~~~~~ -jsxml.cpp:434:20: error: cannot initialize return object of type 'JSString *' with an rvalue of type 'JSIntn' (aka 'int') - return JS_FALSE; - ^~~~~~~~ -./jstypes.h:395:18: note: expanded from macro 'JS_FALSE' -#define JS_FALSE (JSIntn)0 - ^~~~~~~~~ -./methodjit/InvokeHelpers.cpp:731:16: error: cannot initialize return object of type 'void *' with an rvalue of type 'bool' - return false; - ^~~~~ -./nanojit/NativeX64.cpp:1902:59: error: constant expression evaluates to 9223372036854775808 which cannot be narrowed to type 'int64_t' (aka 'long') [-Wc++11-narrowing] - static const AVMPLUS_ALIGN16(int64_t) negateMask[] = {0x8000000000000000LL,0}; - ^~~~~~~~~~~~~~~~~~~~ -./nanojit/NativeX64.cpp:1902:59: note: insert an explicit cast to silence this issue - static const AVMPLUS_ALIGN16(int64_t) negateMask[] = {0x8000000000000000LL,0}; - ^~~~~~~~~~~~~~~~~~~~ - static_cast<int64_t>( ) -./nanojit/RegAlloc.h:189:24: error: non-constant-expression cannot be narrowed from type 'int' to 'nanojit::Register' (aka 'unsigned int') in initializer list [-Wc++11-narrowing] - Register r = { (sizeof(RegisterMask) == 4) ? lsbSet32(mask) : lsbSet64(mask) }; - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -./nanojit/RegAlloc.h:189:24: note: insert an explicit cast to silence this issue - Register r = { (sizeof(RegisterMask) == 4) ? lsbSet32(mask) : lsbSet64(mask) }; - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - static_cast<Register>( ) -./nanojit/RegAlloc.h:197:24: error: non-constant-expression cannot be narrowed from type 'int' to 'nanojit::Register' (aka 'unsigned int') in initializer list [-Wc++11-narrowing] - Register r = { (sizeof(RegisterMask) == 4) ? msbSet32(mask) : msbSet64(mask) }; - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -./nanojit/RegAlloc.h:197:24: note: insert an explicit cast to silence this issue - Register r = { (sizeof(RegisterMask) == 4) ? msbSet32(mask) : msbSet64(mask) }; - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - static_cast<Register>( ) - ---- jsapi.cpp.orig 2011-03-31 19:08:36 UTC -+++ jsapi.cpp -@@ -3985,7 +3985,7 @@ JS_Enumerate(JSContext *cx, JSObject *obj) - AutoIdVector props(cx); - JSIdArray *ida; - if (!GetPropertyNames(cx, obj, JSITER_OWNONLY, &props) || !VectorToIdArray(cx, props, &ida)) -- return false; -+ return NULL; - for (size_t n = 0; n < size_t(ida->length); ++n) - JS_ASSERT(js_CheckForStringIndex(ida->vector[n]) == ida->vector[n]); - return ida; ---- jsbuiltins.h.orig 2011-03-31 19:08:36 UTC -+++ jsbuiltins.h -@@ -284,14 +284,14 @@ struct ClosureVarInfo; - #define _JS_DEFINE_CALLINFO(linkage, name, crtype, cargtypes, argtypes, isPure, storeAccSet) \ - _JS_TN_LINKAGE(linkage, crtype) name cargtypes; \ - _JS_CI_LINKAGE(linkage) const nanojit::CallInfo _JS_CALLINFO(name) = \ -- { (intptr_t) &name, argtypes, nanojit::ABI_CDECL, isPure, storeAccSet _JS_CI_NAME(name) };\ -+ { (uintptr_t) &name, argtypes, nanojit::ABI_CDECL, isPure, storeAccSet _JS_CI_NAME(name) };\ - JS_STATIC_ASSERT_IF(isPure, (storeAccSet) == nanojit::ACCSET_NONE); - - #else - #define _JS_DEFINE_CALLINFO(linkage, name, crtype, cargtypes, argtypes, isPure, storeAccSet) \ - _JS_TN_LINKAGE(linkage, crtype) FASTCALL name cargtypes; \ - _JS_CI_LINKAGE(linkage) const nanojit::CallInfo _JS_CALLINFO(name) = \ -- { (intptr_t) &name, argtypes, nanojit::ABI_FASTCALL, isPure, storeAccSet _JS_CI_NAME(name) }; \ -+ { (uintptr_t) &name, argtypes, nanojit::ABI_FASTCALL, isPure, storeAccSet _JS_CI_NAME(name) }; \ - JS_STATIC_ASSERT_IF(isPure, (storeAccSet) == nanojit::ACCSET_NONE); - #endif - ---- jsfun.cpp.orig 2011-03-31 19:08:36 UTC -+++ jsfun.cpp -@@ -2051,7 +2051,7 @@ fun_toStringHelper(JSContext *cx, JSObject *obj, uintN - - JSString *str = JS_DecompileFunction(cx, fun, indent); - if (!str) -- return false; -+ return NULL; - - if (!indent) - cx->compartment->toSourceCache.put(fun, str); -@@ -2657,7 +2657,7 @@ LookupInterpretedFunctionPrototype(JSContext *cx, JSOb - const Shape *shape = funobj->nativeLookup(id); - if (!shape) { - if (!ResolveInterpretedFunctionPrototype(cx, funobj)) -- return false; -+ return NULL; - shape = funobj->nativeLookup(id); - } - JS_ASSERT(!shape->configurable()); ---- jsiter.cpp.orig 2011-03-31 19:08:36 UTC -+++ jsiter.cpp -@@ -267,7 +267,7 @@ Snapshot(JSContext *cx, JSObject *obj, uintN flags, Au - */ - IdSet ht(cx); - if (!ht.init(32)) -- return NULL; -+ return false; - - JSObject *pobj = obj; - do { -@@ -425,7 +425,7 @@ NewIteratorObject(JSContext *cx, uintN flags) - */ - JSObject *obj = js_NewGCObject(cx, FINALIZE_OBJECT0); - if (!obj) -- return false; -+ return NULL; - obj->init(cx, &js_IteratorClass, NULL, NULL, NULL, false); - obj->setMap(cx->compartment->emptyEnumeratorShape); - return obj; ---- jsparse.cpp.orig 2011-03-31 19:08:36 UTC -+++ jsparse.cpp -@@ -1821,14 +1821,14 @@ Compiler::compileFunctionBody(JSContext *cx, JSFunctio - - JSCodeGenerator funcg(&parser, &codePool, ¬ePool, tokenStream.getLineno()); - if (!funcg.init()) -- return NULL; -+ return false; - - funcg.flags |= TCF_IN_FUNCTION; - funcg.setFunction(fun); - funcg.bindings.transfer(cx, bindings); - fun->setArgCount(funcg.bindings.countArgs()); - if (!GenerateBlockId(&funcg, funcg.bodyid)) -- return NULL; -+ return false; - - /* FIXME: make Function format the source for a function definition. */ - tokenStream.mungeCurrentToken(TOK_NAME); -@@ -3352,7 +3352,7 @@ Parser::functionDef(JSAtom *funAtom, FunctionType type - if (!outertc->inFunction() && bodyLevel && funAtom && !lambda && outertc->compiling()) { - JS_ASSERT(pn->pn_cookie.isFree()); - if (!DefineGlobal(pn, outertc->asCodeGenerator(), funAtom)) -- return false; -+ return NULL; - } - - pn->pn_blockid = outertc->blockid(); -@@ -5058,7 +5058,7 @@ RebindLets(JSParseNode *pn, JSTreeContext *tc) - if (!ale) { - ale = MakePlaceholder(pn, tc); - if (!ale) -- return NULL; -+ return false; - } - LinkUseToDef(pn, ALE_DEFN(ale), tc); - } ---- jsstr.cpp.orig 2011-03-31 19:08:36 UTC -+++ jsstr.cpp -@@ -1734,7 +1734,7 @@ class RegExpGuard - if (flat) { - patstr = flattenPattern(cx, fm.patstr); - if (!patstr) -- return false; -+ return NULL; - } else { - patstr = fm.patstr; - } -@@ -2276,7 +2276,7 @@ BuildDollarReplacement(JSContext *cx, JSString *textst - { - JSLinearString *textstr = textstrArg->ensureLinear(cx); - if (!textstr) -- return NULL; -+ return false; - - JS_ASSERT(repstr->chars() <= firstDollar && firstDollar < repstr->chars() + repstr->length()); - size_t matchStart = fm.match(); -@@ -3400,7 +3400,7 @@ js_InitStringClass(JSContext *cx, JSObject *obj) - UndefinedValue(), NULL, NULL, - JSPROP_READONLY | JSPROP_PERMANENT | JSPROP_SHARED, 0, 0, - NULL)) { -- return JS_FALSE; -+ return NULL; - } - - return proto; ---- jstypedarray.cpp.orig 2011-03-31 19:08:36 UTC -+++ jstypedarray.cpp -@@ -1334,7 +1334,7 @@ class TypedArrayTemplate - if (size != 0 && count >= INT32_MAX / size) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, - JSMSG_NEED_DIET, "size and count"); -- return false; -+ return NULL; - } - - int32 bytelen = size * count; -@@ -1668,7 +1668,7 @@ TypedArrayConstruct(JSContext *cx, jsint atype, uintN - - default: - JS_NOT_REACHED("shouldn't have gotten here"); -- return false; -+ return NULL; - } - } - ---- jsxml.cpp.orig 2011-03-31 19:08:36 UTC -+++ jsxml.cpp -@@ -282,7 +282,7 @@ NewXMLNamespace(JSContext *cx, JSLinearString *prefix, - - obj = NewBuiltinClassInstanceXML(cx, &js_NamespaceClass); - if (!obj) -- return JS_FALSE; -+ return NULL; - JS_ASSERT(JSVAL_IS_VOID(obj->getNamePrefixVal())); - JS_ASSERT(JSVAL_IS_VOID(obj->getNameURIVal())); - JS_ASSERT(JSVAL_IS_VOID(obj->getNamespaceDeclared())); -@@ -431,7 +431,7 @@ ConvertQNameToString(JSContext *cx, JSObject *obj) - size_t length = str->length(); - jschar *chars = (jschar *) cx->malloc((length + 2) * sizeof(jschar)); - if (!chars) -- return JS_FALSE; -+ return NULL; - *chars = '@'; - const jschar *strChars = str->getChars(cx); - if (!strChars) { ---- methodjit/InvokeHelpers.cpp.orig 2011-03-31 19:08:36 UTC -+++ methodjit/InvokeHelpers.cpp -@@ -728,7 +728,7 @@ AtSafePoint(JSContext *cx) - { - JSStackFrame *fp = cx->fp(); - if (fp->hasImacropc()) -- return false; -+ return NULL; - - JSScript *script = fp->script(); - return script->maybeNativeCodeForPC(fp->isConstructing(), cx->regs->pc); ---- nanojit/NativeX64.cpp.orig 2011-03-31 19:08:36 UTC -+++ nanojit/NativeX64.cpp -@@ -1899,7 +1899,7 @@ namespace nanojit - } - } - -- static const AVMPLUS_ALIGN16(int64_t) negateMask[] = {0x8000000000000000LL,0}; -+ static const AVMPLUS_ALIGN16(int64_t) negateMask[] = {(int64_t)0x8000000000000000LL,0}; - - void Assembler::asm_fneg(LIns *ins) { - Register rr, ra; ---- nanojit/RegAlloc.h.orig 2011-03-31 19:08:36 UTC -+++ nanojit/RegAlloc.h -@@ -186,7 +186,7 @@ namespace nanojit - inline Register lsReg(RegisterMask mask) { - // This is faster than it looks; we rely on the C++ optimizer - // to strip the dead branch and inline just one alternative. -- Register r = { (sizeof(RegisterMask) == 4) ? lsbSet32(mask) : lsbSet64(mask) }; -+ Register r = { (sizeof(RegisterMask) == 4) ? (Register)lsbSet32(mask) : (Register)lsbSet64(mask) }; - return r; - } - -@@ -194,7 +194,7 @@ namespace nanojit - inline Register msReg(RegisterMask mask) { - // This is faster than it looks; we rely on the C++ optimizer - // to strip the dead branch and inline just one alternative. -- Register r = { (sizeof(RegisterMask) == 4) ? msbSet32(mask) : msbSet64(mask) }; -+ Register r = { (sizeof(RegisterMask) == 4) ? (Register)msbSet32(mask) : (Register)msbSet64(mask) }; - return r; - } - diff --git a/lang/spidermonkey185/files/patch-configure.in b/lang/spidermonkey185/files/patch-configure.in deleted file mode 100644 index c8910057a423..000000000000 --- a/lang/spidermonkey185/files/patch-configure.in +++ /dev/null @@ -1,36 +0,0 @@ ---- ./configure.in.orig 2011-04-01 06:08:36.000000000 +1100 -+++ ./configure.in 2013-05-26 00:19:28.032315432 +1000 -@@ -3378,7 +3378,8 @@ - rm -f conftest.{c,S} - ]) - if test "$ac_cv_have_visibility_builtin_bug" = "no" -a \ -- "$ac_cv_have_visibility_class_bug" = "no"; then -+ "$ac_cv_have_visibility_class_bug" = "no" -a \ -+ "$OS_ARCH" != "FreeBSD" ; then - VISIBILITY_FLAGS='-I$(DIST)/system_wrappers_js -include $(topsrcdir)/config/gcc_hidden.h' - WRAP_SYSTEM_INCLUDES=1 - STL_FLAGS='-I$(DIST)/stl_wrappers' -@@ -4656,6 +4657,9 @@ MOZ_ARG_HEADER(Individual module options - - dnl Setup default CPU arch for arm target - case "$target_cpu" in -+ armv6*) -+ MOZ_ARM_ARCH=armv6 -+ ;; - arm*) - MOZ_ARM_ARCH=armv7 - ;; -@@ -4716,6 +4720,13 @@ elif test "$MOZ_ARM_ARCH" = "armv7"; the - esac - else - case "$target_cpu" in -+ armv6*) -+ if test "$GNU_CC"; then -+ CFLAGS="$CFLAGS" -+ CXXFLAGS="$CXXFLAGS" -+ ASFLAGS="$ASFLAGS" -+ fi -+ ;; - arm*) - if test "$GNU_CC"; then - CFLAGS="$CFLAGS -march=armv5te -mthumb-interwork -msoft-float" diff --git a/lang/spidermonkey185/files/patch-jsscript.h b/lang/spidermonkey185/files/patch-jsscript.h deleted file mode 100644 index a642b31a8642..000000000000 --- a/lang/spidermonkey185/files/patch-jsscript.h +++ /dev/null @@ -1,48 +0,0 @@ -# HG changeset patch -# User Ehsan Akhgari <ehsan@mozilla.com> -# Date 1308340787 14400 -# Node ID c0e8643e8e60d1c98bff30c78e034f991f75c191 -# Parent 284ebc48b2cb8e35dc04482ede700e717d8d214f -Bug 662962 - Silence the clang warnings issued because of alignment requirements increase when compiling jsscript.h; r=Waldo - ---- ./jsscript.h.orig 2011-04-01 06:08:36.000000000 +1100 -+++ ./jsscript.h 2013-05-26 00:23:16.202260566 +1000 -@@ -496,32 +496,32 @@ - - JSObjectArray *objects() { - JS_ASSERT(isValidOffset(objectsOffset)); -- return (JSObjectArray *)((uint8 *) (this + 1) + objectsOffset); -+ return reinterpret_cast<JSObjectArray *>(uintptr_t(this + 1) + objectsOffset); - } - - JSUpvarArray *upvars() { - JS_ASSERT(isValidOffset(upvarsOffset)); -- return (JSUpvarArray *) ((uint8 *) (this + 1) + upvarsOffset); -+ return reinterpret_cast<JSUpvarArray *>(uintptr_t(this + 1) + upvarsOffset); - } - - JSObjectArray *regexps() { - JS_ASSERT(isValidOffset(regexpsOffset)); -- return (JSObjectArray *) ((uint8 *) (this + 1) + regexpsOffset); -+ return reinterpret_cast<JSObjectArray *>(uintptr_t(this + 1) + regexpsOffset); - } - - JSTryNoteArray *trynotes() { - JS_ASSERT(isValidOffset(trynotesOffset)); -- return (JSTryNoteArray *) ((uint8 *) (this + 1) + trynotesOffset); -+ return reinterpret_cast<JSTryNoteArray *>(uintptr_t(this + 1) + trynotesOffset); - } - - js::GlobalSlotArray *globals() { - JS_ASSERT(isValidOffset(globalsOffset)); -- return (js::GlobalSlotArray *) ((uint8 *) (this + 1) + globalsOffset); -+ return reinterpret_cast<js::GlobalSlotArray *>(uintptr_t(this + 1) + globalsOffset); - } - - JSConstArray *consts() { - JS_ASSERT(isValidOffset(constOffset)); -- return (JSConstArray *) ((uint8 *) (this + 1) + constOffset); -+ return reinterpret_cast<JSConstArray *>(uintptr_t(this + 1) + constOffset); - } - - JSAtom *getAtom(size_t index) { diff --git a/lang/spidermonkey185/files/patch-jsstr.cpp b/lang/spidermonkey185/files/patch-jsstr.cpp deleted file mode 100644 index 13ab1ee9f3d4..000000000000 --- a/lang/spidermonkey185/files/patch-jsstr.cpp +++ /dev/null @@ -1,36 +0,0 @@ -# HG changeset patch -# User Ehsan Akhgari <ehsan@mozilla.com> -# Date 1308517488 14400 -# Node ID 284ebc48b2cb8e35dc04482ede700e717d8d214f -# Parent cecc5adfc44068fb6f11b9baa78cb5fddc100b27 -Bug 662961 - Silence the clang warnings issued because of alignment requirements increase when compiling jsstr.cpp; r=Waldo - ---- ./jsstr.cpp.orig 2013-05-26 00:44:33.383765764 +1000 -+++ ./jsstr.cpp 2013-05-26 00:46:35.842211859 +1000 -@@ -3147,7 +3147,7 @@ - */ - #define R(c) { \ - BUILD_LENGTH_AND_FLAGS(1, JSString::FLAT | JSString::ATOMIZED), \ -- { (jschar *)(((char *)(unitStringTable + (c))) + \ -+ { (jschar *)(uintptr_t(unitStringTable + (c)) + \ - offsetof(JSString, inlineStorage)) }, \ - { {(c), 0x00} } } - -@@ -3207,7 +3207,7 @@ - */ - #define R(c) { \ - BUILD_LENGTH_AND_FLAGS(2, JSString::FLAT | JSString::ATOMIZED), \ -- { (jschar *)(((char *)(length2StringTable + (c))) + \ -+ { (jschar *)(uintptr_t(length2StringTable + (c)) + \ - offsetof(JSString, inlineStorage)) }, \ - { {FROM_SMALL_CHAR((c) >> 6), FROM_SMALL_CHAR((c) & 0x3F), 0x00} } } - -@@ -3240,7 +3240,7 @@ - */ - #define R(c) { \ - BUILD_LENGTH_AND_FLAGS(3, JSString::FLAT | JSString::ATOMIZED), \ -- { (jschar *)(((char *)(hundredStringTable + ((c) - 100))) + \ -+ { (jschar *)(uintptr_t(hundredStringTable + ((c) - 100)) + \ - offsetof(JSString, inlineStorage)) }, \ - { {((c) / 100) + '0', ((c) / 10 % 10) + '0', ((c) % 10) + '0', 0x00} } } - diff --git a/lang/spidermonkey185/files/patch-methodjit_MethodJIT.cpp b/lang/spidermonkey185/files/patch-methodjit_MethodJIT.cpp deleted file mode 100644 index b886520e9bd8..000000000000 --- a/lang/spidermonkey185/files/patch-methodjit_MethodJIT.cpp +++ /dev/null @@ -1,38 +0,0 @@ ---- methodjit/MethodJIT.cpp.orig 2011-03-31 19:08:36 UTC -+++ methodjit/MethodJIT.cpp -@@ -189,7 +189,7 @@ JS_STATIC_ASSERT(offsetof(VMFrame, regs.fp) == 0x38); - JS_STATIC_ASSERT(JSVAL_TAG_MASK == 0xFFFF800000000000LL); - JS_STATIC_ASSERT(JSVAL_PAYLOAD_MASK == 0x00007FFFFFFFFFFFLL); - --asm volatile ( -+asm ( - ".text\n" - ".globl " SYMBOL_STRING(JaegerTrampoline) "\n" - SYMBOL_STRING(JaegerTrampoline) ":" "\n" -@@ -236,7 +236,7 @@ SYMBOL_STRING(JaegerTrampoline) ":" "\n" - "jmp *0(%rsp)" "\n" - ); - --asm volatile ( -+asm ( - ".text\n" - ".globl " SYMBOL_STRING(JaegerTrampolineReturn) "\n" - SYMBOL_STRING(JaegerTrampolineReturn) ":" "\n" -@@ -256,7 +256,7 @@ SYMBOL_STRING(JaegerTrampolineReturn) ":" "\n" - "ret" "\n" - ); - --asm volatile ( -+asm ( - ".text\n" - ".globl " SYMBOL_STRING(JaegerThrowpoline) "\n" - SYMBOL_STRING(JaegerThrowpoline) ":" "\n" -@@ -281,7 +281,7 @@ SYMBOL_STRING(JaegerThrowpoline) ":" "\n" - - JS_STATIC_ASSERT(offsetof(VMFrame, regs.fp) == 0x38); - --asm volatile ( -+asm ( - ".text\n" - ".globl " SYMBOL_STRING(InjectJaegerReturn) "\n" - SYMBOL_STRING(InjectJaegerReturn) ":" "\n" diff --git a/lang/spidermonkey185/files/patch-nanojit_CodeAlloc.cpp b/lang/spidermonkey185/files/patch-nanojit_CodeAlloc.cpp deleted file mode 100644 index 52c65c0e9624..000000000000 --- a/lang/spidermonkey185/files/patch-nanojit_CodeAlloc.cpp +++ /dev/null @@ -1,10 +0,0 @@ ---- nanojit/CodeAlloc.cpp.orig 2016-09-07 UTC -+++ nanojit/CodeAlloc.cpp -@@ -261,7 +261,6 @@ namespace nanojit - #endif - - #if defined(AVMPLUS_UNIX) && defined(NANOJIT_ARM) --#include <asm/unistd.h> - extern "C" void __clear_cache(char *BEG, char *END); - #endif - diff --git a/lang/spidermonkey185/files/patch-nanojit_njcpudetect.h b/lang/spidermonkey185/files/patch-nanojit_njcpudetect.h deleted file mode 100644 index 4a26a07ab688..000000000000 --- a/lang/spidermonkey185/files/patch-nanojit_njcpudetect.h +++ /dev/null @@ -1,11 +0,0 @@ ---- nanojit/njcpudetect.h.orig 2016-09-07 UTC -+++ nanojit/njcpudetect.h -@@ -77,6 +77,8 @@ - #elif defined(__ARM_ARCH_6__) || \ - defined(__ARM_ARCH_6J__) || \ - defined(__ARM_ARCH_6T2__) || \ -+ defined(__ARM_ARCH_6K__) || \ -+ defined(__ARM_ARCH_6KZ__) || \ - defined(__ARM_ARCH_6Z__) || \ - defined(__ARM_ARCH_6ZK__) || \ - defined(__ARM_ARCH_6M__) || \ diff --git a/lang/spidermonkey185/pkg-descr b/lang/spidermonkey185/pkg-descr deleted file mode 100644 index db4318240eed..000000000000 --- a/lang/spidermonkey185/pkg-descr +++ /dev/null @@ -1,3 +0,0 @@ -Spidermonkey is the JavaScript interpreter from the Mozilla project. - -WWW: http://www.mozilla.org/js/spidermonkey/ diff --git a/lang/spidermonkey185/pkg-plist b/lang/spidermonkey185/pkg-plist deleted file mode 100644 index f7735572dd26..000000000000 --- a/lang/spidermonkey185/pkg-plist +++ /dev/null @@ -1,106 +0,0 @@ -bin/js-config -include/js/Allocator.h -include/js/Assembler.h -include/js/CodeAlloc.h -include/js/Containers.h -include/js/Fragmento.h -include/js/LIR.h -include/js/LIRopcode.tbl -include/js/Native.h -include/js/NativeCommon.h -%%ARM%%/include/js/NativeARM.h -%%MIPS%%/include/js/NativeMIPS.h -%%PPC%%/include/js/NativePPC.h -%%SPARC%%/include/js/NativeSparc.h -%%AMD64%%include/js/NativeX64.h -%%I386%%include/js/Nativei386.h -include/js/RegAlloc.h -include/js/VMPI.h -include/js/Writer.h -include/js/avmplus.h -include/js/js-config.h -include/js/js.msg -include/js/jsanalyze.h -include/js/jsapi.h -include/js/jsarena.h -include/js/jsarray.h -include/js/jsatom.h -include/js/jsautocfg.h -include/js/jsautokw.h -include/js/jsbit.h -include/js/jsbool.h -include/js/jsbuiltins.h -include/js/jscell.h -include/js/jsclist.h -include/js/jsclone.h -include/js/jscntxt.h -include/js/jscompartment.h -include/js/jscompat.h -include/js/jsdate.h -include/js/jsdbgapi.h -include/js/jsdhash.h -include/js/jsdtoa.h -include/js/jsemit.h -include/js/jsfriendapi.h -include/js/jsfun.h -include/js/jsgc.h -include/js/jsgcchunk.h -include/js/jsgcstats.h -include/js/jshash.h -include/js/jshashtable.h -include/js/jshotloop.h -include/js/jsinterp.h -include/js/jsinttypes.h -include/js/jsiter.h -include/js/jslock.h -include/js/jslong.h -include/js/jsmath.h -include/js/jsobj.h -include/js/jsobjinlines.h -include/js/json.h -include/js/jsopcode.h -include/js/jsopcode.tbl -include/js/jsopcodeinlines.h -include/js/jsotypes.h -include/js/jsparse.h -include/js/jsperf.h -include/js/jsprf.h -include/js/jsprobes.h -include/js/jspropertycache.h -include/js/jspropertycacheinlines.h -include/js/jspropertytree.h -include/js/jsproto.tbl -include/js/jsproxy.h -include/js/jsprvtd.h -include/js/jspubtd.h -include/js/jsreflect.h -include/js/jsregexp.h -include/js/jsscan.h -include/js/jsscope.h -include/js/jsscript.h -include/js/jsscriptinlines.h -include/js/jsstaticcheck.h -include/js/jsstdint.h -include/js/jsstr.h -include/js/jstl.h -include/js/jstracer.h -include/js/jstypedarray.h -include/js/jstypes.h -include/js/jsutil.h -include/js/jsval.h -include/js/jsvalue.h -include/js/jsvector.h -include/js/jsversion.h -include/js/jswrapper.h -include/js/jsxdrapi.h -include/js/jsxml.h -include/js/nanojit.h -include/js/njconfig.h -include/js/njcpudetect.h -include/js/prmjtime.h -lib/libmozjs185.so -lib/libmozjs185-1.0.a -lib/libmozjs185.so.1.0.0 -lib/libmozjs185.so.1.0 -lib/libmozjs185.so.1 -libdata/pkgconfig/mozjs185.pc diff --git a/multimedia/Makefile b/multimedia/Makefile index 54bbd872c5ae..221555f40b21 100644 --- a/multimedia/Makefile +++ b/multimedia/Makefile @@ -126,7 +126,6 @@ SUBDIR += gstreamer1-validate SUBDIR += gstreamermm SUBDIR += gtk-youtube-viewer - SUBDIR += gxine SUBDIR += handbrake SUBDIR += haruna SUBDIR += harvid diff --git a/multimedia/gxine/Makefile b/multimedia/gxine/Makefile deleted file mode 100644 index 1cb7cb9942e0..000000000000 --- a/multimedia/gxine/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# Created by: Grigori Goronzy <greg@chown.ath.cx> - -PORTNAME= gxine -PORTVERSION= 0.5.910 -PORTREVISION= 3 -CATEGORIES= multimedia -MASTER_SITES= SF/xine/${PORTNAME}/${PORTVERSION} - -MAINTAINER= ports@FreeBSD.org -COMMENT= Alternative GUI for the Xine media player - -LICENSE= GPLv2 -LICENSE_FILE= ${WRKSRC}/COPYING - -DEPRECATED= Uses EOL Python 2.7 via lang/spidermonkey185 -EXPIRATION_DATE=2021-06-23 - -LIB_DEPENDS= libnspr4.so:devel/nspr \ - libmozjs185.so:lang/spidermonkey185 \ - libxine.so:multimedia/libxine - -USES= desktop-file-utils gmake gnome libtool pathfix pkgconfig tar:xz -USE_GNOME= gtk30 -GNU_CONFIGURE= yes -CONFIGURE_ARGS= --without-hal --with-libintl-prefix=${LOCALBASE} \ - --with-gtk3 --without-dbus --disable-integration-wizard -INSTALLS_ICONS= yes -LLD_UNSAFE= yes - -OPTIONS_DEFINE= LIRC NLS WEBPLUGIN -OPTIONS_SUB= yes - -WEBPLUGIN_DESC= Build and/or install Web browser plugins - -LIRC_LIB_DEPENDS= liblirc_client.so:comms/lirc -LIRC_CONFIGURE_ENABLE= lirc -LIRC_USES= localbase - -NLS_CONFIGURE_ENABLE= nls -NLS_USES= gettext - -WEBPLUGIN_USE= xorg=xaw -WEBPLUGIN_USES= webplugin:native xorg -WEBPLUGIN_CONFIGURE_WITH= browser-plugin -WEBPLUGIN_DIR= ${PREFIX}/lib/gxine -WEBPLUGIN_FILES= gxineplugin.so - -post-patch: - @${REINPLACE_CMD} -e \ - '/CFLAGS/s|-I/usr/local/include|| ; \ - /CFLAGS/s|-L/usr/local/lib|| ; \ - /CPPFLAGS/s|-I/usr/local/include|| ; \ - s|XINE_LIST=.*|XINE_LIST=|' ${WRKSRC}/configure - @${REINPLACE_CMD} -e \ - 's|@MAKE_PNG_TRUE@|#|' ${WRKSRC}/pixmaps/Makefile.in - -post-install-WEBPLUGIN-on: - @${STRIP_CMD} ${STAGEDIR}${WEBPLUGIN_DIR}/${WEBPLUGIN_FILES} - -.include <bsd.port.mk> diff --git a/multimedia/gxine/distinfo b/multimedia/gxine/distinfo deleted file mode 100644 index 444f00677191..000000000000 --- a/multimedia/gxine/distinfo +++ /dev/null @@ -1,3 +0,0 @@ -TIMESTAMP = 1519264096 -SHA256 (gxine-0.5.910.tar.xz) = 567a0e14bea30e8bb82080173b61b574a6a22ab074f513c535f276780741fe17 -SIZE (gxine-0.5.910.tar.xz) = 931616 diff --git a/multimedia/gxine/files/patch-src__Makefile.in b/multimedia/gxine/files/patch-src__Makefile.in deleted file mode 100644 index 72663e4b6632..000000000000 --- a/multimedia/gxine/files/patch-src__Makefile.in +++ /dev/null @@ -1,11 +0,0 @@ ---- src/Makefile.in.orig 2018-02-22 07:47:00 UTC -+++ src/Makefile.in -@@ -470,7 +470,7 @@ gxine_SOURCES = \ - gxine_LDADD = $(XINE_LIBS) $(GTK2_LIBS) $(GTK3_LIBS) $(GTHREAD2_LIBS) \ - $(JS_LIBS) $(HAL_LIBS) $(UDEV_LIBS) $(DBUS_LIBS) $(LIRC_LIBS) \ - $(X_LIBS) $(X_EXTRA_LIBS) $(XEXT_LIBS) $(XTEST_LIBS) \ -- $(XINERAMA_LIBS) $(XRANDR_LIBS) $(XCB_LIBS) -ldl -lm -+ $(XINERAMA_LIBS) $(XRANDR_LIBS) $(XCB_LIBS) -lm - - gxine_client_SOURCES = client.c console_output.c - gxine_client_CFLAGS = $(AM_CFLAGS) -DGXINE_CLIENT diff --git a/multimedia/gxine/files/patch-src__lirc.c b/multimedia/gxine/files/patch-src__lirc.c deleted file mode 100644 index c2d2b04ce118..000000000000 --- a/multimedia/gxine/files/patch-src__lirc.c +++ /dev/null @@ -1,12 +0,0 @@ ---- src/lirc.c.orig 2017-12-27 17:41:32 UTC -+++ src/lirc.c -@@ -226,8 +226,8 @@ static JSBool js_reload_lirc (JSContext *cx, uintN arg - if (gxine_lirc_thread_created) - pthread_join (gxine_lirc_thread, NULL); - gxine_lirc_start (); --#endif - JS_SET_RVAL (cx, vp, gxine_lirc_thread_created ? JSVAL_TRUE : JSVAL_FALSE); -+#endif - return JS_TRUE; - } - diff --git a/multimedia/gxine/files/patch-src_console__output.c b/multimedia/gxine/files/patch-src_console__output.c deleted file mode 100644 index b845624c74ca..000000000000 --- a/multimedia/gxine/files/patch-src_console__output.c +++ /dev/null @@ -1,162 +0,0 @@ ---- src/console_output.c.orig 2017-12-27 17:41:32 UTC -+++ src/console_output.c -@@ -45,6 +45,159 @@ static void console_push (const char *s, uint8_t e) {} - #else - /* defines & functions for gxine */ - -+#if defined(__FreeBSD__) -+#include <osreldate.h> -+#if __FreeBSD_version < 800067 -+ -+/* from src/contrib/cvs/lib/getline.h */ -+#if defined (__GNUC__) || (defined (__STDC__) && __STDC__) -+#define __PROTO(args) args -+#else -+#define __PROTO(args) () -+#endif /* GCC. */ -+ -+#define GETLINE_NO_LIMIT -1 -+ -+int -+ getline __PROTO ((char **_lineptr, size_t *_n, FILE *_stream)); -+int -+ getline_safe __PROTO ((char **_lineptr, size_t *_n, FILE *_stream, -+ int limit)); -+int -+ getstr __PROTO ((char **_lineptr, size_t *_n, FILE *_stream, -+ int _terminator, int _offset, int limit)); -+ -+/* getline.h */ -+/* from src/contrib/cvs/lib/getline.c */ -+ -+#include <sys/types.h> -+#include <assert.h> -+#include <errno.h> -+ -+#define MIN_CHUNK 64 -+ -+int -+getstr (lineptr, n, stream, terminator, offset, limit) -+ char **lineptr; -+ size_t *n; -+ FILE *stream; -+ int terminator; -+ int offset; -+ int limit; -+{ -+ int nchars_avail; /* Allocated but unused chars in *LINEPTR. */ -+ char *read_pos; /* Where we're reading into *LINEPTR. */ -+ int ret; -+ -+ if (!lineptr || !n || !stream) -+ { -+ errno = EINVAL; -+ return -1; -+ } -+ -+ if (!*lineptr) -+ { -+ *n = MIN_CHUNK; -+ *lineptr = malloc (*n); -+ if (!*lineptr) -+ { -+ errno = ENOMEM; -+ return -1; -+ } -+ *lineptr[0] = '\0'; -+ } -+ -+ nchars_avail = *n - offset; -+ read_pos = *lineptr + offset; -+ -+ for (;;) -+ { -+ int save_errno; -+ register int c; -+ -+ if (limit == 0) -+ break; -+ else -+ { -+ c = getc (stream); -+ -+ /* If limit is negative, then we shouldn't pay attention to -+ it, so decrement only if positive. */ -+ if (limit > 0) -+ limit--; -+ } -+ -+ save_errno = errno; -+ -+ /* We always want at least one char left in the buffer, since we -+ always (unless we get an error while reading the first char) -+ NUL-terminate the line buffer. */ -+ -+ assert((*lineptr + *n) == (read_pos + nchars_avail)); -+ if (nchars_avail < 2) -+ { -+ if (*n > MIN_CHUNK) -+ *n *= 2; -+ else -+ *n += MIN_CHUNK; -+ -+ nchars_avail = *n + *lineptr - read_pos; -+ *lineptr = realloc (*lineptr, *n); -+ if (!*lineptr) -+ { -+ errno = ENOMEM; -+ return -1; -+ } -+ read_pos = *n - nchars_avail + *lineptr; -+ assert((*lineptr + *n) == (read_pos + nchars_avail)); -+ } -+ -+ if (ferror (stream)) -+ { -+ /* Might like to return partial line, but there is no -+ place for us to store errno. And we don't want to just -+ lose errno. */ -+ errno = save_errno; -+ return -1; -+ } -+ -+ if (c == EOF) -+ { -+ /* Return partial line, if any. */ -+ if (read_pos == *lineptr) -+ return -1; -+ else -+ break; -+ } -+ -+ *read_pos++ = c; -+ nchars_avail--; -+ -+ if (c == terminator) -+ /* Return the line. */ -+ break; -+ } -+ -+ /* Done - NUL terminate and return the number of chars read. */ -+ *read_pos = '\0'; -+ -+ ret = read_pos - (*lineptr + offset); -+ return ret; -+} -+ -+int -+getline (lineptr, n, stream) -+ char **lineptr; -+ size_t *n; -+ FILE *stream; -+{ -+ return getstr (lineptr, n, stream, '\n', 0, GETLINE_NO_LIMIT); -+} -+ -+/* getline.c */ -+#endif /* __FreeBSD_version */ -+#endif /* defined(__FreeBSD__) */ -+ - # include <pthread.h> - # include <string.h> - # include "log_window.h" diff --git a/multimedia/gxine/files/patch-src_desktop__integration.c b/multimedia/gxine/files/patch-src_desktop__integration.c deleted file mode 100644 index 1f370888f8e9..000000000000 --- a/multimedia/gxine/files/patch-src_desktop__integration.c +++ /dev/null @@ -1,20 +0,0 @@ ---- src/desktop_integration.c.orig 2017-12-27 17:41:32 UTC -+++ src/desktop_integration.c -@@ -120,6 +120,9 @@ static void *get_func (const char *name) - - gboolean gxine_vfs_init (void) - { -+#ifndef USE_INTEGRATION_WIZARD -+ return gnome_vfs_available = 0; -+#else - void (*init_func) (void) = NULL; - - if (gnome_vfs_available != -1) -@@ -170,6 +173,7 @@ gboolean gxine_vfs_init (void) - #endif - - return gnome_vfs_available = 1; -+#endif - } - - /* diff --git a/multimedia/gxine/pkg-descr b/multimedia/gxine/pkg-descr deleted file mode 100644 index 47ea4d14b8e3..000000000000 --- a/multimedia/gxine/pkg-descr +++ /dev/null @@ -1,4 +0,0 @@ -gxine is a simple but effective GUI for the Xine media player. -It uses the GTK toolkit, so it nicely fits in into a GNOME desktop. - -WWW: http://www.xine-project.org diff --git a/multimedia/gxine/pkg-plist b/multimedia/gxine/pkg-plist deleted file mode 100644 index 3091114404cf..000000000000 --- a/multimedia/gxine/pkg-plist +++ /dev/null @@ -1,57 +0,0 @@ -bin/gxine -bin/gxine_client -%%ETCDIR%%/gtk.css -%%ETCDIR%%/gtkrc -%%ETCDIR%%/keypad.xml -%%ETCDIR%%/startup -%%ETCDIR%%/toolbar-fullscreen.xml -%%ETCDIR%%/toolbar-window.xml -%%WEBPLUGIN%%%%WEBPLUGIN_DIR%%/gxineplugin.so -man/de/man1/gxine.1.gz -man/de/man1/gxine_client.1.gz -man/es/man1/gxine.1.gz -man/es/man1/gxine_client.1.gz -man/man1/gxine.1.gz -man/man1/gxine_client.1.gz -share/applications/gxine.desktop -%%DATADIR%%/logo.jpg -%%DATADIR%%/mediamarks -%%DATADIR%%/pixmaps/gxine-icon.xpm -%%DATADIR%%/pixmaps/nospeaker.png -%%DATADIR%%/pixmaps/set-brightness.svg -%%DATADIR%%/pixmaps/set-channel.svg -%%DATADIR%%/pixmaps/set-contrast.svg -%%DATADIR%%/pixmaps/set-hue.svg -%%DATADIR%%/pixmaps/set-saturation.svg -%%DATADIR%%/pixmaps/set-sharpness.svg -%%DATADIR%%/pixmaps/set-sync.svg -%%DATADIR%%/pixmaps/set-volume.svg -%%DATADIR%%/pixmaps/speaker.png -%%DATADIR%%/pixmaps/splash.png -%%DATADIR%%/pixmaps/subtitle.svg -share/icons/hicolor/64x64/apps/gxine.png -%%NLS%%share/locale/cs/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/cs/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/de/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/de/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/es/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/es/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/fi/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/fi/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/fr/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/fr/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/it/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/it/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/ja/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/ja/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/pl/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/pl/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/ru/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/ru/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/sv/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/sv/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/uk/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/uk/LC_MESSAGES/gxine.theme.mo -%%NLS%%share/locale/zh_CN/LC_MESSAGES/gxine.mo -%%NLS%%share/locale/zh_CN/LC_MESSAGES/gxine.theme.mo -share/pixmaps/gxine.png |