Commit 1ba7cd44 authored by John van Groningen's avatar John van Groningen
Browse files

generate ea entry for boxed records, fixes jmp_eval_upd in lazy selectors

for fields (in other records) with this record type
parent 5f2dae3d
...@@ -890,7 +890,7 @@ static void GenerateConstructorDescriptorAndFunction (ConstructorList constructo ...@@ -890,7 +890,7 @@ static void GenerateConstructorDescriptorAndFunction (ConstructorList constructo
static void GenLazyRecordEntry (SymbDef rdef) static void GenLazyRecordEntry (SymbDef rdef)
{ {
LabDef record_label,d_label; LabDef record_label,d_label,ea_label,*ea_label_p;
States argstates; States argstates;
int asp,bsp,arity; int asp,bsp,arity;
int maxasize,asize,bsize; int maxasize,asize,bsize;
...@@ -902,21 +902,36 @@ static void GenLazyRecordEntry (SymbDef rdef) ...@@ -902,21 +902,36 @@ static void GenLazyRecordEntry (SymbDef rdef)
arity = asp; arity = asp;
ConvertSymbolToRecordDandNLabel (&d_label,&CurrentAltLabel,rdef); ConvertSymbolToRecordDandNLabel (&d_label,&CurrentAltLabel,rdef);
if (rdef->sdef_exported)
GenExportEaEntry (rdef);
if (rdef->sdef_boxed_record){
if (rdef->sdef_exported){
GenExportEaEntry (rdef);
MakeSymbolLabel (&ea_label,CurrentModule,ea_pref,rdef,0);
} else {
MakeSymbolLabel (&ea_label,NULL,ea_pref,rdef,0);
}
ea_label_p=&ea_label;
} else
ea_label_p=NULL;
if (DoTimeProfiling) if (DoTimeProfiling)
GenPB (rdef->sdef_ident->ident_name); GenPB (rdef->sdef_ident->ident_name);
GenLazyRecordDescriptorAndExport (rdef); GenLazyRecordDescriptorAndExport (rdef);
GenLazyRecordNodeEntryDirective (arity,&d_label); GenLazyRecordNodeEntryDirective (arity,&d_label,ea_label_p);
GenOAStackLayout (1); GenOAStackLayout (1);
GenLabelDefinition (&CurrentAltLabel); GenLabelDefinition (&CurrentAltLabel);
GenPushNode (ReduceError,asp); GenPushNode (ReduceError,asp);
if (ea_label_p!=NULL){
GenOAStackLayout (arity+1);
if (DoTimeProfiling)
GenPN();
GenLabelDefinition (&ea_label);
}
asize=0; asize=0;
bsize=0; bsize=0;
maxasize=0; maxasize=0;
...@@ -1399,10 +1414,15 @@ Bool NodeEntry (StateS *const function_state_p,int arity,Label ealab,SymbDef roo ...@@ -1399,10 +1414,15 @@ Bool NodeEntry (StateS *const function_state_p,int arity,Label ealab,SymbDef roo
} }
#endif #endif
} else if (function_state_p[-1].state_kind==StrictRedirection || function_state_p[-1].state_kind==LazyRedirection){ } else if (function_state_p[-1].state_kind==StrictRedirection || function_state_p[-1].state_kind==LazyRedirection){
#ifdef JMP_UPD
GenDAStackLayout (arity);
GenJmpUpd (ealab);
#else
CallEvalArgsEntry (arity,function_state_p,1,0,ealab); CallEvalArgsEntry (arity,function_state_p,1,0,ealab);
GenFillFromA (0, 1, ReleaseAndFill); GenFillFromA (0, 1, ReleaseAndFill);
GenPopA (1); GenPopA (1);
GenRtn (1,0,OnAState); GenRtn (1,0,OnAState);
#endif
} }
} else { } else {
int asize, bsize; int asize, bsize;
...@@ -1560,10 +1580,19 @@ Bool NodeEntryUnboxed (StateS *const function_state_p,NodeP call_node_p,int args ...@@ -1560,10 +1580,19 @@ Bool NodeEntryUnboxed (StateS *const function_state_p,NodeP call_node_p,int args
} }
# endif # endif
} else if (function_state_p[-1].state_kind==StrictRedirection || function_state_p[-1].state_kind==LazyRedirection){ } else if (function_state_p[-1].state_kind==StrictRedirection || function_state_p[-1].state_kind==LazyRedirection){
#ifdef JMP_UPD
if (args_b_size==0){
GenDAStackLayout (args_a_size);
GenJmpUpd (ealab);
} else {
#endif
CallEvalArgsEntryUnboxed (args_a_size,args_b_size,call_node_p->node_arguments,function_state_p,1,0,ealab); CallEvalArgsEntryUnboxed (args_a_size,args_b_size,call_node_p->node_arguments,function_state_p,1,0,ealab);
GenFillFromA (0, 1, ReleaseAndFill); GenFillFromA (0, 1, ReleaseAndFill);
GenPopA (1); GenPopA (1);
GenRtn (1,0,OnAState); GenRtn (1,0,OnAState);
#ifdef JMP_UPD
}
#endif
} }
} else { } else {
int asize, bsize; int asize, bsize;
......
...@@ -643,6 +643,8 @@ enum { ...@@ -643,6 +643,8 @@ enum {
#define Ijmp_eval "jmp_eval" #define Ijmp_eval "jmp_eval"
#define Ijmp_eval_upd "jmp_eval_upd" #define Ijmp_eval_upd "jmp_eval_upd"
#define Ijmp_ap "jmp_ap" #define Ijmp_ap "jmp_ap"
#define Ijmp_ap_upd "jmp_ap_upd"
#define Ijmp_upd "jmp_upd"
#define Ihalt "halt" #define Ihalt "halt"
...@@ -2211,6 +2213,18 @@ void GenJmpAp (int n_args) ...@@ -2211,6 +2213,18 @@ void GenJmpAp (int n_args)
put_arguments_n_b (n_args); put_arguments_n_b (n_args);
} }
void GenJmpApUpd (int n_args)
{
put_instruction_b (jmp_ap_upd);
put_arguments_n_b (n_args);
}
void GenJmpUpd (Label tolab)
{
put_instruction_b (jmp_upd);
GenLabel (tolab);
}
void GenPopA (int nr) void GenPopA (int nr)
{ {
if (nr > 0){ if (nr > 0){
...@@ -2660,7 +2674,7 @@ void GenApplyEntryDirective (int arity,Label label) ...@@ -2660,7 +2674,7 @@ void GenApplyEntryDirective (int arity,Label label)
} }
#endif #endif
void GenLazyRecordNodeEntryDirective (int arity,Label label) void GenLazyRecordNodeEntryDirective (int arity,Label label,Label label2)
{ {
if (DoStackLayout){ if (DoStackLayout){
put_directive_b (n); put_directive_b (n);
...@@ -2671,6 +2685,11 @@ void GenLazyRecordNodeEntryDirective (int arity,Label label) ...@@ -2671,6 +2685,11 @@ void GenLazyRecordNodeEntryDirective (int arity,Label label)
else else
FPutS (empty_lab.lab_name, OutFile); FPutS (empty_lab.lab_name, OutFile);
if (label2){
FPutC (' ', OutFile);
GenLabel (label2);
}
#ifdef MEMORY_PROFILING_WITH_N_STRING #ifdef MEMORY_PROFILING_WITH_N_STRING
if (DoProfiling && arity>=0 && !DoParallel){ if (DoProfiling && arity>=0 && !DoParallel){
put_directive_ (Dn_string); put_directive_ (Dn_string);
......
...@@ -90,6 +90,8 @@ void GenJsrEval (int offset); ...@@ -90,6 +90,8 @@ void GenJsrEval (int offset);
void GenJsrAp (int n_args); void GenJsrAp (int n_args);
void GenJmpEval (void); void GenJmpEval (void);
void GenJmpAp (int n_args); void GenJmpAp (int n_args);
void GenJmpApUpd (int n_args);
void GenJmpUpd (Label tolab);
void GenPopA (int nr); void GenPopA (int nr);
void GenPopB (int nr); void GenPopB (int nr);
...@@ -162,7 +164,7 @@ void GenApplyEntryDirective (int arity,Label label); ...@@ -162,7 +164,7 @@ void GenApplyEntryDirective (int arity,Label label);
#ifdef NEW_APPLY #ifdef NEW_APPLY
void GenApplyEntryDirective (int arity,Label label); void GenApplyEntryDirective (int arity,Label label);
#endif #endif
void GenLazyRecordNodeEntryDirective (int arity,Label label); void GenLazyRecordNodeEntryDirective (int arity,Label label,Label label2);
void GenFieldNodeEntryDirective (int arity, Label label, Label label2,char *record_name); void GenFieldNodeEntryDirective (int arity, Label label, Label label2,char *record_name);
void GenConstructorDescriptorAndExport (SymbDef sdef); void GenConstructorDescriptorAndExport (SymbDef sdef);
void GenFunctionDescriptorAndExportNodeAndDescriptor (SymbDef sdef); void GenFunctionDescriptorAndExportNodeAndDescriptor (SymbDef sdef);
......
...@@ -1159,6 +1159,12 @@ void ExamineTypesAndLhsOfSymbolDefinition (SymbDef def) ...@@ -1159,6 +1159,12 @@ void ExamineTypesAndLhsOfSymbolDefinition (SymbDef def)
for_l (fields,def->sdef_type->type_fields,fl_next) for_l (fields,def->sdef_type->type_fields,fl_next)
ExamineTypesAndLhsOfSymbolDefinition (fields->fl_symbol->symb_def); ExamineTypesAndLhsOfSymbolDefinition (fields->fl_symbol->symb_def);
if (def->sdef_boxed_record){
def->sdef_calledwithrootnode = True;
def->sdef_returnsnode = True;
return;
}
rootstate = def->sdef_record_state; rootstate = def->sdef_record_state;
break; break;
} }
...@@ -1717,7 +1723,7 @@ static Bool ArgsInAStrictContext (StateP arg_state_p,Args argn, int local_scope) ...@@ -1717,7 +1723,7 @@ static Bool ArgsInAStrictContext (StateP arg_state_p,Args argn, int local_scope)
#if BOXED_RECORDS #if BOXED_RECORDS
if (record_sdef->sdef_boxed_record){ if (record_sdef->sdef_boxed_record){
StateS boxed_record_state; StateS boxed_record_state;
SetUnaryState (&boxed_record_state,StrictOnA,RecordObj); SetUnaryState (&boxed_record_state,StrictOnA,RecordObj);
if (DetermineStrictArgContext (arg, boxed_record_state,local_scope)) if (DetermineStrictArgContext (arg, boxed_record_state,local_scope))
parallel = True; parallel = True;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment