Author: jsdelfino
Date: Mon Nov 30 08:36:07 2009
New Revision: 885348

URL: http://svn.apache.org/viewvc?rev=885348&view=rev
Log:
Added debug macros and cleaned up debug logging. Added locking macros used when 
compiling for multithreading. Fixed value conversions to numbers. Fixed compile 
warnings.

Added:
    tuscany/sca-cpp/trunk/kernel/debug.hpp
      - copied, changed from r883260, 
tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp
Modified:
    tuscany/sca-cpp/trunk/kernel/cache.hpp
    tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp
    tuscany/sca-cpp/trunk/kernel/function.hpp
    tuscany/sca-cpp/trunk/kernel/gc.hpp
    tuscany/sca-cpp/trunk/kernel/kernel-test.cpp
    tuscany/sca-cpp/trunk/kernel/list.hpp
    tuscany/sca-cpp/trunk/kernel/monad.hpp
    tuscany/sca-cpp/trunk/kernel/parallel.hpp
    tuscany/sca-cpp/trunk/kernel/value.hpp
    tuscany/sca-cpp/trunk/modules/eval/driver.hpp
    tuscany/sca-cpp/trunk/modules/eval/environment.hpp
    tuscany/sca-cpp/trunk/modules/eval/eval-test.cpp
    tuscany/sca-cpp/trunk/modules/eval/eval.hpp
    tuscany/sca-cpp/trunk/modules/eval/io.hpp
    tuscany/sca-cpp/trunk/modules/eval/primitive.hpp
    tuscany/sca-cpp/trunk/modules/json/json.hpp
    tuscany/sca-cpp/trunk/modules/server/mod-wiring.cpp
    tuscany/sca-cpp/trunk/test/store-function/currency.hpp
    tuscany/sca-cpp/trunk/test/store-object/currency.hpp

Modified: tuscany/sca-cpp/trunk/kernel/cache.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/cache.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/cache.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/cache.hpp Mon Nov 30 08:36:07 2009
@@ -26,6 +26,9 @@
  * Simple local cache monad implementation.
  */
 
+#ifdef _REENTRANT
+#include <pthread.h>
+#endif
 #include <sys/stat.h>
 
 #include <string>
@@ -40,25 +43,37 @@
  */
 template<typename V> class cached {
 public:
-    cached() : mtime(0) {
+    cached() : mutex(mutex_init()), mtime(0) {
     }
 
-    cached(const lambda<V()>& lvalue, const lambda<unsigned long()> ltime) : 
lvalue(lvalue), ltime(ltime), mtime(0) {
+    cached(const lambda<V()>& lvalue, const lambda<unsigned long()> ltime) : 
mutex(mutex_init()), lvalue(lvalue), ltime(ltime), mtime(0) {
     }
 
-    cached(const lambda<V()>& lvalue, const lambda<unsigned long()> ltime, 
const unsigned long mtime, const V& v) : lvalue(lvalue), ltime(ltime), 
mtime(mtime), v(v) {
+    cached(const lambda<V()>& lvalue, const lambda<unsigned long()> ltime, 
const unsigned long mtime, const V& v) : mutex(mutex_init()), lvalue(lvalue), 
ltime(ltime), mtime(mtime), v(v) {
     }
 
-    cached(const cached<V>& c) : lvalue(c.lvalue), ltime(c.ltime), 
mtime(c.mtime), v(c.v) {
+    cached(const cached<V>& c) : mutex(mutex_init()), lvalue(c.lvalue), 
ltime(c.ltime), mtime(c.mtime), v(c.v) {
+    }
+
+    ~cached() {
+#ifdef _REENTRANT
+        pthread_mutex_destroy(mutex);
+#endif
     }
 
     const cached<V>& operator=(const cached<V>& c) {
         if(this == &c)
             return *this;
+#ifdef _REENTRANT
+        pthread_mutex_lock(mutex);
+#endif
         this->lvalue = c.lvalue;
         this->ltime = c.ltime;
         this->mtime = c.mtime;
         this->v = c.v;
+#ifdef _REENTRANT
+        pthread_mutex_unlock(mutex);
+#endif
         return *this;
     }
 
@@ -69,10 +84,31 @@
     const bool operator==(const cached<V>& m) const {
         if (this == &m)
             return true;
-        return mtime == m.mtime && v == m.v;
+#ifdef _REENTRANT
+        pthread_mutex_lock(mutex);
+#endif
+        const bool r = mtime == m.mtime && v == m.v;
+#ifdef _REENTRANT
+        pthread_mutex_unlock(mutex);
+#endif
+        return r;
     }
 
 private:
+#ifdef _REENTRANT
+    pthread_mutex_t* mutex;
+    pthread_mutex_t* mutex_init() {
+        pthread_mutex_t* mx = new pthread_mutex_t();
+        pthread_mutex_init(mx, NULL);
+        return mx;
+    }
+#else
+    void* mutex;
+    void* mutex_init() {
+        return NULL;
+    }
+#endif
+
     lambda<V()> lvalue;
     lambda<time_t()> ltime;
     unsigned long mtime;

Copied: tuscany/sca-cpp/trunk/kernel/debug.hpp (from r883260, 
tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp)
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/debug.hpp?p2=tuscany/sca-cpp/trunk/kernel/debug.hpp&p1=tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp&r1=883260&r2=885348&rev=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp (original)
+++ tuscany/sca-cpp/trunk/kernel/debug.hpp Mon Nov 30 08:36:07 2009
@@ -19,30 +19,50 @@
 
 /* $Rev$ $Date$ */
 
+#ifndef tuscany_debug_hpp
+#define tuscany_debug_hpp
+
 /**
- * Test library.
+ * Functions to help log and debug.
  */
 
-#include "function.hpp"
+namespace tuscany
+{
 
-namespace tuscany {
-namespace test {
+#ifdef _DEBUG
 
-    const int cppsquare(int x) {
-        return x * x;
-    }
+/**
+ * Debug log.
+ */
+template<typename V> const bool debug(const V& v, const std::string& msg) {
+    std::cerr<< msg << ": " << v << std::endl;
+    return true;
+}
 
+/**
+ * Increment / decrement a debug counter.
+ */
+bool debug_inc(long int& c) {
+    c++;
+    return true;
 }
+
+bool debug_dec(long int& c) {
+    c--;
+    return true;
 }
 
-extern "C" {
+#define unused __attribute__ ((unused))
+
+#else
+
+#define debug(v, msg)
+
+#define debug_inc(c)
+#define debug_dec(c)
+#define unused
 
-    const int csquare(const int x) {
-        return tuscany::test::cppsquare(x);
-    }
-
-    const tuscany::lambda<int(int)> csquarel(const int x) {
-        return tuscany::lambda<int(int)>(tuscany::test::cppsquare);
-    }
+#endif
 
 }
+#endif /* tuscany_debug_hpp */

Modified: tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp (original)
+++ tuscany/sca-cpp/trunk/kernel/dynlib-test.cpp Mon Nov 30 08:36:07 2009
@@ -24,6 +24,7 @@
  */
 
 #include "function.hpp"
+#include "debug.hpp"
 
 namespace tuscany {
 namespace test {
@@ -41,7 +42,7 @@
         return tuscany::test::cppsquare(x);
     }
 
-    const tuscany::lambda<int(int)> csquarel(const int x) {
+    const tuscany::lambda<int(int)> csquarel() {
         return tuscany::lambda<int(int)>(tuscany::test::cppsquare);
     }
 

Modified: tuscany/sca-cpp/trunk/kernel/function.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/function.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/function.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/function.hpp Mon Nov 30 08:36:07 2009
@@ -28,9 +28,12 @@
 
 #include <iostream>
 #include "gc.hpp"
+#include "debug.hpp"
 
 namespace tuscany {
 
+#ifdef _DEBUG
+
 /**
  * Debug counters.
  */
@@ -47,6 +50,10 @@
     return true;
 }
 
+bool checkLambdaCounters() {
+    return countLambdas == 0;
+}
+
 bool printLambdaCounters() {
     std::cout << "countLambdas " << countLambdas << std::endl;
     std::cout << "countELambdas " << countELambdas << std::endl;
@@ -58,6 +65,14 @@
     return true;
 }
 
+#else
+
+#define resetLambdaCounters()
+#define checkLambdaCounters() true
+#define printLambdaCounters()
+
+#endif
+
 /**
  * Lambda function type.
  */
@@ -77,17 +92,17 @@
     template<typename F> class Proxy: public Callable {
     public:
         Proxy(const F& f) : function(f) {
-            countProxies++;
-            countFProxies ++;
+            debug_inc(countProxies);
+            debug_inc(countFProxies);
         }
 
         Proxy(const Proxy& p) : function(p.function) {
-            countProxies++;
-            countCProxies ++;
+            debug_inc(countProxies);
+            debug_inc(countCProxies);
         }
 
         ~Proxy() {
-            countProxies--;
+            debug_dec(countProxies);
         }
 
         virtual const R operator() (P... p) const {
@@ -108,11 +123,11 @@
     unsigned int refCount;
 
     unsigned int acquire() {
-        return __sync_add_and_fetch(&refCount, 1);
+        return gc_add_and_fetch(refCount, (unsigned int)1);
     }
 
     unsigned int release() {
-        return __sync_sub_and_fetch(&refCount, 1);
+        return gc_sub_and_fetch(refCount, (unsigned int)1);
     }
 };
 
@@ -121,21 +136,21 @@
 template<typename R, typename... P> class lambda<R(P...)> {
 public:
     lambda() : callable(0) {
-        countLambdas++;
-        countELambdas++;
+        debug_inc(countLambdas);
+        debug_inc(countELambdas);
     }
 
     template<typename F> lambda(const F f) : callable(0) {
         typedef typename CallableType::template Proxy<F> ProxyType;
 
-        countLambdas++;
-        countFLambdas++;
+        debug_inc(countLambdas);
+        debug_inc(countFLambdas);
         callable = gc_counting_ptr<CallableType>(new ProxyType(f));
     }
 
     lambda(const lambda& l) {
-        countLambdas++;
-        countCLambdas++;
+        debug_inc(countLambdas);
+        debug_inc(countCLambdas);
         callable = l.callable;
     }
 
@@ -147,7 +162,7 @@
     }
 
     ~lambda() {
-        countLambdas--;
+        debug_dec(countLambdas);
     }
 
     const bool operator==(const lambda& l) const {

Modified: tuscany/sca-cpp/trunk/kernel/gc.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/gc.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/gc.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/gc.hpp Mon Nov 30 08:36:07 2009
@@ -33,6 +33,24 @@
 namespace tuscany
 {
 
+/**
+ * Macros used to add or subtract values to reference counters.
+ * In a multithreaded environment, define MTHREAD_GC to use
+ * the GCC __sync_add_and_fetch and __sync_sub_and_fetch built
+ * in functions.
+ */
+#ifdef MTHREAD_GC
+
+#define gc_add_and_fetch(t, v) __sync_add_and_fetch(&(t), v)
+#define gc_sub_and_fetch(t, v) __sync_sub_and_fetch(&(t), v)
+
+#else
+
+#define gc_add_and_fetch(t, v) ((t) = (t) + (v))
+#define gc_sub_and_fetch(t, v) ((t) = (t) - (v))
+
+#endif
+
 template<typename T> class gc_ptr {
 public:
     gc_ptr(T* p = 0) throw() : countingRef(p == 0? 0 : new CountingRef(p)) {
@@ -95,12 +113,12 @@
 
     void acquire(CountingRef* ref) throw() {
         if(ref)
-            __sync_add_and_fetch(&ref->count, 1);
+            gc_add_and_fetch(ref->count, (unsigned int)1);
     }
 
     void release() throw() {
         if(countingRef) {
-            unsigned rc = __sync_sub_and_fetch(&countingRef->count, 1);
+            unsigned rc = gc_sub_and_fetch(countingRef->count, (unsigned 
int)1);
             if(rc == 0) {
                 delete countingRef->ptr;
                 delete countingRef;
@@ -178,12 +196,12 @@
 
     void acquire(CountingRef* ref) throw() {
         if(ref)
-            __sync_add_and_fetch(&ref->count, 1);
+            gc_add_and_fetch(ref->count, (unsigned int)1);
     }
 
     void release() throw() {
         if(countingRef) {
-            unsigned rc = __sync_sub_and_fetch(&countingRef->count, 1);
+            unsigned rc = gc_sub_and_fetch(countingRef->count, (unsigned 
int)1);
             if(rc == 0) {
                 delete[] countingRef->ptr;
                 delete countingRef;
@@ -311,11 +329,11 @@
         }
 
         unsigned int acquire() {
-            return __sync_add_and_fetch(&refCount, 1);
+            return gc_add_and_fetch(refCount, (unsigned int)1);
         }
 
         unsigned int release() {
-            return __sync_sub_and_fetch(&refCount, 1);
+            return gc_sub_and_fetch(refCount, (unsigned int)1);
         }
     };
 

Modified: tuscany/sca-cpp/trunk/kernel/kernel-test.cpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/kernel-test.cpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/kernel-test.cpp (original)
+++ tuscany/sca-cpp/trunk/kernel/kernel-test.cpp Mon Nov 30 08:36:07 2009
@@ -81,7 +81,7 @@
 bool testLambdaGC() {
     resetLambdaCounters();
     testLambda();
-    assert(countLambdas == 0);
+    assert(checkLambdaCounters());
     return true;
 }
 
@@ -140,8 +140,8 @@
     countElements = 0;
     testCons();
     testSet();
-    assert(countLambdas == 0);
-    assert(countlists == 0);
+    assert(checkLambdaCounters());
+    assert(checkListCounters());
     assert(countElements == 0);
     return true;
 }
@@ -296,7 +296,7 @@
     return x;
 }
 
-double testSeqReduce(double v, double accum) {
+double testSeqReduce(unused double v, double accum) {
     return accum + 1.0;
 }
 
@@ -351,9 +351,9 @@
     resetListCounters();
     resetValueCounters();
     testValue();
-    assert(countValues == 0);
-    assert(countLambdas == 0);
-    assert(countlists == 0);
+    assert(checkValueCounters());
+    assert(checkLambdaCounters());
+    assert(checkListCounters());
     return true;
 }
 

Modified: tuscany/sca-cpp/trunk/kernel/list.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/list.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/list.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/list.hpp Mon Nov 30 08:36:07 2009
@@ -28,27 +28,46 @@
 
 #include <iostream>
 #include "function.hpp"
+#include "debug.hpp"
 
 namespace tuscany {
 
-long countlists = 0;
-long countIlists = 0;
-long countClists = 0;
-long countElists = 0;
+#ifdef _DEBUG
+
+/**
+ * Debug counters.
+ */
+long countLists = 0;
+long countILists = 0;
+long countCLists = 0;
+long countELists = 0;
 
 bool resetListCounters() {
-    countlists = countIlists = countClists = countElists = 0;
+    countLists = countILists = countCLists = countELists = 0;
     return true;
 }
 
+bool checkListCounters() {
+    return countLists == 0;
+}
+
 bool printListCounters() {
-    std::cout << "countlists " << countlists << std::endl;
-    std::cout << "countElists " << countElists << std::endl;
-    std::cout << "countIlists " << countIlists << std::endl;
-    std::cout << "countClists " << countClists << std::endl;
+    std::cout << "countLists " << countLists << std::endl;
+    std::cout << "countELists " << countELists << std::endl;
+    std::cout << "countILists " << countILists << std::endl;
+    std::cout << "countCLists " << countCLists << std::endl;
     return true;
 }
 
+#else
+
+#define resetListCounters()
+#define checkListCounters() true
+#define printListCounters()
+
+#endif
+
+
 /**
  * A car/cdr lisp-like pair, base structure to construct lists.
  */
@@ -57,20 +76,20 @@
 public:
 
     list() {
-        countlists++;
-        countElists++;
+        debug_inc(countLists);
+        debug_inc(countELists);
     }
 
     list(const T car, const lambda<list<T> ()>& cdr) :
         car(car), cdr(cdr) {
-        countlists++;
-        countIlists++;
+        debug_inc(countLists);
+        debug_inc(countILists);
     }
 
     list(const list& p) :
         car(p.car), cdr(p.cdr) {
-        countlists++;
-        countClists++;
+        debug_inc(countLists);
+        debug_inc(countCLists);
     }
 
     const list& operator=(const list<T>& p) {
@@ -82,7 +101,7 @@
     }
 
     ~list() {
-        countlists--;
+        debug_dec(countLists);
     }
 
     const bool operator==(const list<T>& p) const {

Modified: tuscany/sca-cpp/trunk/kernel/monad.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/monad.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/monad.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/monad.hpp Mon Nov 30 08:36:07 2009
@@ -28,7 +28,9 @@
 
 #include <string>
 #include <iostream>
+
 #include "function.hpp"
+#include "debug.hpp"
 
 namespace tuscany
 {
@@ -280,6 +282,7 @@
  * Returns a failable monad with a failure in it.
  */
 template<typename V, typename F> const failable<V, F> mkfailure(const F& f) {
+    debug(f, "failable::mkfailure");
     return failable<V, F>(false, f);
 }
 

Modified: tuscany/sca-cpp/trunk/kernel/parallel.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/parallel.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/parallel.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/parallel.hpp Mon Nov 30 08:36:07 2009
@@ -28,6 +28,7 @@
 
 #include <pthread.h>
 #include <sys/syscall.h>
+
 #include "function.hpp"
 
 namespace tuscany {
@@ -59,11 +60,11 @@
         }
 
         unsigned int acquire() {
-            return __sync_add_and_fetch(&refCount, 1);
+            return __sync_add_and_fetch(&refCount, (unsigned int)1);
         }
 
         unsigned int release() {
-            return __sync_sub_and_fetch(&refCount, 1);
+            return __sync_sub_and_fetch(&refCount, (unsigned int)1);
         }
 
         bool set(const T& v) {

Modified: tuscany/sca-cpp/trunk/kernel/value.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/kernel/value.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/kernel/value.hpp (original)
+++ tuscany/sca-cpp/trunk/kernel/value.hpp Mon Nov 30 08:36:07 2009
@@ -32,10 +32,16 @@
 #include "gc.hpp"
 #include "function.hpp"
 #include "list.hpp"
+#include "debug.hpp"
 
 namespace tuscany
 {
 
+#ifdef _DEBUG
+
+/**
+ * Debug counters.
+ */
 long int countValues = 0;
 long int countEValues = 0;
 long int countCValues = 0;
@@ -46,6 +52,10 @@
     return true;
 }
 
+bool checkValueCounters() {
+    return countValues == 0;
+}
+
 bool printValueCounters() {
     std::cout << "countValues " << countValues << std::endl;
     std::cout << "countEValues " << countEValues << std::endl;
@@ -54,6 +64,14 @@
     return true;
 }
 
+#else
+
+#define resetValueCounters()
+#define checkValueCounters() true
+#define printValueCounters()
+
+#endif
+
 class value;
 
 class value {
@@ -65,13 +83,13 @@
 
     value() :
         type(value::Undefined) {
-        countValues++;
-        countEValues++;
+        debug_inc(countValues);
+        debug_inc(countEValues);
     }
 
     value(const value& v) {
-        countValues++;
-        countCValues++;
+        debug_inc(countValues);
+        debug_inc(countCValues);
         type = v.type;
         switch(type) {
         case value::List:
@@ -127,73 +145,73 @@
     }
 
     virtual ~value() {
-        countValues--;
+        debug_dec(countValues);
     }
 
     value(const lambda<value(list<value>&)>& func) :
         type(value::Lambda), data(vdata(func)) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const std::string& str) :
         type(value::String), data(vdata(result(str))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const char* str) :
         type(value::Symbol), data(vdata(result(std::string(str)))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const list<value>& lst) :
         type(value::List), data(vdata(result(lst))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const list<list<value> >& l) :
         type(value::List), data(vdata(result(listOfValues(l)))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const double num) :
         type(value::Number), data(vdata(result(num))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const int num) :
         type(value::Number), data(vdata(result((double)num))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const bool boo) :
         type(value::Bool), data(vdata(result(boo))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const char chr) :
         type(value::Char), data(vdata(result(chr))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const gc_ptr<value> ptr) :
         type(value::Ptr), data(vdata(result(ptr))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     value(const gc_pool_ptr<value> ptr) :
         type(value::PoolPtr), data(vdata(result(ptr))) {
-        countValues++;
-        countVValues++;
+        debug_inc(countValues);
+        debug_inc(countVValues);
     }
 
     const bool operator!=(const value& v) const {
@@ -237,11 +255,6 @@
 
     operator const std::string() const {
         switch(type) {
-        case value::List:
-        case value::Lambda:
-        case value::Ptr:
-        case value::PoolPtr:
-            return "";
         case value::Symbol:
         case value::String:
             return str()();
@@ -250,12 +263,8 @@
             sos << num()();
             return sos.str();
         }
-        case value::Bool: {
-            if(boo()())
-                return "true";
-            else
-                return "false";
-        }
+        case value::Bool:
+            return boo()()? "true" : "false";
         case value::Char: {
             std::ostringstream sos;
             sos << chr()();
@@ -267,19 +276,67 @@
     }
 
     operator const double() const {
-        return num()();
+        switch(type) {
+        case value::Symbol:
+        case value::String:
+            return atof(str()().c_str());
+        case value::Number:
+            return (double)num()();
+        case value::Bool:
+            return boo()()? 1.0 : 0.0;
+        case value::Char:
+            return (double)chr()();
+        default:
+            return 0.0;
+        }
     }
 
     operator const int() const {
-        return num()();
+        switch(type) {
+        case value::Symbol:
+        case value::String:
+            return atoi(str()().c_str());
+        case value::Number:
+            return (int)num()();
+        case value::Bool:
+            return boo()()? 1 : 0;
+        case value::Char:
+            return (int)chr()();
+        default:
+            return 0;
+        }
     }
 
     operator const bool() const {
-        return boo()();
+        switch(type) {
+        case value::Symbol:
+        case value::String:
+            return str()() == "true";
+        case value::Number:
+            return (int)num()() != 0;
+        case value::Bool:
+            return boo()();
+        case value::Char:
+            return (int)chr()() != 0;
+        default:
+            return 0;
+        }
     }
 
     operator const char() const {
-        return chr()();
+        switch(type) {
+        case value::Symbol:
+        case value::String:
+            return 0;
+        case value::Number:
+            return (char)num()();
+        case value::Bool:
+            return (char)boo()();
+        case value::Char:
+            return chr()();
+        default:
+            return 0;
+        }
     }
 
     operator const gc_ptr<value>() const {

Modified: tuscany/sca-cpp/trunk/modules/eval/driver.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/eval/driver.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/eval/driver.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/eval/driver.hpp Mon Nov 30 08:36:07 2009
@@ -37,12 +37,12 @@
 const std::string evalInputPrompt("=> ");
 
 const bool promptForInput(const std::string str, std::ostream& out) {
-    out << "\n\n" << str;
+    out << std::endl << std::endl << str;
     return true;
 }
 
 const bool announceOutput(const std::string str, std::ostream& out) {
-    out << "\n" << str;
+    out << std::endl << str;
     return true;
 }
 

Modified: tuscany/sca-cpp/trunk/modules/eval/environment.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/eval/environment.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/eval/environment.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/eval/environment.hpp Mon Nov 30 08:36:07 2009
@@ -82,7 +82,7 @@
 const Frame makeBinding(const Frame& frameSoFar, const list<value>& variables, 
const list<value> values) {
     if (isNil(variables)) {
         if (!isNil(values))
-            std::cout << "Too many arguments supplied " << values << "\n";
+            logStream() << "Too many arguments supplied " << values << 
std::endl;
         return frameSoFar;
     }
     if (isDotVariable(car(variables)))
@@ -90,7 +90,7 @@
 
     if (isNil(values)) {
         if (!isNil(variables))
-            std::cout << "Too few arguments supplied " << variables << "\n";
+            logStream() << "Too few arguments supplied " << variables << 
std::endl;
         return frameSoFar;
     }
 
@@ -163,7 +163,7 @@
 
 const value lookupEnvLoop(const value& var, const Env& env) {
     if(env == theEmptyEnvironment()) {
-        std::cout << "Unbound variable " << var << "\n";
+        logStream() << "Unbound variable " << var << std::endl;
         return value();
     }
     return lookupEnvScan(var, frameVariables(*firstFrame(env)), 
frameValues(*firstFrame(env)), env);

Modified: tuscany/sca-cpp/trunk/modules/eval/eval-test.cpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/eval/eval-test.cpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/eval/eval-test.cpp (original)
+++ tuscany/sca-cpp/trunk/modules/eval/eval-test.cpp Mon Nov 30 08:36:07 2009
@@ -47,9 +47,9 @@
     resetListCounters();
     resetValueCounters();
     testEnv();
-    assert(countValues == 0);
-    assert(countLambdas == 0);
-    assert(countlists == 0);
+    assert(checkValueCounters());
+    assert(checkLambdaCounters());
+    assert(checkListCounters());
     //printLambdaCounters();
     //printListCounters();
     //printValueCounters();
@@ -211,9 +211,9 @@
     testEval();
     testEvalExpr();
     testEvalLambda();
-    assert(countValues == 0);
-    assert(countLambdas == 0);
-    assert(countlists == 0);
+    assert(checkValueCounters());
+    assert(checkLambdaCounters());
+    assert(checkListCounters());
     //printLambdaCounters();
     //printListCounters();
     //printValueCounters();

Modified: tuscany/sca-cpp/trunk/modules/eval/eval.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/eval/eval.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/eval/eval.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/eval/eval.hpp Mon Nov 30 08:36:07 2009
@@ -141,12 +141,12 @@
 
 const value applyProcedure(const value& procedure, list<value>& arguments, 
const gc_pool& pool) {
     if(isPrimitiveProcedure(procedure))
-        return applyPrimitiveProcedure(procedure, arguments, pool);
+        return applyPrimitiveProcedure(procedure, arguments);
     if(isCompoundProcedure(procedure)) {
         Env env = extendEnvironment(procedureParameters(procedure), arguments, 
procedureEnvironment(procedure), pool);
         return evalSequence(procedureBody(procedure), env, pool);
     }
-    std::cout << "Unknown procedure type " << procedure << "\n";
+    logStream() << "Unknown procedure type " << procedure << std::endl;
     return value();
 }
 
@@ -208,7 +208,7 @@
     if(isCondElseClause(first)) {
         if(isNil(rest))
             return sequenceToExp(condActions(first));
-        std::cout << "else clause isn't last " << clauses << "\n";
+        logStream() << "else clause isn't last " << clauses << std::endl;
         return value();
     }
     return makeIf(condPredicate(first), sequenceToExp(condActions(first)), 
expandClauses(rest));
@@ -254,7 +254,7 @@
         list<value> operandValues = listOfValues(operands(exp), env, pool);
         return applyProcedure(evalExpr(operat(exp), env, pool), operandValues, 
pool);
     }
-    std::cout << "Unknown expression type " << exp << "\n";
+    logStream() << "Unknown expression type " << exp << std::endl;
     return value();
 }
 

Modified: tuscany/sca-cpp/trunk/modules/eval/io.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/eval/io.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/eval/io.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/eval/io.hpp Mon Nov 30 08:36:07 2009
@@ -77,14 +77,14 @@
     if(in.eof()) {
         return -1;
     }
-    char c = in.get();
+    char c = (char)in.get();
     return c;
 }
 
 const char peekChar(std::istream& in) {
     if(in.eof())
         return -1;
-    char c = in.peek();
+    char c = (char)in.peek();
     return c;
 }
 
@@ -95,7 +95,7 @@
 const value skipComment(std::istream& in);
 const value readQuoted(std::istream& in);
 const value readIdentifier(const char chr, std::istream& in);
-const value readString(const char chr, std::istream& in);
+const value readString(std::istream& in);
 const value readNumber(const char chr, std::istream& in);
 const value readValue(std::istream& in);
 
@@ -112,14 +112,14 @@
     if(firstChar == ')')
         return rightParenthesis;
     if(firstChar == '"')
-        return readString(firstChar, in);
+        return readString(in);
     if(isIdentifierStart(firstChar))
         return readIdentifier(firstChar, in);
     if(isDigit(firstChar))
         return readNumber(firstChar, in);
     if(firstChar == -1)
         return value();
-    std::cout << "Illegal lexical syntax '" << firstChar << "'" << "\n";
+    logStream() << "Illegal lexical syntax '" << firstChar << "'" << std::endl;
     return readToken(in);
 }
 
@@ -167,7 +167,7 @@
     return reverse(listSoFar);
 }
 
-const value readString(const char chr, std::istream& in) {
+const value readString(std::istream& in) {
     return listToString(readStringHelper(list<char>(), in));
 }
 
@@ -189,11 +189,25 @@
     return nextToken;
 }
 
+const value readValue(const std::string s) {
+    std::istringstream in(s);
+    const value nextToken = readToken(in);
+    if(isLeftParenthesis(nextToken))
+        return readList(list<value> (), in);
+    return nextToken;
+}
+
 const bool writeValue(const value& val, std::ostream& out) {
     out << val;
     return true;
 }
 
+const std::string writeValue(const value& val) {
+    std::ostringstream out;
+    out << val;
+    return out.str();
+}
+
 const value readScript(std::istream& in) {
     const value val = readValue(in);
     if (isNil(val))

Modified: tuscany/sca-cpp/trunk/modules/eval/primitive.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/eval/primitive.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/eval/primitive.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/eval/primitive.hpp Mon Nov 30 08:36:07 2009
@@ -40,13 +40,27 @@
 const value quoteSymbol("'");
 const value lambdaSymbol("lambda");
 
-std::ostream* displayOut = &std::cout;
+std::ostream* displayOutStream = &std::cout;
+std::ostream* logOutStream = &std::cerr;
 
 const bool setupDisplay(std::ostream& out) {
-    displayOut = &out;
+    displayOutStream = &out;
     return true;
 }
 
+std::ostream& displayStream() {
+    return *displayOutStream;
+}
+
+const bool setupLog(std::ostream& out) {
+    logOutStream = &out;
+    return true;
+}
+
+std::ostream& logStream() {
+    return *logOutStream;
+}
+
 const value carProc(const list<value>& args) {
     return car((list<value> )car(args));
 }
@@ -64,7 +78,12 @@
 }
 
 const value nulProc(const list<value>& args) {
-    return (bool)isNil(car(args));
+    const value v(car(args));
+    if (isNil(v))
+        return true;
+    if (isList(v))
+        return isNil(list<value>(v));
+    return false;
 }
 
 const value equalProc(const list<value>& args) {
@@ -92,12 +111,24 @@
 }
 
 const value displayProc(const list<value>& args) {
-    *displayOut << car(args);
-    (*displayOut).flush();
-    return true;
+    if (isNil(args)) {
+        displayStream() << std::endl;
+        return true;
+    }
+    displayStream() << car(args);
+    return displayProc(cdr(args));
+}
+
+const value logProc(const list<value>& args) {
+    if (isNil(args)) {
+        logStream() << std::endl;
+        return true;
+    }
+    logStream() << car(args);
+    return logProc(cdr(args));
 }
 
-const value uuidProc(const list<value>& args) {
+const value uuidProc(unused const list<value>& args) {
     apr_uuid_t uuid;
     apr_uuid_get(&uuid);
     char buf[APR_UUID_FORMATTED_LENGTH];
@@ -105,7 +136,7 @@
     return std::string(buf, APR_UUID_FORMATTED_LENGTH);
 }
 
-const value applyPrimitiveProcedure(const value& proc, list<value>& args, 
const gc_pool& pool) {
+const value applyPrimitiveProcedure(const value& proc, list<value>& args) {
     const lambda<value(list<value>&)> func(cadr((list<value>)proc));
     return func(args);
 }
@@ -151,6 +182,7 @@
     l = cons<value>("/", l);
     l = cons<value>("equal?", l);
     l = cons<value>("display", l);
+    l = cons<value>("log", l);
     l = cons<value>("uuid", l);
     return l;
 }
@@ -168,6 +200,7 @@
     l = cons(primitiveProcedure(divProc), l);
     l = cons(primitiveProcedure(equalProc), l);
     l = cons(primitiveProcedure(displayProc), l);
+    l = cons(primitiveProcedure(logProc), l);
     l = cons(primitiveProcedure(uuidProc), l);
     return l;
 }

Modified: tuscany/sca-cpp/trunk/modules/json/json.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/json/json.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/json/json.hpp (original)
+++ tuscany/sca-cpp/trunk/modules/json/json.hpp Mon Nov 30 08:36:07 2009
@@ -40,7 +40,7 @@
 /**
  * Report JSON errors.
  */
-void reportError(JSContext *cx, const char *message, JSErrorReport *report) {
+void reportError(unused JSContext *cx, const char *message, JSErrorReport 
*report) {
     std::cerr << (const char*)(report->filename? report->filename : "<no 
filename>") << ":"
             << (unsigned int)report->lineno << ":" << message << std::endl;
 }

Modified: tuscany/sca-cpp/trunk/modules/server/mod-wiring.cpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/modules/server/mod-wiring.cpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/modules/server/mod-wiring.cpp (original)
+++ tuscany/sca-cpp/trunk/modules/server/mod-wiring.cpp Mon Nov 30 08:36:07 2009
@@ -33,6 +33,7 @@
 #include "list.hpp"
 #include "slist.hpp"
 #include "value.hpp"
+#include "debug.hpp"
 #include "monad.hpp"
 #include "cache.hpp"
 #include "../scdl/scdl.hpp"
@@ -51,10 +52,11 @@
  */
 class ServerConf {
 public:
-    ServerConf(server_rec* s) : home("") {
+    ServerConf(server_rec* s) : s(s), home(""), wiringHost("") {
     }
-    server_rec* s;
+    const server_rec* s;
     std::string home;
+    std::string wiringHost;
 };
 
 /**
@@ -67,9 +69,9 @@
  */
 class DirConf {
 public:
-    DirConf(char* dirspec) : contributionPath(""), compositeName("") {
+    DirConf(char* dirspec) : dirspec(dirspec), contributionPath(""), 
compositeName("") {
     }
-    char* dirspec;
+    const char* dirspec;
     std::string contributionPath;
     std::string compositeName;
     cached<failable<list<value>, std::string> > components;
@@ -106,7 +108,8 @@
 int translate(request_rec *r) {
     if (strncmp(r->uri, "/references/", 12) != 0)
         return DECLINED;
-    httpd::logRequest(r, "mod_tuscany_wiring::translate");
+    httpdDebugRequest(r, "modwiring::translate::input");
+    debug(r->uri, "modwiring::translate::uri");
 
     // Find the requested component, reference and its target configuration
     DirConf& conf = httpd::dirConf<DirConf>(r, &mod_tuscany_wiring);
@@ -165,11 +168,14 @@
 int handler(request_rec *r) {
     if(strcmp(r->handler, "mod_tuscany_wiring"))
         return DECLINED;
-    httpd::logRequest(r, "mod_tuscany_wiring::handler");
+    httpdDebugRequest(r, "modwiring::handler::input");
 
     // Do an internal redirect
     if (r->filename == NULL || strncmp(r->filename, "/redirect:", 10) != 0)
         return DECLINED;
+    debug(r->uri, "modwiring::handler::uri");
+    debug(r->filename, "modwiring::handler::filename");
+
     if (r->args == NULL) {
         ap_internal_redirect(apr_pstrdup(r->pool, redirect(r->filename + 10, 
r->path_info).c_str()), r);
         return OK;
@@ -181,18 +187,23 @@
 /**
  * Configuration commands.
  */
-const char *confHome(cmd_parms *cmd, void *dummy, const char *arg) {
+const char *confHome(cmd_parms *cmd, unused void *dummy, const char *arg) {
     ServerConf *c = 
(ServerConf*)ap_get_module_config(cmd->server->module_config, 
&mod_tuscany_wiring);
     c->home = arg;
     return NULL;
 }
-const char *confContribution(cmd_parms *cmd, void *c, const char *arg) {
+const char *confWiringHost(cmd_parms *cmd, unused void *dummy, const char 
*arg) {
+    ServerConf *c = 
(ServerConf*)ap_get_module_config(cmd->server->module_config, 
&mod_tuscany_wiring);
+    c->wiringHost = arg;
+    return NULL;
+}
+const char *confContribution(unused cmd_parms *cmd, void *c, const char *arg) {
     DirConf* conf = (DirConf*)c;
     conf->contributionPath = arg;
     conf->components = components(conf);
     return NULL;
 }
-const char *confComposite(cmd_parms *cmd, void *c, const char *arg) {
+const char *confComposite(unused cmd_parms *cmd, void *c, const char *arg) {
     DirConf* conf = (DirConf*)c;
     conf->compositeName = arg;
     conf->components = components(conf);
@@ -204,16 +215,17 @@
  */
 const command_rec commands[] = {
     AP_INIT_TAKE1("TuscanyHome", (const char*(*)())confHome, NULL, RSRC_CONF, 
"Tuscany home directory"),
+    AP_INIT_TAKE1("SCAWiringHost", (const char*(*)())confWiringHost, NULL, 
RSRC_CONF, "SCA wiring host"),
     AP_INIT_TAKE1("SCAContribution", (const char*(*)())confContribution, NULL, 
ACCESS_CONF, "SCA contribution location"),
     AP_INIT_TAKE1("SCAComposite", (const char*(*)())confComposite, NULL, 
ACCESS_CONF, "SCA composite location"),
-    {NULL}
+    {NULL, NULL, NULL, 0, NO_ARGS, NULL}
 };
 
-int postConfig(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec 
*s) {
+int postConfig(unused apr_pool_t *p, unused apr_pool_t *plog, unused 
apr_pool_t *ptemp, unused server_rec *s) {
    return OK;
 }
 
-void childInit(apr_pool_t* p, server_rec* svr_rec) {
+void childInit(unused apr_pool_t* p, server_rec* svr_rec) {
     ServerConf *conf = 
(ServerConf*)ap_get_module_config(svr_rec->module_config, &mod_tuscany_wiring);
     if(conf == NULL) {
         std::cerr << "[Tuscany] Due to one or more errors mod_tuscany_wiring 
loading failed. Causing apache to stop loading." << std::endl;
@@ -221,7 +233,7 @@
     }
 }
 
-void registerHooks(apr_pool_t *p) {
+void registerHooks(unused apr_pool_t *p) {
     ap_hook_post_config(postConfig, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_child_init(childInit, NULL, NULL, APR_HOOK_MIDDLE);
     ap_hook_handler(handler, NULL, NULL, APR_HOOK_MIDDLE);

Modified: tuscany/sca-cpp/trunk/test/store-function/currency.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/test/store-function/currency.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/test/store-function/currency.hpp (original)
+++ tuscany/sca-cpp/trunk/test/store-function/currency.hpp Mon Nov 30 08:36:07 
2009
@@ -24,13 +24,14 @@
 
 #include <math.h>
 #include <string>
+#include "debug.hpp"
 #include "service.hpp"
 #include "item.hpp"
 
 namespace store
 {
 
-const double currencyConverter_convert(const std::string& fromCurrencyCode, 
const std::string& toCurrencyCode, const double amount) {
+const double currencyConverter_convert(unused const std::string& 
fromCurrencyCode, const std::string& toCurrencyCode, const double amount) {
     if(toCurrencyCode == "USD")
         return amount;
     if(toCurrencyCode == "EUR")

Modified: tuscany/sca-cpp/trunk/test/store-object/currency.hpp
URL: 
http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/test/store-object/currency.hpp?rev=885348&r1=885347&r2=885348&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/test/store-object/currency.hpp (original)
+++ tuscany/sca-cpp/trunk/test/store-object/currency.hpp Mon Nov 30 08:36:07 
2009
@@ -24,6 +24,7 @@
 
 #include <math.h>
 #include <string>
+#include "debug.hpp"
 
 namespace store
 {
@@ -38,7 +39,7 @@
 class CurrencyConverterImpl : public CurrencyConverter {
 public:
 
-    virtual const double convert(const std::string& fromCurrencyCode, const 
std::string& toCurrencyCode, const double amount) const {
+    virtual const double convert(unused const std::string& fromCurrencyCode, 
const std::string& toCurrencyCode, const double amount) const {
         if(toCurrencyCode == "USD")
             return amount;
         if(toCurrencyCode == "EUR")


Reply via email to