summaryrefslogtreecommitdiff
path: root/includes/compiler/CExpr.h
diff options
context:
space:
mode:
authorAsh Wolf <ninji@wuffs.org>2022-11-07 03:06:21 +0000
committerAsh Wolf <ninji@wuffs.org>2022-11-07 03:06:21 +0000
commit9a46dd0e2e80790d9848c0bbd718932a27c23269 (patch)
treee7a8e976c7138d50a69ff4778c4e8572efd94452 /includes/compiler/CExpr.h
parentd0b9848c54e6f85ab713f059dcd1ddef7e57caa6 (diff)
downloadMWCC-9a46dd0e2e80790d9848c0bbd718932a27c23269.tar.gz
MWCC-9a46dd0e2e80790d9848c0bbd718932a27c23269.zip
honk
Diffstat (limited to '')
-rw-r--r--includes/compiler/CExpr.h237
1 files changed, 237 insertions, 0 deletions
diff --git a/includes/compiler/CExpr.h b/includes/compiler/CExpr.h
new file mode 100644
index 0000000..a82e56e
--- /dev/null
+++ b/includes/compiler/CExpr.h
@@ -0,0 +1,237 @@
+#ifndef COMPILER_CEXPR_H
+#define COMPILER_CEXPR_H
+
+#include "compiler/common.h"
+#include "compiler/enode.h"
+#include "compiler/types.h"
+#include "compiler/CScope.h"
+
+#ifdef __MWERKS__
+#pragma options align=mac68k
+#endif
+
+typedef struct ConIteratorList {
+ struct ConIteratorList *next;
+ struct ConIterator *iter;
+} ConIteratorList;
+
+typedef struct ConIterator {
+ struct ConIterator *parent;
+ ConIteratorList *children;
+ TypeClass *tclass;
+} ConIterator;
+
+typedef struct ConversionIterator {
+ CScopeObjectIterator objiter;
+ ConIterator myconiter;
+ ConIterator *coniter;
+} ConversionIterator;
+
+enum {
+ CheckResult0,
+ CheckResult1,
+ CheckResult2,
+ CheckResult3,
+ CheckResult4
+};
+
+// Rename me to StdMatch?
+typedef struct Match5 {
+ short x0;
+ short x2;
+ short x4;
+ short x6;
+ short x8;
+} Match5;
+
+typedef struct Match13 {
+ short x0;
+ short x2;
+ short x4;
+ short x6;
+ short x8;
+ short xA;
+ short xC;
+ short xE;
+ Match5 match5;
+} Match13;
+
+// CExpr.c
+extern Boolean (*name_obj_check)(void *, Object *); // TODO figure out the right type
+extern Boolean disallowgreaterthan;
+
+// CExpr2.c
+extern ENode *assign_node;
+extern Boolean temp_reference_init;
+
+// CExpr.c
+extern void CExpr_RewriteConst();
+extern void optimizecomm(ENode *expr);
+extern short canadd(ENode *expr, SInt32 value);
+extern ENode *checkreference(ENode *expr);
+extern ENode *pointer_generation(ENode *expr);
+extern void CExpr_PointerGeneration();
+extern void oldassignmentpromotion();
+extern ENode *argumentpromotion(ENode *expr, Type *type, short qual, Boolean flag);
+extern ENode *classargument(ENode *expr);
+extern ENodeList *CExpr_ScanExpressionList(Boolean flag);
+extern void CExpr_DoExplicitConversion();
+extern void CExpr_MakeNameLookupResultExpr();
+extern void scansizeof();
+extern void scanalignof();
+extern ENode *getnodeaddress(ENode *expr, Boolean flag);
+extern void getpointertomemberfunc();
+extern void CExpr_New_ELOGNOT_Node();
+extern void CExpr_New_EMONMIN_Node();
+extern void CExpr_New_EBINNOT_Node();
+extern ENode *unary_expression(void);
+extern ENode *do_castnullcheck(ENode *a, ENode *b);
+extern void CExpr_SafeClassPointerCast();
+extern ENode *PointerToMemberCast(ENode *expr, TypeMemberPointer *tm1, TypeMemberPointer *tm2, Boolean flag);
+extern void CExpr_MemberPointerConversion();
+extern ENode *do_typecast(ENode *expr, Type *type, UInt32 qual);
+extern void cast_expression();
+extern void CExpr_New_EMUL_Node();
+extern void CExpr_New_EDIV_Node();
+extern void CExpr_New_EMODULO_Node();
+extern void CExpr_New_EADD_Node();
+extern void CExpr_New_ESUB_Node();
+extern void CExpr_New_ESHL_Node();
+extern void CExpr_New_ESHR_Node();
+extern void CExpr_New_ELESS_Node();
+extern void CExpr_New_ELESSEQU_Node();
+extern void CExpr_New_EGREATER_Node();
+extern void CExpr_New_EGREATEREQU_Node();
+extern ENode *memberpointercompare(ENodeType t, ENode *left, ENode *right);
+extern void CExpr_New_EEQU_Node();
+extern void CExpr_New_ENOTEQU_Node();
+extern void CExpr_New_EAND_Node();
+extern void CExpr_New_EXOR_Node();
+extern void CExpr_New_EOR_Node();
+extern void CExpr_New_ELAND_Node();
+extern void CExpr_New_ELOR_Node();
+extern void CExpr_NewDyadicNode();
+extern void CExpr_New_ECOND_Node();
+extern ENode *assignment_expression(void);
+extern ENode *conv_assignment_expression(void);
+extern void CExpr_CheckUnusedExpression();
+extern void s_expression();
+extern ENode *expression(void);
+extern CInt64 CExpr_IntegralConstExprType(Type **tint);
+extern ENode *CExpr_IntegralConstOrDepExpr(void);
+extern CInt64 CExpr_IntegralConstExpr(void);
+extern void CExpr_CheckUnwantedAssignment();
+extern void CExpr_ParseAsmExpr();
+
+// CExpr2.c
+typedef void (*CExprSearchCB)(ENode *expr);
+typedef ENode *(*CExprReplaceCB)(ENode *expr);
+
+extern void CExpr_SearchExprTree(ENode *expr, CExprSearchCB callback, int count, ...);
+extern ENode *CExpr_SearchExprTreeReplace(ENode *expr, CExprReplaceCB callback, int count, ...);
+extern Boolean CExpr_HasFuncCall(ENode *expr);
+extern void CExpr_AliasTransform(ENode *expr);
+extern ENode *CExpr_UnaryFloatExpression(ENode *expr);
+extern ENode *CExpr_BinaryFloatExpression(ENode *expr);
+extern ENode *CExpr_NewENode(ENodeType ty);
+extern ENode *CExpr_NewTemplDepENode(TemplDepSubType t);
+extern ENode *nullnode(void);
+extern ENode *intconstnode(Type *type, SInt32 value);
+extern ENode *stringconstnode(char *str);
+extern ENode *forceintegral(ENode *expr);
+extern ENode *makemonadicnode(ENode *inner, ENodeType ty);
+extern ENode *makediadicnode(ENode *left, ENode *right, ENodeType ty);
+extern ENode *makecommaexpression(ENode *left, ENode *right);
+extern short iszero(ENode *expr);
+extern short isnotzero(ENode *expr);
+extern Boolean CExpr_IsOne(ENode *expr);
+extern Boolean CExpr_AllBitsSet(ENode *expr);
+extern ENode *CExpr_NewETEMPNode(Type *type, Boolean assign_id);
+extern ENode *CExpr_GetETEMPCopy(ENode *expr);
+extern ENode *integralpromote(ENode *expr);
+extern CInt64 CExpr_IntConstConvert(Type *a, Type *b, CInt64 val);
+extern ENode *promote(ENode *expr, Type *type);
+extern void CExpr_ArithmeticConversion(ENode **left, ENode **right);
+extern ENode *CExpr_TempModifyExpr(ENode *expr);
+extern Boolean CExpr_IsLValue(ENode *expr);
+extern ENode *CExpr_LValue(ENode *expr, Boolean flag1, Boolean flag2);
+extern ENode *CExpr_MakeObjRefNode(Object *obj, Boolean flag);
+extern ENode *create_objectrefnode(Object *obj);
+extern ENode *create_objectnode2(Object *obj);
+extern ENode *create_objectnode(Object *obj);
+extern ENode *CExpr_IsTempConstruction(ENode *expr, Type *type, ENode **resultexpr);
+extern ENode *CExpr_AdjustFunctionCall(ENode *expr);
+extern ENode *funccallexpr(Object *func, ENode *arg1, ENode *arg2, ENode *arg3, ENode *arg4);
+extern ENode *CExpr_FuncCallSix(Object *func, ENode *arg1, ENode *arg2, ENode *arg3, ENode *arg4, ENode *arg5, ENode *arg6);
+extern void CExpr_MatchCV(Type *t1, UInt32 q1, Type *t2, UInt32 q2, Match13 *match);
+extern Boolean CExpr_MatchAssign(Type *type, UInt32 qual, ENode *expr, Match13 *match);
+extern ENode *CExpr_ClassPointerCast(BClassList *cls, ENode *expr, Boolean nullcheckflag);
+extern ENode *CExpr_GetClassAccessNode(BClassList *a, BClassList *b, ENode *expr, Object *obj, AccessType access, Boolean flag);
+extern ENode *CExpr_ConvertToBool(ENode *expr, Boolean flag);
+extern void CExpr_ConversionIteratorInit(ConversionIterator *iter, TypeClass *tclass);
+extern Object *CExpr_ConversionIteratorNext(ConversionIterator *iter);
+extern void user_assign_check();
+extern ENode *CExpr_ConvertToCondition(ENode *expr);
+extern void CExpr_ConvertToIntegral();
+extern void CExpr_CheckArithmConversion();
+extern void get_address_of_temp_copy();
+extern short assign_check(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boolean flag2, Boolean flag3);
+extern void CExpr_MatchCompare();
+extern void CExpr_GetFuncMatchArgs();
+extern ENode *CExpr_GetDefaultArgument(ENode *funcexpr, FuncArg *arg);
+extern ENode *CExpr_VarArgPromotion(ENode *expr, Boolean flag);
+extern void CExpr_GenericFuncCall();
+extern void CExpr_GenericPtmfCall();
+extern void CExpr_MakeFunctionCall();
+extern void CExpr_CheckOperatorConversion();
+extern void CExpr_CheckOperator();
+extern ENode *CExpr_ConstructObject(TypeClass *tclass, ENode *addr_expr, ENodeList *args, Boolean flag1, Boolean flag2, Boolean flag3, Boolean flag4, Boolean flag5);
+extern void scannew();
+extern void scandelete();
+
+// CExprConvMatch.c
+// static void CExpr_GetImplictObjectParamType();
+// static void CExpr_GetParamType();
+// static void CExpr_HasNParams();
+// static void CExpr_TypeCompare();
+// static void CExpr_IsReferenceCompatible();
+// static void CExpr_IsBaseOf();
+// static void CExpr_IsBetterClassConversion();
+// static void CExpr_IsBetterStandardConv();
+// static void CExpr_IsBetterImplicitConv();
+// static void CExpr_SetupStandardConversionResult();
+// static void CExpr_SetQualConversionResult();
+// static void CExpr_OverloadFuncMatch();
+// static void CExpr_StandardConversionMatch();
+// static void CExpr_UserConversion();
+// static void CExpr_UserConversionMatch();
+// static void CExpr_ImplicitConversionMatch();
+extern Boolean CExpr_CanImplicitlyConvert(ENode *expr, Type *type, UInt32 qual);
+// static void CExpr_DerivedToBase();
+// static void CExpr_ClassReferenceConversion();
+// static void CExpr_BindToReference();
+extern ENode *CExpr_Convert(ENode *expr, Type *type, UInt32 qual, Boolean flag1, Boolean flag2);
+extern ENode *CExpr_AssignmentPromotion(ENode *expr, Type *type, UInt32 qual, Boolean flag);
+// static void CExpr_IsBetterMatch();
+// static void CExpr_MatchArgs();
+// static void CExpr_GetMatchObject();
+// static void CExpr_FindBestMatch();
+extern void CExpr_FuncArgMatch();
+// static void CExpr_BuildConversionTypeList();
+// static void CExpr_NextPromotedIntegralType();
+// static void CExpr_NextArithmeticType();
+// static void CExpr_NextPromotedArithmeticType();
+// static void CExpr_MatchBuiltin();
+// static void CExpr_CheckIncDecBuiltin();
+// static void CExpr_CheckUnaryBuiltin();
+// static void CExpr_CheckBinaryBuiltin();
+// static void CExpr_MatchOperands();
+extern void CExpr_CondOperatorMatch();
+extern void CExpr_OperatorMatch();
+// static void CExpr_ClassCopyInit();
+
+#ifdef __MWERKS__
+#pragma options align=reset
+#endif
+
+#endif