Что будет, если внешняя dll изменит содержимое строки Lua?

Страницы: 1
RSS
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Если есть просто строка Lua, ссылок на которую нет в таблицах, то изменение такой строки не повлечёт неожиданностей в работе скрипта? Возможные варианты: длина строки не меняется/уменьшается. Мне кажется, это может повлиять только на подсчёт хэша от этой строки, а кому он нужен в данном случае? Но, как я заметил по исходникам Lua, у Lua есть какой-то кэшбуфер удалённых сборкой мусора строк, я не понял, что это такое и для чего он используется...

Примечание: если dll уменьшает размер строки, то она корректирует это в поле длины строки (и если надо, типе строки: короткая/длинная строка).
 
Не понятно что значит "нет ссылок"?
Откуда строка Lua взялась в скрипте?

Покажите пример
 
Цитата
swerg написал:
Покажите пример
local str = 'abc'

При этом str не используется для индексирования в таблицах, т.е. нет такого: table.str ...
 
1. И где здесь dll
2. Есть штатное API для изменения значений переменных
О чем ваш вопрс?
 
Здесь подразумевается, что str изменилась с пом. моей dll. Вопрос: будет ли после этого скрипт работать корректно? Зачем для этого выписывать эту dll, она просто изменяет байты в массиве с содержимым этой строки...
 
А профайлер показал, что изменение строки - узкое место, на которое тратится больше всего времени?
Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
 
Цитата
paluke написал:
Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
Да, хочу, чтобы кто-то знающий подтвердил, что это будет незаметно для Луа (меня беспокоит какой-то непонятный буфер удалённых строк), на будущее может пригодиться в хозяйстве. Только почему сразу ноль целых хрен десятых, а вдруг будет больше? :smile:
 
Цитата
Serge123 написал:
Цитата
swerg написал:
Покажите пример
local str = 'abc'

При этом str не используется для индексирования в таблицах, т.е. нет такого: table.str ...
Похвально, что Вы интересуетесь такими вопросами, на которые скорее всего Вам на этом форуме не ответят.
Но чтобы ответить Вам на него мало информации.
----------------
Попробуйте уточнить следующее:
как вы предполагаете изменить значение локальной переменной.  Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию. т е чтобы изменить ее  из DLL надо сделать хорошие грабли и достать большой бубен.  
 
Возможность менять строку из dll может означать, что не надо будет оправлять эту строку в мусор хрен знает сколько раз. :smile:
 
Цитата
nikolz написал:
как вы предполагаете изменить значение локальной переменной.  Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию.
Странное рассуждение... Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.

А вдруг кто-то знает, но не хочет сказать... Вот TGB, по-моему, глубоко копает.
 
Цитата
Serge123 написал:
Цитата
nikolz написал:
как вы предполагаете изменить значение локальной переменной.  Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию.
Странное рассуждение... Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.

А вдруг кто-то знает, но не хочет сказать... Вот TGB, по-моему, глубоко копает.
Вы на ходу придумываете?
Вы хотя бы  смотрели что написали. Где в вашем примере структура?
Код
local str = 'abc'
---------------------------
"Один дурак может задать столько вопросов,что сто мудрецов не смогут ответить"
 
Цитата
Serge123 написал:
Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.
  Далее:
 char* str_h = (char*) Адрес структуры;
И с str_h (указатель открытый для записи) делаете все, что хотите (в пределах размера строки).
  Но, написанное выше не отменяет, то, что так делать не стоит. Вам интересно стрелять по своим ногам?
  Если вы так сильно озабочены эффективностью (только непонятно что вас не устраивает, конкретно для решения вашей задачи, в Lua?), то, наверное, для вас имеет смысл все, кроме интерфейса с QUIK, писать на C (а может быть на MASM  :smile: ). Все остальное будет менее эффективно и скорее всего затратнее, с учетом необходимости выполнения научно-исследовательской работы по скрещиванию dll с Lua  :smile: .
 
Цитата
nikolz написал:
Где в вашем примере структура?
Не в моём примере структура, а в Lua структура в файле lobject.h:
Код
/*
** Header for a string value.
*/
typedef struct TString {
  CommonHeader;
  lu_byte extra;  /* reserved words for short strings; "has hash" for longs */
  lu_byte shrlen;  /* length for short strings */
  unsigned int hash;
  union {
    size_t lnglen;  /* length for long strings */
    struct TString *hnext;  /* linked list for hash table */
  } u;
  char contents[1];
} TString;
Цитата
nikolz написал:
"Один дурак может задать столько вопросов,что сто мудрецов не смогут ответить"
Ну так не задавайте...
Цитата
TGB написал:
 Далее:  char* str_h = (char*) Адрес структуры; И с str_h (указатель открытый для записи) делаете все, что хотите (в пределах размера строки).
Я уже написал dll с прямым доступом, которая меняет содержимое и размер строки, он работает. Также работает пример с массивом и хождением по нодам с поиском элемента по ключу. М.б. по примеру Миши Флёнова напишу книжку "Lua глазами хакера" (за почасовую ставку школьной уборщицы). :smile:

Чукча не читатель, чукча писатель :smile:
https://intuit.ru/goods_store/books/121
https://shop-re-books.ru/catalog/knigi/nekhudozhestvennaya_literatura/kompyuternye­_tekhnologii/31118...
https://bhv.ru/product/delphi-i-turbo-pascal-na-zanimatelnyh-primerah/
https://www.amazon.com/Flash-Game-Developing-Handbook/dp/1931769478
Цитата
TGB написал:
Вам интересно стрелять по своим ногам?
Примеры хоть и работают, но ноги иногда чувствуют себя неуютно. :smile:
Цитата
TGB написал:
для вас имеет смысл все, кроме интерфейса с QUIK, писать на C (а может быть на MASM   ).
Надо как-то оценить, в каком случае будет быстрее работать и во сколько раз. Сейчас на 2-ядерном ЦП, подозреваю, что и поток Квика с коллбэками и поток с main могут выполняться на одном ядре, поэтому с переносом работы в поток main и ожиданием события может получиться полная ерунда, надо будет это проверить на 6-ядерном ЦП.

Сейчас gcc настолько хорошо оптимизирует, что я как-то написал оптимизированную программку на flat assembler, а на C аналогичная работала заметно быстрее...
 
Кстати, хотел спросить: почему на lua.org исходники даются для вер. 5.4.6, а бинарники лишь для вер. 5.4.2?
В составе Квика lua54.dll откуда берётся: квиковцы компилируют её из исходников? Они что-то перед компиляцией меняют в исходниках Lua?
 
Меняют конечно. Как минимум, туда добавлено несколько функций: os.sysdate(), table.sconcat(), table.sremove(), table.sinsert(), table.ssort().
А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
 
Цитата
paluke написал:
А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
Ясно, спасибо, я как-то заметил, что в исходниках эти лок и анлок присутствуют в виде заглушек.
Получается, что нельзя самому что-то для своего удобства изменить в исходниках и получить настроенную под себя dll для Квика...
 
Цитата
Serge123 написал:
Получается, что нельзя самому что-то для своего удобства изменить в исходниках и получить настроенную под себя dll для Квика...
Вы же хакер, можете заменить часть бинарника, заодно проверите, защищён ли он от этого как-нибудь.
 
Цитата
paluke написал:
А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
   Если интересно, то предложенный и проверенный мною вариант реализации этих макросов для обеспечения многопоточности QLua: https://forum.quik.ru/messages/forum10/message54696/topic6356/#message54696
------
 
Цитата
funduk написал:
Вы же хакер, можете заменить часть бинарника,
Я не хакер, я недавно перешёл на C, и часто приходится смотреть в справке по языку, как и чем что сделать. Я набираю программы в редакторе Фара и не пользуюсь отладчиками. Просто я слегка разобрался в структурах таблиц, строк и нодов...
Страницы: 1
Читают тему
Наверх