ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/libcpjit/cpjit.h.PL
Revision: 1.6
Committed: Tue Oct 11 22:06:24 2005 UTC (21 years ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.5: +62 -11 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #!/usr/bin/perl
2    
3     # create cpjit.h
4    
5     open STDOUT, ">cpjit.h"
6     or die "cpijit.h: $!";
7    
8 root 1.6 $CPJIT_MAX_ARGS = 9;
9    
10 root 1.1 print <<EOF;
11 root 1.6 #line 12 "cpjit.h.PL"
12 root 1.1 /*
13 root 1.2 This file is AUTOMAGICALLY created by cpjit.h.PL. Modifications will
14     be lost.
15    
16 root 1.1 cpjit.h -- c portable jit in time compiler
17     Copyright (C) 2005 Marc Lehmann <cpjit@schmorp.de>
18    
19     This file is part of libcpjit.
20    
21     libcpjit is free software; you can redistribute it and/or modify
22     it under the terms of the GNU General Public License as published by
23     the Free Software Foundation; either version 2 of the License, or
24     (at your option) any later version.
25    
26     This program is distributed in the hope that it will be useful,
27     but WITHOUT ANY WARRANTY; without even the implied warranty of
28     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29     GNU General Public License for more details.
30    
31     You should have received a copy of the GNU General Public License
32     along with gvpe; if not, write to the Free Software
33     Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34     */
35    
36 root 1.3 #include <string>
37 root 1.6 #include <sstream>
38 root 1.4 #include <inttypes.h>
39 root 1.3
40 root 1.1 namespace cpjit
41     {
42    
43 root 1.6 #define CPJIT_MAX_ARGS $CPJIT_MAX_ARGS
44     #define CPJIT_NULLID ""
45    
46 root 1.5 typedef std::string idstr;
47 root 1.3
48 root 1.5 // environment for persistent or temporary storage
49     struct env
50     {
51     };
52    
53 root 1.6 struct fun
54 root 1.5 {
55     env &e;
56     idstr id;
57 root 1.6 std::string source;
58    
59     fun (env &e, const idstr &id);
60 root 1.5
61 root 1.6 // is compiled function available?
62     bool compiled ();
63    
64     void set_source (const std::string source)
65     {
66     this->source = source;
67     }
68 root 1.5
69     // internal method to return the function pointer
70     void *ptr ();
71     };
72    
73 root 1.6 struct funbuild : std::ostringstream
74 root 1.5 {
75 root 1.6 env &e;
76     idstr id;
77    
78     funbuild (env &e, const idstr &id, const char *rettype, ...);
79     void finish ();
80    
81     fun *get ()
82     {
83     finish ();
84     fun *f = new fun (e, id);
85     f->set_source (str ());
86     return f;
87     }
88 root 1.5 };
89 root 1.2
90 root 1.5 typedef unsigned char U8;
91     typedef signed char I8;
92     typedef uint16_t U16;
93     typedef int16_t I16;
94     typedef uint32_t U32;
95     typedef int32_t I32;
96     typedef uint64_t U64;
97     typedef int64_t I64;
98     typedef float F32;
99     typedef double F64;
100    
101     template<typename T> struct typestr { };
102    
103     template<> struct typestr<U8 > { static const char str[]; };
104     template<> struct typestr<U16 > { static const char str[]; };
105     template<> struct typestr<U32 > { static const char str[]; };
106     template<> struct typestr<U64 > { static const char str[]; };
107     template<> struct typestr<I8 > { static const char str[]; };
108     template<> struct typestr<I16 > { static const char str[]; };
109     template<> struct typestr<I32 > { static const char str[]; };
110     template<> struct typestr<I64 > { static const char str[]; };
111     template<> struct typestr<F32 > { static const char str[]; };
112     template<> struct typestr<F64 > { static const char str[]; };
113     template<> struct typestr<U8 *> { static const char str[]; };
114     template<> struct typestr<U16 *> { static const char str[]; };
115     template<> struct typestr<U32 *> { static const char str[]; };
116     template<> struct typestr<U64 *> { static const char str[]; };
117     template<> struct typestr<I8 *> { static const char str[]; };
118     template<> struct typestr<I16 *> { static const char str[]; };
119     template<> struct typestr<I32 *> { static const char str[]; };
120     template<> struct typestr<I64 *> { static const char str[]; };
121     template<> struct typestr<F32 *> { static const char str[]; };
122     template<> struct typestr<F64 *> { static const char str[]; };
123 root 1.2
124 root 1.6 EOF
125    
126     for (0 .. $CPJIT_MAX_ARGS) {
127     print <<EOF;
128     #line 129 "cpjit.h.PL"
129    
130     template<typename R${\( join "", map ", typename A$_", 1..$_ )}>
131     struct fun$_ : fun
132     {
133     fun$_ (env &e, const idstr &id = CPJIT_NULLID)
134     : fun (e, id)
135     {
136     }
137    
138     int operator ()(${\( join ", ", map "A$_ a$_", 1..$_ )})
139     {
140     return ((R (*)(${\( join ", ", map "A$_", 1..$_ )})) ptr ())(${\( join ", ", map "a$_", 1..$_ )});
141     }
142     };
143    
144     template<typename R${\( join "", map ", typename A$_", 1..$_ )}>
145     struct funbuild$_ : funbuild
146 root 1.5 {
147 root 1.6 funbuild$_ (env &e, const idstr &id = CPJIT_NULLID)
148     : funbuild (e, id, typestr<R>::str${\( join "", map ", typestr<A$_>::str", 1..$_ )}, (const char *)0)
149 root 1.2 {
150 root 1.5 }
151 root 1.3
152 root 1.6 fun$_<R${\( join "", map ", A$_", 1..$_ )}> *get ()
153 root 1.2 {
154 root 1.6 finish ();
155     fun$_<R${\( join "", map ", A$_", 1..$_ )}> *f = new fun$_<R${\( join "", map ", A$_", 1..$_ )}> (e, id);
156     f->set_source (str ());
157     return f;
158 root 1.5 }
159     };
160 root 1.3
161 root 1.1 EOF
162 root 1.6 }
163 root 1.1
164     print <<EOF;
165     }
166     EOF
167