diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/runtime/c/gu/defs.h | 10 | ||||
| -rw-r--r-- | src/runtime/c/gu/mem.h | 4 | ||||
| -rw-r--r-- | src/runtime/c/gu/seq.h | 2 | ||||
| -rw-r--r-- | src/runtime/c/pgf/expr.h | 8 | ||||
| -rw-r--r-- | src/runtime/c/pgf/parser.c | 2 | ||||
| -rw-r--r-- | src/runtime/c/pgf/reader.c | 20 | ||||
| -rw-r--r-- | src/runtime/c/sg/sg.c | 9 | ||||
| -rw-r--r-- | src/runtime/haskell-bind/PGF2/Expr.hsc | 16 |
8 files changed, 51 insertions, 20 deletions
diff --git a/src/runtime/c/gu/defs.h b/src/runtime/c/gu/defs.h index f5472a414..15bd9e57b 100644 --- a/src/runtime/c/gu/defs.h +++ b/src/runtime/c/gu/defs.h @@ -74,6 +74,8 @@ #ifdef GU_ALIGNOF # define gu_alignof GU_ALIGNOF +#elif defined(_MSC_VER) +# define gu_alignof __alignof #else # define gu_alignof(t_) \ ((size_t)(offsetof(struct { char c_; t_ e_; }, e_))) @@ -87,7 +89,7 @@ #define GU_COMMA , -#define GU_ARRAY_LEN(t,a) (sizeof((const t[])a) / sizeof(t)) +#define GU_ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) #define GU_ID(...) __VA_ARGS__ @@ -193,9 +195,13 @@ typedef union { void (*fp)(); } GuMaxAlign; +#if defined(_MSC_VER) +#include <malloc.h> +#define gu_alloca(N) alloca(N) +#else #define gu_alloca(N) \ (((union { GuMaxAlign align_; uint8_t buf_[N]; }){{0}}).buf_) - +#endif // For Doxygen #define GU_PRIVATE /** @private */ diff --git a/src/runtime/c/gu/mem.h b/src/runtime/c/gu/mem.h index f26e4d3a4..1d4a52bf9 100644 --- a/src/runtime/c/gu/mem.h +++ b/src/runtime/c/gu/mem.h @@ -57,7 +57,7 @@ gu_local_pool_(uint8_t* init_buf, size_t sz); /// Create a pool where each chunk is corresponds to one or /// more pages. -GU_API GuPool* +GU_API_DECL GuPool* gu_new_page_pool(void); /// Create a pool stored in a memory mapped file. @@ -204,7 +204,7 @@ gu_mem_buf_realloc( size_t* real_size_out); /// Allocate enough memory pages to contain min_size bytes. -GU_API void* +GU_API_DECL void* gu_mem_page_alloc(size_t min_size, size_t* real_size_out); /// Free a memory buffer. diff --git a/src/runtime/c/gu/seq.h b/src/runtime/c/gu/seq.h index 3b345be61..b639369c3 100644 --- a/src/runtime/c/gu/seq.h +++ b/src/runtime/c/gu/seq.h @@ -183,7 +183,7 @@ gu_buf_heapify(GuBuf *buf, GuOrder *order); GU_API_DECL GuSeq* gu_buf_freeze(GuBuf* buf, GuPool* pool); -GU_API void +GU_API_DECL void gu_buf_evacuate(GuBuf* buf, GuPool* pool); #endif // GU_SEQ_H_ diff --git a/src/runtime/c/pgf/expr.h b/src/runtime/c/pgf/expr.h index e560d3a83..b775bd9b5 100644 --- a/src/runtime/c/pgf/expr.h +++ b/src/runtime/c/pgf/expr.h @@ -197,16 +197,16 @@ pgf_literal_hash(GuHash h, PgfLiteral lit); PGF_API_DECL GuHash pgf_expr_hash(GuHash h, PgfExpr e); -PGF_API size_t +PGF_API_DECL size_t pgf_expr_size(PgfExpr expr); -PGF_API GuSeq* +PGF_API_DECL GuSeq* pgf_expr_functions(PgfExpr expr, GuPool* pool); -PGF_API PgfExpr +PGF_API_DECL PgfExpr pgf_expr_substitute(PgfExpr expr, GuSeq* meta_values, GuPool* pool); -PGF_API PgfType* +PGF_API_DECL PgfType* pgf_type_substitute(PgfType* type, GuSeq* meta_values, GuPool* pool); typedef struct PgfPrintContext PgfPrintContext; diff --git a/src/runtime/c/pgf/parser.c b/src/runtime/c/pgf/parser.c index 20deba9da..cb59b2a55 100644 --- a/src/runtime/c/pgf/parser.c +++ b/src/runtime/c/pgf/parser.c @@ -10,7 +10,7 @@ #include <math.h> #include <stdlib.h> -#define PGF_PARSER_DEBUG +//#define PGF_PARSER_DEBUG //#define PGF_COUNTS_DEBUG //#define PGF_RESULT_DEBUG diff --git a/src/runtime/c/pgf/reader.c b/src/runtime/c/pgf/reader.c index d7094c9d5..82b6f8abf 100644 --- a/src/runtime/c/pgf/reader.c +++ b/src/runtime/c/pgf/reader.c @@ -328,16 +328,20 @@ pgf_read_patt(PgfReader* rdr) uint8_t tag = pgf_read_tag(rdr); switch (tag) { case PGF_PATT_APP: { - PgfPattApp *papp = - gu_new_variant(PGF_PATT_APP, - PgfPattApp, - &patt, rdr->opool); - papp->ctor = pgf_read_cid(rdr, rdr->opool); + PgfCId ctor = pgf_read_cid(rdr, rdr->opool); gu_return_on_exn(rdr->err, gu_null_variant); - - papp->n_args = pgf_read_len(rdr); + + size_t n_args = pgf_read_len(rdr); gu_return_on_exn(rdr->err, gu_null_variant); - + + PgfPattApp *papp = + gu_new_flex_variant(PGF_PATT_APP, + PgfPattApp, + args, n_args, + &patt, rdr->opool); + papp->ctor = ctor; + papp->n_args = n_args; + for (size_t i = 0; i < papp->n_args; i++) { papp->args[i] = pgf_read_patt(rdr); gu_return_on_exn(rdr->err, gu_null_variant); diff --git a/src/runtime/c/sg/sg.c b/src/runtime/c/sg/sg.c index bcb97f55e..b5a473b99 100644 --- a/src/runtime/c/sg/sg.c +++ b/src/runtime/c/sg/sg.c @@ -499,14 +499,17 @@ store_expr(SgSG* sg, PgfExprLit* elit = ei.data; Mem mem[2]; + size_t len = 0; GuVariantInfo li = gu_variant_open(elit->lit); switch (li.tag) { case PGF_LITERAL_STR: { PgfLiteralStr* lstr = li.data; + len = strlen(lstr->val); + mem[0].flags = MEM_Str; - mem[0].n = strlen(lstr->val); + mem[0].n = len; mem[0].z = lstr->val; break; } @@ -515,6 +518,7 @@ store_expr(SgSG* sg, mem[0].flags = MEM_Int; mem[0].u.i = lint->val; + len = sizeof(mem[0].u.i); break; } case PGF_LITERAL_FLT: { @@ -522,6 +526,7 @@ store_expr(SgSG* sg, mem[0].flags = MEM_Real; mem[0].u.r = lflt->val; + len = sizeof(mem[0].u.r); break; } default: @@ -556,7 +561,7 @@ store_expr(SgSG* sg, int serial_type_arg = sqlite3BtreeSerialType(&mem[1], file_format); int serial_type_arg_hdr_len = sqlite3BtreeVarintLen(serial_type_arg); - unsigned char* buf = malloc(1+serial_type_lit_hdr_len+(serial_type_arg_hdr_len > 1 ? serial_type_arg_hdr_len : 1)+mem[0].n+8); + unsigned char* buf = malloc(1+serial_type_lit_hdr_len+(serial_type_arg_hdr_len > 1 ? serial_type_arg_hdr_len : 1)+len+8); unsigned char* p = buf; *p++ = 1+serial_type_lit_hdr_len+serial_type_arg_hdr_len; p += putVarint32(p, serial_type_lit); diff --git a/src/runtime/haskell-bind/PGF2/Expr.hsc b/src/runtime/haskell-bind/PGF2/Expr.hsc index 096d15bfa..85e55ab40 100644 --- a/src/runtime/haskell-bind/PGF2/Expr.hsc +++ b/src/runtime/haskell-bind/PGF2/Expr.hsc @@ -6,7 +6,9 @@ import System.IO.Unsafe(unsafePerformIO) import Foreign hiding (unsafePerformIO) import Foreign.C import Data.IORef +import Data.Data import PGF2.FFI +import Data.Maybe(fromJust) -- | An data type that represents -- identifiers for functions and categories in PGF. @@ -42,6 +44,20 @@ instance Eq Expr where e1_touch >> e2_touch return (res /= 0) +instance Data Expr where + gfoldl f z e = z (fromJust . readExpr) `f` (showExpr [] e) + toConstr _ = readExprConstr + gunfold k z c = case constrIndex c of + 1 -> k (z (fromJust . readExpr)) + _ -> error "gunfold" + dataTypeOf _ = exprDataType + +readExprConstr :: Constr +readExprConstr = mkConstr exprDataType "(fromJust . readExpr)" [] Prefix + +exprDataType :: DataType +exprDataType = mkDataType "PGF2.Expr" [readExprConstr] + -- | Constructs an expression by lambda abstraction mkAbs :: BindType -> CId -> Expr -> Expr mkAbs bind_type var (Expr body bodyTouch) = |
