mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 11:55:49 +00:00
Factor jsscopeinlines.h out, clean up #include order (524267, r=gal/jorendorff).
This commit is contained in:
parent
81917d747d
commit
8d0c82da47
@ -86,6 +86,9 @@
|
||||
#include "jsstaticcheck.h"
|
||||
#include "jsvector.h"
|
||||
|
||||
#include "jsatominlines.h"
|
||||
#include "jsscopeinlines.h"
|
||||
|
||||
#if JS_HAS_FILE_OBJECT
|
||||
#include "jsfile.h"
|
||||
#endif
|
||||
@ -94,8 +97,6 @@
|
||||
#include "jsxml.h"
|
||||
#endif
|
||||
|
||||
#include "jsatominlines.h"
|
||||
|
||||
#ifdef HAVE_VA_LIST_AS_ARRAY
|
||||
#define JS_ADDRESSOF_VA_LIST(ap) ((va_list *)(ap))
|
||||
#else
|
||||
|
@ -37,8 +37,8 @@
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef jsatom_inlines_h___
|
||||
#define jsatom_inlines_h___
|
||||
#ifndef jsatominlines_h___
|
||||
#define jsatominlines_h___
|
||||
|
||||
#include "jsatom.h"
|
||||
#include "jsnum.h"
|
||||
@ -92,4 +92,4 @@ js_Int32ToId(JSContext* cx, int32 index, jsid* id)
|
||||
return js_ValueToStringId(cx, STRING_TO_JSVAL(str), id);
|
||||
}
|
||||
|
||||
#endif /* jsatom_inlines_h___ */
|
||||
#endif /* jsatominlines_h___ */
|
||||
|
@ -61,6 +61,7 @@
|
||||
#include "jsvector.h"
|
||||
|
||||
#include "jsatominlines.h"
|
||||
#include "jsscopeinlines.h"
|
||||
|
||||
using namespace avmplus;
|
||||
using namespace nanojit;
|
||||
|
@ -73,6 +73,10 @@
|
||||
#include "jstracer.h"
|
||||
#include "jslibmath.h"
|
||||
#include "jsvector.h"
|
||||
|
||||
#include "jsatominlines.h"
|
||||
#include "jsscopeinlines.h"
|
||||
#include "jsscriptinlines.h"
|
||||
#include "jsstrinlines.h"
|
||||
|
||||
#ifdef INCLUDE_MOZILLA_DTRACE
|
||||
@ -83,9 +87,6 @@
|
||||
#include "jsxml.h"
|
||||
#endif
|
||||
|
||||
#include "jsatominlines.h"
|
||||
#include "jsscriptinlines.h"
|
||||
|
||||
#include "jsautooplen.h"
|
||||
|
||||
/* jsinvoke_cpp___ indicates inclusion from jsinvoke.cpp. */
|
||||
|
@ -71,13 +71,15 @@
|
||||
#include "jsparse.h"
|
||||
#include "jsscope.h"
|
||||
#include "jsscript.h"
|
||||
#include "jsscriptinlines.h"
|
||||
#include "jsstaticcheck.h"
|
||||
#include "jsstdint.h"
|
||||
#include "jsstr.h"
|
||||
#include "jstracer.h"
|
||||
#include "jsdbgapi.h"
|
||||
|
||||
#include "jsscopeinlines.h"
|
||||
#include "jsscriptinlines.h"
|
||||
|
||||
#if JS_HAS_GENERATORS
|
||||
#include "jsiter.h"
|
||||
#endif
|
||||
|
@ -61,6 +61,8 @@
|
||||
#include "jsstr.h"
|
||||
#include "jstracer.h"
|
||||
|
||||
#include "jsscopeinlines.h"
|
||||
|
||||
uint32
|
||||
js_GenerateShape(JSContext *cx, bool gcLocked)
|
||||
{
|
||||
|
120
js/src/jsscope.h
120
js/src/jsscope.h
@ -45,7 +45,6 @@
|
||||
*/
|
||||
#include "jstypes.h"
|
||||
#include "jslock.h"
|
||||
#include "jsfun.h"
|
||||
#include "jsobj.h"
|
||||
#include "jsprvtd.h"
|
||||
#include "jspubtd.h"
|
||||
@ -291,7 +290,7 @@ struct JSScope : public JSObjectMap
|
||||
* Read barrier to clone a joined function object stored as a method.
|
||||
* Defined inline further below.
|
||||
*/
|
||||
inline bool methodReadBarrier(JSContext *cx, JSScopeProperty *sprop, jsval *vp);
|
||||
bool methodReadBarrier(JSContext *cx, JSScopeProperty *sprop, jsval *vp);
|
||||
|
||||
/*
|
||||
* Write barrier to check for a method value change. Defined inline below
|
||||
@ -300,8 +299,8 @@ struct JSScope : public JSObjectMap
|
||||
* flags show this is necessary. The methodShapeChange overload (directly
|
||||
* below) parallels this.
|
||||
*/
|
||||
inline bool methodWriteBarrier(JSContext *cx, JSScopeProperty *sprop, jsval v);
|
||||
inline bool methodWriteBarrier(JSContext *cx, uint32 slot, jsval v);
|
||||
bool methodWriteBarrier(JSContext *cx, JSScopeProperty *sprop, jsval v);
|
||||
bool methodWriteBarrier(JSContext *cx, uint32 slot, jsval v);
|
||||
|
||||
void trace(JSTracer *trc);
|
||||
|
||||
@ -651,119 +650,6 @@ JSScope::drop(JSContext *cx, JSObject *obj)
|
||||
return true;
|
||||
}
|
||||
|
||||
inline void
|
||||
JSScope::extend(JSContext *cx, JSScopeProperty *sprop)
|
||||
{
|
||||
js_LeaveTraceIfGlobalObject(cx, object);
|
||||
shape = (!lastProp || shape == lastProp->shape)
|
||||
? sprop->shape
|
||||
: js_GenerateShape(cx, false);
|
||||
++entryCount;
|
||||
lastProp = sprop;
|
||||
|
||||
jsuint index;
|
||||
if (js_IdIsIndex(sprop->id, &index))
|
||||
setIndexedProperties();
|
||||
|
||||
if (sprop->isMethod())
|
||||
setMethodBarrier();
|
||||
}
|
||||
|
||||
/*
|
||||
* Property read barrier for deferred cloning of compiler-created function
|
||||
* objects optimized as typically non-escaping, ad-hoc methods in obj.
|
||||
*/
|
||||
inline bool
|
||||
JSScope::methodReadBarrier(JSContext *cx, JSScopeProperty *sprop, jsval *vp)
|
||||
{
|
||||
JS_ASSERT(hasMethodBarrier());
|
||||
JS_ASSERT(has(sprop));
|
||||
JS_ASSERT(sprop->isMethod());
|
||||
JS_ASSERT(sprop->methodValue() == *vp);
|
||||
JS_ASSERT(object->getClass() == &js_ObjectClass);
|
||||
|
||||
JSObject *funobj = JSVAL_TO_OBJECT(*vp);
|
||||
JSFunction *fun = GET_FUNCTION_PRIVATE(cx, funobj);
|
||||
JS_ASSERT(FUN_OBJECT(fun) == funobj && FUN_NULL_CLOSURE(fun));
|
||||
|
||||
funobj = js_CloneFunctionObject(cx, fun, OBJ_GET_PARENT(cx, funobj));
|
||||
if (!funobj)
|
||||
return false;
|
||||
*vp = OBJECT_TO_JSVAL(funobj);
|
||||
return js_SetPropertyHelper(cx, object, sprop->id, 0, vp);
|
||||
}
|
||||
|
||||
inline bool
|
||||
JSScope::methodWriteBarrier(JSContext *cx, JSScopeProperty *sprop, jsval v)
|
||||
{
|
||||
if (branded()) {
|
||||
jsval prev = LOCKED_OBJ_GET_SLOT(object, sprop->slot);
|
||||
|
||||
if (prev != v && VALUE_IS_FUNCTION(cx, prev))
|
||||
return methodShapeChange(cx, sprop, v);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool
|
||||
JSScope::methodWriteBarrier(JSContext *cx, uint32 slot, jsval v)
|
||||
{
|
||||
if (branded()) {
|
||||
jsval prev = LOCKED_OBJ_GET_SLOT(object, slot);
|
||||
|
||||
if (prev != v && VALUE_IS_FUNCTION(cx, prev))
|
||||
return methodShapeChange(cx, slot, v);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
inline void
|
||||
JSScope::trace(JSTracer *trc)
|
||||
{
|
||||
JSContext *cx = trc->context;
|
||||
JSScopeProperty *sprop = lastProp;
|
||||
uint8 regenFlag = cx->runtime->gcRegenShapesScopeFlag;
|
||||
if (IS_GC_MARKING_TRACER(trc) && cx->runtime->gcRegenShapes && hasRegenFlag(regenFlag)) {
|
||||
/*
|
||||
* Either this scope has its own shape, which must be regenerated, or
|
||||
* it must have the same shape as lastProp.
|
||||
*/
|
||||
uint32 newShape;
|
||||
|
||||
if (sprop) {
|
||||
if (!(sprop->flags & SPROP_FLAG_SHAPE_REGEN)) {
|
||||
sprop->shape = js_RegenerateShapeForGC(cx);
|
||||
sprop->flags |= SPROP_FLAG_SHAPE_REGEN;
|
||||
}
|
||||
newShape = sprop->shape;
|
||||
}
|
||||
if (!sprop || hasOwnShape()) {
|
||||
newShape = js_RegenerateShapeForGC(cx);
|
||||
JS_ASSERT_IF(sprop, newShape != sprop->shape);
|
||||
}
|
||||
shape = newShape;
|
||||
flags ^= JSScope::SHAPE_REGEN;
|
||||
|
||||
/* Also regenerate the shapes of empty scopes, in case they are not shared. */
|
||||
for (JSScope *empty = emptyScope;
|
||||
empty && empty->hasRegenFlag(regenFlag);
|
||||
empty = empty->emptyScope) {
|
||||
empty->shape = js_RegenerateShapeForGC(cx);
|
||||
empty->flags ^= JSScope::SHAPE_REGEN;
|
||||
}
|
||||
}
|
||||
if (sprop) {
|
||||
JS_ASSERT(has(sprop));
|
||||
|
||||
/* Trace scope's property tree ancestor line. */
|
||||
do {
|
||||
if (hadMiddleDelete() && !has(sprop))
|
||||
continue;
|
||||
sprop->trace(trc);
|
||||
} while ((sprop = sprop->parent) != NULL);
|
||||
}
|
||||
}
|
||||
|
||||
inline bool
|
||||
JSScopeProperty::get(JSContext* cx, JSObject* obj, JSObject *pobj, jsval* vp)
|
||||
{
|
||||
|
161
js/src/jsscopeinlines.h
Normal file
161
js/src/jsscopeinlines.h
Normal file
@ -0,0 +1,161 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
||||
*
|
||||
* ***** 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 Mozilla Communicator client code, released
|
||||
* March 31, 1998.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 1998
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
*
|
||||
* 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 jsscopeinlines_h___
|
||||
#define jsscopeinlines_h___
|
||||
|
||||
#include "jscntxt.h"
|
||||
#include "jsfun.h"
|
||||
#include "jsobj.h"
|
||||
#include "jsscope.h"
|
||||
|
||||
inline void
|
||||
JSScope::extend(JSContext *cx, JSScopeProperty *sprop)
|
||||
{
|
||||
js_LeaveTraceIfGlobalObject(cx, object);
|
||||
shape = (!lastProp || shape == lastProp->shape)
|
||||
? sprop->shape
|
||||
: js_GenerateShape(cx, false);
|
||||
++entryCount;
|
||||
lastProp = sprop;
|
||||
|
||||
jsuint index;
|
||||
if (js_IdIsIndex(sprop->id, &index))
|
||||
setIndexedProperties();
|
||||
|
||||
if (sprop->isMethod())
|
||||
setMethodBarrier();
|
||||
}
|
||||
|
||||
/*
|
||||
* Property read barrier for deferred cloning of compiler-created function
|
||||
* objects optimized as typically non-escaping, ad-hoc methods in obj.
|
||||
*/
|
||||
inline bool
|
||||
JSScope::methodReadBarrier(JSContext *cx, JSScopeProperty *sprop, jsval *vp)
|
||||
{
|
||||
JS_ASSERT(hasMethodBarrier());
|
||||
JS_ASSERT(has(sprop));
|
||||
JS_ASSERT(sprop->isMethod());
|
||||
JS_ASSERT(sprop->methodValue() == *vp);
|
||||
JS_ASSERT(object->getClass() == &js_ObjectClass);
|
||||
|
||||
JSObject *funobj = JSVAL_TO_OBJECT(*vp);
|
||||
JSFunction *fun = GET_FUNCTION_PRIVATE(cx, funobj);
|
||||
JS_ASSERT(FUN_OBJECT(fun) == funobj && FUN_NULL_CLOSURE(fun));
|
||||
|
||||
funobj = js_CloneFunctionObject(cx, fun, OBJ_GET_PARENT(cx, funobj));
|
||||
if (!funobj)
|
||||
return false;
|
||||
*vp = OBJECT_TO_JSVAL(funobj);
|
||||
return js_SetPropertyHelper(cx, object, sprop->id, 0, vp);
|
||||
}
|
||||
|
||||
inline bool
|
||||
JSScope::methodWriteBarrier(JSContext *cx, JSScopeProperty *sprop, jsval v)
|
||||
{
|
||||
if (branded()) {
|
||||
jsval prev = LOCKED_OBJ_GET_SLOT(object, sprop->slot);
|
||||
|
||||
if (prev != v && VALUE_IS_FUNCTION(cx, prev))
|
||||
return methodShapeChange(cx, sprop, v);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
inline bool
|
||||
JSScope::methodWriteBarrier(JSContext *cx, uint32 slot, jsval v)
|
||||
{
|
||||
if (branded()) {
|
||||
jsval prev = LOCKED_OBJ_GET_SLOT(object, slot);
|
||||
|
||||
if (prev != v && VALUE_IS_FUNCTION(cx, prev))
|
||||
return methodShapeChange(cx, slot, v);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
inline void
|
||||
JSScope::trace(JSTracer *trc)
|
||||
{
|
||||
JSContext *cx = trc->context;
|
||||
JSScopeProperty *sprop = lastProp;
|
||||
uint8 regenFlag = cx->runtime->gcRegenShapesScopeFlag;
|
||||
if (IS_GC_MARKING_TRACER(trc) && cx->runtime->gcRegenShapes && hasRegenFlag(regenFlag)) {
|
||||
/*
|
||||
* Either this scope has its own shape, which must be regenerated, or
|
||||
* it must have the same shape as lastProp.
|
||||
*/
|
||||
uint32 newShape;
|
||||
|
||||
if (sprop) {
|
||||
if (!(sprop->flags & SPROP_FLAG_SHAPE_REGEN)) {
|
||||
sprop->shape = js_RegenerateShapeForGC(cx);
|
||||
sprop->flags |= SPROP_FLAG_SHAPE_REGEN;
|
||||
}
|
||||
newShape = sprop->shape;
|
||||
}
|
||||
if (!sprop || hasOwnShape()) {
|
||||
newShape = js_RegenerateShapeForGC(cx);
|
||||
JS_ASSERT_IF(sprop, newShape != sprop->shape);
|
||||
}
|
||||
shape = newShape;
|
||||
flags ^= JSScope::SHAPE_REGEN;
|
||||
|
||||
/* Also regenerate the shapes of empty scopes, in case they are not shared. */
|
||||
for (JSScope *empty = emptyScope;
|
||||
empty && empty->hasRegenFlag(regenFlag);
|
||||
empty = empty->emptyScope) {
|
||||
empty->shape = js_RegenerateShapeForGC(cx);
|
||||
empty->flags ^= JSScope::SHAPE_REGEN;
|
||||
}
|
||||
}
|
||||
if (sprop) {
|
||||
JS_ASSERT(has(sprop));
|
||||
|
||||
/* Trace scope's property tree ancestor line. */
|
||||
do {
|
||||
if (hadMiddleDelete() && !has(sprop))
|
||||
continue;
|
||||
sprop->trace(trc);
|
||||
} while ((sprop = sprop->parent) != NULL);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* jsscopeinlines_h___ */
|
@ -37,8 +37,8 @@
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
#ifndef jsstr_inlines_h___
|
||||
#define jsstr_inlines_h___
|
||||
#ifndef jsstrinlines_h___
|
||||
#define jsstrinlines_h___
|
||||
|
||||
#include "jsstr.h"
|
||||
|
||||
@ -72,4 +72,4 @@ JSString::intString(jsint i)
|
||||
return &JSString::intStringTable[u];
|
||||
}
|
||||
|
||||
#endif /* jsstr_inlines_h___ */
|
||||
#endif /* jsstrinlines_h___ */
|
||||
|
@ -77,6 +77,7 @@
|
||||
#include "jsxml.h"
|
||||
|
||||
#include "jsatominlines.h"
|
||||
#include "jsscopeinlines.h"
|
||||
#include "jsscriptinlines.h"
|
||||
|
||||
#include "jsautooplen.h" // generated headers last
|
||||
|
Loading…
Reference in New Issue
Block a user