> Ищи function CreateCFunctionDump() :)
Всего лишь генерация кода в куче. Можно и обойтись, но интерпретатор медленнее будет работать.
FBX
> а в винде была включена защита от этого
А что, теперь нельзя выполнять код в куче?! ЧТО ЗА БРЕДОВЫЙ ЗАПРЕТ? Как же JIT-компиляция работать будет?!
TarasB
> ЧТО ЗА БРЕДОВЫЙ ЗАПРЕТ?
Нормальный запрет, не позволяющий выполнять злоумышленно подготовленный мусор.
>Как же JIT-компиляция работать будет?!
Дык кучу нужно нормально выделять. HeapCreate() с HEAP_CREATE_ENABLE_EXECUTE (или mmap() c PROT_EXEC на posix).
А не просто глобальный массив буферов.
Еще немного допилить и можно выложить на lua.org :)
Здравствуйте, первым делом хотел бы вас поблагодарить за ваш труд, а его не мало вложено в эту библиотеку!
ну а во вторых хотел бы у вас спросить (документацию читал, но ответа на свой вопрос, к сожалению, не нашел):
1. Я так понимаю возвращаемый тип луа функции не может быть множеством ?
т.е
function test() return 1,2,3 end
никак нельзя это обработать в Delphi ?
и еще один вопрос:
есть код:
lua:
function test() return {a=1,b=2,c=3} end
delphi:
procedure TForm1.btn1Click(Sender: TObject); var ret : TLuaArg; begin lua.LoadScript( 'test.lua'); ret := lua.Call( 'test', nil ); Form1.Caption := ret. LuaTypeName; end;
Но возвращает тип ltEmpty, что я не так делаю ?
shureg
наконецто получил достойный вопрос )
спасибо )
>1. Я так понимаю возвращаемый тип луа функции не может быть множеством ?
да в CrystalLUA результатом может быть только одно значение
таблицы в качестве результата тоже не принимаются
Решения такого вопроса вижу 2
1) зарегистрировать структуру для таких результатов. Например TTestResult
если хотите возвращать только несколько первых полей, то предусмотрите в конструкторе, что заполняться может не всё
return TTestResult(1, 2, 3) -- остальные поля не заполнены. В конструктор структура приходит нулевая (ZeroMemory)
2) передать структуру в качестве IsRef параметра
function test(Result)
Result.a = 1
Result.b = 2
Result.c = 3
return;
end
3) использовать глобальную переменную-таблицу. А на нативной стороне общаться с ней через TLuaReference
DevilDevil, спасибо за подробный и быстрый ответ!
исправлен баг с DEP.
новую версию качать по старой ссылке
А зарегестрировать обьект в луа нельзя? Чтобы можно было свободно его юзать....
Незнаю как в Дельфи но в BlitzMax сделали так :
1) Добавили функции-интерпретаторы lua_object.с :
#include <brl.mod/blitz.mod/blitz.h> #include <pub.mod/lua.mod/lua-5.1.4/src/lua.h> void lua_boxobject( lua_State *L,BBObject *obj ){ void *p; BBRETAIN( obj ); p=lua_newuserdata( L,4 ); *(BBObject**)p=obj; } BBObject *lua_unboxobject( lua_State *L,int index ){ void *p; p=lua_touserdata( L,index ); return *(BBObject**)p; } void lua_pushlightobject( lua_State *L,BBObject *obj ){ lua_pushlightuserdata( L,obj ); } BBObject *lua_tolightobject( lua_State *L,int index ){ return (BBObject*)( lua_touserdata( L,index ) ); } void lua_gcobject( lua_State *L ){ BBObject *obj=lua_unboxobject( L,1 ); BBRELEASE( obj ); }
а затем при дампе обьекта из скрипта БМакс распознает его при помощи описателя классов и делает с ним что нужно.
Diablo1909
полная поддержка классов и структур
смотрите документацию
Справку не обновил. Надеюсь появится когда-нибудь интерфейс для дебага - и тогда обновлю
- восстановлена историческая справедливость. пустая строка это "", а не nil
- загружаются и читаются строки любой длинны, даже если они содержат #0
- убрал свойство Preprocess. Все скрипты проходят препроцессинг
- добавлены "универсальные" свойства
- реализована регистрация виртуальных методов (по крайней мере для свойств поддержка уже была). Регистрировать виртуальные и вообще любые методы можно указывая LuaClassProcPtr(pointer) в качестве TLuaClassProc
- реализована выгрузка name_space -а (всего того что доступно из Lua). Метод SaveNameSpace(). К примеру минимальное приложение на CrystalEngine содержит в себе следующий неймспейс: crystal_engine_namespace
- добавлена поддержка Chunk-ов. В частности теперь в сообщении об ошибке указывается исходный код:
Ваш труд действительно впечатляет!
Спасибо вам, есть повод продолжить изучать вашу библиотеку :)
shureg
в отличие от Lua api мою библиотеку не нужно изучать )
берите и пользуйтесь )
Кто-нибудь может объяснить логику работы require() и всего, что с этим связано? В CrystalLUA есть проблемы с использованием этого, а в частности, с подгрузкой DLL-библиотек для Lua, которые могут предоставлять дополнительные функции. Функция __global__index (перегружена в CrystalLUA для глобального пространства), если не находит в своем собственном пространстве какой-либо переменной, вызывает исключение, что в большинстве случаев не дает библиотеке загрузиться (судя по всему, провоцирует это код, в ней содержащийся). А "чистый" Lua не вызывает исключений, если не находит переменную, а возвращает nil. Насколько я догадываюсь, вся проблема заключается в этой вот разнице механики работы, но как это логично обосновать? Я в Lua почти не разбираюсь, а автору нужно больше информации, чтобы решить проблему.
Контр-пример :) .
luaPro:=TLua.Create; LuaCom:=TLua.Create; luaPro.Variable['Start']:=0; luaPro.Variable['VersionX']:=0; luaPro.Variable['VersionXX']:=0; luaPro.Variable['VersionXXX']:=1; luaPro.Variable['VersionType']:=-1; luaPro.Variable['LoadedErr']:=255; luaPro.Variable['wS']:=10; luaPro.Variable['hS']:=10; luaPro.Variable['wh']:=-1; { luaPro.Variable['q']:=GLDummyCube2;} LuaPro.RegClass(TGLDummyCube); LuaPro.RegClass( TLC); LuaPro.RegClass( TGLSphere); LuaPro.RegClass( TGLFreeForm); LuaPro.RegClass( TGLPlane); LuaPro.RegProc( TLC, LUA_CONSTRUCTOR, LuaClassProc( TLCConstructor)); LuaPro.LoadScript( 'loadFS.lua'); //здесь или f := LuaPro.Call( 'l', [1]).ForceBoolean; // здесь Адрес Волуктион(я ево так називаю),если нада другие какиета процедури/функции ,говорите :) ws:=luaPro.Variable['wS']; hs:=luaPro.Variable['hS']; if luaPro.Variable['LoadedErr']<>-1 then ELua.Assert( 'Lua scripts not be sucuses load.Error '+inttostr( luaPro.Variable['LoadedErr'])); if luaPro.Variable['Start']<>10 then ELua.Assert( 'Lua scripts not be started.Code exit not 10.Code '+luaPro.Variable['Start']); if luaPro.Variable['OpenGL']<>-1 then ELua.Assert( 'This App not started.OpneGL has result '+luaPro.Variable['OpenGL']); if luaPro.Variable['DirectX']=-1 then ELua.Assert( 'This App not for DirectX :).I don''t like Windows and DirectX.Result -1'); luaPro.Variable['Cheats']:=-1; if luaPro.Variable['FGCFHdeveloper']<>-1 then ShowMessage( 'This mod and/or app not create fhntv24,and if this app and/or mod not good,òîãäà íå ðóãàéòå ìåíÿ,à '+luaPro.Variable['Developer']+'!!!(~ not run!)') else luaPro.Variable['Cheats']:=1; if luaPro.Variable['wh']<>-1 then ShowMessage( luaPro.Variable['HELOU']);
fhntv24
мне кажется ошибка в 15й строке
1) я уже просил по поводу ошибок писать в личку
2) что находится в файле loadFS.lua ?
3) зачем 2 экземпляра TLua ?
4) где код ведёт себя не так как нужно ?
Тема в архиве.