diff options
author | johnvg | 2002-03-20 12:52:06 +0000 |
---|---|---|
committer | johnvg | 2002-03-20 12:52:06 +0000 |
commit | 267c8efee880e72a24e6d331e82b8ce0af62f854 (patch) | |
tree | b74372f56ab485f1f5cf0d6dc78478cf71589669 | |
parent | - bug fix: added a forgotten alternative to function convertDynamics for (diff) |
bug fix for record updates in a lazy context with unboxed tuple fields
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1056 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r-- | backendC/CleanCompilerSources/codegen.c | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/backendC/CleanCompilerSources/codegen.c b/backendC/CleanCompilerSources/codegen.c index 3dbee5f..cc9e8a1 100644 --- a/backendC/CleanCompilerSources/codegen.c +++ b/backendC/CleanCompilerSources/codegen.c @@ -4,6 +4,7 @@ #define SHARE_UPDATE_CODE 0 /* also in codegen1.c */ #define SELECTORS_FIRST 1 /* also in codegen2.c */ #define UNBOXED_RECORDS_IN_UNBOXED_CLOSURES 1 /* 1 if UNBOX_UPDATE_FUNCTION_ARGUMENTS */ +#define UNBOXED_TUPLES_IN_UNBOXED_CLOSURES 1 /* 1 if UNBOX_UPDATE_FUNCTION_ARGUMENTS */ #include "compiledefines.h" #include "types.t" @@ -400,9 +401,11 @@ static void EvaluateArgumentsForFunctionWithUnboxedArguments (int n_states,State return; else { #if UNBOXED_RECORDS_IN_UNBOXED_CLOSURES - if (call_arg->arg_state.state_type==SimpleState && call_arg->arg_state.state_kind==OnB){ - EvaluateArgumentsForFunctionWithUnboxedArguments (n_states-1,arg_state_p+1,asp_p,a_index,call_arg->arg_next); - return; + if (call_arg->arg_state.state_type==SimpleState){ + if (call_arg->arg_state.state_kind==OnB){ + EvaluateArgumentsForFunctionWithUnboxedArguments (n_states-1,arg_state_p+1,asp_p,a_index,call_arg->arg_next); + return; + } } else if (call_arg->arg_state.state_type==RecordState){ int a_size,b_size; @@ -412,7 +415,18 @@ static void EvaluateArgumentsForFunctionWithUnboxedArguments (int n_states,State EvaluateArgumentsForFunctionWithUnboxedArguments (n_states-1,arg_state_p+1,asp_p,a_index,call_arg->arg_next); return; } - +# if UNBOXED_TUPLES_IN_UNBOXED_CLOSURES + else if (call_arg->arg_state.state_type==TupleState){ + int a_size,b_size; + + DetermineSizeOfStates (call_arg->arg_state.state_arity,call_arg->arg_state.state_tuple_arguments,&a_size,&b_size); + a_index -= a_size; + + EvaluateArgumentsForFunctionWithUnboxedArguments (n_states-1,arg_state_p+1,asp_p,a_index,call_arg->arg_next); + return; + } +# endif + EvaluateArgumentsForFunctionWithUnboxedArguments (n_states-1,arg_state_p+1,asp_p,a_index-1,call_arg->arg_next); EvaluateArgumentIfNecesary (*arg_state_p,asp_p,a_index,!IsLazyState (call_arg->arg_state) ? &call_arg->arg_state : state_of_node_or_node_id (call_arg->arg_node)); #else @@ -451,6 +465,19 @@ static void MoveArgumentsToBStack (StateS src_state,StateS dest_state, arity = dest_state.state_arity; dest_states = dest_state.state_tuple_arguments; +#if UNBOXED_TUPLES_IN_UNBOXED_CLOSURES + if (src_state.state_type==TupleState){ + int asize,bsize,element_n; + + DetermineSizeOfStates (arity,dest_state.state_tuple_arguments,&asize,&bsize); + + for (element_n=asize-1; element_n>=0; --element_n) + PutInAFrames (a_index-element_n,dest_asp_p); + PutInBFrames (b_index,dest_bsp_p,bsize); + return; + } +#endif + if (*old_asp_p==a_index) --*old_asp_p; @@ -516,9 +543,14 @@ static void MoveArgumentsForFunctionWithUnboxedArguments (int n_states,StateP st else { int next_a_index,next_b_index; - if (call_arg->arg_state.state_type==SimpleState && call_arg->arg_state.state_kind==OnB){ - next_a_index=a_index; - next_b_index=b_index-ObjectSizes[call_arg->arg_state.state_object]; + if (call_arg->arg_state.state_type==SimpleState){ + if (call_arg->arg_state.state_kind==OnB){ + next_a_index=a_index; + next_b_index=b_index-ObjectSizes[call_arg->arg_state.state_object]; + } else { + next_a_index=a_index-1; + next_b_index=b_index; + } #if UNBOXED_RECORDS_IN_UNBOXED_CLOSURES } else if (call_arg->arg_state.state_type==RecordState){ int a_size,b_size; @@ -528,6 +560,15 @@ static void MoveArgumentsForFunctionWithUnboxedArguments (int n_states,StateP st next_a_index=a_index-a_size; next_b_index=b_index-b_size; #endif +#if UNBOXED_TUPLES_IN_UNBOXED_CLOSURES + } else if (call_arg->arg_state.state_type==TupleState){ + int a_size,b_size; + + DetermineSizeOfStates (call_arg->arg_state.state_arity,call_arg->arg_state.state_tuple_arguments,&a_size,&b_size); + + next_a_index=a_index-a_size; + next_b_index=b_index-b_size; +#endif } else { next_a_index=a_index-1; next_b_index=b_index; |