Changeset 8e4bc30
- Timestamp:
- Oct 8, 2020, 12:45:43 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 8fc9a5f, baee756
- Parents:
- 391c065 (diff), 6fbe9a5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 2 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/coroutine.cfa
r391c065 r8e4bc30 47 47 48 48 //----------------------------------------------------------------------------- 49 FORALL_DATA_INSTANCE(CoroutineCancelled, 50 (dtype coroutine_t | sized(coroutine_t)), (coroutine_t)) 49 FORALL_DATA_INSTANCE(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) 51 50 52 51 struct __cfaehm_node { … … 59 58 void mark_exception(CoroutineCancelled(T) *) {} 60 59 61 forall(dtype T | sized(T))60 forall(dtype T) 62 61 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) { 63 62 dst->the_coroutine = src->the_coroutine; … … 77 76 exception_t * except = (exception_t *)(1 + (__cfaehm_node *)desc->cancellation); 78 77 78 // TODO: Remove explitate vtable set once trac#186 is fixed. 79 79 CoroutineCancelled(T) except; 80 except.virtual_table = &get_exception_vtable(&except); 80 81 except.the_coroutine = &cor; 81 82 except.the_exception = except; -
libcfa/src/concurrency/coroutine.hfa
r391c065 r8e4bc30 22 22 //----------------------------------------------------------------------------- 23 23 // Exception thrown from resume when a coroutine stack is cancelled. 24 // Should not have to be be sized (see trac #196). 25 FORALL_DATA_EXCEPTION(CoroutineCancelled, 26 (dtype coroutine_t | sized(coroutine_t)), (coroutine_t)) ( 24 FORALL_DATA_EXCEPTION(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) ( 27 25 coroutine_t * the_coroutine; 28 26 exception_t * the_exception; … … 30 28 31 29 forall(dtype T) 32 void mark_exception(CoroutineCancelled(T) *);33 34 forall(dtype T | sized(T))35 30 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src); 36 31 … … 42 37 // Anything that implements this trait can be resumed. 43 38 // Anything that is resumed is a coroutine. 44 trait is_coroutine(dtype T | sized(T)45 | is_resumption_exception(CoroutineCancelled(T) )46 | VTABLE_ASSERTION(CoroutineCancelled,(T))) {39 trait is_coroutine(dtype T 40 | is_resumption_exception(CoroutineCancelled(T), 41 CoroutineCancelled_vtable(T))) { 47 42 void main(T & this); 48 43 $coroutine * get_coroutine(T & this); -
libcfa/src/exception.h
r391c065 r8e4bc30 76 76 // implemented in the .c file either so they all have to be inline. 77 77 78 trait is_exception(dtype exceptT ) {78 trait is_exception(dtype exceptT, dtype virtualT) { 79 79 /* The first field must be a pointer to a virtual table. 80 * That virtual table must be a decendent of the base exception virtual tab $80 * That virtual table must be a decendent of the base exception virtual table. 81 81 */ 82 v oid mark_exception(exceptT *);83 // This is never used and should be a no-op.82 virtualT const & get_exception_vtable(exceptT *); 83 // Always returns the virtual table for this type (associated types hack). 84 84 }; 85 85 86 trait is_termination_exception(dtype exceptT | is_exception(exceptT)) {86 trait is_termination_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) { 87 87 void defaultTerminationHandler(exceptT &); 88 88 }; 89 89 90 trait is_resumption_exception(dtype exceptT | is_exception(exceptT)) {90 trait is_resumption_exception(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) { 91 91 void defaultResumptionHandler(exceptT &); 92 92 }; 93 93 94 forall(dtype exceptT | is_termination_exception(exceptT))94 forall(dtype exceptT, dtype virtualT | is_termination_exception(exceptT, virtualT)) 95 95 static inline void $throw(exceptT & except) { 96 96 __cfaehm_throw_terminate( … … 100 100 } 101 101 102 forall(dtype exceptT | is_resumption_exception(exceptT))102 forall(dtype exceptT, dtype virtualT | is_resumption_exception(exceptT, virtualT)) 103 103 static inline void $throwResume(exceptT & except) { 104 104 __cfaehm_throw_resume( … … 108 108 } 109 109 110 forall(dtype exceptT | is_exception(exceptT))110 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 111 111 static inline void cancel_stack(exceptT & except) __attribute__((noreturn)) { 112 112 __cfaehm_cancel_stack( (exception_t *)&except ); 113 113 } 114 114 115 forall(dtype exceptT | is_exception(exceptT))115 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 116 116 static inline void defaultTerminationHandler(exceptT & except) { 117 117 return cancel_stack( except ); 118 118 } 119 119 120 forall(dtype exceptT | is_exception(exceptT))120 forall(dtype exceptT, dtype virtualT | is_exception(exceptT, virtualT)) 121 121 static inline void defaultResumptionHandler(exceptT & except) { 122 122 throw except; -
libcfa/src/exception.hfa
r391c065 r8e4bc30 95 95 // visible anywhere you use the instantiation of the exception is used. 96 96 #define POLY_VTABLE_DECLARATION(exception_name, ...) \ 97 void mark_exception(exception_name(__VA_ARGS__) *); \97 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable(exception_name(__VA_ARGS__) *); \ 98 98 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name) 99 99 … … 160 160 161 161 #define _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) \ 162 forall(_UNPACK assertions | VTABLE_ASSERTION(exception_name, parameters) ) \ 162 forall(_UNPACK assertions | \ 163 is_exception(exception_name parameters, VTABLE_TYPE(exception_name) parameters)) \ 163 164 void ?{}(exception_name parameters & this) 164 165 165 166 #define _FORALL_CTOR0_INSTANCE(exception_name, assertions, parameters) \ 166 167 _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) { \ 167 VTABLE_INIT(this, exception_name); \168 (this).virtual_table = &get_exception_vtable(&this); \ 168 169 } 169 170 … … 185 186 #define _VTABLE_DECLARATION(exception_name, parent_name, ...) \ 186 187 struct exception_name; \ 187 void mark_exception(exception_name *); \188 188 VTABLE_TYPE(exception_name); \ 189 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *); \ 189 190 extern VTABLE_TYPE(exception_name) VTABLE_NAME(exception_name); \ 190 191 VTABLE_TYPE(exception_name) { \ … … 197 198 198 199 #define _VTABLE_INSTANCE(exception_name, parent_name, ...) \ 199 void mark_exception(exception_name *) {} \ 200 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *) { \ 201 return VTABLE_NAME(exception_name); \ 202 } \ 200 203 void _GLUE2(exception_name,_copy)(exception_name * this, exception_name * other) { \ 201 204 *this = *other; \ … … 218 221 219 222 #define _POLY_VTABLE_INSTANCE(exception_name, parent_name, ...) \ 220 void mark_exception(exception_name(__VA_ARGS__) *) {} \ 223 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name); \ 224 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable( \ 225 exception_name(__VA_ARGS__) *) { \ 226 return VTABLE_NAME(exception_name); \ 227 } \ 221 228 void _GLUE2(exception_name,_copy)( \ 222 229 exception_name(__VA_ARGS__) * this, exception_name(__VA_ARGS__) * other) { \ -
libcfa/src/limits.cfa
r391c065 r8e4bc30 10 10 // Created On : Wed Apr 6 18:06:52 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Sep 30 22:56:32 202013 // Update Count : 7 612 // Last Modified On : Thu Mar 1 16:22:51 2018 13 // Update Count : 74 14 14 // 15 15 … … 23 23 // Integral Constants 24 24 25 signed char MIN = SCHAR_MIN;26 unsigned char MIN = 0;27 short int MIN = SHRT_MIN;28 unsigned short int MIN = 0;29 int MIN = INT_MIN;30 unsigned int MIN = 0;31 long int MIN = LONG_MIN;32 unsigned long int MIN = 0;33 long long int MIN = LLONG_MIN;34 unsigned long long int MIN = 0;25 const signed char MIN = SCHAR_MIN; 26 const unsigned char MIN = 0; 27 const short int MIN = SHRT_MIN; 28 const unsigned short int MIN = 0; 29 const int MIN = INT_MIN; 30 const unsigned int MIN = 0; 31 const long int MIN = LONG_MIN; 32 const unsigned long int MIN = 0; 33 const long long int MIN = LLONG_MIN; 34 const unsigned long long int MIN = 0; 35 35 36 signed char MAX = SCHAR_MAX;37 unsigned char MAX = UCHAR_MAX;38 short int MAX = SHRT_MAX;39 unsigned short int MAX = USHRT_MAX;40 int MAX = INT_MAX;41 unsigned int MAX = UINT_MAX;42 long int MAX = LONG_MAX;43 unsigned long int MAX = ULONG_MAX;44 long long int MAX = LLONG_MAX;45 unsigned long long int MAX = ULLONG_MAX;36 const signed char MAX = SCHAR_MAX; 37 const unsigned char MAX = UCHAR_MAX; 38 const short int MAX = SHRT_MAX; 39 const unsigned short int MAX = USHRT_MAX; 40 const int MAX = INT_MAX; 41 const unsigned int MAX = UINT_MAX; 42 const long int MAX = LONG_MAX; 43 const unsigned long int MAX = ULONG_MAX; 44 const long long int MAX = LLONG_MAX; 45 const unsigned long long int MAX = ULLONG_MAX; 46 46 47 47 // Floating-Point Constants 48 48 49 float MIN = FLT_MIN;50 double MIN = DBL_MIN;51 long double MIN = LDBL_MIN;52 float _Complex MIN = __FLT_MIN__ + __FLT_MIN__ * I;53 double _Complex MIN = DBL_MIN + DBL_MIN * I;54 long double _Complex MIN = LDBL_MIN + LDBL_MIN * I;49 const float MIN = FLT_MIN; 50 const double MIN = DBL_MIN; 51 const long double MIN = LDBL_MIN; 52 const float _Complex MIN = __FLT_MIN__ + __FLT_MIN__ * I; 53 const double _Complex MIN = DBL_MIN + DBL_MIN * I; 54 const long double _Complex MIN = LDBL_MIN + LDBL_MIN * I; 55 55 56 float MAX = FLT_MAX;57 double MAX = DBL_MAX;58 long double MAX = LDBL_MAX;59 float _Complex MAX = FLT_MAX + FLT_MAX * I;60 double _Complex MAX = DBL_MAX + DBL_MAX * I;61 long double _Complex MAX = LDBL_MAX + LDBL_MAX * I;56 const float MAX = FLT_MAX; 57 const double MAX = DBL_MAX; 58 const long double MAX = LDBL_MAX; 59 const float _Complex MAX = FLT_MAX + FLT_MAX * I; 60 const double _Complex MAX = DBL_MAX + DBL_MAX * I; 61 const long double _Complex MAX = LDBL_MAX + LDBL_MAX * I; 62 62 63 float PI = (float)M_PI;// pi64 float PI_2 = (float)M_PI_2;// pi / 265 float PI_4 = (float)M_PI_4;// pi / 466 float _1_PI = (float)M_1_PI;// 1 / pi67 float _2_PI = (float)M_2_PI;// 2 / pi68 float _2_SQRT_PI = (float)M_2_SQRTPI;// 2 / sqrt(pi)63 const float PI = (float)M_PI; // pi 64 const float PI_2 = (float)M_PI_2; // pi / 2 65 const float PI_4 = (float)M_PI_4; // pi / 4 66 const float _1_PI = (float)M_1_PI; // 1 / pi 67 const float _2_PI = (float)M_2_PI; // 2 / pi 68 const float _2_SQRT_PI = (float)M_2_SQRTPI; // 2 / sqrt(pi) 69 69 70 double PI = M_PI;// pi71 double PI_2 = M_PI_2;// pi / 272 double PI_4 = M_PI_4;// pi / 473 double _1_PI = M_1_PI;// 1 / pi74 double _2_PI = M_2_PI;// 2 / pi75 double _2_SQRT_PI = M_2_SQRTPI;// 2 / sqrt(pi)70 const double PI = M_PI; // pi 71 const double PI_2 = M_PI_2; // pi / 2 72 const double PI_4 = M_PI_4; // pi / 4 73 const double _1_PI = M_1_PI; // 1 / pi 74 const double _2_PI = M_2_PI; // 2 / pi 75 const double _2_SQRT_PI = M_2_SQRTPI; // 2 / sqrt(pi) 76 76 77 long double PI = M_PIl;// pi78 long double PI_2 = M_PI_2l;// pi / 279 long double PI_4 = M_PI_4l;// pi / 480 long double _1_PI = M_1_PIl;// 1 / pi81 long double _2_PI = M_2_PIl;// 2 / pi82 long double _2_SQRT_PI = M_2_SQRTPIl;// 2 / sqrt(pi)77 const long double PI = M_PIl; // pi 78 const long double PI_2 = M_PI_2l; // pi / 2 79 const long double PI_4 = M_PI_4l; // pi / 4 80 const long double _1_PI = M_1_PIl; // 1 / pi 81 const long double _2_PI = M_2_PIl; // 2 / pi 82 const long double _2_SQRT_PI = M_2_SQRTPIl; // 2 / sqrt(pi) 83 83 84 float _Complex PI = (float)M_PI + 0.0_iF;// pi85 float _Complex PI_2 = (float)M_PI_2 + 0.0_iF;// pi / 286 float _Complex PI_4 = (float)M_PI_4 + 0.0_iF;// pi / 487 float _Complex _1_PI = (float)M_1_PI + 0.0_iF;// 1 / pi88 float _Complex _2_PI = (float)M_2_PI + 0.0_iF;// 2 / pi89 float _Complex _2_SQRT_PI = (float)M_2_SQRTPI + 0.0_iF; // 2 / sqrt(pi)84 const float _Complex PI = (float)M_PI + 0.0_iF; // pi 85 const float _Complex PI_2 = (float)M_PI_2 + 0.0_iF; // pi / 2 86 const float _Complex PI_4 = (float)M_PI_4 + 0.0_iF; // pi / 4 87 const float _Complex _1_PI = (float)M_1_PI + 0.0_iF; // 1 / pi 88 const float _Complex _2_PI = (float)M_2_PI + 0.0_iF; // 2 / pi 89 const float _Complex _2_SQRT_PI = (float)M_2_SQRTPI + 0.0_iF; // 2 / sqrt(pi) 90 90 91 double _Complex PI = M_PI + 0.0_iD;// pi92 double _Complex PI_2 = M_PI_2 + 0.0_iD;// pi / 293 double _Complex PI_4 = M_PI_4 + 0.0_iD;// pi / 494 double _Complex _1_PI = M_1_PI + 0.0_iD;// 1 / pi95 double _Complex _2_PI = M_2_PI + 0.0_iD;// 2 / pi96 double _Complex _2_SQRT_PI = M_2_SQRTPI + 0.0_iD;// 2 / sqrt(pi)91 const double _Complex PI = M_PI + 0.0_iD; // pi 92 const double _Complex PI_2 = M_PI_2 + 0.0_iD; // pi / 2 93 const double _Complex PI_4 = M_PI_4 + 0.0_iD; // pi / 4 94 const double _Complex _1_PI = M_1_PI + 0.0_iD; // 1 / pi 95 const double _Complex _2_PI = M_2_PI + 0.0_iD; // 2 / pi 96 const double _Complex _2_SQRT_PI = M_2_SQRTPI + 0.0_iD; // 2 / sqrt(pi) 97 97 98 long double _Complex PI = M_PIl + 0.0_iL;// pi99 long double _Complex PI_2 = M_PI_2l + 0.0_iL;// pi / 2100 long double _Complex PI_4 = M_PI_4l + 0.0_iL;// pi / 4101 long double _Complex _1_PI = M_1_PIl + 0.0_iL;// 1 / pi102 long double _Complex _2_PI = M_2_PIl + 0.0_iL;// 2 / pi103 long double _Complex _2_SQRT_PI = M_2_SQRTPIl + 0.0_iL; // 2 / sqrt(pi)98 const long double _Complex PI = M_PIl + 0.0_iL; // pi 99 const long double _Complex PI_2 = M_PI_2l + 0.0_iL; // pi / 2 100 const long double _Complex PI_4 = M_PI_4l + 0.0_iL; // pi / 4 101 const long double _Complex _1_PI = M_1_PIl + 0.0_iL; // 1 / pi 102 const long double _Complex _2_PI = M_2_PIl + 0.0_iL; // 2 / pi 103 const long double _Complex _2_SQRT_PI = M_2_SQRTPIl + 0.0_iL; // 2 / sqrt(pi) 104 104 105 float E = (float)M_E;// e106 float LOG2_E = (float)M_LOG2E;// log_2(e)107 float LOG10_E = (float)M_LOG10E;// log_10(e)108 float LN_2 = (float)M_LN2;// log_e(2)109 float LN_10 = (float)M_LN10;// log_e(10)110 float SQRT_2 = (float)M_SQRT2;// sqrt(2)111 float _1_SQRT_2 = (float)M_SQRT1_2;// 1 / sqrt(2)105 const float E = (float)M_E; // e 106 const float LOG2_E = (float)M_LOG2E; // log_2(e) 107 const float LOG10_E = (float)M_LOG10E; // log_10(e) 108 const float LN_2 = (float)M_LN2; // log_e(2) 109 const float LN_10 = (float)M_LN10; // log_e(10) 110 const float SQRT_2 = (float)M_SQRT2; // sqrt(2) 111 const float _1_SQRT_2 = (float)M_SQRT1_2; // 1 / sqrt(2) 112 112 113 double E = M_E;// e114 double LOG2_E = M_LOG2E;// log_2(e)115 double LOG10_E = M_LOG10E;// log_10(e)116 double LN_2 = M_LN2;// log_e(2)117 double LN_10 = M_LN10;// log_e(10)118 double SQRT_2 = M_SQRT2;// sqrt(2)119 double _1_SQRT_2 = M_SQRT1_2;// 1 / sqrt(2)113 const double E = M_E; // e 114 const double LOG2_E = M_LOG2E; // log_2(e) 115 const double LOG10_E = M_LOG10E; // log_10(e) 116 const double LN_2 = M_LN2; // log_e(2) 117 const double LN_10 = M_LN10; // log_e(10) 118 const double SQRT_2 = M_SQRT2; // sqrt(2) 119 const double _1_SQRT_2 = M_SQRT1_2; // 1 / sqrt(2) 120 120 121 long double E = M_El;// e122 long double LOG2_E = M_LOG2El;// log_2(e)123 long double LOG10_E = M_LOG10El;// log_10(e)124 long double LN_2 = M_LN2l;// log_e(2)125 long double LN_10 = M_LN10l;// log_e(10)126 long double SQRT_2 = M_SQRT2l;// sqrt(2)127 long double _1_SQRT_2 = M_SQRT1_2l;// 1 / sqrt(2)121 const long double E = M_El; // e 122 const long double LOG2_E = M_LOG2El; // log_2(e) 123 const long double LOG10_E = M_LOG10El; // log_10(e) 124 const long double LN_2 = M_LN2l; // log_e(2) 125 const long double LN_10 = M_LN10l; // log_e(10) 126 const long double SQRT_2 = M_SQRT2l; // sqrt(2) 127 const long double _1_SQRT_2 = M_SQRT1_2l; // 1 / sqrt(2) 128 128 129 float _Complex E = M_E + 0.0_iF;// e130 float _Complex LOG2_E = M_LOG2E + 0.0_iF;// log_2(e)131 float _Complex LOG10_E = M_LOG10E + 0.0_iF;// log_10(e)132 float _Complex LN_2 = M_LN2 + 0.0_iF;// log_e(2)133 float _Complex LN_10 = M_LN10 + 0.0_iF;// log_e(10)134 float _Complex SQRT_2 = M_SQRT2 + 0.0_iF;// sqrt(2)135 float _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iF;// 1 / sqrt(2)129 const float _Complex E = M_E + 0.0_iF; // e 130 const float _Complex LOG2_E = M_LOG2E + 0.0_iF; // log_2(e) 131 const float _Complex LOG10_E = M_LOG10E + 0.0_iF; // log_10(e) 132 const float _Complex LN_2 = M_LN2 + 0.0_iF; // log_e(2) 133 const float _Complex LN_10 = M_LN10 + 0.0_iF; // log_e(10) 134 const float _Complex SQRT_2 = M_SQRT2 + 0.0_iF; // sqrt(2) 135 const float _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iF; // 1 / sqrt(2) 136 136 137 double _Complex E = M_E + 0.0_iD;// e138 double _Complex LOG2_E = M_LOG2E + 0.0_iD;// log_2(e)139 double _Complex LOG10_E = M_LOG10E + 0.0_iD;// log_10(e)140 double _Complex LN_2 = M_LN2 + 0.0_iD;// log_e(2)141 double _Complex LN_10 = M_LN10 + 0.0_iD;// log_e(10)142 double _Complex SQRT_2 = M_SQRT2 + 0.0_iD;// sqrt(2)143 double _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iD;// 1 / sqrt(2)137 const double _Complex E = M_E + 0.0_iD; // e 138 const double _Complex LOG2_E = M_LOG2E + 0.0_iD; // log_2(e) 139 const double _Complex LOG10_E = M_LOG10E + 0.0_iD; // log_10(e) 140 const double _Complex LN_2 = M_LN2 + 0.0_iD; // log_e(2) 141 const double _Complex LN_10 = M_LN10 + 0.0_iD; // log_e(10) 142 const double _Complex SQRT_2 = M_SQRT2 + 0.0_iD; // sqrt(2) 143 const double _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iD; // 1 / sqrt(2) 144 144 145 long double _Complex E = M_El + 0.0_iL;// e146 long double _Complex LOG2_E = M_LOG2El + 0.0_iL;// log_2(e)147 long double _Complex LOG10_E = M_LOG10El + 0.0_iL;// log_10(e)148 long double _Complex LN_2 = M_LN2l + 0.0_iL;// log_e(2)149 long double _Complex LN_10 = M_LN10l + 0.0_iL;// log_e(10)150 long double _Complex SQRT_2 = M_SQRT2l + 0.0_iL;// sqrt(2)151 long double _Complex _1_SQRT_2 = M_SQRT1_2l + 0.0_iL;// 1 / sqrt(2)145 const long double _Complex E = M_El + 0.0_iL; // e 146 const long double _Complex LOG2_E = M_LOG2El + 0.0_iL; // log_2(e) 147 const long double _Complex LOG10_E = M_LOG10El + 0.0_iL; // log_10(e) 148 const long double _Complex LN_2 = M_LN2l + 0.0_iL; // log_e(2) 149 const long double _Complex LN_10 = M_LN10l + 0.0_iL; // log_e(10) 150 const long double _Complex SQRT_2 = M_SQRT2l + 0.0_iL; // sqrt(2) 151 const long double _Complex _1_SQRT_2 = M_SQRT1_2l + 0.0_iL; // 1 / sqrt(2) 152 152 153 153 // Local Variables: // -
libcfa/src/limits.hfa
r391c065 r8e4bc30 10 10 // Created On : Wed Apr 6 18:06:52 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Sep 30 22:56:35 202013 // Update Count : 1 512 // Last Modified On : Thu Mar 1 16:20:54 2018 13 // Update Count : 13 14 14 // 15 15 … … 18 18 // Integral Constants 19 19 20 extern signed char MIN;21 extern unsigned char MIN;22 extern short int MIN;23 extern unsigned short int MIN;24 extern int MIN;25 extern unsigned int MIN;26 extern long int MIN;27 extern unsigned long int MIN;28 extern long long int MIN;29 extern unsigned long long int MIN;20 extern const signed char MIN; 21 extern const unsigned char MIN; 22 extern const short int MIN; 23 extern const unsigned short int MIN; 24 extern const int MIN; 25 extern const unsigned int MIN; 26 extern const long int MIN; 27 extern const unsigned long int MIN; 28 extern const long long int MIN; 29 extern const unsigned long long int MIN; 30 30 31 extern signed char MAX;32 extern unsigned char MAX;33 extern short int MAX;34 extern unsigned short int MAX;35 extern int MAX;36 extern unsigned int MAX;37 extern long int MAX;38 extern unsigned long int MAX;39 extern long long int MAX;40 extern unsigned long long int MAX;31 extern const signed char MAX; 32 extern const unsigned char MAX; 33 extern const short int MAX; 34 extern const unsigned short int MAX; 35 extern const int MAX; 36 extern const unsigned int MAX; 37 extern const long int MAX; 38 extern const unsigned long int MAX; 39 extern const long long int MAX; 40 extern const unsigned long long int MAX; 41 41 42 42 // Floating-Point Constants 43 43 44 extern float MIN;45 extern double MIN;46 extern long double MIN;47 extern float _Complex MIN;48 extern double _Complex MIN;49 extern long double _Complex MIN;44 extern const float MIN; 45 extern const double MIN; 46 extern const long double MIN; 47 extern const float _Complex MIN; 48 extern const double _Complex MIN; 49 extern const long double _Complex MIN; 50 50 51 extern float MAX;52 extern double MAX;53 extern long double MAX;54 extern float _Complex MAX;55 extern double _Complex MAX;56 extern long double _Complex MAX;51 extern const float MAX; 52 extern const double MAX; 53 extern const long double MAX; 54 extern const float _Complex MAX; 55 extern const double _Complex MAX; 56 extern const long double _Complex MAX; 57 57 58 extern float PI;// pi59 extern float PI_2;// pi / 260 extern float PI_4;// pi / 461 extern float _1_PI;// 1 / pi62 extern float _2_PI;// 2 / pi63 extern float _2_SQRT_PI;// 2 / sqrt(pi)58 extern const float PI; // pi 59 extern const float PI_2; // pi / 2 60 extern const float PI_4; // pi / 4 61 extern const float _1_PI; // 1 / pi 62 extern const float _2_PI; // 2 / pi 63 extern const float _2_SQRT_PI; // 2 / sqrt(pi) 64 64 65 extern double PI;// pi66 extern double PI_2;// pi / 267 extern double PI_4;// pi / 468 extern double _1_PI;// 1 / pi69 extern double _2_PI;// 2 / pi70 extern double _2_SQRT_PI;// 2 / sqrt(pi)65 extern const double PI; // pi 66 extern const double PI_2; // pi / 2 67 extern const double PI_4; // pi / 4 68 extern const double _1_PI; // 1 / pi 69 extern const double _2_PI; // 2 / pi 70 extern const double _2_SQRT_PI; // 2 / sqrt(pi) 71 71 72 extern long double PI;// pi73 extern long double PI_2;// pi / 274 extern long double PI_4;// pi / 475 extern long double _1_PI;// 1 / pi76 extern long double _2_PI;// 2 / pi77 extern long double _2_SQRT_PI;// 2 / sqrt(pi)72 extern const long double PI; // pi 73 extern const long double PI_2; // pi / 2 74 extern const long double PI_4; // pi / 4 75 extern const long double _1_PI; // 1 / pi 76 extern const long double _2_PI; // 2 / pi 77 extern const long double _2_SQRT_PI; // 2 / sqrt(pi) 78 78 79 extern float _Complex PI;// pi80 extern float _Complex PI_2;// pi / 281 extern float _Complex PI_4;// pi / 482 extern float _Complex _1_PI;// 1 / pi83 extern float _Complex _2_PI;// 2 / pi84 extern float _Complex _2_SQRT_PI;// 2 / sqrt(pi)79 extern const float _Complex PI; // pi 80 extern const float _Complex PI_2; // pi / 2 81 extern const float _Complex PI_4; // pi / 4 82 extern const float _Complex _1_PI; // 1 / pi 83 extern const float _Complex _2_PI; // 2 / pi 84 extern const float _Complex _2_SQRT_PI; // 2 / sqrt(pi) 85 85 86 extern double _Complex PI;// pi87 extern double _Complex PI_2;// pi / 288 extern double _Complex PI_4;// pi / 489 extern double _Complex _1_PI;// 1 / pi90 extern double _Complex _2_PI;// 2 / pi91 extern double _Complex _2_SQRT_PI;// 2 / sqrt(pi)86 extern const double _Complex PI; // pi 87 extern const double _Complex PI_2; // pi / 2 88 extern const double _Complex PI_4; // pi / 4 89 extern const double _Complex _1_PI; // 1 / pi 90 extern const double _Complex _2_PI; // 2 / pi 91 extern const double _Complex _2_SQRT_PI; // 2 / sqrt(pi) 92 92 93 extern long double _Complex PI;// pi94 extern long double _Complex PI_2;// pi / 295 extern long double _Complex PI_4;// pi / 496 extern long double _Complex _1_PI;// 1 / pi97 extern long double _Complex _2_PI;// 2 / pi98 extern long double _Complex _2_SQRT_PI;// 2 / sqrt(pi)93 extern const long double _Complex PI; // pi 94 extern const long double _Complex PI_2; // pi / 2 95 extern const long double _Complex PI_4; // pi / 4 96 extern const long double _Complex _1_PI; // 1 / pi 97 extern const long double _Complex _2_PI; // 2 / pi 98 extern const long double _Complex _2_SQRT_PI; // 2 / sqrt(pi) 99 99 100 extern float E;// e101 extern float LOG2_E;// log_2(e)102 extern float LOG10_E;// log_10(e)103 extern float LN_2;// log_e(2)104 extern float LN_10;// log_e(10)105 extern float SQRT_2;// sqrt(2)106 extern float _1_SQRT_2;// 1 / sqrt(2)100 extern const float E; // e 101 extern const float LOG2_E; // log_2(e) 102 extern const float LOG10_E; // log_10(e) 103 extern const float LN_2; // log_e(2) 104 extern const float LN_10; // log_e(10) 105 extern const float SQRT_2; // sqrt(2) 106 extern const float _1_SQRT_2; // 1 / sqrt(2) 107 107 108 extern double E;// e109 extern double LOG2_E;// log_2(e)110 extern double LOG10_E;// log_10(e)111 extern double LN_2;// log_e(2)112 extern double LN_10;// log_e(10)113 extern double SQRT_2;// sqrt(2)114 extern double _1_SQRT_2;// 1 / sqrt(2)108 extern const double E; // e 109 extern const double LOG2_E; // log_2(e) 110 extern const double LOG10_E; // log_10(e) 111 extern const double LN_2; // log_e(2) 112 extern const double LN_10; // log_e(10) 113 extern const double SQRT_2; // sqrt(2) 114 extern const double _1_SQRT_2; // 1 / sqrt(2) 115 115 116 extern long double E;// e117 extern long double LOG2_E;// log_2(e)118 extern long double LOG10_E;// log_10(e)119 extern long double LN_2;// log_e(2)120 extern long double LN_10;// log_e(10)121 extern long double SQRT_2;// sqrt(2)122 extern long double _1_SQRT_2;// 1/sqrt(2)116 extern const long double E; // e 117 extern const long double LOG2_E; // log_2(e) 118 extern const long double LOG10_E; // log_10(e) 119 extern const long double LN_2; // log_e(2) 120 extern const long double LN_10; // log_e(10) 121 extern const long double SQRT_2; // sqrt(2) 122 extern const long double _1_SQRT_2; // 1/sqrt(2) 123 123 124 extern float _Complex E;// e125 extern float _Complex LOG2_E;// log_2(e)126 extern float _Complex LOG10_E;// log_10(e)127 extern float _Complex LN_2;// log_e(2)128 extern float _Complex LN_10;// log_e(10)129 extern float _Complex SQRT_2;// sqrt(2)130 extern float _Complex _1_SQRT_2;// 1 / sqrt(2)124 extern const float _Complex E; // e 125 extern const float _Complex LOG2_E; // log_2(e) 126 extern const float _Complex LOG10_E; // log_10(e) 127 extern const float _Complex LN_2; // log_e(2) 128 extern const float _Complex LN_10; // log_e(10) 129 extern const float _Complex SQRT_2; // sqrt(2) 130 extern const float _Complex _1_SQRT_2; // 1 / sqrt(2) 131 131 132 extern double _Complex E;// e133 extern double _Complex LOG2_E;// log_2(e)134 extern double _Complex LOG10_E;// log_10(e)135 extern double _Complex LN_2;// log_e(2)136 extern double _Complex LN_10;// log_e(10)137 extern double _Complex SQRT_2;// sqrt(2)138 extern double _Complex _1_SQRT_2;// 1 / sqrt(2)132 extern const double _Complex E; // e 133 extern const double _Complex LOG2_E; // log_2(e) 134 extern const double _Complex LOG10_E; // log_10(e) 135 extern const double _Complex LN_2; // log_e(2) 136 extern const double _Complex LN_10; // log_e(10) 137 extern const double _Complex SQRT_2; // sqrt(2) 138 extern const double _Complex _1_SQRT_2; // 1 / sqrt(2) 139 139 140 extern long double _Complex E;// e141 extern long double _Complex LOG2_E;// log_2(e)142 extern long double _Complex LOG10_E;// log_10(e)143 extern long double _Complex LN_2;// log_e(2)144 extern long double _Complex LN_10;// log_e(10)145 extern long double _Complex SQRT_2;// sqrt(2)146 extern long double _Complex _1_SQRT_2;// 1 / sqrt(2)140 extern const long double _Complex E; // e 141 extern const long double _Complex LOG2_E; // log_2(e) 142 extern const long double _Complex LOG10_E; // log_10(e) 143 extern const long double _Complex LN_2; // log_e(2) 144 extern const long double _Complex LN_10; // log_e(10) 145 extern const long double _Complex SQRT_2; // sqrt(2) 146 extern const long double _Complex _1_SQRT_2; // 1 / sqrt(2) 147 147 148 148 // Local Variables: // -
src/Concurrency/Keywords.cc
r391c065 r8e4bc30 66 66 bool needs_main, AggregateDecl::Aggregate cast_target ) : 67 67 type_name( type_name ), field_name( field_name ), getter_name( getter_name ), 68 context_error( context_error ), vtable_name( getVTableName( exception_name ) ), 68 context_error( context_error ), exception_name( exception_name ), 69 vtable_name( getVTableName( exception_name ) ), 69 70 needs_main( needs_main ), cast_target( cast_target ) {} 70 71 … … 89 90 const std::string getter_name; 90 91 const std::string context_error; 92 const std::string exception_name; 91 93 const std::string vtable_name; 92 94 bool needs_main; … … 95 97 StructDecl * type_decl = nullptr; 96 98 FunctionDecl * dtor_decl = nullptr; 99 StructDecl * except_decl = nullptr; 97 100 StructDecl * vtable_decl = nullptr; 98 101 }; … … 376 379 else if ( is_target(decl) ) { 377 380 handle( decl ); 381 } 382 else if ( !except_decl && exception_name == decl->name && decl->body ) { 383 except_decl = decl; 378 384 } 379 385 else if ( !vtable_decl && vtable_name == decl->name && decl->body ) { … … 398 404 assert( struct_type ); 399 405 400 declsToAddAfter.push_back( Virtual::makeVtableInstance( vtable_decl, { 401 new TypeExpr( struct_type->clone() ), 402 }, struct_type, nullptr ) ); 406 std::list< Expression * > poly_args = { new TypeExpr( struct_type->clone() ) }; 407 ObjectDecl * vtable_object = Virtual::makeVtableInstance( 408 vtable_decl->makeInst( poly_args ), struct_type, nullptr ); 409 declsToAddAfter.push_back( vtable_object ); 410 declsToAddAfter.push_back( Virtual::makeGetExceptionFunction( 411 vtable_object, except_decl->makeInst( std::move( poly_args ) ) 412 ) ); 403 413 } 404 414 … … 434 444 void ConcurrentSueKeyword::addVtableForward( StructDecl * decl ) { 435 445 if ( vtable_decl ) { 436 declsToAddBefore.push_back( Virtual::makeVtableForward( vtable_decl,{446 std::list< Expression * > poly_args = { 437 447 new TypeExpr( new StructInstType( noQualifiers, decl ) ), 438 } ) ); 448 }; 449 declsToAddBefore.push_back( Virtual::makeGetExceptionForward( 450 vtable_decl->makeInst( poly_args ), 451 except_decl->makeInst( poly_args ) 452 ) ); 453 declsToAddBefore.push_back( Virtual::makeVtableForward( 454 vtable_decl->makeInst( move( poly_args ) ) ) ); 439 455 // Its only an error if we want a vtable and don't have one. 440 456 } else if ( ! vtable_name.empty() ) { -
src/InitTweak/FixGlobalInit.cc
r391c065 r8e4bc30 112 112 } // if 113 113 if ( Statement * ctor = ctorInit->ctor ) { 114 // Translation 1: Add this attribute on the global declaration: 115 // __attribute__((section (".data#"))) 116 // which makes gcc put the global in the data section, 117 // so that the global is writeable (via a const cast) in the init function. 118 // The trailing # is an injected assembly comment, to suppress the "a" in 119 // .section .data,"a" 120 // .section .data#,"a" 121 // to avoid assembler warning "ignoring changed section attributes for .data" 122 Type *strLitT = new PointerType( Type::Qualifiers( ), 123 new BasicType( Type::Qualifiers( ), BasicType::Char ) ); 124 std::list< Expression * > attr_params; 125 attr_params.push_back( 126 new ConstantExpr( Constant( strLitT, "\".data#\"", std::nullopt ) ) ); 127 objDecl->attributes.push_back(new Attribute("section", attr_params)); 128 // Translation 2: Move the initizliation off the global declaration, 129 // into the startup function. 114 130 initStatements.push_back( ctor ); 115 131 objDecl->init = nullptr; -
src/ResolvExpr/ResolveAssertions.cc
r391c065 r8e4bc30 277 277 const DeclarationWithType * candidate = cdata.id; 278 278 279 // build independent unification context for candidate 279 // ignore deleted candidates. 280 // NOTE: this behavior is different from main resolver. 281 // further investigations might be needed to determine 282 // if we should implement the same rule here 283 // (i.e. error if unique best match is deleted) 284 if (candidate->isDeleted) continue; 285 286 // build independent unification context. for candidate 280 287 AssertionSet have, newNeed; 281 288 TypeEnvironment newEnv{ resn.alt.env }; -
src/ResolvExpr/SatisfyAssertions.cpp
r391c065 r8e4bc30 170 170 const ast::DeclWithType * candidate = cdata.id; 171 171 172 // ignore deleted candidates. 173 // NOTE: this behavior is different from main resolver. 174 // further investigations might be needed to determine 175 // if we should implement the same rule here 176 // (i.e. error if unique best match is deleted) 177 if (candidate->isDeleted) continue; 178 172 179 // build independent unification context for candidate 173 180 ast::AssertionSet have, newNeed; -
src/SymTab/Autogen.cc
r391c065 r8e4bc30 339 339 } catch ( SemanticErrorException & ) { 340 340 // okay if decl does not resolve - that means the function should not be generated 341 delete dcl; 341 // delete dcl; 342 delete dcl->statements; 343 dcl->statements = nullptr; 344 dcl->isDeleted = true; 345 definitions.push_back( dcl ); 346 indexer.addId( dcl ); 342 347 } 343 348 } -
src/SynTree/AggregateDecl.cc
r391c065 r8e4bc30 21 21 #include "Common/utility.h" // for printAll, cloneAll, deleteAll 22 22 #include "Declaration.h" // for AggregateDecl, TypeDecl, Declaration 23 #include "Expression.h" 23 24 #include "Initializer.h" 24 25 #include "LinkageSpec.h" // for Spec, linkageName, Cforall … … 88 89 const char * StructDecl::typeString() const { return aggrString( kind ); } 89 90 91 StructInstType * StructDecl::makeInst( std::list< Expression * > const & new_parameters ) { 92 std::list< Expression * > copy_parameters; 93 cloneAll( new_parameters, copy_parameters ); 94 return makeInst( move( copy( copy_parameters ) ) ); 95 } 96 97 StructInstType * StructDecl::makeInst( std::list< Expression * > && new_parameters ) { 98 assert( parameters.size() == new_parameters.size() ); 99 StructInstType * type = new StructInstType( noQualifiers, this ); 100 type->parameters = std::move( new_parameters ); 101 return type; 102 } 103 90 104 const char * UnionDecl::typeString() const { return aggrString( Union ); } 91 105 -
src/SynTree/Declaration.h
r391c065 r8e4bc30 306 306 bool is_thread () { return kind == Thread ; } 307 307 308 // Make a type instance of this declaration. 309 StructInstType * makeInst( std::list< Expression * > const & parameters ); 310 StructInstType * makeInst( std::list< Expression * > && parameters ); 311 308 312 virtual StructDecl * clone() const override { return new StructDecl( *this ); } 309 313 virtual void accept( Visitor & v ) override { v.visit( this ); } -
src/Virtual/Tables.cc
r391c065 r8e4bc30 14 14 // 15 15 16 #include <SynTree/Attribute.h> 16 17 #include <SynTree/Declaration.h> 17 18 #include <SynTree/Expression.h> 19 #include <SynTree/Statement.h> 18 20 #include <SynTree/Type.h> 19 21 … … 38 40 } 39 41 40 // Fuse base polymorphic declaration and forall arguments into a new type.41 static StructInstType * vtableInstType(42 StructDecl * polyDecl, std::list< Expression * > && parameters ) {43 assert( parameters.size() == polyDecl->parameters.size() );44 StructInstType * type = new StructInstType(45 Type::Qualifiers( /* Type::Const */ ), polyDecl );46 type->parameters = std::move( parameters );47 return type;48 }49 50 42 static ObjectDecl * makeVtableDeclaration( 51 43 StructInstType * type, Initializer * init ) { … … 66 58 67 59 ObjectDecl * makeVtableForward( StructInstType * type ) { 60 assert( type ); 68 61 return makeVtableDeclaration( type, nullptr ); 69 62 } 70 63 71 ObjectDecl * makeVtableForward(72 StructDecl * polyDecl, std::list< Expression * > && parameters ) {73 return makeVtableForward( vtableInstType( polyDecl, std::move( parameters ) ) );74 }75 76 64 ObjectDecl * makeVtableInstance( 77 StructInstType * vtableType, Type * vobject_type, Initializer * init ) { 65 StructInstType * vtableType, Type * objectType, Initializer * init ) { 66 assert( vtableType ); 67 assert( objectType ); 78 68 StructDecl * vtableStruct = vtableType->baseStruct; 79 69 // Build the initialization … … 92 82 new SingleInit( new AddressExpr( new NameExpr( parentInstance ) ) ) ); 93 83 } else if ( std::string( "size" ) == field->name ) { 94 inits.push_back( new SingleInit( new SizeofExpr( vobject_type->clone() ) ) );84 inits.push_back( new SingleInit( new SizeofExpr( objectType->clone() ) ) ); 95 85 } else if ( std::string( "align" ) == field->name ) { 96 inits.push_back( new SingleInit( new AlignofExpr( vobject_type->clone() ) ) );86 inits.push_back( new SingleInit( new AlignofExpr( objectType->clone() ) ) ); 97 87 } else { 98 88 inits.push_back( new SingleInit( new NameExpr( field->name ) ) ); … … 108 98 } 109 99 110 ObjectDecl * makeVtableInstance( 111 StructDecl * polyDecl, std::list< Expression * > && parameters, 112 Type * vobject, Initializer * init ) { 113 return makeVtableInstance( 114 vtableInstType( polyDecl, std::move( parameters ) ), vobject, init ); 100 namespace { 101 std::string const functionName = "get_exception_vtable"; 102 } 103 104 FunctionDecl * makeGetExceptionForward( 105 Type * vtableType, Type * exceptType ) { 106 assert( vtableType ); 107 assert( exceptType ); 108 FunctionType * type = new FunctionType( noQualifiers, false ); 109 vtableType->tq.is_const = true; 110 type->returnVals.push_back( new ObjectDecl( 111 "_retvalue", 112 noStorageClasses, 113 LinkageSpec::Cforall, 114 nullptr, 115 new ReferenceType( noQualifiers, vtableType ), 116 nullptr, 117 { new Attribute("unused") } 118 ) ); 119 type->parameters.push_back( new ObjectDecl( 120 "__unused", 121 noStorageClasses, 122 LinkageSpec::Cforall, 123 nullptr, 124 new PointerType( noQualifiers, exceptType ), 125 nullptr, 126 { new Attribute("unused") } 127 ) ); 128 return new FunctionDecl( 129 functionName, 130 noStorageClasses, 131 LinkageSpec::Cforall, 132 type, 133 nullptr 134 ); 135 } 136 137 FunctionDecl * makeGetExceptionFunction( 138 ObjectDecl * vtableInstance, Type * exceptType ) { 139 assert( vtableInstance ); 140 assert( exceptType ); 141 FunctionDecl * func = makeGetExceptionForward( 142 vtableInstance->type->clone(), exceptType ); 143 func->statements = new CompoundStmt( { 144 new ReturnStmt( new VariableExpr( vtableInstance ) ), 145 } ); 146 return func; 115 147 } 116 148 -
src/Virtual/Tables.h
r391c065 r8e4bc30 27 27 bool isVTableInstanceName( std::string const & name ); 28 28 29 /// Converts exceptions into regular structures. 30 //void ( std::list< Declaration * > & translationUnit ); 31 32 ObjectDecl * makeVtableForward( StructInstType * ); 33 ObjectDecl * makeVtableForward( StructDecl *, std::list< Expression * > && ); 34 /* Create a forward definition of a vtable of the given type. 35 * 36 * Instead of the virtual table type you may provide the declaration and all 37 * the forall parameters. 29 ObjectDecl * makeVtableForward( StructInstType * vtableType ); 30 /* Create a forward declaration of a vtable of the given type. 31 * vtableType node is consumed. 38 32 */ 39 33 40 ObjectDecl * makeVtableInstance( StructInstType *, Type *, Initializer * ); 41 ObjectDecl * makeVtableInstance( 42 StructDecl *, std::list< Expression * > &&, Type *, Initializer * ); 34 ObjectDecl * makeVtableInstance( StructInstType * vtableType, Type * objectType, 35 Initializer * init = nullptr ); 43 36 /* Create an initialized definition of a vtable. 44 * 45 * The parameters are the virtual table type (or the base declaration and the 46 * forall parameters), the object type and optionally an initializer. 47 * 48 * Instead of the virtual table type you may provide the declaration and all 49 * the forall parameters. 37 * vtableType and init (if provided) nodes are consumed. 38 */ 39 40 // Some special code for how exceptions interact with virtual tables. 41 FunctionDecl * makeGetExceptionForward( Type * vtableType, Type * exceptType ); 42 /* Create a forward declaration of the exception virtual function 43 * linking the vtableType to the exceptType. Both nodes are consumed. 44 */ 45 46 FunctionDecl * makeGetExceptionFunction( 47 ObjectDecl * vtableInstance, Type * exceptType ); 48 /* Create the definition of the exception virtual function. 49 * exceptType node is consumed. 50 50 */ 51 51 -
tests/.expect/limits.txt
r391c065 r8e4bc30 1 1 limits.cfa: In function '_X4mainFi_iPPKc__1': 2 limits.cfa:15 1:9: note: #pragma message: Compiled2 limits.cfa:154:9: note: #pragma message: Compiled -
tests/exceptions/defaults.cfa
r391c065 r8e4bc30 55 55 56 56 void unhandled_test(void) { 57 forall(dtype T | is_exception(T))57 forall(dtype T, dtype V | is_exception(T, V)) 58 58 void defaultTerminationHandler(T &) { 59 59 throw (unhandled_exception){}; -
tests/limits.cfa
r391c065 r8e4bc30 13 13 // Update Count : 10 14 14 // 15 16 // Note: For testing the ability to load the constants defined in libcfa/src/limits.cfa, 17 // see discussion in test const-init. 15 18 16 19 #include <limits.hfa>
Note: See TracChangeset
for help on using the changeset viewer.