Компонентная модель организации программных систем. Семакин М.М. - 22 стр.

UptoLike

Составители: 

22
{------------------------------------------------------------------------------}
const
TMyComponent_tag: integer = LUA_NOTAG;
function TMyComponent_gettable_event( L: lua_State ): integer; cdecl;
function TMyComponent_settable_event( L: lua_State ): integer; cdecl;
{------------------------------------------------------------------------------}
const
type_TMyComponent = LUA_TTABLE;
function to_TMyComponent( L: lua_State;
value_index: integer ): TMyComponent;
function push_TMyComponent( L: lua_State;
value: TMyComponent ): integer;
{==============================================================================}
implementation
uses
SysUtils,
LuaDebug,
TMyComponent_LuaObject;
////////////////////////////////////////////////////////////////////////////////
function TMyComponent_alloc( L: lua_State ): integer; cdecl;
var MyComp: TMyComponent;
begin
Result := 1;
MyComp := TMyComponent.Create();
PushObjectHandleWithTag( L, MyComp );
end;
{------------------------------------------------------------------------------}
function TMyComponent_new( L: lua_State ): integer; cdecl;
var top: integer;
begin
Result := 1;
if lua_type( L, 1 ) <> LUA_TTABLE then begin
lua_pushnil( L ) // если это не таблица, необходимо возвращать nil
end
else begin
TMyComponent_alloc( L ); // создаем экземпляр объекта и посылаем в стек
CreateTableCopy( L, 1 ); // создаем копию таблицы и посылаем в стек
top := lua_gettop( L );
SetObjectHandleToTable( L, top, lua_gettop(L)-1 ); // ассоциируем
// таблицу и объект
lua_remove( L, -2 ); // удаляем копию объекта из стека
// на вершине остается только таблица
if TMyComponent_Tag = LUA_NOTAG then begin
// создаем tag для таблицы
TMyComponent_Tag := lua_newtag( L );
lua_pushcfunction( L, TMyComponent_gettable_event );
lua_settagmethod( L, TMyComponent_Tag, 'gettable' );
lua_pushcfunction( L, TMyComponent_settable_event );
lua_settagmethod( L, TMyComponent_Tag, 'settable' );
end;
lua_settag( L, TMyComponent_Tag ); // ассоциируем tag и таблицу
end;
end;
////////////////////////////////////////////////////////////////////////////////
function TMyComponent_gettable_event( L: lua_State ): integer; cdecl;
begin
Result := 1;
lua_pushvalue( L, 2 );
lua_rawget( L, 1 );
end;
{------------------------------------------------------------------------------}
const
  TMyComponent_tag: integer = LUA_NOTAG;

function TMyComponent_gettable_event( L: lua_State ): integer; cdecl;
function TMyComponent_settable_event( L: lua_State ): integer; cdecl;

{------------------------------------------------------------------------------}
const
  type_TMyComponent = LUA_TTABLE;

function to_TMyComponent( L: lua_State;
                           value_index: integer ): TMyComponent;
function push_TMyComponent( L: lua_State;
                             value: TMyComponent ): integer;

{==============================================================================}
implementation

uses
  SysUtils,
  LuaDebug,
  TMyComponent_LuaObject;

////////////////////////////////////////////////////////////////////////////////
function TMyComponent_alloc( L: lua_State ): integer; cdecl;
var MyComp: TMyComponent;
begin
  Result := 1;
  MyComp := TMyComponent.Create();
  PushObjectHandleWithTag( L, MyComp );
end;

{------------------------------------------------------------------------------}
function TMyComponent_new( L: lua_State ): integer; cdecl;
var top: integer;
begin
  Result := 1;
  if lua_type( L, 1 ) <> LUA_TTABLE then begin
    lua_pushnil( L ) // если это не таблица, необходимо возвращать nil
  end
  else begin
    TMyComponent_alloc( L ); // создаем экземпляр объекта и посылаем в стек
    CreateTableCopy( L, 1 ); // создаем копию таблицы и посылаем в стек
     top := lua_gettop( L );
     SetObjectHandleToTable( L, top, lua_gettop(L)-1 ); // ассоциируем
                                                        // таблицу и объект
     lua_remove( L, -2 );      // удаляем копию объекта из стека
                               // на вершине остается только таблица
     if TMyComponent_Tag = LUA_NOTAG then begin
       // создаем tag для таблицы
       TMyComponent_Tag := lua_newtag( L );
       lua_pushcfunction( L, TMyComponent_gettable_event );
       lua_settagmethod( L, TMyComponent_Tag, 'gettable' );
       lua_pushcfunction( L, TMyComponent_settable_event );
       lua_settagmethod( L, TMyComponent_Tag, 'settable' );
     end;
     lua_settag( L, TMyComponent_Tag ); // ассоциируем tag и таблицу
  end;
end;

////////////////////////////////////////////////////////////////////////////////
function TMyComponent_gettable_event( L: lua_State ): integer; cdecl;
begin
  Result := 1;

  lua_pushvalue( L, 2 );
  lua_rawget( L, 1 );
end;



                                          22