kjs Library API Documentation

scope_chain.cpp

00001 /* 00002 * This file is part of the KDE libraries 00003 * Copyright (C) 2003 Apple Computer, Inc. 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public License 00016 * along with this library; see the file COPYING.LIB. If not, write to 00017 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 * Boston, MA 02111-1307, USA. 00019 * 00020 */ 00021 00022 #include "scope_chain.h" 00023 00024 #include "object.h" 00025 00026 #include <assert.h> 00027 00028 namespace KJS { 00029 00030 inline void ScopeChain::ref() const 00031 { 00032 for (ScopeChainNode *n = _node; n; n = n->next) { 00033 if (n->refCount++ != 0) 00034 break; 00035 } 00036 } 00037 00038 ScopeChain &ScopeChain::operator=(const ScopeChain &c) 00039 { 00040 c.ref(); 00041 deref(); 00042 _node = c._node; 00043 return *this; 00044 } 00045 00046 void ScopeChain::push(ObjectImp *o) 00047 { 00048 assert(o); 00049 _node = new ScopeChainNode(_node, o); 00050 } 00051 00052 void ScopeChain::pop() 00053 { 00054 ScopeChainNode *oldNode = _node; 00055 assert(oldNode); 00056 ScopeChainNode *newNode = oldNode->next; 00057 _node = newNode; 00058 00059 if (--oldNode->refCount != 0) { 00060 if (newNode) 00061 ++newNode->refCount; 00062 } else { 00063 delete oldNode; 00064 } 00065 } 00066 00067 void ScopeChain::release() 00068 { 00069 // This function is only called by deref(), 00070 // Deref ensures these conditions are true. 00071 assert(_node && _node->refCount == 0); 00072 ScopeChainNode *n = _node; 00073 do { 00074 ScopeChainNode *next = n->next; 00075 delete n; 00076 n = next; 00077 } while (n && --n->refCount == 0); 00078 } 00079 00080 void ScopeChain::mark() 00081 { 00082 for (ScopeChainNode *n = _node; n; n = n->next) { 00083 ObjectImp *o = n->object; 00084 if (!o->marked()) 00085 o->mark(); 00086 } 00087 } 00088 00089 } // namespace KJS
KDE Logo
This file is part of the documentation for kjs Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Oct 8 11:14:43 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003