Commit 70ebbfda authored by Laszlo Domoszlai's avatar Laszlo Domoszlai
Browse files

first stub on using typeinfo. need to modify examples.

parent b31ad726
...@@ -15,8 +15,10 @@ ...@@ -15,8 +15,10 @@
#define forward_thunk(thunk, frame_ptr) \ #define forward_thunk(thunk, frame_ptr) \
Thunk* dst = get_dst(frame_ptr); \ Thunk* dst = get_dst(frame_ptr); \
if(dst != NULL){ \
dst->desc = (Desc*) __FORWARD_PTR__; \ dst->desc = (Desc*) __FORWARD_PTR__; \
dst->_forward_ptr = thunk; dst->_forward_ptr = thunk; \
}
#define placeholder() \ #define placeholder() \
push_a(alloc_b()); \ push_a(alloc_b()); \
...@@ -83,20 +85,14 @@ struct Thunk* create_thunk_var(Code* expr, int frame_ptr) ...@@ -83,20 +85,14 @@ struct Thunk* create_thunk_var(Code* expr, int frame_ptr)
return local(frame_ptr, ((VarEntry*) expr)->index); return local(frame_ptr, ((VarEntry*) expr)->index);
} }
struct Thunk* create_thunk_var_strict(Code* expr, int frame_ptr) struct Thunk* create_thunk_var_unboxed(Code* expr, int frame_ptr)
{ {
Thunk* arg = local(frame_ptr, ((VarEntry*) expr)->index); Thunk* arg = local(frame_ptr, ((VarEntry*) expr)->index);
if(arg->desc->unboxable) // unboxable means it is on the B stack // TODO: check if its on heap
{ Thunk* target = (Thunk*) alloc_heap(sizeof (Thunk));
Thunk* target = (Thunk*) alloc_heap(sizeof (Thunk)); memcpy(target, arg, sizeof(Thunk));
memcpy(target, arg, sizeof(Thunk)); return target;
return target;
}
else
{
return arg;
}
} }
struct Thunk* create_thunk_thunk(Code* expr, int frame_ptr) struct Thunk* create_thunk_thunk(Code* expr, int frame_ptr)
...@@ -128,10 +124,11 @@ void set_create_thunk_fun(Code* code) ...@@ -128,10 +124,11 @@ void set_create_thunk_fun(Code* code)
code->create_thunk = create_thunk_app_dyn; code->create_thunk = create_thunk_app_dyn;
break; break;
case CT_VAR: case CT_VAR:
case CT_VAR_STRICT:
code->create_thunk = create_thunk_var; code->create_thunk = create_thunk_var;
break; break;
case CT_VAR_STRICT: case CT_VAR_UNBOXED:
code->create_thunk = create_thunk_var_strict; code->create_thunk = create_thunk_var_unboxed;
break; break;
case CT_THUNK: case CT_THUNK:
code->create_thunk = create_thunk_thunk; code->create_thunk = create_thunk_thunk;
...@@ -312,7 +309,7 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr) ...@@ -312,7 +309,7 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr)
Thunk* thunk = get_dst(root_frame_ptr); Thunk* thunk = get_dst(root_frame_ptr);
int newsize = slice->thunk_size; int newsize = slice->thunk_size;
if (thunk->desc->thunk_size < newsize) { if (thunk != NULL && thunk->desc->thunk_size < newsize) {
Thunk* target = thunk; Thunk* target = thunk;
thunk = (Thunk*) alloc_heap(newsize); thunk = (Thunk*) alloc_heap(newsize);
target->desc = (Desc*) __FORWARD_PTR__; target->desc = (Desc*) __FORWARD_PTR__;
...@@ -336,10 +333,6 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr) ...@@ -336,10 +333,6 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr)
case CT_APP_DYN: case CT_APP_DYN:
{ {
push_a(local(frame_ptr, ((AppEntry*)expr)->var.index)); push_a(local(frame_ptr, ((AppEntry*)expr)->var.index));
//if(!basethunk->desc->hnf) basethunk = basethunk->desc->eval();
//peek_a()->desc->eval();
//Thunk* basethunk = peek_a();
//basethunk->desc->eval();
Thunk** bt = &peek_a(); Thunk** bt = &peek_a();
(*bt)->desc->eval(); (*bt)->desc->eval();
...@@ -397,7 +390,7 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr) ...@@ -397,7 +390,7 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr)
Thunk* thunk = get_dst(root_frame_ptr); Thunk* thunk = get_dst(root_frame_ptr);
int newsize = slice->thunk_size; int newsize = slice->thunk_size;
if (thunk->desc->thunk_size < newsize) { if (thunk != NULL && thunk->desc->thunk_size < newsize) {
Thunk* target = thunk; Thunk* target = thunk;
thunk = (Thunk*) alloc_heap(newsize); thunk = (Thunk*) alloc_heap(newsize);
target->desc = (Desc*) __FORWARD_PTR__; target->desc = (Desc*) __FORWARD_PTR__;
...@@ -428,13 +421,13 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr) ...@@ -428,13 +421,13 @@ void exec(Code* expr, int frame_ptr, int root_frame_ptr)
} }
} }
case CT_VAR_STRICT: case CT_VAR_STRICT:
case CT_VAR_UNBOXED:
{ {
Thunk* arg = local(frame_ptr, ((VarEntry*) expr)->index); Thunk* arg = local(frame_ptr, ((VarEntry*) expr)->index);
assert(is_hnf(arg)); assert(is_hnf(arg));
// TODO: check how often happens if(get_dst(root_frame_ptr) != NULL && arg->desc->unboxable)
if(arg->desc->unboxable)
{ {
memcpy(get_dst(root_frame_ptr), arg, sizeof(Thunk)); memcpy(get_dst(root_frame_ptr), arg, sizeof(Thunk));
} }
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include "thunk.h" #include "thunk.h"
enum CodeType { enum CodeType {
CT_VAR, CT_VAR_STRICT, CT_VAR, CT_VAR_STRICT, CT_VAR_UNBOXED,
CT_APP_PRIM1, CT_APP_PRIM_S, CT_APP_PRIM1, CT_APP_PRIM_S,
CT_APP_PRIM2, CT_APP_PRIM_ST, CT_APP_PRIM_TS, CT_APP_PRIM_SS, CT_APP_PRIM_TA, CT_APP_PRIM_AT, CT_APP_PRIM_AS, CT_APP_PRIM_SA, CT_APP_PRIM2, CT_APP_PRIM_ST, CT_APP_PRIM_TS, CT_APP_PRIM_SS, CT_APP_PRIM_TA, CT_APP_PRIM_AT, CT_APP_PRIM_AS, CT_APP_PRIM_SA,
CT_APP_THUNK, CT_APP_DYN, CT_APP_THUNK, CT_APP_DYN,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define DEBUG_H #define DEBUG_H
//#define DEBUG //#define DEBUG
#define BENCHMARK //#define BENCHMARK
#ifndef DEBUG #ifndef DEBUG
#define NDEBUG #define NDEBUG
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
struct FunEntry { struct FunEntry {
struct Desc base; struct Desc base;
int strictness; int strictness;
int boxing;
union { union {
char* parseCont; char* parseCont;
...@@ -26,7 +27,8 @@ struct SliceEntry { ...@@ -26,7 +27,8 @@ struct SliceEntry {
struct ADTEntry { struct ADTEntry {
struct Desc base; struct Desc base;
int strictness; int strictness;
int boxing;
unsigned int nrConses; // number of constructors in the type unsigned int nrConses; // number of constructors in the type
unsigned int idx; // constructor index unsigned int idx; // constructor index
...@@ -47,13 +49,13 @@ struct CAFEntry { ...@@ -47,13 +49,13 @@ struct CAFEntry {
struct RecordEntry { struct RecordEntry {
struct Desc base; struct Desc base;
int strictness; int strictness;
int boxing;
char** fields; char** fields;
char name[]; char name[];
}; };
struct PrimEntry { struct PrimEntry {
struct Desc base; struct Desc base;
int strictness;
void (*exec)(int frame_ptr); void (*exec)(int frame_ptr);
char name[]; char name[];
}; };
......
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
#define follow_thunk(thunk) if (thunk->desc == (Desc*) __FORWARD_PTR__) thunk = thunk->_forward_ptr; #define follow_thunk(thunk) if (thunk->desc == (Desc*) __FORWARD_PTR__) thunk = thunk->_forward_ptr;
// http://stackoverflow.com/questions/17095324/fastest-way-to-determine-if-an-integer-is-between-two-integers-inclusive-with/17095534#17095534 // http://stackoverflow.com/questions/17095324/fastest-way-to-determine-if-an-integer-is-between-two-integers-inclusive-with/17095534#17095534
//#define inheap(addr) ((unsigned)((int)addr-(int)heap_base_curr) < HEAP_SIZE) #define inheap(addr) ((unsigned)((int)addr-(int)heap_base_curr) < HEAP_SIZE)
#define inheap(addr) ((char*)addr >= heap_base_curr && (char*)addr < (heap_base_curr + HEAP_SIZE)) //#define inheap(addr) ((char*)addr >= heap_base_curr && (char*)addr < (heap_base_curr + HEAP_SIZE))
#define instackb(addr) ((char*)addr >= (char*) &stack_b[0] && (char*)addr < (char*) &stack_b[STACK_SIZE_B]) //#define instackb(addr) ((char*)addr >= (char*) &stack_b[0] && (char*)addr < (char*) &stack_b[STACK_SIZE_B])
int gc_enabled = 1; int gc_enabled = 1;
......
...@@ -100,6 +100,8 @@ int parseDef1(char** ptr) { ...@@ -100,6 +100,8 @@ int parseDef1(char** ptr) {
// 4. field: strictness bits // 4. field: strictness bits
if (!parseInt(ptr, &entry->strictness)) return 0; if (!parseInt(ptr, &entry->strictness)) return 0;
// 5. field: boxing info
if (!parseInt(ptr, &entry->boxing)) return 0;
// set the continuation for stage 2 // set the continuation for stage 2
entry->parseCont = *ptr; entry->parseCont = *ptr;
...@@ -177,6 +179,8 @@ int parseDef1(char** ptr) { ...@@ -177,6 +179,8 @@ int parseDef1(char** ptr) {
// 4. field: strictness bits // 4. field: strictness bits
if (!parseInt(ptr, &entry->strictness)) return 0; if (!parseInt(ptr, &entry->strictness)) return 0;
// 5. field: boxing info
if (!parseInt(ptr, &entry->boxing)) return 0;
// generate slices. avoid function call if arity is zero // generate slices. avoid function call if arity is zero
if (arity > 0) gen_slices(entry_base, (Desc*) entry, arity); if (arity > 0) gen_slices(entry_base, (Desc*) entry, arity);
...@@ -204,7 +208,8 @@ int parseDef1(char** ptr) { ...@@ -204,7 +208,8 @@ int parseDef1(char** ptr) {
if (!parseInt(ptr, &arity)) return 0; if (!parseInt(ptr, &arity)) return 0;
entry->base.arity = arity; entry->base.arity = arity;
if (!parseInt(ptr, &entry->strictness)) return 0; if (!parseInt(ptr, &entry->strictness)) return 0;
if (!parseInt(ptr, &entry->boxing)) return 0;
entry->base.thunk_size = thunk_size_f(arity); entry->base.thunk_size = thunk_size_f(arity);
entry->base.unboxable = false; entry->base.unboxable = false;
entry->base.hnf = true; entry->base.hnf = true;
...@@ -299,6 +304,10 @@ VarEntry* parseVar(char **ptr, VarEntry* target) { ...@@ -299,6 +304,10 @@ VarEntry* parseVar(char **ptr, VarEntry* target) {
entry->base.type = CT_VAR_STRICT; entry->base.type = CT_VAR_STRICT;
entry->base.strict = true; entry->base.strict = true;
break; break;
case 'U': // Strict unboxable var
entry->base.type = CT_VAR_UNBOXED;
entry->base.strict = true;
break;
default: default:
return 0; return 0;
} }
......
...@@ -9,15 +9,6 @@ ...@@ -9,15 +9,6 @@
void __add(int dst_idx) { void __add(int dst_idx) {
Thunk* target = get_dst(dst_idx); Thunk* target = get_dst(dst_idx);
while(target->desc == (Desc*) __FORWARD_PTR__) target = target->_forward_ptr;
if(target->desc->type == FT_ADT)
{
int i =0;
}
target->desc = (Desc*) __INT__; target->desc = (Desc*) __INT__;
target->_int = readI(arg(2)) + readI(arg(1)); target->_int = readI(arg(2)) + readI(arg(1));
} }
...@@ -60,12 +51,6 @@ void __geC(int dst_idx) { ...@@ -60,12 +51,6 @@ void __geC(int dst_idx) {
void __eqI(int dst_idx) { void __eqI(int dst_idx) {
Thunk* target = get_dst(dst_idx); Thunk* target = get_dst(dst_idx);
if(target->desc != NULL && target->desc->type == FT_ADT)
{
int i =0;
}
target->desc = (Desc*) __BOOL__; target->desc = (Desc*) __BOOL__;
target->_bool = readI(arg(2)) == readI(arg(1)); target->_bool = readI(arg(2)) == readI(arg(1));
} }
...@@ -118,7 +103,7 @@ void __C2I(int dst_idx) { ...@@ -118,7 +103,7 @@ void __C2I(int dst_idx) {
target->_int = readC(arg(1)); target->_int = readC(arg(1));
} }
void add_prim(int arity, int strictness, char* name, void (*exec)(int)) { void add_prim(int arity, char* name, void (*exec)(int)) {
int nameLength = strlen(name); int nameLength = strlen(name);
// before the PrimEntry there are "arity" number of SliceEntries // before the PrimEntry there are "arity" number of SliceEntries
...@@ -127,7 +112,6 @@ void add_prim(int arity, int strictness, char* name, void (*exec)(int)) { ...@@ -127,7 +112,6 @@ void add_prim(int arity, int strictness, char* name, void (*exec)(int)) {
PrimEntry* entry = (PrimEntry*) (entry_base + arity); PrimEntry* entry = (PrimEntry*) (entry_base + arity);
entry->base.type = arity == 1 ? FT_PRIM1 : FT_PRIM2; entry->base.type = arity == 1 ? FT_PRIM1 : FT_PRIM2;
entry->base.arity = arity; entry->base.arity = arity;
entry->strictness = strictness;
entry->base.thunk_size = thunk_size_f(arity); entry->base.thunk_size = thunk_size_f(arity);
entry->base.hnf = false; entry->base.hnf = false;
entry->exec = exec; entry->exec = exec;
...@@ -143,20 +127,20 @@ void add_prim(int arity, int strictness, char* name, void (*exec)(int)) { ...@@ -143,20 +127,20 @@ void add_prim(int arity, int strictness, char* name, void (*exec)(int)) {
} }
void init_prim() { void init_prim() {
add_prim(2, 3, "add", &__add); add_prim(2, "add", &__add);
add_prim(2, 3, "sub", &__sub); add_prim(2, "sub", &__sub);
add_prim(2, 3, "mult", &__mult); add_prim(2, "mult", &__mult);
add_prim(2, 3, "div", &__div); add_prim(2, "div", &__div);
add_prim(2, 3, "gt", &__gt); add_prim(2, "gt", &__gt);
add_prim(2, 3, "geC", &__geC); add_prim(2, "geC", &__geC);
add_prim(2, 3, "lt", &__lt); add_prim(2, "lt", &__lt);
add_prim(2, 3, "eqI", &__eqI); add_prim(2, "eqI", &__eqI);
add_prim(2, 3, "neqI", &__neqI); add_prim(2, "neqI", &__neqI);
add_prim(2, 3, "eqB", &__eqB); add_prim(2, "eqB", &__eqB);
add_prim(2, 3, "eqC", &__eqC); add_prim(2, "eqC", &__eqC);
add_prim(1, 1, "not", &__not); add_prim(1, "not", &__not);
add_prim(2, 3, "and", &__and); add_prim(2, "and", &__and);
add_prim(2, 3, "or", &__or); add_prim(2, "or", &__or);
add_prim(2, 3, "mod", &__mod); add_prim(2, "mod", &__mod);
add_prim(1, 1, "C2I", &__C2I); add_prim(1, "C2I", &__C2I);
} }
...@@ -14,7 +14,8 @@ from Text.Unicode.UChar import instance toChar UChar ...@@ -14,7 +14,8 @@ from Text.Unicode.UChar import instance toChar UChar
import System.CommandLine import System.CommandLine
import System.File import System.File
:: VarType = Local Int Bool :: TypeInfo = Normal | Strict | UnBoxable
:: VarType = Local Int TypeInfo
:: Context = { vars :: Map String VarType :: Context = { vars :: Map String VarType
, localcount :: Int , localcount :: Int
...@@ -22,24 +23,42 @@ import System.File ...@@ -22,24 +23,42 @@ import System.File
, currentFun :: String , currentFun :: String
} }
unBoxableType (Type "I") = True
unBoxableType (Type "C") = True
unBoxableType (Type "B") = True
unBoxableType (Type "R") = True
unBoxableType _ = False
selectCaseOrder (PDefault,_) _ = True selectCaseOrder (PDefault,_) _ = True
selectCaseOrder _ _ = False selectCaseOrder _ _ = False
newContext = {vars = newMap, localcount = 0, inspine = False, currentFun = ""} newContext = {vars = newMap, localcount = 0, inspine = False, currentFun = ""}
typeInfo (TypedVar (StrictVar _ _) type) | unBoxableType type
= UnBoxable
= Strict
typeInfo _ = Normal
registerArgs vars idx [] = vars registerArgs vars idx [] = vars
registerArgs vars idx [v:vs] = registerArgs (put (unpackVar v) (Local idx (isStrictVar v)) vars) (idx + 1) vs registerArgs vars idx [v:vs] = registerArgs (put (unpackVar v) (Local idx (typeInfo v)) vars) (idx + 1) vs
registerLocals vars idx [] = vars registerLocals vars idx [] = vars
registerLocals vars idx [v:vs] = registerLocals (put (unpackVar v) (Local idx (isStrictVar v)) vars) (idx + 1) vs registerLocals vars idx [v:vs] = registerLocals (put (unpackVar v) (Local idx (typeInfo v)) vars) (idx + 1) vs
calcStrictness [] _ = 0 calcStrictness [] _ = 0
calcStrictness [StrictVar _ _:vs] idx = (1 << idx) + calcStrictness vs (idx + 1) calcStrictness [TypedVar (StrictVar _ _) _:vs] idx = (1 << idx) + calcStrictness vs (idx + 1)
calcStrictness [NormalVar _ _:vs] idx = calcStrictness vs (idx + 1) calcStrictness [_:vs] idx = calcStrictness vs (idx + 1)
calcBoxing [] _ = 0
calcBoxing [TypedVar (StrictVar _ _) type:vs] idx | unBoxableType type = (1 << idx) + calcBoxing vs (idx + 1)
calcBoxing [_:vs] idx = calcBoxing vs (idx + 1)
sFunc ctx (FTFunc name body params) a sFunc ctx (FTFunc name body params) a
# ctx = {ctx & vars = registerArgs ctx.vars 0 params, localcount = length params, inspine = True, currentFun = (unpackVar name)} # ctx = {ctx & vars = registerArgs ctx.vars 0 params, localcount = length params, inspine = True, currentFun = (unpackVar name)}
= a <++ "F" <++ sText (unpackVar name) <++ sNum (length params) <++ sNum (calcStrictness params 0) <++ sTerm ctx body = a <++ "F" <++ sText (unpackVar name) <++ sNum (length params)
<++ sNum (calcStrictness params 0) <++ sNum (calcBoxing params 0)
<++ sTerm ctx body
sFunc ctx (FTCAF name body) a sFunc ctx (FTCAF name body) a
# ctx = {ctx & inspine = False, currentFun = (unpackVar name)} # ctx = {ctx & inspine = False, currentFun = (unpackVar name)}
...@@ -47,14 +66,16 @@ sFunc ctx (FTCAF name body) a ...@@ -47,14 +66,16 @@ sFunc ctx (FTCAF name body) a
sFunc ctx (FTRecord name fields) a sFunc ctx (FTRecord name fields) a
# ctx = {ctx & inspine = False, currentFun = (unpackVar name)} # ctx = {ctx & inspine = False, currentFun = (unpackVar name)}
= a <++ "R" <++ sText (unpackVar name) <++ sNum (length fields) <++ sNum (calcStrictness fields 0) <++ sList0 sText (map unpackVar fields) = a <++ "R" <++ sText (unpackVar name) <++ sNum (length fields)
<++ sNum (calcStrictness fields 0) <++ sNum (calcBoxing fields 0)
<++ sList0 sText (map unpackVar fields)
sFunc ctx (FTADT typeName cs) a sFunc ctx (FTADT typeName cs) a
# ctx = {ctx & inspine = False, currentFun = (unpackVar typeName)} # ctx = {ctx & inspine = False, currentFun = (unpackVar typeName)}
= a <++ "A" <++ sList sCon cs = a <++ "A" <++ sList sCon cs
where where
sCon (SaplConstructor name _ params) a sCon (SaplConstructor name _ params) a
= a <++ sText (unpackVar name) <++ sNum (length params) <++ sNum (calcStrictness params 0) = a <++ sText (unpackVar name) <++ sNum (length params) <++ sNum (calcStrictness params 0) <++ sNum (calcBoxing params 0)
sList f es a = a <++ sNum (length es) <++ sList0 f es sList f es a = a <++ sNum (length es) <++ sList0 f es
sList0 f [e] a = a <++ f e sList0 f [e] a = a <++ f e
...@@ -77,8 +98,9 @@ appType ctx var | isLocalVar ctx var ...@@ -77,8 +98,9 @@ appType ctx var | isLocalVar ctx var
appType {inspine, currentFun} var = if (inspine && unpackVar var == currentFun) "T" "A" // T: tail recursive appType {inspine, currentFun} var = if (inspine && unpackVar var == currentFun) "T" "A" // T: tail recursive
// TODO: find constructor for strictness info
sSelectCase ctx (PCons varName params, expr) a sSelectCase ctx (PCons varName params, expr) a
# ctx = {ctx & vars = registerLocals ctx.vars ctx.localcount params, localcount = ctx.localcount + length params} # ctx = {ctx & vars = registerLocals ctx.vars ctx.localcount (map (\p->TypedVar p NoType) params), localcount = ctx.localcount + length params}
= a <++ "C" <++ sText varName <++ sTerm ctx expr = a <++ "C" <++ sText varName <++ sTerm ctx expr
sSelectCase ctx (PLit lit, expr) a sSelectCase ctx (PLit lit, expr) a
= a <++ "L" <++ lit <++ sTerm ctx expr = a <++ "L" <++ lit <++ sTerm ctx expr
...@@ -87,17 +109,19 @@ sSelectCase ctx (PDefault, expr) a ...@@ -87,17 +109,19 @@ sSelectCase ctx (PDefault, expr) a
sVar ctx var a sVar ctx var a
= case get varName ctx.vars of = case get varName ctx.vars of
(Just (Local i True)) = a <++ "S" <++ sNum i (Just (Local i Strict)) = a <++ "S" <++ sNum i
(Just (Local i False)) = a <++ "L" <++ sNum i (Just (Local i UnBoxable)) = a <++ "U" <++ sNum i
_ = a <++ "F" <++ sText varName (Just (Local i Normal)) = a <++ "L" <++ sNum i
_ = a <++ "F" <++ sText varName
where where
varName = unpackVar var varName = unpackVar var
sVarApp ctx var a sVarApp ctx var a
= case get varName ctx.vars of = case get varName ctx.vars of
(Just (Local i True)) = a <++ "VS" <++ sNum i (Just (Local i Strict)) = a <++ "VS" <++ sNum i
(Just (Local i False)) = a <++ "VL" <++ sNum i (Just (Local i UnBoxable)) = a <++ "VS" <++ sNum i
_ = a <++ "A" <++ sList (sTerm ctx) [] <++ sVar ctx var (Just (Local i Normal)) = a <++ "VL" <++ sNum i
_ = a <++ "A" <++ sList (sTerm ctx) [] <++ sVar ctx var
where where
varName = unpackVar var varName = unpackVar var
......
...@@ -398,7 +398,7 @@ OtherModules ...@@ -398,7 +398,7 @@ OtherModules
Fusion: False Fusion: False
Module Module
Name: Control.Applicative Name: Control.Applicative
Dir: {Application}\iTasks-SDK\Dependencies\Platform\OS-Independent Dir: {Application}\iTasks-SDK\Dependencies\clean-platform\src\libraries\OS-Independent
Compiler Compiler
NeverMemoryProfile: False NeverMemoryProfile: False
NeverTimeProfile: False NeverTimeProfile: False
...@@ -412,7 +412,7 @@ OtherModules ...@@ -412,7 +412,7 @@ OtherModules
Fusion: False Fusion: False
Module Module
Name: Control.Monad Name: Control.Monad
Dir: {Application}\iTasks-SDK\Dependencies\Platform\OS-Independent Dir: {Application}\iTasks-SDK\Dependencies\clean-platform\src\libraries\OS-Independent
Compiler Compiler
NeverMemoryProfile: False NeverMemoryProfile: False
NeverTimeProfile: False NeverTimeProfile: False
...@@ -426,7 +426,7 @@ OtherModules ...@@ -426,7 +426,7 @@ OtherModules
Fusion: False Fusion: False
Module Module
Name: Data.Either Name: Data.Either
Dir: {Application}\iTasks-SDK\Dependencies\Platform\OS-Independent Dir: {Application}\iTasks-SDK\Dependencies\clean-platform\src\libraries\OS-Independent
Compiler Compiler
NeverMemoryProfile: False NeverMemoryProfile: False
NeverTimeProfile: False NeverTimeProfile: False
...@@ -440,7 +440,7 @@ OtherModules ...@@ -440,7 +440,7 @@ OtherModules
Fusion: False