From 450bbcb50fcf3c333b1e0eba38b73d7d0373ecbe Mon Sep 17 00:00:00 2001 From: Spoike Date: Tue, 28 Jul 2015 03:13:00 +0000 Subject: [PATCH] Added emulation for old return array; etc behaviour. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4951 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/qclib/qcc.h | 1 + engine/qclib/qcc_pr_comp.c | 10 +++++++++- engine/qclib/qccmain.c | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/engine/qclib/qcc.h b/engine/qclib/qcc.h index 2a5048546..ddbe5fd45 100644 --- a/engine/qclib/qcc.h +++ b/engine/qclib/qcc.h @@ -586,6 +586,7 @@ extern pbool flag_debugmacros; extern pbool flag_filetimes; extern pbool flag_typeexplicit; extern pbool flag_noboundchecks; +extern pbool flag_brokenarrays; extern pbool flag_guiannotate; extern pbool opt_overlaptemps; diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index 008ce3124..368b6ccc6 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -103,6 +103,7 @@ pbool flag_filetimes; pbool flag_typeexplicit; //no implicit type conversions, you must do the casts yourself. pbool flag_noboundchecks; //Disable generation of bound check instructions. pbool flag_guiannotate; +pbool flag_brokenarrays; //return array; returns array[0] instead of &array; pbool opt_overlaptemps; //reduce numpr_globals by reuse of temps. When they are not needed they are freed for reuse. The way this is implemented is better than frikqcc's. (This is the single most important optimisation) pbool opt_assignments; //STORE_F isn't used if an operation wrote to a temp. @@ -3906,7 +3907,12 @@ QCC_ref_t *QCC_PR_GenerateAddressOf(QCC_ref_t *retbuf, QCC_ref_t *operand) if (operand->type == REF_ARRAYHEAD || operand->type == REF_GLOBAL || operand->type == REF_ARRAY) { if (!QCC_OPCodeValid(&pr_opcodes[OP_GLOBALADDRESS])) - QCC_PR_ParseError (ERR_BADEXTENSION, "Address-of operator is not supported in this form without extensions. Consider the use of: #pragma target fte"); + { + if (operand->type == REF_ARRAYHEAD) + QCC_PR_ParseError (ERR_BADEXTENSION, "Address-of operator is not supported in this form without extensions. Consider the use of either '#pragma target fte' or '#pragma flag enable brokenarray'"); + else + QCC_PR_ParseError (ERR_BADEXTENSION, "Address-of operator is not supported in this form without extensions. Consider the use of: #pragma target fte"); + } //&foo (or &((&foo)[5]), which is basically an array). the result is a temp and thus cannot be assigned to (but should be possible to dereference further). return QCC_PR_BuildRef(retbuf, @@ -6666,6 +6672,8 @@ QCC_ref_t *QCC_PR_ParseRefValue (QCC_ref_t *refbuf, QCC_type_t *assumeclass, pbo QCC_DefToRef(refbuf, d); refbuf->type = REF_ARRAYHEAD; r = QCC_PR_ParseRefArrayPointer(refbuf, refbuf, allowarrayassign, makearraypointers); + if (r->type == REF_ARRAYHEAD && flag_brokenarrays) + r->type = REF_GLOBAL; /*if (r->type == REF_ARRAYHEAD) { r->type = REF_GLOBAL; diff --git a/engine/qclib/qccmain.c b/engine/qclib/qccmain.c index 80e9a2e3c..28f045b19 100644 --- a/engine/qclib/qccmain.c +++ b/engine/qclib/qccmain.c @@ -329,6 +329,7 @@ compiler_flag_t compiler_flag[] = { {&flag_iffloat, FLAG_MIDCOMPILE,"iffloat","if(-0.0) fix","Fixes certain floating point logic."}, {&flag_ifvector, FLAG_MIDCOMPILE|FLAG_ASDEFAULT,"ifvector","if('0 1 0') fix","Fixes conditional vector logic."}, {&flag_vectorlogic, FLAG_MIDCOMPILE|FLAG_ASDEFAULT,"vectorlogic","v&&v||v fix", "Fixes conditional vector logic."}, + {&flag_brokenarrays, FLAG_MIDCOMPILE,"brokenarray", "array[0] omission", "Treat references to arrays as references to the first index of said array, to replicate an old fteqcc bug."}, {&flag_acc, 0, "acc", "Reacc support", "Reacc is a pascall like compiler. It was released before the Quake source was released. This flag has a few effects. It sorts all qc files in the current directory into alphabetical order to compile them. It also allows Reacc global/field distinctions, as well as allows ¦ as EOF. Whilst case insensitivity and lax type checking are supported by reacc, they are seperate compiler flags in fteqcc."}, //reacc like behaviour of src files. {&flag_caseinsensitive, 0, "caseinsens", "Case insensitivity", "Causes fteqcc to become case insensitive whilst compiling names. It's generally not advised to use this as it compiles a little more slowly and provides little benefit. However, it is required for full reacc support."}, //symbols will be matched to an insensitive case if the specified case doesn't exist. This should b usable for any mod {&flag_laxcasts, FLAG_MIDCOMPILE,"lax", "Lax type checks", "Disables many errors (generating warnings instead) when function calls or operations refer to two normally incompatible types. This is required for reacc support, and can also allow certain (evil) mods to compile that were originally written for frikqcc."}, //Allow lax casting. This'll produce loadsa warnings of course. But allows compilation of certain dodgy code.