LUA: obtener la fuente de la función -- debugging campo con serialization campo con lua campo con introspection camp Relacionados El problema

Lua: Get function source


3
vote

problema

Español

Estoy trabajando en un sistema para la serialización / deserialización, y estoy tratando de obtener algunas cosas realmente elegantes que van con las funciones. Mi objetivo es serializar objetos que contengan funciones de una manera legible y reversible de forma humana (los archivos serializados necesitarán el procesamiento después del paso del archivo de carga ()). Necesito una manera de obtener la fuente real de una función, y parece que no siempre puedo hacer eso con debug.getInfo ().

Sé que debug.getInfo () dará el archivo y la línea donde se definió (o la fuente de la función, dependiendo de su origen). ¿Hay alguna forma en que puedo leer el texto de la función de ese archivo? Estaría dispuesto a usar algún tipo de utilidades de analizador para hacerlo. Tal vez hay paquetes de LUA para analizar el código LUA?

Tal vez hay una forma en que puedo obtener el archivo de carga () o requerir () para retener automáticamente la fuente de la función en algún lugar?

Sí, sé que puede obtener todo tipo de información de Debug.GetInfo, pero no pudo lidiar con las funciones cargadas a través de StDin ...

  uberblah@glade-m:~$ lua Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio > a = function() print("hello, world!") end > require("serpent") > s = require("serpent") > =s.block(debug.getinfo(a)) {   currentline = -1,   func = loadstring("LuaQ000000000000000000=stdin00000000000000000000000000000000A@0000@0000�0000000000000000000000print0000000000000000hello, world!00000000000000000000000000000000000000000000000000000000",'@serialized') --[[function: 0x2068a30]],   lastlinedefined = 1,   linedefined = 1,   namewhat = "",   nups = 0,   short_src = "stdin",   source = "=stdin",   what = "Lua" } --[[table: 0x206cf80]] > f = io.open("stdin", "r") > =f nil   

Solución para Fuente de STDIN ... 1) Captura todo stdin, escríbalo a un archivo 2) Cargue la información de ese archivo, en lugar de STDIN 3) La depuración rastreará los números de la línea de la función en ese archivo

Original en ingles

I'm working on a system for serialization/deserialization, and I'm trying to get some really fancy stuff going with functions. My goal is to serialize objects containing functions in a human-readable and reversible manner (the serialized files will need processing after the loadfile() step). I need a way to get the actual source of a function, and it looks like I can't always do that with debug.getinfo().

I know that debug.getinfo() will give be the file and line where it was defined (or the source of the function, depending on its origin). Is there a way I can read the function text from that file? I'd be willing to use some kind of parser utilities to do so. Maybe there are Lua packages for parsing Lua code?

Perhaps there's a way I can get loadfile() or require() to automatically retain function source somewhere?

Yes, I know you can get all sorts of information out of debug.getinfo, but it was unable to deal with functions loaded through stdin...

uberblah@glade-m:~$ lua Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio > a = function() print("hello, world!") end > require("serpent") > s = require("serpent") > =s.block(debug.getinfo(a)) {   currentline = -1,   func = loadstring("LuaQ\000\000\000\000\000\000\000\000\000=stdin\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A@\000\000@\000\000xefxbfxbd\000\000\000\000\000\000\000\000\000\000\000print\000\000\000\000\000\000\000\000hello, world!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000",'@serialized') --[[function: 0x2068a30]],   lastlinedefined = 1,   linedefined = 1,   namewhat = "",   nups = 0,   short_src = "stdin",   source = "=stdin",   what = "Lua" } --[[table: 0x206cf80]] > f = io.open("stdin", "r") > =f nil 

SOLUTION FOR SOURCE FROM STDIN... 1) Capture all STDIN, write it to a file 2) Load the information from that file, instead of from stdin 3) debug will track the function line numbers in that file

           
       
       

Lista de respuestas

5
 
vote
vote
La mejor respuesta
 

Uso de core3 Puede obtener core4 , core5 y core6 . A menos que formatee su código realmente extraño, debería poder extraer el código completo de su función de esta información. No hay necesidad de analizar el código, solo para obtener el conjunto correcto de líneas.

 

Using debug.getinfo you can get source, linedefined, and lastlinedefined. Unless you format your code really weirdly you should be able to extract the complete code of your function from this info. There is no need to parse code, just to get the correct set of lines.

 
 
 
 
1
 
vote

Usted desea dispersar el código de byteCode en declaraciones y expresiones de LUA. Pruebe http://chunkspy.luaforge.net/ . O tal vez http://luadec.luaforge.net/ pero no los he usado, así que no puedo Da mucha más información. LUAC (LUA Compiler) también tiene un interruptor -L que produce la listado de ensamblaje que podría ser analizado. Luego está LBCI (BHTTP: //www.tecgraf.puc-rio.br/~lhf/ftp/lua/#LBCI). Puede encontrar Obtención de la siguiente función útil. Finalmente, le sugiero que haga una búsqueda de "Lua Decompiler".

 

You want to disasseble the bytecode into Lua statements and expressions. Try http://chunkspy.luaforge.net/. Or maybe http://luadec.luaforge.net/ but I haven't used them so can't give much more info. Luac (Lua compiler) also has -l switch which produces assembly listing that could potentially be parsed. Then there is lbci (bhttp://www.tecgraf.puc-rio.br/~lhf/ftp/lua/#lbci). You might find Getting the AST of a function useful. Finally, I suggest you do a search for "lua decompiler".

 
 
   
   

Relacionados problema

20  ¿Cuál es el equivalente / proc / cpuinfo en FreeBSD V8.1?  ( What is the equivalent of proc cpuinfo on freebsd v8 1 ) 
¿Cuál es el equivalente de Linux / PROC / CPUINFO en FREEBSD V8.1? Mi solicitud lee / proc / cpuinfo y guarda la información en el archivo de registro, ¿qué p...

3  Cómo obtener todas las instancias de una clase dentro del módulo actual  ( How to obtain all instances of a class within the current module ) 
Tengo un módulo foo que define un Foo6 , e instancie una serie de instancias de esta clase. de otros módulos, puedo import foo y obtener una lista del ...

4  La información de la fuente faltante de las clases de Python cargadas con Module_from_SPEC  ( Source info missing from python classes loaded with module from spec ) 
Estoy tratando de usar el módulo de introspección de Python inspect Para recuperar el código fuente para los objetos en vivo que se han cargado en el alcanc...

2  Método D-Bus no encontrado en la ruta del objeto a pesar del hecho de que existe el método  ( D bus method not found at object path despite the fact that method exist ) 
I implemento una aplicación con este archivo com.example.appname.desktop de la siguiente manera: $ cat /usr/local/share/applications/com.example.appname.de...

0  Objetivo C Introspección  ( Objective c introspection ) 
Al realizar la introspección en una clase, utilizo el siguiente código: <xsl:variable name="dailyBundleMappingFile" select="'daily_bundles_mapping.xml'"/> ...

0  Miembro de clase como un objeto de primera clase  ( Class member as a first class object ) 
Me preguntaba si hay algo en C # para poder pasar un miembro de una clase a otra función que usará este miembro para obtener un valor. Así que obtenga un valo...

4  ¿Es posible generar una lista de todas las cadenas marcadas en C # en el tiempo de compilación / tiempo de ejecución?  ( Is it possible to generate a list of all marked strings in c sharp at compile ti ) 
Entonces, tengo un pequeño sistema de traducción configurado para mi aplicación, donde generamos una lista de todas las cadenas marcadas como traducibles, vol...

5  Imprima una variable seleccionada por un número aleatorio  ( Print a variable selected by a random number ) 
Tengo una lista de nombres, y me gustaría que mi programa seleccione al azar uno de esos nombres. Intenté usar lo siguiente: import random def main(): ...

4  Obtener el nombre de la función como una cadena en Python [Duplicar]  ( Get function name as a string in python ) 
Esta pregunta ya tiene respuestas aquí : Cerrado 8 años . posible duplicado: ¿Cómo obtengo...

8  Generando enlaces de SWIG con CMAKE  ( Generating swig bindings with cmake ) 
¿Cómo generaría los enlaces automáticos para un proyecto C que se construye utilizando CMAKEK? Quiero generar enlaces para Python, Java, .NET, PHP, PERL, TC...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos