Skip to content

Commit

Permalink
add OPddtor
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright committed Mar 13, 2011
1 parent 5740671 commit dbd4aa7
Show file tree
Hide file tree
Showing 14 changed files with 66 additions and 10 deletions.
5 changes: 3 additions & 2 deletions src/backend/cdef.h
Expand Up @@ -958,8 +958,9 @@ union eve
#if MARS
struct
{
void *Edecl; // OPdctor: VarDeclaration being constructed
} ed;
elem *Eleft; // left child for OPddtor
void *Edecl; // VarDeclaration being constructed
} ed; // OPdctor,OPddtor
#endif
}; // variants for each type of elem

Expand Down
5 changes: 4 additions & 1 deletion src/backend/cgcs.c
Expand Up @@ -269,6 +269,7 @@ STATIC void ecom(elem **pe)
#if TX86
case OPinp: /* never CSE the I/O instruction itself */
#endif
case OPdctor:
ecom(&e->E1);
/* FALL-THROUGH */
case OPasm:
Expand All @@ -278,7 +279,9 @@ STATIC void ecom(elem **pe)
case OPctor:
case OPdtor:
case OPmark:
case OPdctor:
return;

case OPddtor:
return;

case OPparam:
Expand Down
9 changes: 9 additions & 0 deletions src/backend/cgelem.c
Expand Up @@ -4018,6 +4018,15 @@ elem *elpair(elem *e)
return e;
}

/********************************
* Handle OPddtor
*/

elem *elddtor(elem *e)
{
return e;
}

/********************************
* Handle OPinfo, OPmark, OPctor, OPdtor
*/
Expand Down
10 changes: 10 additions & 0 deletions src/backend/cod2.c
Expand Up @@ -4654,6 +4654,16 @@ code *cddctor(elem *e,regm_t *pretregs)
return NULL;
}

/*******************************************
* D destructor.
*/

code *cdddtor(elem *e,regm_t *pretregs)
{
return NULL;
}


/*******************************************
* C++ constructor.
*/
Expand Down
1 change: 1 addition & 0 deletions src/backend/code.h
Expand Up @@ -711,6 +711,7 @@ cd_t cdpost;
cd_t cderr;
cd_t cdinfo;
cd_t cddctor;
cd_t cdddtor;
cd_t cdctor;
cd_t cddtor;
cd_t cdmark;
Expand Down
21 changes: 20 additions & 1 deletion src/backend/el.c
Expand Up @@ -2385,7 +2385,7 @@ elem * el_const(tym_t ty,union eve *pconst)
/**************************
* Insert constructor information into tree.
* e code to construct the object
* var VarDeclaration of variable being constructed
* decl VarDeclaration of variable being constructed
*/

#if MARS
Expand All @@ -2403,6 +2403,25 @@ elem *el_dctor(elem *e,void *decl)
}
#endif

/**************************
* Insert destructor information into tree.
* e code to destruct the object
* decl VarDeclaration of variable being destructed
* (must match decl for corresponding OPctor)
*/

#if MARS
elem *el_ddtor(elem *e,void *decl)
{
elem *edtor = el_calloc();
edtor->Eoper = OPddtor;
edtor->Ety = TYvoid;
edtor->EV.ed.Edecl = decl;
edtor->EV.ed.Eleft = e;
return edtor;
}
#endif

/**************************
* Insert constructor information into tree.
* ector pointer to object being constructed
Expand Down
3 changes: 2 additions & 1 deletion src/backend/el.h
@@ -1,5 +1,5 @@
// Copyright (C) 1985-1995 by Symantec
// Copyright (C) 2000-2010 by Digital Mars
// Copyright (C) 2000-2011 by Digital Mars
// All Rights Reserved
// http://www.digitalmars.com
// Written by Walter Bright
Expand Down Expand Up @@ -223,6 +223,7 @@ elem_p el_long(tym_t,targ_long);
int ERTOL(elem_p);
int el_noreturn(elem_p);
elem *el_dctor(elem *e,void *decl);
elem *el_ddtor(elem *e,void *decl);
elem *el_ctor(elem *ector,elem *e,symbol *sdtor);
elem *el_dtor(elem *edtor,elem *e);
elem *el_zero(type *t);
Expand Down
2 changes: 1 addition & 1 deletion src/backend/gdag.c
@@ -1,5 +1,5 @@
// Copyright (C) 1986-1998 by Symantec
// Copyright (C) 2000-2009 by Digital Mars
// Copyright (C) 2000-2011 by Digital Mars
// All Rights Reserved
// http://www.digitalmars.com
// Written by Walter Bright
Expand Down
7 changes: 7 additions & 0 deletions src/backend/glocal.c
Expand Up @@ -165,6 +165,13 @@ STATIC void local_exp(elem *e,int goal)
loctop = 0; // don't move expressions across ctor/dtor
break; // boundaries, it would goof up EH cleanup

case OPddtor:
loctop = 0; // don't move expressions across ctor/dtor
// boundaries, it would goof up EH cleanup
local_exp(e->E1,0);
loctop = 0;
break;

case OPeq:
case OPstreq:
e1 = e->E1;
Expand Down
3 changes: 2 additions & 1 deletion src/backend/gloop.c
@@ -1,5 +1,5 @@
// Copyright (C) 1985-1998 by Symantec
// Copyright (C) 2000-2009 by Digital Mars
// Copyright (C) 2000-2011 by Digital Mars
// All Rights Reserved
// http://www.digitalmars.com
// Written by Walter Bright
Expand Down Expand Up @@ -1292,6 +1292,7 @@ STATIC void markinvar(elem *n,vec_t rd)
case OPctor:
case OPdtor:
case OPdctor:
case OPddtor:
case OPhalt:
case OPgot: // shouldn't OPgot be makeLI ?
break;
Expand Down
2 changes: 1 addition & 1 deletion src/backend/gother.c
@@ -1,5 +1,5 @@
// Copyright (C) 1986-1998 by Symantec
// Copyright (C) 2000-2010 by Digital Mars
// Copyright (C) 2000-2011 by Digital Mars
// All Rights Reserved
// http://www.digitalmars.com
// Written by Walter Bright
Expand Down
2 changes: 2 additions & 0 deletions src/backend/oper.h
Expand Up @@ -262,6 +262,8 @@ TARGET_CONVERSION_OPS
OPdtor,
OPmark,
OPdctor, // D constructor
OPddtor, // D destructor

OPpair, // build register pair, E1 is lsb, E2 = msb
OPrpair, // build reversed register pair, E1 is msb, E2 = lsb
OPframeptr, // load pointer to base of frame
Expand Down
4 changes: 3 additions & 1 deletion src/backend/optabgen.c
Expand Up @@ -63,6 +63,7 @@ int _unary[] =
OPinp,OPptrlptr,OPtofar16,OPfromfar16,OParrow,OPnegass,
OPctor,OPdtor,OPsetjmp,OPvoid,OParraylength,
OPbsf,OPbsr,OPbswap,
OPddtor,
};
int _commut[] = {OPadd,OPand,OPor,OPxor,OPmul,OPeqeq,OPne,OPle,OPlt,OPge,OPgt,
OPunord,OPlg,OPleg,OPule,OPul,OPuge,OPug,OPue,OPngt,OPnge,
Expand Down Expand Up @@ -109,7 +110,7 @@ int _sideff[] = {OPasm,OPucall,OPstrcpy,OPmemcpy,OPmemset,OPstrcat,
OPinp,OPoutp,OPnegass,OPctor,OPdtor,OPmark,OPvoid,OPnewarray,
OPmultinewarray,OPcheckcast,OPnullcheck,
OPbtc,OPbtr,OPbts,
OPhalt,OPdctor,
OPhalt,OPdctor,OPddtor,
};
int _rtol[] = {OPeq,OPstreq,OPstrcpy,OPmemcpy,OPpostinc,OPpostdec,OPaddass,
OPminass,OPmulass,OPdivass,OPmodass,OPandass,
Expand Down Expand Up @@ -444,6 +445,7 @@ void dotab()
case OPasm: X("asm", elzot, cdasm);
case OPinfo: X("info", elinfo,cdinfo);
case OPdctor: X("dctor", elzot, cddctor);
case OPddtor: X("ddtor", elddtor, cdddtor);
case OPctor: X("ctor", elinfo,cdctor);
case OPdtor: X("dtor", elinfo,cddtor);
case OPmark: X("mark", elinfo,cdmark);
Expand Down
2 changes: 1 addition & 1 deletion src/backend/out.c
@@ -1,5 +1,5 @@
// Copyright (C) 1984-1998 by Symantec
// Copyright (C) 2000-2009 by Digital Mars
// Copyright (C) 2000-2011 by Digital Mars
// All Rights Reserved
// http://www.digitalmars.com
// Written by Walter Bright
Expand Down

0 comments on commit dbd4aa7

Please sign in to comment.