view dmd2/dump.c @ 1499:df11cdec45a2

Another shot at fixing the issues with (constant) struct literals and their addresses. See DMD2682, #218, #324. The idea is to separate the notion of const from 'this variable can always be replaced with its initializer' in the frontend. To do that, I introduced Declaration::isSameAsInitializer, which is overridden in VarDeclaration to return false for constants that have a struct literal initializer. So {{{ const S s = S(5); void foo() { auto ps = &s; } // is no longer replaced by void foo() { auto ps = &(S(5)); } }}} To make taking the address of a struct constant with a struct-initializer outside of function scope possible, I made sure that AddrExp::optimize doesn't try to run the argument's optimization with WANTinterpret - that'd again replace the constant with a struct literal temporary.
author Christian Kamm <kamm incasoftware de>
date Sun, 14 Jun 2009 19:49:58 +0200
parents 638d16625da2
children
line wrap: on
line source


// Compiler implementation of the D programming language
// Copyright (c) 1999-2006 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// http://www.digitalmars.com
// License for redistribution is by either the Artistic License
// in artistic.txt, or the GNU General Public License in gnu.txt.
// See the included readme.txt for details.

#include <stdio.h>
#include <ctype.h>
#include <assert.h>

#include "mars.h"
#include "mtype.h"
#include "declaration.h"
#include "expression.h"
#include "template.h"

static void indent(int indent)
{
    int i;

    for (i = 0; i < indent; i++)
	printf(" ");
}

static char *type_print(Type *type)
{
    return type ? type->toChars() : (char *) "null";
}

void dumpExpressions(int i, Expressions *exps)
{
    for (size_t j = 0; j < exps->dim; j++)
    {	Expression *e = (Expression *)exps->data[j];
	indent(i);
	printf("(\n");
	e->dump(i + 2);
	indent(i);
	printf(")\n");
    }
}

void Expression::dump(int i)
{
    indent(i);
    printf("%p %s type=%s\n", this, Token::toChars(op), type_print(type));
}

void IntegerExp::dump(int i)
{
    indent(i);
    printf("%p %jd type=%s\n", this, (intmax_t)value, type_print(type));
}

void IdentifierExp::dump(int i)
{
    indent(i);
    printf("%p ident '%s' type=%s\n", this, ident->toChars(), type_print(type));
}

void DsymbolExp::dump(int i)
{
    indent(i);
    printf("%p %s type=%s\n", this, s->toChars(), type_print(type));
}

void VarExp::dump(int i)
{
    indent(i);
    printf("%p %s var=%s type=%s\n", this, Token::toChars(op), var->toChars(), type_print(type));
}

void UnaExp::dump(int i)
{
    indent(i);
    printf("%p %s type=%s e1=%p\n", this, Token::toChars(op), type_print(type), e1);
    if (e1)
	e1->dump(i + 2);
}

void CallExp::dump(int i)
{
    UnaExp::dump(i);
    dumpExpressions(i, arguments);
}

void SliceExp::dump(int i)
{
    indent(i);
    printf("%p %s type=%s e1=%p\n", this, Token::toChars(op), type_print(type), e1);
    if (e1)
	e1->dump(i + 2);
    if (lwr)
	lwr->dump(i + 2);
    if (upr)
	upr->dump(i + 2);
}

void DotIdExp::dump(int i)
{
    indent(i);
    printf("%p %s type=%s ident=%s e1=%p\n", this, Token::toChars(op), type_print(type), ident->toChars(), e1);
    if (e1)
	e1->dump(i + 2);
}

void DotVarExp::dump(int i)
{
    indent(i);
    printf("%p %s type=%s var='%s' e1=%p\n", this, Token::toChars(op), type_print(type), var->toChars(), e1);
    if (e1)
	e1->dump(i + 2);
}

void DotTemplateInstanceExp::dump(int i)
{
    indent(i);
    printf("%p %s type=%s ti='%s' e1=%p\n", this, Token::toChars(op), type_print(type), ti->toChars(), e1);
    if (e1)
	e1->dump(i + 2);
}

void DelegateExp::dump(int i)
{
    indent(i);
    printf("%p %s func=%s type=%s e1=%p\n", this, Token::toChars(op), func->toChars(), type_print(type), e1);
    if (e1)
	e1->dump(i + 2);
}

void BinExp::dump(int i)
{
    indent(i);
    printf("%p %s type=%s e1=%p e2=%p\n", this, Token::toChars(op), type_print(type), e1, e2);
    if (e1)
	e1->dump(i + 2);
    if (e2)
	e2->dump(i + 2);
}