Domanda

Sto usando Python per implementare un altro linguaggio di programmazione denominato 'foo'. Tutto il codice di Foo sarà tradotto in Python, e sarà anche gestito nello stesso interprete Python, quindi Jit Traduci in Python.

Ecco un piccolo pezzo di codice di foo:

function bar(arg1, arg2) {
    while (arg1 > arg2) {
        arg2 += 5;
    }
    return arg2 - arg1;
}
.

che si tradurrà in:

def _bar(arg1, arg2):
    while arg1 > arg2:
        arg2 += 5
        watchdog.switch()
    watchdog.switch()
    return arg2 - arg1
.

Il 'watchdog' è un Greenlet (il codice generato è anche in esecuzione in un contesto Greenlet) che monitorerà / limiterà l'utilizzo delle risorse, poiché la lingua eseguirà il codice non affidabile.

Come si può vedere nell'esempio, prima che il codice Python venga generato, verranno apportate piccole modifiche all'albero di analisi per aggiungere interruttori di watchdog e apportare piccole modifiche agli identificatori di funzionalità.

Per soddisfare tutti i requisiti, devo anche aggiungere funzionalità di traceback / debug nella lingua, in modo che quando il runtime Python lanci un'eccezione, ciò che l'utente vedrà è la traceback del codice di foo (come opposto a mostrare la traceback del codice Python generato ).

Considera che l'utente crea un file denominato 'programma.FOO' con i seguenti contenuti:

1  function bar() {
2      throw Exception('Some exception message');
3  }
4
5  function foo() {
6      output('invoking function bar');
7      bar();
8  }
9
10 foo();
.

che si tradurrà in:

def _bar():
    watchdog.switch()
    raise Exception('Some exception message')

def _foo():
    print 'invoking function bar'
    watchdog.switch()
    _bar()

watchdog.switch()
_foo()
.

Allora, l'output di 'Program.FOO' dovrebbe essere qualcosa come:

invoking function bar
Traceback (most recent call last):
  File "program.foo", line 10
    foo();
  File "program.foo", line 7, inside function 'foo'
    bar();
  File "program.foo", line 2, inside function 'bar'
    throw Exception('Some exception message');
Exception: Some exception message
.

C'è un modo semplice per farlo? Preferirei una soluzione che non coinvolge la strumentazione di Python Bytecode, poiché è interno all'interpretazione dell'attuazione, ma se non c'è nient'altro, allora lo strumento di bytecode lo farà anche.

È stato utile?

Soluzione

You could decorate each generated Python function with a decorator which record the context (filename, function, line number, etc.) to a global stack. Then you could derive your own Exception class and catch it at the top level of the interpreter. Finally, you print out what you like, using information from the global debug stack.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top