summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am9
-rw-r--r--python/py_value.cc83
-rw-r--r--python/pyinterp.cc24
3 files changed, 97 insertions, 19 deletions
diff --git a/Makefile.am b/Makefile.am
index 3384170d..b5133c4b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -194,13 +194,14 @@ if HAVE_BOOST_PYTHON
lib_LTLIBRARIES += libpyledger.la
libpyledger_la_SOURCES = \
+ python/pyutils.h \
+ python/pyfstream.h \
+ python/py_utils.cc \
+ python/py_times.cc \
python/py_amount.cc \
python/py_commodity.cc \
- python/py_times.cc \
- python/py_utils.cc \
- python/pyfstream.h \
+ python/py_value.cc \
python/pyinterp.cc \
- python/pyutils.h \
python/setup.py
libpyledger_la_CPPFLAGS = $(libledger_la_CPPFLAGS) -I$(srcdir)/python
diff --git a/python/py_value.cc b/python/py_value.cc
new file mode 100644
index 00000000..419d635d
--- /dev/null
+++ b/python/py_value.cc
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2003-2009, John Wiegley. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of New Artisans LLC nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "pyinterp.h"
+#include "pyutils.h"
+#include "value.h"
+
+#include <boost/python/exception_translator.hpp>
+#include <boost/python/implicit.hpp>
+#include <boost/python/args.hpp>
+
+namespace ledger {
+
+using namespace boost::python;
+
+#define EXC_TRANSLATOR(type) \
+ void exc_translate_ ## type(const type& err) { \
+ PyErr_SetString(PyExc_ArithmeticError, err.what()); \
+ }
+
+EXC_TRANSLATOR(value_error)
+
+void export_value()
+{
+#if 0
+ if (PyBool_Check(func.ptr()))
+ return extract<bool>(func)();
+ else if (PyInt_Check(func.ptr()))
+ return long(extract<int>(func)());
+ else if (PyString_Check(func.ptr()))
+ return string_value(extract<string>(func)());
+
+ extract<date_t> d(func);
+ if (d.check())
+ return value_t(d());
+ extract<datetime_t> dt(func);
+ if (dt.check())
+ return value_t(dt());
+#endif
+
+ register_optional_to_python<value_t>();
+
+#ifdef HAVE_GDTOA
+ implicitly_convertible<double, value_t>();
+#endif
+ implicitly_convertible<long, value_t>();
+ implicitly_convertible<string, value_t>();
+
+#define EXC_TRANSLATE(type) \
+ register_exception_translator<type>(&exc_translate_ ## type);
+
+ EXC_TRANSLATE(value_error);
+}
+
+} // namespace ledger
diff --git a/python/pyinterp.cc b/python/pyinterp.cc
index 582b8e78..6af17170 100644
--- a/python/pyinterp.cc
+++ b/python/pyinterp.cc
@@ -43,7 +43,9 @@ void export_amount();
void export_commodity();
#if 0
void export_balance();
+#endif
void export_value();
+#if 0
void export_journal();
void export_parser();
void export_option();
@@ -61,7 +63,9 @@ void initialize_for_python()
export_commodity();
#if 0
export_balance();
+#endif
export_value();
+#if 0
export_journal();
export_parser();
export_option();
@@ -223,21 +227,11 @@ value_t python_interpreter_t::functor_t::operator()(call_scope_t& args)
{
try {
if (! PyCallable_Check(func.ptr())) {
- if (PyBool_Check(func.ptr()))
- return extract<bool>(func)();
- else if (PyInt_Check(func.ptr()))
- return long(extract<int>(func)());
- else if (PyString_Check(func.ptr()))
- return string_value(extract<string>(func)());
-
- extract<date_t> d(func);
- if (d.check())
- return value_t(d());
- extract<datetime_t> dt(func);
- if (dt.check())
- return value_t(dt());
-
- return extract<value_t>(func);
+ extract<value_t> val(func);
+ if (val.check())
+ return val();
+ throw_(calc_error,
+ "Could not evaluate Python variable '" << name << "'");
} else {
if (args.size() > 0) {
list arglist;