lib Library API Documentation

koscript_context.h

00001 /* This file is part of the KDE project
00002    Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017    Boston, MA 02111-1307, USA.
00018 */
00019 
00020 #ifndef __KSCRIPT_CONTEXT_H__
00021 #define __KSCRIPT_CONTEXT_H__
00022 
00023 #include "koscript_value.h"
00024 #include "koscript_ptr.h"
00025 
00026 #include <qshared.h>
00027 #include <qstring.h>
00028 #include <qptrlist.h>
00029 
00030 class KSContext;
00031 class KSParseNode;
00032 class KSInterpreter;
00033 
00034 typedef QMap<QString,KSValue::Ptr> KSNamespace;
00035 
00041 class KSModule : public QShared
00042 {
00043 public:
00044     typedef KSSharedPtr<KSModule> Ptr;
00045 
00046     KSModule( KSInterpreter*, const QString& name, KSParseNode* = 0 );
00047     virtual ~KSModule();
00048 
00053     virtual bool eval( KSContext& );
00054 
00062     virtual KSValue::Ptr member( KSContext&, const QString& name );
00066     virtual bool setMember( KSContext&, const QString& name, const KSValue::Ptr& v );
00067 
00071     virtual bool isPebbles() const { return FALSE; } // BIC: remove
00072 
00076     QString name() const { return m_name; }
00077 
00084     KSNamespace* nameSpace() { return &m_space; }
00085 
00095     KSValue* object( const QString& name );
00102     void addObject( const QString& name, const KSValue::Ptr& v );
00109     void removeObject( const QString& name );
00113     KSInterpreter* interpreter() { return m_interpreter; }
00114 
00115 protected:
00116     void setCode( KSParseNode* node );
00117 
00118 private:
00119     QString m_name;
00120     KSNamespace m_space;
00121     KSParseNode* m_code;
00122     KSInterpreter* m_interpreter;
00123 };
00124 
00125 
00126 class KSSubScope
00127 {
00128 public:
00129   KSSubScope() { }
00130   KSSubScope( KSNamespace* n ) { m_spaces.append( n ); }
00131 
00137   KSValue* object( const QString& name, bool insert = FALSE );
00141   void addObject( const QString& name, const KSValue::Ptr& );
00142 
00146   void pushNamespace( KSNamespace* nspace ) { m_spaces.append( nspace ); }
00147 
00151   void popNamespace() { m_spaces.removeLast(); }
00152 
00153 private:
00154   QPtrList<KSNamespace> m_spaces;
00155 };
00156 
00157 
00158 class KSScope : public QShared
00159 {
00160 public:
00161   typedef KSSharedPtr<KSScope> Ptr;
00162 
00166   KSScope( const KSNamespace* globalSpace, KSModule *module );
00167   KSScope( const KSScope& s );
00168 
00169   void pushLocalScope( KSSubScope* scope ) { Q_ASSERT( m_localScope == 0 ); m_localScope = scope;  }
00170   KSSubScope* popLocalScope() { KSSubScope* s = m_localScope; m_localScope = 0; return s; }
00171   KSSubScope* localScope() { return m_localScope; }
00172 
00173   void pushModule( KSModule* m ) { Q_ASSERT( m_module == 0 ); m_module = m; m_moduleSpace = m->nameSpace(); }
00174   KSModule* popModule() { KSModule* n = m_module; m_module = 0; return n; }
00175 
00176   KSModule* module() { return m_module; }
00177 
00185   KSValue* object( const QString& name, bool insert = FALSE );
00192   void addObject( const QString& name, const KSValue::Ptr& );
00193 
00194 private:
00195   KSModule* m_module;
00196   const KSNamespace* m_globalSpace;
00200   KSNamespace* m_moduleSpace;
00201   KSSubScope* m_localScope;
00202 };
00203 
00204 class KSException : public QShared
00205 {
00206 public:
00207   typedef KSSharedPtr<KSException> Ptr;
00208 
00209   KSException( const QString& _type, const KSValue::Ptr& _ptr, int _line = -1 );
00210   KSException( const QString& _type, const QString& _val, int _line = -1 );
00211   KSException( const KSValue::Ptr& _type, const KSValue::Ptr& ptr, int _line = -1 );
00212   ~KSException() { }
00213 
00214   const QValueList<int>& lines() { return m_lines; }
00215   void addLine( int l ) { if ( m_lines.isEmpty() ) m_lines.append( l ); else if ( m_lines.last() != l ) m_lines.append( l ); }
00216 
00217   QString toString( KSContext& context );
00218   void print( KSContext& context );
00219 
00220   KSValue* type() { return m_type; }
00221   KSValue* value() { return m_value; }
00222 
00223 private:
00224   KSValue::Ptr m_type;
00225   KSValue::Ptr m_value;
00226   QValueList<int> m_lines;
00227 };
00228 
00229 class KSContext
00230 {
00231 public:
00232   KSContext();
00233   KSContext( KSContext& c, bool leftexpr = false );
00234   ~KSContext();
00235 
00236   void setValue( const KSValue::Ptr& p ) { m_value = p; }
00242   void setValue( KSValue* p ) { m_value = p; }
00248   KSValue* value() { return m_value; }
00254   KSValue* shareValue() { if ( !m_value ) return 0; m_value->ref(); return m_value; }
00255 
00259   void setExtraData( KSValue* p ) { m_extraData = p; }
00260 
00264   KSValue* extraData() { return m_extraData; }
00265 
00266 
00267   void setException( KSContext& c ) { m_exception = c.exception(); if ( c.exception() ) c.exception()->ref(); }
00268   void setException( KSException::Ptr& p ) { m_exception = p; }
00269   void setException( KSException* p ) { m_exception = p; }
00270   KSException* exception() { return m_exception; }
00271   KSException* shareException() { if ( !m_exception ) return 0; m_exception->ref(); return m_exception; }
00272 
00273   void setScope( KSContext& c ) { m_scope = c.scope(); if ( c.scope() ) c.scope()->ref(); }
00274   void setScope( KSScope::Ptr& p ) { m_scope = p; }
00275   void setScope( KSScope* p ) { m_scope = p; }
00276   KSScope* scope() { return m_scope; }
00277   KSValue* object( const QString& _name ) { if ( !!m_scope ) return m_scope->object( _name, m_bLeftExpr ); return 0; }
00278 
00279   void setLeftExpr( bool b ) { m_bLeftExpr = b; }
00280   bool leftExpr() { return m_bLeftExpr; }
00281 
00285   KSModule* module() { return m_scope->module(); }
00286 
00287   KSInterpreter* interpreter() { return m_scope->module()->interpreter(); }
00288 
00295   bool returnFlag() const { return m_bReturning; }
00301   void clearReturnFlag() { m_bReturning = false; }
00308   void setReturnFlag( bool b = true ) { m_bReturning = b; }
00309 
00310   int tmpInt;
00311 
00312 private:
00313   KSValue::Ptr m_value;
00314   KSValue::Ptr m_extraData;
00315   KSException::Ptr m_exception;
00316   KSScope::Ptr m_scope;
00317   bool m_bLeftExpr;
00318   bool m_bReturning;
00319 };
00320 
00321 #endif
KDE Logo
This file is part of the documentation for lib Library Version 1.3.5.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Nov 17 13:19:25 2004 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2003