00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _IMPULSE_VALUE_INLINE_
00009 #define _IMPULSE_VALUE_INLINE_
00010
00011 #include "../protos/array.h"
00012 #include "../protos/symbol.h"
00013 #include "../protos/string.h"
00014
00015 namespace impulse {
00016
00017
00018
00019
00020
00021 inline Value_data::Value_data() : _frame( _nil_.getFrame() ), _float( -1 ) { }
00022 inline Value_data::Value_data( double value ) : _frame( _LitNum_.getFrame() ), _float( value ) { }
00023 inline Value_data::Value_data( string value ) : _frame( new String( value ) ), _float( -2 ) { }
00024 inline Value_data::Value_data( Frame* frame ) : _frame( frame ), _float( -0 ) { }
00025
00026
00027
00028
00029
00030 inline Value::Value() { }
00031 inline Value::Value( double value ) : Value_data( value ) { }
00032 inline Value::Value( string value ) : Value_data( value ) { }
00033 inline Value::Value( Frame* value ) : Value_data( value ) { }
00034
00035 inline Value Value::getSlot( Symbol& symbol )
00036 {
00037 Value result = getFrame()->getSlot( symbol );
00038
00039 return result;
00040 }
00041
00042 inline Value Value::setSlot( Symbol& symbol, Value value )
00043 {
00044 Value result = getFrame()->setSlot( symbol, value );
00045
00046 return result;
00047 }
00048
00049
00050 inline Value Value::eval( Array& args, Value self )
00051 {
00052 BEG( "Value::eval( args, self = " << self.inspect() << " )" );
00053
00054 Value result;
00055
00056 if (getFrame() == _LitNum_.getFrame())
00057 {
00058 result = *this;
00059 }
00060 else
00061 {
00062 result = getFrame()->eval( args, self );
00063 }
00064
00065 END( result.inspect() );
00066
00067 return result;
00068 }
00069
00070
00071 inline Value Value::send( Symbol& selector, Array& args )
00072 {
00073 BEG( "Value::send( args, sel = " << selector.getName() << " )" );
00074
00075 Value result = getFrame()->send( selector, args, *this );
00076
00077 END( result.inspect() );
00078
00079 return result;
00080 }
00081
00082
00083 inline void Value::incrRef()
00084 {
00085 getFrame()->_refCount++;
00086 }
00087
00088 inline void Value::decrRef()
00089 {
00090 TRACE( "Value::decrRef() " << inspect() << " " << getFrame()->_refCount );
00091
00092 if (--getFrame()->_refCount == 0)
00093 {
00094 cout << "\x1b[33mdelete\x1b[0m " << inspect() << endl;
00095
00096 delete getFrame();
00097 }
00098 }
00099
00100 }
00101
00102 #endif