diff options
Diffstat (limited to 'js/src/jit/CalleeToken.h')
-rw-r--r-- | js/src/jit/CalleeToken.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/js/src/jit/CalleeToken.h b/js/src/jit/CalleeToken.h new file mode 100644 index 0000000000..b2944108a5 --- /dev/null +++ b/js/src/jit/CalleeToken.h @@ -0,0 +1,66 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef jit_CalleeToken_h +#define jit_CalleeToken_h + +#include "mozilla/Assertions.h" + +#include <stdint.h> + +#include "js/TypeDecls.h" + +class JS_PUBLIC_API JSTracer; + +namespace js::jit { + +using CalleeToken = void*; + +enum CalleeTokenTag { + CalleeToken_Function = 0x0, // untagged + CalleeToken_FunctionConstructing = 0x1, + CalleeToken_Script = 0x2 +}; + +// Any CalleeToken with this bit set must be CalleeToken_Script. +static const uintptr_t CalleeTokenScriptBit = CalleeToken_Script; + +static const uintptr_t CalleeTokenMask = ~uintptr_t(0x3); + +static inline CalleeTokenTag GetCalleeTokenTag(CalleeToken token) { + CalleeTokenTag tag = CalleeTokenTag(uintptr_t(token) & 0x3); + MOZ_ASSERT(tag <= CalleeToken_Script); + return tag; +} +static inline CalleeToken CalleeToToken(JSFunction* fun, bool constructing) { + CalleeTokenTag tag = + constructing ? CalleeToken_FunctionConstructing : CalleeToken_Function; + return CalleeToken(uintptr_t(fun) | uintptr_t(tag)); +} +static inline CalleeToken CalleeToToken(JSScript* script) { + return CalleeToken(uintptr_t(script) | uintptr_t(CalleeToken_Script)); +} +static inline bool CalleeTokenIsFunction(CalleeToken token) { + CalleeTokenTag tag = GetCalleeTokenTag(token); + return tag == CalleeToken_Function || tag == CalleeToken_FunctionConstructing; +} +static inline bool CalleeTokenIsConstructing(CalleeToken token) { + return GetCalleeTokenTag(token) == CalleeToken_FunctionConstructing; +} +static inline JSFunction* CalleeTokenToFunction(CalleeToken token) { + MOZ_ASSERT(CalleeTokenIsFunction(token)); + return (JSFunction*)(uintptr_t(token) & CalleeTokenMask); +} +static inline JSScript* CalleeTokenToScript(CalleeToken token) { + MOZ_ASSERT(GetCalleeTokenTag(token) == CalleeToken_Script); + return (JSScript*)(uintptr_t(token) & CalleeTokenMask); +} + +CalleeToken TraceCalleeToken(JSTracer* trc, CalleeToken token); + +} /* namespace js::jit */ + +#endif /* jit_CalleeToken_h */ |