socsvn commit: r268635 - soc2014/pedrosouza/lua_loader/head/sys/boot/common

Pedro Arthur bygrandao at gmail.com
Tue Jun 3 01:26:15 UTC 2014


I'll do these fixes.
The new functions do the following:
lua_realloc -> this function is passed to lua_newstate to realloc mem, it
changed from the previous lua version where it wasn't needed.
data_chunk struct and read_chunk -> are needed to execute a string, as the
lua_load function expects a function that reads a stream
and return the size read, data_chunk contains a pointer to the string and
its size. When I call lua_load(read_chunk, data_chunk)
lua_load calls read_chunk(data_chunk, &out_size) and read_chunk just
returns the pointer to the string and its size.


2014-06-02 19:03 GMT-03:00 Wojciech A. Koszek <wkoszek at freebsd.org>:

> On Mon, May 26, 2014 at 01:37:34PM +0000, pedrosouza at freebsd.org wrote:
> > Author: pedrosouza
> > Date: Mon May 26 13:37:34 2014
> > New Revision: 268635
> > URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=268635
> >
> > Log:
> >   Added missing file intep_lua.c
>
>
> Pedro,
>
> My comments below.
>
> >
> > Added:
> >   soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c
> >
> > Added: soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c
> >
> ==============================================================================
> > --- /dev/null 00:00:00 1970   (empty, because file is newly added)
> > +++ soc2014/pedrosouza/lua_loader/head/sys/boot/common/interp_lua.c
> Mon May 26 13:37:34 2014        (r268635)
> > @@ -0,0 +1,203 @@
> > +#include <sys/cdefs.h>
>
> Please put our copyright in here.
>
> > +__FBSDID("$FreeBSD$");
> > +
> > +#include <sys/param.h>               /* to pick up __FreeBSD_version */
> > +#include <machine/stdarg.h>
> > +
> > +
> > +#include "bootstrap.h"
> > +#include "interp.h"
> > +
> > +#define lua_c
> > +
> > +#include "../lua/src/lua.h"
> > +#include "../lua/src/ldebug.h"
> > +
> > +struct interp_lua_softc {
> > +     lua_State       *luap;
> > +};
> > +struct interp_lua_softc      lua_softc = { 0 };
> > +
> > +#define      LDBG(...)       do {                    \
> > +     printf("%s(%d): ", __func__, __LINE__); \
> > +     printf(__VA_ARGS__);                    \
> > +     printf("\n");                           \
> > +} while (0)
> > +
> > +
> > +int lua_print(lua_State *L)
> > +{
> > +    int i;
> > +    int n = lua_gettop(L);
> > +    for (i = 1; i <= n; ++i)
> > +        printf("%s", lua_tostring(L, i));
> > +    return 0;
> > +}
>
> This comment touches the whole file: something is wrong with formatting.
> We'd appreciate if you could look at it a bit more and maybe align the
> formatting accross the file.
>
> > +
> > +int lua_perform(lua_State *L)
> > +{
> > +
> > +    int argc, ret;
> > +     char **argv;
>
> ..like here..
>
> > +    int res = -1;
> > +    int n = lua_gettop(L);
> > +
> > +    if (n >= 1)
> > +    {
>
> ..or here..
>
> > +         parse(&argc, &argv, lua_tostring(L, 1));
> > +         res = perform(argc, argv);
> > +    }
> > +    lua_pushnumber(L, res);
> > +
> > +    return 1;
> > +}
> > +
> > +void * lua_realloc(void *ud, void *ptr, size_t osize, size_t nsize)
> > +{
> > +    (void)ud; (void)osize;  /* not used */
> > +    if (nsize == 0) {
> > +        free(ptr);
> > +        return NULL;
> > +    }
> > +    else
> > +        return realloc(ptr, nsize);
> > +}
> > +
> > +typedef struct data_chunk
> > +{
> > +    void * data;
> > +    size_t size;
> > +} data_chunk;
> > +
> > +const char * read_chunk(lua_State *L, void * chunk, size_t *sz)
> > +{
> > +    data_chunk * ds = (data_chunk *)chunk;
> > +    if (ds->size == 0) return NULL;
> > +    *sz = ds->size;
> > +    ds->size = 0;
> > +    return (const char*)ds->data;
> > +}
>
>
> I don't seem to recall my code had these functions. Can you quickly
> summarize what they do?
>
> > +
> > +
> > +int do_string(lua_State *L, const char * str, size_t size)
> > +{
> > +    int res;
> > +    data_chunk ds;
> > +    ds.data = (void*)str;
> > +    ds.size = size;
> > +    res = lua_load(L, read_chunk, &ds, "do_string___", 0);
> > +    res = lua_pcall(L, 0, LUA_MULTRET, 0);
> > +    return res;
> > +}
> > +
> > +
> > +void
> > +interp_lua_init(void *ctx)
> > +{
> > +     lua_State *luap;
> > +     struct bootblk_command **cmdp;
> > +     struct interp_lua_softc *softc;
> > +     struct env_var *ev;
> > +     const char *name_str, *val_str;
> > +     char buf[16];
> > +
> > +     softc = ctx;
> > +     luap = lua_newstate(lua_realloc, NULL);
> > +     if (luap == NULL) {
> > +             LDBG("problem with initializing Lua interpreter\n");
> > +     }
> > +     softc->luap = luap;
> > +    lua_register(luap, "print", lua_print);
> > +    lua_register(luap, "perform", lua_perform);
> > +
> > +}
> > +
> > +int
> > +interp_lua_run(void *data, const char *line)
> > +{
> > +     lua_State *luap;
> > +     struct interp_lua_softc *softc;
> > +     int argc, ret;
> > +     char **argv;
> > +
> > +     softc = data;
> > +     luap = softc->luap;
> > +
> > +    if (do_string(luap, line, strlen(line)) != 0)
> > +        printf("[LUA]Failed to execure \'%s\'\n", line);
> > +
> > +     return (0);
> > +}
> > +
> > +int
> > +interp_lua_incl(void *ctx, const char *filename)
> > +{
> > +     lua_State *luap;
> > +     struct interp_lua_softc *softc;
> > +     struct stat st;
> > +     char *filebuf, *errstr;
> > +     int fd, filebufoff, i, rleft, rread;
> > +
> > +    printf("[Lua] Including file %s.\n", filename);
> > +     /*
>
> If you could look into using #ifdef for commenting out, this would be good.
>
> > +    if ((strcmp(filename, "/boot/loader.rc") == 0) ||
> > +         (strcmp(filename, "/boot/boot.conf") == 0)) {
> > +             printf("Skipping loader.rc and boot.conf");
> > +             return (0);
> > +     }
>
> There was a small glitch here: I think the current implementation is that
> if
> there's no Forth interpreter, the rc/conf (which are in Forth) will get
> passed to the loader as well.
>
> I'd keep it that way in case somebody takes advantage of this bug, but we
> could comment this part out.
>
> > +    */
> > +     softc = ctx;
> > +     luap = softc->luap;
> > +     /*
> > +
> > +    fd = open(filename, O_RDONLY);
> > +     if (fd < 0) {
> > +             printf("Couldn't open file %s\n", filename);
> > +             return (1);
> > +     }
> > +     i = stat(filename, &st);
> > +     assert(i == 0);
> > +     filebuf = malloc(st.st_size);
> > +     assert(filebuf != NULL);
> > +     memset(filebuf, 0, st.st_size);
> > +    */
> > +     /*
> > +      * XX: Investigate stat() vs logic problem. I'm getting
> > +      * more bytes that the file really has.
> > +      */
> > +
> > +    /*
> > +     rleft = st.st_size - 1;
> > +     filebufoff = 0;
> > +     for (;;) {
> > +             rread = read(fd, filebuf + filebufoff, rleft);
> > +             assert(rread >= 0);
> > +             rleft -= rread;
> > +             filebufoff += rread;
> > +             if (rread == 0 || rleft <= 0) {
> > +                     break;
> > +             }
> > +     }
> > +     close(fd);
> > +     i = LUA_DOSTRING(luap, filebuf);
> > +     free(filebuf);
> > +     if ((i != 0) && (lua_isnil(luap, -1) == 0)) {
> > +             errstr = lua_tostring(luap, -1);
> > +             if (errstr == NULL) {
> > +                     errstr = "internal error; errstr must be string";
> > +             }
> > +             printf("Problem with script execution:\n\n");
> > +             printf("\t'%s'\n\n", errstr);
> > +             lua_pop(luap, 1);
> > +     }
> > +    */
> > +     return (0);
> > +}
> > +
> > +
> > +struct interp boot_interp_lua = {
> > +     .init = interp_lua_init,
> > +     .run = interp_lua_run,
> > +     .incl = interp_lua_incl,
> > +     .context = &lua_softc,
> > +};
>
> Other than that it looks good.
>
>
> --
> Wojciech A. Koszek
> wkoszek at FreeBSD.czest.pl
> http://FreeBSD.czest.pl/~wkoszek/
>


More information about the svn-soc-all mailing list