00001
00002
00003 #include "cppscript"
00004 #include <sstream>
00005
00070 not_supported::not_supported(const var & v, std::string const & op) :
00071 exception("not_supported", "Operation '" + op + "' not supported on " + v.as_string())
00072 {
00073 }
00074
00075
00076 not_supported::~not_supported() throw ()
00077 {
00078 }
00079
00080
00081 static std::string build_error(var_impl * v, std::string const & op)
00082 {
00083 std::ostringstream ss;
00084 ss << "Operation '" << op << "' not supported on ";
00085 v->output(ss);
00086 return ss.str();
00087 }
00088
00089
00090 not_supported::not_supported(var_impl * v, std::string const & op) :
00091 exception("not_supported", build_error(v,op) )
00092 {
00093 }
00094
00095
00096 not_found::not_found(var const & e) :
00097 exception("not_found", "No such member: " + e.as_string(), e)
00098 {
00099 }
00100
00101
00102 not_found::~not_found() throw()
00103 {
00104 }
00105
00106
00107 exception::exception() :
00108 std::runtime_error("exception"),
00109 var( object("exception").extend("text", "exception")("data", var())("stack", stack_trace()) )
00110 {
00111 }
00112
00113
00114 exception::exception(const char * class_name) :
00115 std::runtime_error(class_name),
00116 var( object(class_name).extend("text", class_name)("data", var())("stack", stack_trace()) )
00117 {
00118 }
00119
00120
00121 exception::exception(const char * class_name, const var & message) :
00122 std::runtime_error(message.as_string().c_str()),
00123 var( object(class_name).extend("text", message)("data", var())("stack", stack_trace()) )
00124 {
00125 }
00126
00127
00128 exception::exception(const char * class_name, const var & message, const var & data) :
00129 std::runtime_error(message.as_string().c_str()),
00130 var( object(class_name).extend("text", message)("data", data)("stack", stack_trace()) )
00131 {
00132 }
00133
00134
00135 dynamic::exception::~exception() throw()
00136 {
00137 }
00138
00139
00140 namespace
00141 {
00142 std::string build_args_string(int expected, int actual)
00143 {
00144 std::ostringstream ss;
00145 ss << "Wrong number of arguments: expected " << expected << " arguments but received " << actual << " arguments";
00146 return ss.str();
00147 }
00148 }
00149
00150
00151 wrong_number_of_args::wrong_number_of_args(int e, int a) :
00152 exception("wrong_number_of_args", build_args_string(e,a))
00153 {
00154 }
00155
00156
00157 wrong_number_of_args::~wrong_number_of_args() throw()
00158 {
00159 }
00160
00161
00162 invalid_string::invalid_string() : exception("invalid_string", "Invalid string")
00163 {
00164 }
00165
00166
00167 invalid_string::~invalid_string() throw()
00168 {
00169 }
00170
00171
00172 too_many_arguments::too_many_arguments() : exception("too_many_arguments", "Too many arguments")
00173 {
00174 }
00175
00176
00177 too_many_arguments::~too_many_arguments() throw()
00178 {
00179 }
00180
00181
00182 expired_iterator::expired_iterator() : exception("expired_iterator", "Expired iterator")
00183 {
00184 }
00185
00186
00187 expired_iterator::~expired_iterator() throw()
00188 {
00189 }
00190
00191
00192 std::ostream & dynamic::operator<<(std::ostream & os, var const & a)
00193 {
00194 a.impl().output(os);
00195 return os;
00196 }
00197
00198
00199 std::basic_ostream<wchar_t> & dynamic::operator<<(std::basic_ostream<wchar_t> & os, var const & a)
00200 {
00201 a.impl().output(os);
00202 return os;
00203 }
00204
00205
00206 var dynamic::global()
00207 {
00208 static var global_var(global(object));
00209 return global_var;
00210 }
00211
00212
00213 var dynamic::exception_description(const var & ex)
00214 {
00215
00216 if( !ex.contains("text") || !ex.contains("stack") )
00217 return ex;
00218
00219 std::ostringstream ss;
00220
00221 ss << var(ex["text"]) << " (" << ex.class_name() << ")";
00222
00223 bool first=false;
00224
00225 foreach( i, ex["stack"] )
00226 {
00227 if(first)
00228 {
00229 first=false;
00230 ss << "\n in function " << i;
00231 }
00232 else
00233 ss << "\n called from " << i;
00234 }
00235
00236 return ss.str();
00237 }
00238
00239
00240 var dynamic::version()
00241 {
00242 return "0.9.4";
00243 }