~dominik-burgdoerfer/libdmcc/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * =====================================================================================
 *
 *       Filename:  Constructor.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  23.08.2009 21:03:42
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Dominik 'domachine' Burgdoerfer (-), dominik.burgdoerfer@gmail.com
 *        Company:  
 *
 * =====================================================================================
 */
#define __DMCC_PCC
#    include "../dmcc/pcc/PccConstructor.hpp"
#undef __DMCC_PCC

using namespace std;

namespace dmcc {
    namespace pcc {
        /*
         * =====================================
         * dmcc::pcc::PccConstructor Implementation
         * =====================================
         */
        
        /*
         * ============
         * Constructors
         * ============
         */
        
        PccConstructor::PccConstructor(const std::string & name,
                vector<const Argument *> * arguments,
                const std::string & str)
                
            : _name(name), _string(str), _arguments(arguments) {
        }
        
        /*
         * ===========
         * Destructors
         * ===========
         */
        
        PccConstructor::~PccConstructor() {
            unsigned int i;
            for(i = 0; i < _arguments->size(); i++) {
                delete _arguments->at(i);
            }
            delete _arguments;
        }
        
        /*
         * ==============
         * Public Methods
         * ==============
         */

        boost::any PccConstructor::newInstance(const std::vector<boost::any> & params) {
            typedef boost::any (*Constr)(const std::vector<boost::any> &);

            Constr pConstr;
            boost::any pObject;

            pConstr = (Constr)mDeclaringClass->context()->symbol(mSymbolName);

            if(pConstr == 0)
                 throw LoadException(mDeclaringClass->context()->lastError());

            pObject = (*pConstr)(params);

            return pObject;

        }

        void PccConstructor::setSymbolName(const std::string & symbolName) {
            this->mSymbolName = symbolName;
        }
        
        string PccConstructor::name() const {
            return _name;
        }
        
        string PccConstructor::string() const {
            return _string;
        }
        
        vector<const Argument *> * PccConstructor::arguments() const {
            return _arguments;
        }

        dmcc::Class * PccConstructor::declaringClass() const {
            return mDeclaringClass;
        }

        void PccConstructor::setDeclaringClass(Class * clazz) {
            mDeclaringClass = clazz;
        }
    }
}