From c64eed571eea10d8e122e5eb173038677014313b Mon Sep 17 00:00:00 2001 From: Per Hedbor <ph@opera.com> Date: Wed, 13 Aug 2014 18:25:38 +0200 Subject: [PATCH] For now: Add automatic softcast nodes for += with friends The actual assignment was never typechecked before. So now everything works like it used to again. --- src/treeopt.in | 77 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 11 deletions(-) diff --git a/src/treeopt.in b/src/treeopt.in index cb7f9f086d..d500457736 100644 --- a/src/treeopt.in +++ b/src/treeopt.in @@ -1612,14 +1612,69 @@ F_LOOP(0 = +[ !depend_p($$, $$)] } ; -// convert all X_EQ(1,2) to $1 = $1 X $2 -F_ADD_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`+", $0, $1 ), $0 ); }; -F_AND_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`&", $0, $1 ), $0 ); }; -F_OR_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`|", $0, $1 ), $0 ); }; -F_XOR_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`^", $0, $1 ), $0 ); }; -F_LSH_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`<<", $0, $1 ), $0 ); }; -F_RSH_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`>>", $0, $1 ), $0 ); }; -F_SUB_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`-", $0, $1 ), $0 ); }; -F_MULT_EQ(0,1): { $$ = mknode( F_ASSIGN, mkopernode( "`*", $0, $1 ), $0 ); }; -F_MOD_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`%", $0, $1 ), $0 ); }; -F_DIV_EQ(0,1) : { $$ = mknode( F_ASSIGN, mkopernode( "`/", $0, $1 ), $0 ); }; +// convert all X_EQ(1,2) to $1 = $1 X $2 +F_ADD_EQ(0,1) : { + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`+", $0, $1 )), $0 ); +}; + +F_SUB_EQ(0,1) : { + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`-", $0, $1 )), $0 ); +}; + +F_AND_EQ(0,1) : { + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`&", $0, $1 )), $0 ); +}; + +F_OR_EQ(0,1) : { + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`|", $0, $1 )), $0 ); +}; + +F_XOR_EQ(0,1) : +{ + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`^", $0, $1 )), $0 ); +}; + +F_LSH_EQ(0,1) : +{ + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`<<", $0, $1)), $0 ); +}; + +F_RSH_EQ(0,1) : +{ + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`>>", $0, $1)), $0 ); +}; + +F_MULT_EQ(0,1): +{ + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`*", $0, $1 )), $0 ); +}; + +F_MOD_EQ(0,1) : +{ + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`%", $0, $1 )), $0 ); +}; + +F_DIV_EQ(0,1) : +{ + struct pike_type *type = $0->type; + add_ref(type); + $$ = mknode( F_ASSIGN, mksoftcastnode(type,mkopernode( "`/", $0, $1 )), $0 ); +}; -- GitLab