Что может заставить C ++ вызывать эту функцию? - PullRequest
0 голосов
/ 01 декабря 2009

Я работаю над языком программирования, который в настоящее время использует C ++ в качестве целевого языка. Я бью исключительно странный след.

#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

В частности, кажется, что объявление типа return каким-то образом вызывает метод __mul на buildin__int, и я понятия не имею, почему. buildin__int выглядит так:

#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

Есть какие-нибудь идеи относительно того, что вообще заставляет C ++ вызывать метод mul ?

РЕДАКТИРОВАТЬ: Добавлен источник 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();
}

Ответы [ 3 ]

5 голосов
/ 01 декабря 2009

Небольшое предположение: инициализация в строке shore::builtin__int * __return = NULL; ничего не делает, поскольку она всегда перезаписывается. Компилятор будет иметь полное право (а) переупорядочить его там, где назначено __return, с помощью оператора, который вызывает __mul__, а затем (б) полностью удалить код. Но, возможно, он оставил исходную строку в отладочной информации, и компоновщик или GDB в конце концов решили, что инструкция вызова относится к неправильной одной из нескольких строк источника поблизости.

Никогда не доверяйте отладке исходного кода, если вы тоже не видите разборки. Скомпилированные языки - ба, хамбуг. И пр.

5 голосов
/ 01 декабря 2009

Имена идентификаторов с двойным подчеркиванием зарезервированы. Возможно, вы столкнулись с именем, сгенерированным компилятором.

1 голос
/ 01 декабря 2009

Мне кажется, что переводчик не работает, и каким-то образом gcc (или что-то еще) считает, что shore :: builtin__int - это какое-то значение, и вы пытаетесь умножить его на __return, вместо того, чтобы объявить значение __return как тип берега :: builtin__int * ...

Очевидно, что если эта вещь компилируется и выдает ошибки во время выполнения, то любой тип, который умножение даст вам, является действительным LHS ...

...