static void StructIOItem( sym_id fd ) { //========================================= // Perform i/o of structure field. RTCODE rtn; if( fd->fd.dim_ext == NULL ) { XPush( TmpVal( TmpStructPtr, TY_POINTER ) ); if( fd->fd.typ == FT_CHAR ) { XPush( CGInteger( fd->fd.xt.size, TY_INTEGER ) ); } IORtnTable[ ParmType( fd->fd.typ, fd->fd.xt.size ) ](); CGTrash( CGAssign( TmpPtr( TmpStructPtr, TY_POINTER ), CGBinary( O_PLUS, TmpVal( TmpStructPtr, TY_POINTER ), CGInteger( fd->fd.xt.size, TY_UINT_4 ), TY_POINTER ), TY_POINTER ) ); } else { if( IORtnTable == &OutRtn ) { rtn = RT_PRT_ARRAY; } else { rtn = RT_INP_ARRAY; } if( fd->fd.typ == FT_CHAR ) { ChrArrayIO( rtn + 1, TmpVal( TmpStructPtr, TY_POINTER ), CGInteger( fd->fd.dim_ext->num_elts, TY_INT_4 ), CGInteger( fd->fd.xt.size, TY_INTEGER ) ); } else { NumArrayIO( rtn, TmpVal( TmpStructPtr, TY_POINTER ), CGInteger( fd->fd.dim_ext->num_elts, TY_INT_4 ), ParmType( fd->fd.typ, fd->fd.xt.size ) ); } CGTrash( CGAssign( TmpPtr( TmpStructPtr, TY_POINTER ), CGBinary( O_PLUS, TmpVal( TmpStructPtr, TY_POINTER ), CGInteger( fd->fd.xt.size * fd->fd.dim_ext->num_elts, TY_UINT_4 ), TY_POINTER ), TY_POINTER ) ); } }
/** * Compare two object property maps * @param OrigName The name of the original object being compared against * @param OrigMap The property map for the object * @param CmpName The name of the object to compare * @param CmpMap The property map for the object to compare */ static bool ComparePropertyMaps(FName OrigName, TMap<FString, FString>& OrigMap, FName CmpName, FPropertiesMap& CmpMap, FCompilerResultsLog& Results) { if (OrigMap.Num() != CmpMap.Num()) { Results.Error( *FString::Printf(TEXT("Objects have a different number of properties (%d vs %d)"), OrigMap.Num(), CmpMap.Num()) ); return false; } bool bMatch = true; for (auto PropIt = OrigMap.CreateIterator(); PropIt; ++PropIt) { FString Key = PropIt.Key(); FString Val = PropIt.Value(); const FString* CmpValue = CmpMap.Find(Key); // Value is missing if (CmpValue == NULL) { bMatch = false; Results.Error( *FString::Printf(TEXT("Property is missing in object being compared: (%s %s)"), *Key, *Val) ); break; } else if (Val != *CmpValue) { // string out object names and retest FString TmpCmp(*CmpValue); TmpCmp.ReplaceInline(*CmpName.ToString(), TEXT("")); FString TmpVal(Val); TmpVal.ReplaceInline(*OrigName.ToString(), TEXT("")); if (TmpCmp != TmpVal) { bMatch = false; Results.Error( *FString::Printf(TEXT("Object properties do not match: %s (%s vs %s)"), *Key, *Val, *(*CmpValue)) ); break; } } } return bMatch; }
static void DoStructArrayIO( tmp_handle num_elts, struct field *fieldz ) { //============================================================================ // Perform structure array i/o. label_handle label; label = BENewLabel(); CGControl( O_LABEL, NULL, label ); StructIO( fieldz ); CGControl( O_IF_TRUE, CGCompare( O_NE, CGAssign( TmpPtr( num_elts, TY_INT_4 ), CGBinary( O_MINUS, TmpVal( num_elts, TY_INT_4 ), CGInteger( 1, TY_INTEGER ), TY_INT_4 ), TY_INT_4 ), CGInteger( 0, TY_INTEGER ), TY_INT_4 ), label ); BEFiniLabel( label ); }
void FCSFCall( void ) { //================== // Call a statement function. sym_id sf; sym_id sf_arg; sym_id tmp; cg_type sf_type; cg_name arg_list; cg_name value; cg_cmplx z; obj_ptr curr_obj; sf = GetPtr(); arg_list = NULL; value = NULL; sf_type = 0; for(;;) { sf_arg = GetPtr(); if( sf_arg == NULL ) break; if( sf_arg->u.ns.u1.s.typ == FT_CHAR ) { value = Concat( 1, CGFEName( sf_arg, TY_CHAR ) ); } else { sf_type = F772CGType( sf_arg ); if( TypeCmplx( sf_arg->u.ns.u1.s.typ ) ) { XPopCmplx( &z, sf_type ); sf_type = CmplxBaseType( sf_type ); value = ImagPtr( SymAddr( sf_arg ), sf_type ); CGTrash( CGAssign( value, z.imagpart, sf_type ) ); value = CGFEName( sf_arg, sf_type ); value = CGAssign( value, z.realpart, sf_type ); } else { value = CGFEName( sf_arg, sf_type ); value = CGAssign( value, XPopValue( sf_type ), sf_type ); } } if( arg_list == NULL ) { arg_list = value; } else { arg_list = CGBinary( O_COMMA, arg_list, value, TY_DEFAULT ); } } if( sf->u.ns.u1.s.typ == FT_CHAR ) { tmp = GetPtr(); value = CGUnary( O_POINTS, CGFEName( tmp, TY_CHAR ), TY_CHAR ); value = CGAssign( CGFEName( sf, TY_CHAR ), value, TY_CHAR ); if( arg_list == NULL ) { arg_list = value; } else { arg_list = CGBinary( O_COMMA, arg_list, value, TY_DEFAULT ); } value = CGFEName( tmp, TY_CHAR ); } else { sf_type = F772CGType( sf ); if( !(OZOpts & OZOPT_O_INLINE) ) { value = CGUnary( O_POINTS, CGFEName( sf, sf_type ), sf_type ); } } if( OZOpts & OZOPT_O_INLINE ) { if( arg_list != NULL ) { CGTrash( arg_list ); } curr_obj = FCodeSeek( sf->u.ns.si.sf.u.sequence ); GetObjPtr(); FCodeSequence(); FCodeSeek( curr_obj ); if( sf->u.ns.u1.s.typ == FT_CHAR ) { CGTrash( XPop() ); XPush( value ); } else if( TypeCmplx( sf->u.ns.u1.s.typ ) ) { XPopCmplx( &z, sf_type ); sf_type = CmplxBaseType( sf_type ); XPush( TmpVal( MkTmp( z.imagpart, sf_type ), sf_type ) ); XPush( TmpVal( MkTmp( z.realpart, sf_type ), sf_type ) ); } else { XPush( TmpVal( MkTmp( XPopValue( sf_type ), sf_type ), sf_type ) ); } } else { value = CGWarp( arg_list, GetLabel( sf->u.ns.si.sf.u.location ), value ); // consider: y = f( a, f( b, c, d ), e ) // make sure that inner reference to f gets evaluated before we assign // arguments for outer reference value = CGEval( value ); if( TypeCmplx( sf->u.ns.u1.s.typ ) ) { SplitCmplx( TmpPtr( MkTmp( value, sf_type ), sf_type ), sf_type ); } else { XPush( value ); } RefStmtFunc( sf ); } }