Pregunta

Estoy trabajando en un lenguaje de programación C ++ que utiliza ya que es idioma de destino por ahora. Estoy golpeando una traza inversa excepcionalmente extraña.

#1  0x08048d09 in factorial (n=0x8052160) at ir.cpp:35
35      shore::builtin__int * __return = NULL;
(gdb) bt
#0  shore::builtin__int::__mul__ (this=0x8052160, other=0x8052288) at /home/alex/projects/shore/shore/runtime/int.h:36
#1  0x08048d09 in factorial (n=0x8052160) at ir.cpp:35
#2  0x08048cfa in factorial (n=0x80520b8) at ir.cpp:35
#3  0x08048cfa in factorial (n=0x8052018) at ir.cpp:35
#4  0x08048d6f in main () at ir.cpp:43

En concreto, parece que declarar el tipo de retorno es de alguna manera la activación de la __mul método de builtin__int a ser llamado, y no tengo ni idea de por qué. builtin__int se ve así:

#ifndef _SHORE_INT_H
#define _SHORE_INT_H

#include "gc.h"


namespace shore {
    class builtin__int : public shore::Object {
        public:
            // Some day this will be arbitrary percision, but not today.
            long long value;

            static builtin__int* new_instance(long long value_) {
                builtin__int* val = new builtin__int(value_);
                shore::GC::register_object(val);
                return val;
            }

            builtin__int(long long value_) {
                this->value = value_;
            }

            builtin__bool* __eq__(builtin__int* other) {
                return builtin__bool::new_instance(this->value == other->value);
            }

            builtin__int* __add__(builtin__int* other) {
                return builtin__int::new_instance(this->value + other->value);
            }

            builtin__int* __sub__(builtin__int* other) {
                return builtin__int::new_instance(this->value - other->value);
            }

            builtin__int* __mul__(builtin__int* other) {
                return builtin__int::new_instance(this->value * other->value);
            }
    };
}
#endif

Alguna idea de lo que en la tierra es convincente C ++ para llamar a la mul método?

EDIT: Se ha añadido la fuente de ir.cpp

#include "builtins.h"
#include "frame.h"
#include "object.h"
#include "state.h"
std::vector < shore::Frame * >shore::State::frames;
shore::GCSet shore::GC::allocated_objects;
class
    factorial__frame:
    public
    shore::Frame {
  public:
    shore::builtin__int *
    n;
    shore::GCSet
    __get_sub_objects() {
    shore::GCSet s;
    s.
    insert(this->n);
    return
        s;
}};
class
    main__frame:
    public
    shore::Frame {
  public:
    shore::GCSet
    __get_sub_objects() {
    shore::GCSet s;
    return
        s;
}};
shore::builtin__int * factorial(shore::builtin__int * n)
{
    shore::builtin__int * __return = NULL;
    factorial__frame frame;
    shore::State::frames.push_back(&frame);
    frame.n = NULL;
    frame.n = n;
    if (((frame.n)->__eq__(shore::builtin__int::new_instance(0)))->value) {
    __return = shore::builtin__int::new_instance(1);
    shore::GC::collect();
    shore::State::frames.pop_back();
    return __return;
    }
    __return =
    (frame.n)->
    __mul__(factorial
        ((frame.n)->
         __sub__(shore::builtin__int::new_instance(1))));
    shore::GC::collect();
    shore::State::frames.pop_back();
    return __return;
}
int
main()
{
    main__frame     frame;
    shore::State::frames.push_back(&frame);
    builtin__print(factorial(shore::builtin__int::new_instance(3)));
    shore::State::frames.pop_back();
}
¿Fue útil?

Solución

Un poco de una conjetura: la inicialización en la línea de shore::builtin__int * __return = NULL; no hace nada, ya que siempre ha sobrescrito. El compilador sería perfecto derecho a (a) cambiar el orden de abajo hacia donde se asigna __return, por la declaración que hace __mul__ llamada y luego (b) eliminar el código completo. Pero tal vez se salió de la línea de origen en la información de depuración, y, o bien el conector o el BGF ha terminado por pensar que la instrucción de llamada pertenece a la equivocada una de las varias líneas de código en los alrededores.

depuración fuente de confianza Nunca menos que se puede ver el desmontaje también. lenguajes compilados - bah, embaucamiento. Y así sucesivamente.

Otros consejos

Se reservan nombres de los identificadores con guiones dobles. Usted podría estar chocando con un nombre generado por el compilador.

Me parece que el traductor está fallando, y de alguna manera gcc (o lo que sea) es piensa que la costa :: builtin__int es un valor de algún tipo, y que están tratando de multiplicar por __return, en lugar de declarar el valor como __return tipo orilla :: builtin__int * ...

Obviamente, si esta cosa está recopilando en absoluto, y que le da tiempo de ejecución de errores, entonces cualquier tipo de la multiplicación sería darle es un LHS válidos ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top