js/jsd/jsd_xpc.h

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/jsd/jsd_xpc.h	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,392 @@
     1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     1.5 + * vim: set ts=8 sts=4 et sw=4 tw=99:
     1.6 + * This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +#ifndef JSDSERVICE_H___
    1.11 +#define JSDSERVICE_H___
    1.12 +
    1.13 +#include "jsdIDebuggerService.h"
    1.14 +#include "jsdebug.h"
    1.15 +#include "nsString.h"
    1.16 +#include "nsCOMPtr.h"
    1.17 +#include "nspr.h"
    1.18 +#include "nsCycleCollectionParticipant.h"
    1.19 +#include "mozilla/Attributes.h"
    1.20 +
    1.21 +// #if defined(DEBUG_rginda_l)
    1.22 +// #   define DEBUG_verbose
    1.23 +// #endif
    1.24 +
    1.25 +struct LiveEphemeral {
    1.26 +    /* link in a chain of live values list */
    1.27 +    PRCList                  links;
    1.28 +    jsdIEphemeral           *value;
    1.29 +    void                    *key;
    1.30 +};
    1.31 +
    1.32 +struct PCMapEntry {
    1.33 +    uint32_t pc, line;
    1.34 +};
    1.35 +    
    1.36 +/*******************************************************************************
    1.37 + * reflected jsd data structures
    1.38 + *******************************************************************************/
    1.39 +
    1.40 +class jsdObject MOZ_FINAL : public jsdIObject
    1.41 +{
    1.42 +  public:
    1.43 +    NS_DECL_THREADSAFE_ISUPPORTS
    1.44 +    NS_DECL_JSDIOBJECT
    1.45 +
    1.46 +    /* you'll normally use use FromPtr() instead of directly constructing one */
    1.47 +    jsdObject (JSDContext *aCx, JSDObject *aObject) :
    1.48 +        mCx(aCx), mObject(aObject)
    1.49 +    {
    1.50 +    }
    1.51 +
    1.52 +    static jsdIObject *FromPtr (JSDContext *aCx,
    1.53 +                                JSDObject *aObject)
    1.54 +    {
    1.55 +        if (!aObject)
    1.56 +            return nullptr;
    1.57 +        
    1.58 +        jsdIObject *rv = new jsdObject (aCx, aObject);
    1.59 +        NS_IF_ADDREF(rv);
    1.60 +        return rv;
    1.61 +    }
    1.62 +
    1.63 +  private:
    1.64 +    jsdObject(); /* no implementation */
    1.65 +    jsdObject(const jsdObject&); /* no implementation */
    1.66 +
    1.67 +    JSDContext *mCx;
    1.68 +    JSDObject *mObject;
    1.69 +};
    1.70 +
    1.71 +
    1.72 +class jsdProperty : public jsdIProperty
    1.73 +{
    1.74 +  public:
    1.75 +    NS_DECL_THREADSAFE_ISUPPORTS
    1.76 +    NS_DECL_JSDIPROPERTY
    1.77 +    NS_DECL_JSDIEPHEMERAL
    1.78 +    
    1.79 +    jsdProperty (JSDContext *aCx, JSDProperty *aProperty);
    1.80 +    virtual ~jsdProperty ();
    1.81 +    
    1.82 +    static jsdIProperty *FromPtr (JSDContext *aCx,
    1.83 +                                  JSDProperty *aProperty)
    1.84 +    {
    1.85 +        if (!aProperty)
    1.86 +            return nullptr;
    1.87 +        
    1.88 +        jsdIProperty *rv = new jsdProperty (aCx, aProperty);
    1.89 +        NS_IF_ADDREF(rv);
    1.90 +        return rv;
    1.91 +    }
    1.92 +
    1.93 +    static void InvalidateAll();
    1.94 +
    1.95 +  private:
    1.96 +    jsdProperty(); /* no implementation */
    1.97 +    jsdProperty(const jsdProperty&); /* no implementation */
    1.98 +
    1.99 +    bool           mValid;
   1.100 +    LiveEphemeral  mLiveListEntry;
   1.101 +    JSDContext    *mCx;
   1.102 +    JSDProperty   *mProperty;
   1.103 +};
   1.104 +
   1.105 +class jsdScript : public jsdIScript
   1.106 +{
   1.107 +  public:
   1.108 +    NS_DECL_THREADSAFE_ISUPPORTS
   1.109 +    NS_DECL_JSDISCRIPT
   1.110 +    NS_DECL_JSDIEPHEMERAL
   1.111 +
   1.112 +    /* you'll normally use use FromPtr() instead of directly constructing one */
   1.113 +    jsdScript (JSDContext *aCx, JSDScript *aScript);
   1.114 +    virtual ~jsdScript();
   1.115 +    
   1.116 +    static jsdIScript *FromPtr (JSDContext *aCx, JSDScript *aScript)
   1.117 +    {
   1.118 +        if (!aScript)
   1.119 +            return nullptr;
   1.120 +
   1.121 +        void *data = JSD_GetScriptPrivate (aScript);
   1.122 +        jsdIScript *rv;
   1.123 +        
   1.124 +        if (data) {
   1.125 +            rv = static_cast<jsdIScript *>(data);
   1.126 +        } else {
   1.127 +            rv = new jsdScript (aCx, aScript);
   1.128 +            NS_IF_ADDREF(rv);  /* addref for the SetScriptPrivate, released in
   1.129 +                                * Invalidate() */
   1.130 +            JSD_SetScriptPrivate (aScript, static_cast<void *>(rv));
   1.131 +        }
   1.132 +        
   1.133 +        NS_IF_ADDREF(rv); /* addref for return value */
   1.134 +        return rv;
   1.135 +    }
   1.136 +
   1.137 +    static void InvalidateAll();
   1.138 +
   1.139 +  private:
   1.140 +    static uint32_t LastTag;
   1.141 +    
   1.142 +    jsdScript(); /* no implementation */
   1.143 +    jsdScript (const jsdScript&); /* no implementation */
   1.144 +    PCMapEntry* CreatePPLineMap();
   1.145 +    uint32_t    PPPcToLine(uint32_t aPC);
   1.146 +    uint32_t    PPLineToPc(uint32_t aLine);
   1.147 +    
   1.148 +    bool        mValid;
   1.149 +    uint32_t    mTag;
   1.150 +    JSDContext *mCx;
   1.151 +    JSDScript  *mScript;
   1.152 +    nsCString  *mFileName;
   1.153 +    nsCString  *mFunctionName;
   1.154 +    uint32_t    mBaseLineNumber, mLineExtent;
   1.155 +    PCMapEntry *mPPLineMap;
   1.156 +    uint32_t    mPCMapSize;
   1.157 +    uintptr_t   mFirstPC;
   1.158 +};
   1.159 +
   1.160 +uint32_t jsdScript::LastTag = 0;
   1.161 +
   1.162 +class jsdContext : public jsdIContext
   1.163 +{
   1.164 +  public:
   1.165 +    NS_DECL_THREADSAFE_ISUPPORTS
   1.166 +    NS_DECL_JSDICONTEXT
   1.167 +    NS_DECL_JSDIEPHEMERAL
   1.168 +
   1.169 +    jsdContext (JSDContext *aJSDCx, JSContext *aJSCx, nsISupports *aISCx);
   1.170 +    virtual ~jsdContext();
   1.171 +
   1.172 +    static void InvalidateAll();
   1.173 +    static jsdIContext *FromPtr (JSDContext *aJSDCx, JSContext *aJSCx);
   1.174 +  private:
   1.175 +    static uint32_t LastTag;
   1.176 +
   1.177 +    jsdContext (); /* no implementation */
   1.178 +    jsdContext (const jsdContext&); /* no implementation */
   1.179 +
   1.180 +    bool                   mValid;
   1.181 +    // The API exposed by JSD here is problematic, because it allows for per-
   1.182 +    // JSContext script disabling, which no longer exists in the platform.
   1.183 +    // The only consumer here in practice is Firebug, which makes sure to re-
   1.184 +    // enable any disabled script before navigation. But if some other consumer
   1.185 +    // were to disable script, navigate, and try to re-enable it, we'd end up
   1.186 +    // with an unmatched UnblockScript call, which violates platform invariants.
   1.187 +    // So we make a half-hearted attempt to detect this by storing the Window ID
   1.188 +    // of the scope for which we disabled script.
   1.189 +    uint64_t               mScriptDisabledForWindowWithID;
   1.190 +    bool IsScriptEnabled() { return !mScriptDisabledForWindowWithID; }
   1.191 +    LiveEphemeral          mLiveListEntry;
   1.192 +    uint32_t               mTag;
   1.193 +    JSDContext            *mJSDCx;
   1.194 +    JSContext             *mJSCx;
   1.195 +    nsCOMPtr<nsISupports>  mISCx;
   1.196 +};
   1.197 +
   1.198 +uint32_t jsdContext::LastTag = 0;
   1.199 +
   1.200 +class jsdStackFrame : public jsdIStackFrame
   1.201 +{
   1.202 +  public:
   1.203 +    NS_DECL_THREADSAFE_ISUPPORTS
   1.204 +    NS_DECL_JSDISTACKFRAME
   1.205 +    NS_DECL_JSDIEPHEMERAL
   1.206 +
   1.207 +    /* you'll normally use use FromPtr() instead of directly constructing one */
   1.208 +    jsdStackFrame (JSDContext *aCx, JSDThreadState *aThreadState,
   1.209 +                   JSDStackFrameInfo *aStackFrameInfo);
   1.210 +    virtual ~jsdStackFrame();
   1.211 +
   1.212 +    static void InvalidateAll();
   1.213 +    static jsdIStackFrame* FromPtr (JSDContext *aCx,
   1.214 +                                    JSDThreadState *aThreadState,
   1.215 +                                    JSDStackFrameInfo *aStackFrameInfo);
   1.216 +
   1.217 +  private:
   1.218 +    jsdStackFrame(); /* no implementation */
   1.219 +    jsdStackFrame(const jsdStackFrame&); /* no implementation */
   1.220 +
   1.221 +    bool               mValid;
   1.222 +    LiveEphemeral      mLiveListEntry;
   1.223 +    JSDContext        *mCx;
   1.224 +    JSDThreadState    *mThreadState;
   1.225 +    JSDStackFrameInfo *mStackFrameInfo;
   1.226 +};
   1.227 +
   1.228 +class jsdValue : public jsdIValue
   1.229 +{
   1.230 +  public:
   1.231 +    NS_DECL_THREADSAFE_ISUPPORTS
   1.232 +    NS_DECL_JSDIVALUE
   1.233 +    NS_DECL_JSDIEPHEMERAL
   1.234 +
   1.235 +    /* you'll normally use use FromPtr() instead of directly constructing one */
   1.236 +    jsdValue (JSDContext *aCx, JSDValue *aValue);
   1.237 +    virtual ~jsdValue();
   1.238 +
   1.239 +    static jsdIValue *FromPtr (JSDContext *aCx, JSDValue *aValue);    
   1.240 +    static void InvalidateAll();
   1.241 +    
   1.242 +  private:
   1.243 +    jsdValue(); /* no implementation */
   1.244 +    jsdValue (const jsdScript&); /* no implementation */
   1.245 +    
   1.246 +    bool           mValid;
   1.247 +    LiveEphemeral  mLiveListEntry;
   1.248 +    JSDContext    *mCx;
   1.249 +    JSDValue      *mValue;
   1.250 +};
   1.251 +
   1.252 +/******************************************************************************
   1.253 + * debugger service
   1.254 + ******************************************************************************/
   1.255 +
   1.256 +class jsdService : public jsdIDebuggerService
   1.257 +{
   1.258 +  public:
   1.259 +    NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   1.260 +    NS_DECL_JSDIDEBUGGERSERVICE
   1.261 +
   1.262 +    NS_DECL_CYCLE_COLLECTION_CLASS(jsdService)
   1.263 +
   1.264 +    jsdService() : mOn(false), mPauseLevel(0),
   1.265 +                   mNestedLoopLevel(0), mCx(0), mRuntime(0), mErrorHook(0),
   1.266 +                   mBreakpointHook(0), mDebugHook(0), mDebuggerHook(0),
   1.267 +                   mInterruptHook(0), mScriptHook(0), mThrowHook(0),
   1.268 +                   mTopLevelHook(0), mFunctionHook(0),
   1.269 +                   mWarnedAboutDeprecation(false),
   1.270 +                   mDeprecationAcknowledged(false)
   1.271 +    {
   1.272 +    }
   1.273 +
   1.274 +    virtual ~jsdService();
   1.275 +    
   1.276 +    static jsdService *GetService ();
   1.277 +
   1.278 +    bool CheckInterruptHook() { return !!mInterruptHook; }
   1.279 +    
   1.280 +    nsresult DoPause(uint32_t *_rval, bool internalCall);
   1.281 +    nsresult DoUnPause(uint32_t *_rval, bool internalCall);
   1.282 +
   1.283 +  private:
   1.284 +    bool        mOn;
   1.285 +    uint32_t    mPauseLevel;
   1.286 +    uint32_t    mNestedLoopLevel;
   1.287 +    JSDContext *mCx;
   1.288 +    JSRuntime  *mRuntime;
   1.289 +
   1.290 +    nsCOMPtr<jsdIErrorHook>     mErrorHook;
   1.291 +    nsCOMPtr<jsdIExecutionHook> mBreakpointHook;
   1.292 +    nsCOMPtr<jsdIExecutionHook> mDebugHook;
   1.293 +    nsCOMPtr<jsdIExecutionHook> mDebuggerHook;
   1.294 +    nsCOMPtr<jsdIExecutionHook> mInterruptHook;
   1.295 +    nsCOMPtr<jsdIScriptHook>    mScriptHook;
   1.296 +    nsCOMPtr<jsdIExecutionHook> mThrowHook;
   1.297 +    nsCOMPtr<jsdICallHook>      mTopLevelHook;
   1.298 +    nsCOMPtr<jsdICallHook>      mFunctionHook;
   1.299 +    nsCOMPtr<jsdIActivationCallback> mActivationCallback;
   1.300 +
   1.301 +    // True if we have ever printed a warning about JSD being deprecated.
   1.302 +    // We only ever print the warning once.
   1.303 +    bool mWarnedAboutDeprecation;
   1.304 +
   1.305 +    // True if the next call to asyncOn should not produce a warning,
   1.306 +    // because the consumer called jsdIDebuggerService::acknowledgeDeprecation.
   1.307 +    bool mDeprecationAcknowledged;
   1.308 +};
   1.309 +
   1.310 +#endif /* JSDSERVICE_H___ */
   1.311 +
   1.312 +
   1.313 +/* graveyard */
   1.314 +
   1.315 +#if 0
   1.316 +
   1.317 +class jsdContext : public jsdIContext
   1.318 +{
   1.319 +  public:
   1.320 +    NS_DECL_THREADSAFE_ISUPPORTS
   1.321 +    NS_DECL_JSDICONTEXT
   1.322 +
   1.323 +    /* you'll normally use use FromPtr() instead of directly constructing one */
   1.324 +    jsdContext (JSDContext *aCx) : mCx(aCx)
   1.325 +    {
   1.326 +        printf ("++++++ jsdContext\n");
   1.327 +    }
   1.328 +
   1.329 +    static jsdIContext *FromPtr (JSDContext *aCx)
   1.330 +    {
   1.331 +        if (!aCx)
   1.332 +            return nullptr;
   1.333 +        
   1.334 +        void *data = JSD_GetContextPrivate (aCx);
   1.335 +        jsdIContext *rv;
   1.336 +        
   1.337 +        if (data) {
   1.338 +            rv = static_cast<jsdIContext *>(data);
   1.339 +        } else {
   1.340 +            rv = new jsdContext (aCx);
   1.341 +            NS_IF_ADDREF(rv);  // addref for the SetContextPrivate
   1.342 +            JSD_SetContextPrivate (aCx, static_cast<void *>(rv));
   1.343 +        }
   1.344 +        
   1.345 +        NS_IF_ADDREF(rv); // addref for the return value
   1.346 +        return rv;
   1.347 +    }
   1.348 +
   1.349 +    virtual ~jsdContext() { printf ("------ ~jsdContext\n"); }
   1.350 +  private:            
   1.351 +    jsdContext(); /* no implementation */
   1.352 +    jsdContext(const jsdContext&); /* no implementation */
   1.353 +    
   1.354 +    JSDContext *mCx;
   1.355 +};
   1.356 +
   1.357 +class jsdThreadState : public jsdIThreadState
   1.358 +{
   1.359 +  public:
   1.360 +    NS_DECL_THREADSAFE_ISUPPORTS
   1.361 +    NS_DECL_JSDITHREADSTATE
   1.362 +
   1.363 +    /* you'll normally use use FromPtr() instead of directly constructing one */
   1.364 +    jsdThreadState (JSDContext *aCx, JSDThreadState *aThreadState) :
   1.365 +        mCx(aCx), mThreadState(aThreadState)
   1.366 +    {
   1.367 +    }
   1.368 +
   1.369 +    /* XXX These things are only valid for a short period of time, they reflect
   1.370 +     * state in the js engine that will go away after stepping past wherever
   1.371 +     * we were stopped at when this was created.  We could keep a list of every
   1.372 +     * instance of this we've created, and "invalidate" them before we let the
   1.373 +     * engine continue.  The next time we need a threadstate, we can search the
   1.374 +     * list to find an invalidated one, and just reuse it.
   1.375 +     */
   1.376 +    static jsdIThreadState *FromPtr (JSDContext *aCx,
   1.377 +                                     JSDThreadState *aThreadState)
   1.378 +    {
   1.379 +        if (!aThreadState)
   1.380 +            return nullptr;
   1.381 +        
   1.382 +        jsdIThreadState *rv = new jsdThreadState (aCx, aThreadState);
   1.383 +        NS_IF_ADDREF(rv);
   1.384 +        return rv;
   1.385 +    }
   1.386 +
   1.387 +  private:
   1.388 +    jsdThreadState(); /* no implementation */
   1.389 +    jsdThreadState(const jsdThreadState&); /* no implementation */
   1.390 +
   1.391 +    JSDContext     *mCx;
   1.392 +    JSDThreadState *mThreadState;
   1.393 +};
   1.394 +
   1.395 +#endif

mercurial