/[jscoverage]/trunk/js/jsscope.h
ViewVC logotype

Diff of /trunk/js/jsscope.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 399 by siliconforks, Tue Dec 9 03:37:47 2008 UTC revision 460 by siliconforks, Sat Sep 26 23:15:22 2009 UTC
# Line 201  Line 201 
201      JSTitle         title;              /* lock state */      JSTitle         title;              /* lock state */
202  #endif  #endif
203      JSObject        *object;            /* object that owns this scope */      JSObject        *object;            /* object that owns this scope */
204        jsrefcount      nrefs;              /* count of all referencing objects */
205        uint32          freeslot;           /* index of next free slot in object */
206      uint32          shape;              /* property cache shape identifier */      uint32          shape;              /* property cache shape identifier */
207      uint8           flags;              /* flags, see below */      uint8           flags;              /* flags, see below */
208      int8            hashShift;          /* multiplicative hash shift */      int8            hashShift;          /* multiplicative hash shift */
# Line 211  Line 213 
213      JSScopeProperty *lastProp;          /* pointer to last property added */      JSScopeProperty *lastProp;          /* pointer to last property added */
214  };  };
215    
 #ifdef JS_THREADSAFE  
 JS_STATIC_ASSERT(offsetof(JSScope, title) == sizeof(JSObjectMap));  
 #endif  
   
216  #define JS_IS_SCOPE_LOCKED(cx, scope)   JS_IS_TITLE_LOCKED(cx, &(scope)->title)  #define JS_IS_SCOPE_LOCKED(cx, scope)   JS_IS_TITLE_LOCKED(cx, &(scope)->title)
217    
218  #define OBJ_SCOPE(obj)                  ((JSScope *)(obj)->map)  #define OBJ_SCOPE(obj)                  (JS_ASSERT(OBJ_IS_NATIVE(obj)),       \
219                                             (JSScope *) (obj)->map)
220  #define OBJ_SHAPE(obj)                  (OBJ_SCOPE(obj)->shape)  #define OBJ_SHAPE(obj)                  (OBJ_SCOPE(obj)->shape)
221    
 #define SCOPE_MAKE_UNIQUE_SHAPE(cx,scope)                                     \  
     ((scope)->shape = js_GenerateShape((cx), JS_FALSE, NULL))  
   
 #define SCOPE_EXTEND_SHAPE(cx,scope,sprop)                                    \  
     JS_BEGIN_MACRO                                                            \  
         if (!(scope)->lastProp ||                                             \  
             (scope)->shape == (scope)->lastProp->shape) {                     \  
             (scope)->shape = (sprop)->shape;                                  \  
         } else {                                                              \  
             (scope)->shape = js_GenerateShape((cx), JS_FALSE, sprop);         \  
         }                                                                     \  
     JS_END_MACRO  
   
222  /* By definition, hashShift = JS_DHASH_BITS - log2(capacity). */  /* By definition, hashShift = JS_DHASH_BITS - log2(capacity). */
223  #define SCOPE_CAPACITY(scope)           JS_BIT(JS_DHASH_BITS-(scope)->hashShift)  #define SCOPE_CAPACITY(scope)           JS_BIT(JS_DHASH_BITS-(scope)->hashShift)
224    
# Line 240  Line 226 
226  #define SCOPE_MIDDLE_DELETE             0x0001  #define SCOPE_MIDDLE_DELETE             0x0001
227  #define SCOPE_SEALED                    0x0002  #define SCOPE_SEALED                    0x0002
228  #define SCOPE_BRANDED                   0x0004  #define SCOPE_BRANDED                   0x0004
229    #define SCOPE_INDEXED_PROPERTIES        0x0008
230    
231  #define SCOPE_HAD_MIDDLE_DELETE(scope)  ((scope)->flags & SCOPE_MIDDLE_DELETE)  #define SCOPE_HAD_MIDDLE_DELETE(scope)  ((scope)->flags & SCOPE_MIDDLE_DELETE)
232  #define SCOPE_SET_MIDDLE_DELETE(scope)  ((scope)->flags |= SCOPE_MIDDLE_DELETE)  #define SCOPE_SET_MIDDLE_DELETE(scope)  ((scope)->flags |= SCOPE_MIDDLE_DELETE)
233  #define SCOPE_CLR_MIDDLE_DELETE(scope)  ((scope)->flags &= ~SCOPE_MIDDLE_DELETE)  #define SCOPE_CLR_MIDDLE_DELETE(scope)  ((scope)->flags &= ~SCOPE_MIDDLE_DELETE)
234    #define SCOPE_HAS_INDEXED_PROPERTIES(scope)  ((scope)->flags & SCOPE_INDEXED_PROPERTIES)
235    #define SCOPE_SET_INDEXED_PROPERTIES(scope)  ((scope)->flags |= SCOPE_INDEXED_PROPERTIES)
236    
237  #define SCOPE_IS_SEALED(scope)          ((scope)->flags & SCOPE_SEALED)  #define SCOPE_IS_SEALED(scope)          ((scope)->flags & SCOPE_SEALED)
238  #define SCOPE_SET_SEALED(scope)         ((scope)->flags |= SCOPE_SEALED)  #define SCOPE_SET_SEALED(scope)         ((scope)->flags |= SCOPE_SEALED)
# Line 271  Line 260 
260  #define SCOPE_LAST_PROP(scope)          ((scope)->lastProp)  #define SCOPE_LAST_PROP(scope)          ((scope)->lastProp)
261  #define SCOPE_REMOVE_LAST_PROP(scope)   ((scope)->lastProp =                  \  #define SCOPE_REMOVE_LAST_PROP(scope)   ((scope)->lastProp =                  \
262                                           (scope)->lastProp->parent)                                           (scope)->lastProp->parent)
263    /*
264     * Helpers for reinterpreting JSPropertyOp as JSObject* for scripted getters
265     * and setters.
266     */
267    static inline JSObject *
268    js_CastAsObject(JSPropertyOp op)
269    {
270        return JS_FUNC_TO_DATA_PTR(JSObject *, op);
271    }
272    
273    static inline jsval
274    js_CastAsObjectJSVal(JSPropertyOp op)
275    {
276        return OBJECT_TO_JSVAL(JS_FUNC_TO_DATA_PTR(JSObject *, op));
277    }
278    
279    static inline JSPropertyOp
280    js_CastAsPropertyOp(JSObject *object)
281    {
282        return JS_DATA_TO_FUNC_PTR(JSPropertyOp, object);
283    }
284    
285  struct JSScopeProperty {  struct JSScopeProperty {
286      jsid            id;                 /* int-tagged jsval/untagged JSAtom* */      jsid            id;                 /* int-tagged jsval/untagged JSAtom* */
# Line 322  Line 332 
332    
333  #define SPROP_INVALID_SLOT              0xffffffff  #define SPROP_INVALID_SLOT              0xffffffff
334    
335  #define SLOT_IN_SCOPE(slot,scope)         ((slot) < (scope)->map.freeslot)  #define SLOT_IN_SCOPE(slot,scope)         ((slot) < (scope)->freeslot)
336  #define SPROP_HAS_VALID_SLOT(sprop,scope) SLOT_IN_SCOPE((sprop)->slot, scope)  #define SPROP_HAS_VALID_SLOT(sprop,scope) SLOT_IN_SCOPE((sprop)->slot, scope)
337    
338  #define SPROP_HAS_STUB_GETTER(sprop)    (!(sprop)->getter)  #define SPROP_HAS_STUB_GETTER(sprop)    (!(sprop)->getter)
339  #define SPROP_HAS_STUB_SETTER(sprop)    (!(sprop)->setter)  #define SPROP_HAS_STUB_SETTER(sprop)    (!(sprop)->setter)
340    
341  /*  static inline void
342   * NB: SPROP_GET must not be called if SPROP_HAS_STUB_GETTER(sprop).  js_MakeScopeShapeUnique(JSContext *cx, JSScope *scope)
343   */  {
344  #define SPROP_GET(cx,sprop,obj,obj2,vp)                                       \      js_LeaveTraceIfGlobalObject(cx, scope->object);
345      (((sprop)->attrs & JSPROP_GETTER)                                         \      scope->shape = js_GenerateShape(cx, JS_FALSE);
346       ? js_InternalGetOrSet(cx, obj, (sprop)->id,                              \  }
347                             OBJECT_TO_JSVAL((sprop)->getter), JSACC_READ,      \  
348                             0, 0, vp)                                          \  static inline void
349       : (sprop)->getter(cx, OBJ_THIS_OBJECT(cx,obj), SPROP_USERID(sprop), vp))  js_ExtendScopeShape(JSContext *cx, JSScope *scope, JSScopeProperty *sprop)
350    {
351        js_LeaveTraceIfGlobalObject(cx, scope->object);
352        if (!scope->lastProp ||
353            scope->shape == scope->lastProp->shape) {
354            scope->shape = sprop->shape;
355        } else {
356            scope->shape = js_GenerateShape(cx, JS_FALSE);
357        }
358    }
359    
360    static JS_INLINE JSBool
361    js_GetSprop(JSContext* cx, JSScopeProperty* sprop, JSObject* obj, jsval* vp)
362    {
363        JS_ASSERT(!SPROP_HAS_STUB_GETTER(sprop));
364        if (sprop->attrs & JSPROP_GETTER) {
365            jsval fval = js_CastAsObjectJSVal(sprop->getter);
366            return js_InternalGetOrSet(cx, obj, sprop->id, fval, JSACC_READ,
367                                       0, 0, vp);
368        }
369    
370        /*
371         * JSObjectOps is private, so we know there are only two implementations
372         * of the thisObject hook: with objects and XPConnect wrapped native
373         * objects.  XPConnect objects don't expect the hook to be called here,
374         * but with objects do.
375         */
376        if (STOBJ_GET_CLASS(obj) == &js_WithClass)
377            obj = obj->map->ops->thisObject(cx, obj);
378        return sprop->getter(cx, obj, SPROP_USERID(sprop), vp);
379    }
380    
381    static JS_INLINE JSBool
382    js_SetSprop(JSContext* cx, JSScopeProperty* sprop, JSObject* obj, jsval* vp)
383    {
384        JS_ASSERT(!(SPROP_HAS_STUB_SETTER(sprop) &&
385                    !(sprop->attrs & JSPROP_GETTER)));
386    
387        if (sprop->attrs & JSPROP_SETTER) {
388            jsval fval = js_CastAsObjectJSVal(sprop->setter);
389            return js_InternalGetOrSet(cx, obj, (sprop)->id, fval, JSACC_WRITE,
390                                       1, vp, vp);
391        }
392    
393        if (sprop->attrs & JSPROP_GETTER) {
394            js_ReportGetterOnlyAssignment(cx);
395            return JS_FALSE;
396        }
397    
398        /* See the comment in js_GetSprop as to why we can check for 'with'. */
399        if (STOBJ_GET_CLASS(obj) == &js_WithClass)
400            obj = obj->map->ops->thisObject(cx, obj);
401        return sprop->setter(cx, obj, SPROP_USERID(sprop), vp);
402    }
403    
404  /*  /*
405   * NB: SPROP_SET must not be called if (SPROP_HAS_STUB_SETTER(sprop) &&   * NB: SPROP_SET must not be called if (SPROP_HAS_STUB_SETTER(sprop) &&
# Line 345  Line 408 
408  #define SPROP_SET(cx,sprop,obj,obj2,vp)                                       \  #define SPROP_SET(cx,sprop,obj,obj2,vp)                                       \
409      (((sprop)->attrs & JSPROP_SETTER)                                         \      (((sprop)->attrs & JSPROP_SETTER)                                         \
410       ? js_InternalGetOrSet(cx, obj, (sprop)->id,                              \       ? js_InternalGetOrSet(cx, obj, (sprop)->id,                              \
411                             OBJECT_TO_JSVAL((sprop)->setter), JSACC_WRITE,     \                             OBJECT_TO_JSVAL((JSObject *) (sprop)->setter),     \
412                             1, vp, vp)                                         \                             JSACC_WRITE, 1, vp, vp)                            \
413       : ((sprop)->attrs & JSPROP_GETTER)                                       \       : ((sprop)->attrs & JSPROP_GETTER)                                       \
414       ? (JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,                    \       ? (JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,                    \
415                               JSMSG_GETTER_ONLY, NULL), JS_FALSE)              \                               JSMSG_GETTER_ONLY, NULL), JS_FALSE)              \
416       : (sprop)->setter(cx, OBJ_THIS_OBJECT(cx,obj), SPROP_USERID(sprop), vp))       : (sprop)->setter(cx, obj, SPROP_USERID(sprop), vp))
417    
418  /* Macro for common expression to test for shared permanent attributes. */  /* Macro for common expression to test for shared permanent attributes. */
419  #define SPROP_IS_SHARED_PERMANENT(sprop)                                      \  #define SPROP_IS_SHARED_PERMANENT(sprop)                                      \
# Line 360  Line 423 
423  js_GetMutableScope(JSContext *cx, JSObject *obj);  js_GetMutableScope(JSContext *cx, JSObject *obj);
424    
425  extern JSScope *  extern JSScope *
426  js_NewScope(JSContext *cx, jsrefcount nrefs, JSObjectOps *ops, JSClass *clasp,  js_NewScope(JSContext *cx, JSObjectOps *ops, JSClass *clasp, JSObject *obj);
             JSObject *obj);  
427    
428  extern void  extern void
429  js_DestroyScope(JSContext *cx, JSScope *scope);  js_DestroyScope(JSContext *cx, JSScope *scope);
430    
431    extern void
432    js_HoldScope(JSScope *scope);
433    
434    extern JSBool
435    js_DropScope(JSContext *cx, JSScope *scope, JSObject *obj);
436    
437  extern JS_FRIEND_API(JSScopeProperty **)  extern JS_FRIEND_API(JSScopeProperty **)
438  js_SearchScope(JSScope *scope, jsid id, JSBool adding);  js_SearchScope(JSScope *scope, jsid id, JSBool adding);
439    

Legend:
Removed from v.399  
changed lines
  Added in v.460

  ViewVC Help
Powered by ViewVC 1.1.24