📄 jsinterp.h
字号:
JSPropertyCacheEntry table[PROPERTY_CACHE_SIZE]; JSBool empty; JSBool disabled;#ifdef JS_PROPERTY_CACHE_METERING uint32 fills; uint32 recycles; uint32 tests; uint32 misses; uint32 flushes;# define PCMETER(x) x#else# define PCMETER(x) /* nothing */#endif} JSPropertyCache;#define PROPERTY_CACHE_FILL(cache, obj, id, sprop) \ JS_BEGIN_MACRO \ JSPropertyCache *cache_ = (cache); \ if (!cache_->disabled) { \ uintN hashIndex_ = (uintN) PROPERTY_CACHE_HASH(obj, id); \ JSPropertyCacheEntry *pce_ = &cache_->table[hashIndex_]; \ JSPropertyCacheEntry entry_; \ JSScopeProperty *pce_sprop_; \ PCE_LOAD(cache_, pce_, entry_); \ pce_sprop_ = PCE_PROPERTY(entry_); \ PCMETER(if (pce_sprop_ && pce_sprop_ != sprop) \ cache_->recycles++); \ PCE_OBJECT(entry_) = obj; \ PCE_PROPERTY(entry_) = sprop; \ cache_->empty = JS_FALSE; \ PCMETER(cache_->fills++); \ PCE_STORE(cache_, pce_, entry_); \ } \ JS_END_MACRO#define PROPERTY_CACHE_TEST(cache, obj, id, sprop) \ JS_BEGIN_MACRO \ uintN hashIndex_ = (uintN) PROPERTY_CACHE_HASH(obj, id); \ JSPropertyCache *cache_ = (cache); \ JSPropertyCacheEntry *pce_ = &cache_->table[hashIndex_]; \ JSPropertyCacheEntry entry_; \ JSScopeProperty *pce_sprop_; \ PCE_LOAD(cache_, pce_, entry_); \ pce_sprop_ = PCE_PROPERTY(entry_); \ PCMETER(cache_->tests++); \ if (pce_sprop_ && \ PCE_OBJECT(entry_) == obj && \ pce_sprop_->id == id) { \ sprop = pce_sprop_; \ } else { \ PCMETER(cache_->misses++); \ sprop = NULL; \ } \ JS_END_MACROextern voidjs_FlushPropertyCache(JSContext *cx);extern voidjs_DisablePropertyCache(JSContext *cx);extern voidjs_EnablePropertyCache(JSContext *cx);extern JS_FRIEND_API(jsval *)js_AllocStack(JSContext *cx, uintN nslots, void **markp);extern JS_FRIEND_API(void)js_FreeStack(JSContext *cx, void *mark);extern JSBooljs_GetArgument(JSContext *cx, JSObject *obj, jsval id, jsval *vp);extern JSBooljs_SetArgument(JSContext *cx, JSObject *obj, jsval id, jsval *vp);extern JSBooljs_GetLocalVariable(JSContext *cx, JSObject *obj, jsval id, jsval *vp);extern JSBooljs_SetLocalVariable(JSContext *cx, JSObject *obj, jsval id, jsval *vp);#ifdef DUMP_CALL_TABLE# define JSOPTION_LOGCALL_TOSOURCE JS_BIT(15)extern JSHashTable *js_CallTable;extern size_t js_LogCallToSourceLimit;extern void js_DumpCallTable(JSContext *cx);#endif/* * Refresh and return fp->scopeChain. It may be stale if block scopes are * active but not yet reflected by objects in the scope chain. If a block * scope contains a with, eval, XML filtering predicate, or similar such * dynamically scoped construct, then compile-time block scope at fp->blocks * must reflect at runtime. */extern JSObject *js_GetScopeChain(JSContext *cx, JSStackFrame *fp);/* * Compute the 'this' parameter for a call with nominal 'this' given by thisp * and arguments including argv[-1] (nominal 'this') and argv[-2] (callee). * Activation objects ("Call" objects not created with "new Call()", i.e., * "Call" objects that have private data) may not be referred to by 'this', * per ECMA-262, so js_ComputeThis censors them. */extern JSObject *js_ComputeThis(JSContext *cx, JSObject *thisp, jsval *argv);/* * NB: js_Invoke requires that cx is currently running JS (i.e., that cx->fp * is non-null), and that the callee, |this| parameter, and actual arguments * are already pushed on the stack under cx->fp->sp. */extern JS_FRIEND_API(JSBool)js_Invoke(JSContext *cx, uintN argc, uintN flags);/* * Consolidated js_Invoke flags simply rename certain JSFRAME_* flags, so that * we can share bits stored in JSStackFrame.flags and passed to: * * js_Invoke * js_InternalInvoke * js_ValueToFunction * js_ValueToFunctionObject * js_ValueToCallableObject * js_ReportIsNotFunction * * See jsfun.h for the latter four and flag renaming macros. */#define JSINVOKE_CONSTRUCT JSFRAME_CONSTRUCTING#define JSINVOKE_INTERNAL JSFRAME_INTERNAL#define JSINVOKE_SKIP_CALLER JSFRAME_SKIP_CALLER#define JSINVOKE_ITERATOR JSFRAME_ITERATOR/* * Mask to isolate construct and iterator flags for use with jsfun.h functions. */#define JSINVOKE_FUNFLAGS (JSINVOKE_CONSTRUCT | JSINVOKE_ITERATOR)/* * "Internal" calls may come from C or C++ code using a JSContext on which no * JS is running (!cx->fp), so they may need to push a dummy JSStackFrame. */#define js_InternalCall(cx,obj,fval,argc,argv,rval) \ js_InternalInvoke(cx, obj, fval, 0, argc, argv, rval)#define js_InternalConstruct(cx,obj,fval,argc,argv,rval) \ js_InternalInvoke(cx, obj, fval, JSINVOKE_CONSTRUCT, argc, argv, rval)extern JSBooljs_InternalInvoke(JSContext *cx, JSObject *obj, jsval fval, uintN flags, uintN argc, jsval *argv, jsval *rval);extern JSBooljs_InternalGetOrSet(JSContext *cx, JSObject *obj, jsid id, jsval fval, JSAccessMode mode, uintN argc, jsval *argv, jsval *rval);extern JSBooljs_Execute(JSContext *cx, JSObject *chain, JSScript *script, JSStackFrame *down, uintN flags, jsval *result);extern JSBooljs_CheckRedeclaration(JSContext *cx, JSObject *obj, jsid id, uintN attrs, JSObject **objp, JSProperty **propp);extern JSBooljs_StrictlyEqual(jsval lval, jsval rval);extern JSBooljs_InvokeConstructor(JSContext *cx, jsval *vp, uintN argc);extern JSBooljs_Interpret(JSContext *cx, jsbytecode *pc, jsval *result);JS_END_EXTERN_C#endif /* jsinterp_h___ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -