ПроектыФорумУтилиты

Высокоуровневая библиотека CrystalLUA. Delphi + Lua (2 стр)

Страницы: 1 2 3 415 Следующая »
#15
13:30, 27 фев 2011

> Ищи function CreateCFunctionDump() :)

Всего лишь генерация кода в куче. Можно и обойтись, но интерпретатор медленнее будет работать.

FBX
> а в винде была включена защита от этого

А что, теперь нельзя выполнять код в куче?! ЧТО ЗА БРЕДОВЫЙ ЗАПРЕТ? Как же JIT-компиляция работать будет?!

#16
15:28, 27 фев 2011

TarasB
> ЧТО ЗА БРЕДОВЫЙ ЗАПРЕТ?
Нормальный запрет, не позволяющий выполнять злоумышленно подготовленный мусор.

>Как же JIT-компиляция работать будет?!
Дык кучу нужно нормально выделять. HeapCreate() с HEAP_CREATE_ENABLE_EXECUTE (или mmap() c PROT_EXEC на posix).
А не просто глобальный массив буферов.

#17
15:45, 27 фев 2011

Еще немного допилить и можно выложить на lua.org :)

#18
12:58, 6 мар 2011

Здравствуйте, первым делом хотел бы вас поблагодарить за ваш труд, а его не мало вложено в эту библиотеку!
ну а во вторых хотел бы у вас спросить (документацию читал, но ответа на свой вопрос, к сожалению, не нашел):
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, что я не так делаю ?

#19
14:53, 6 мар 2011

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

#20
15:45, 6 мар 2011

DevilDevil, спасибо за подробный и быстрый ответ!

#21
18:35, 8 мар 2011

исправлен баг с DEP.
новую версию качать по старой ссылке

#22
15:49, 12 мар 2011

А зарегестрировать обьект в луа нельзя? Чтобы можно было свободно его юзать....

Незнаю как в Дельфи но в 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 );
}

а затем при дампе обьекта из скрипта БМакс распознает его при помощи описателя классов и делает с ним что нужно.

#23
16:01, 12 мар 2011

Diablo1909
полная поддержка классов и структур
смотрите документацию

#24
14:56, 25 мар 2011

Справку не обновил. Надеюсь появится когда-нибудь интерфейс для дебага - и тогда обновлю

- восстановлена историческая справедливость. пустая строка это "", а не nil
- загружаются и читаются строки любой длинны, даже если они содержат #0
- убрал свойство Preprocess. Все скрипты проходят препроцессинг
- добавлены "универсальные" свойства
- реализована регистрация виртуальных методов (по крайней мере для свойств поддержка уже была). Регистрировать виртуальные и вообще любые методы можно указывая LuaClassProcPtr(pointer) в качестве TLuaClassProc
- реализована выгрузка name_space -а (всего того что доступно из Lua). Метод SaveNameSpace(). К примеру минимальное приложение на CrystalEngine содержит в себе следующий неймспейс: crystal_engine_namespace
- добавлена поддержка Chunk-ов. В частности теперь в сообщении об ошибке указывается исходный код:

error_description | Высокоуровневая библиотека CrystalLUA. Delphi + Lua
#25
15:07, 25 мар 2011

Ваш труд действительно впечатляет!
Спасибо вам, есть повод продолжить изучать вашу библиотеку :)

#26
15:52, 25 мар 2011

shureg
в отличие от Lua api мою библиотеку не нужно изучать )
берите и пользуйтесь )

#27
11:47, 26 мар 2011

Кто-нибудь может объяснить логику работы require() и всего, что с этим связано? В CrystalLUA есть проблемы с использованием этого, а в частности, с подгрузкой DLL-библиотек для Lua, которые могут предоставлять дополнительные функции. Функция __global__index (перегружена в CrystalLUA для глобального пространства), если не находит в своем собственном пространстве какой-либо переменной, вызывает исключение, что в большинстве случаев не дает библиотеке загрузиться (судя по всему, провоцирует это код, в ней содержащийся). А "чистый" Lua не вызывает исключений, если не находит переменную, а возвращает nil. Насколько я догадываюсь, вся проблема заключается в этой вот разнице механики работы, но как это логично обосновать? Я в Lua почти не разбираюсь, а автору нужно больше информации, чтобы решить проблему.

#28
1:20, 3 мая 2011

Контр-пример :) .

 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']);
#29
9:48, 3 мая 2011

fhntv24
мне кажется ошибка в 15й строке

1) я уже просил по поводу ошибок писать в личку
2) что находится в файле loadFS.lua ?
3) зачем 2 экземпляра TLua ?
4) где код ведёт себя не так как нужно ?

Страницы: 1 2 3 415 Следующая »
ПроектыФорумУтилиты

Тема в архиве.