Что будет, если внешняя dll изменит содержимое строки Lua?
Пользователь
Сообщений: Регистрация: 27.12.2022
26.04.2024 12:44:52
Если есть просто строка Lua, ссылок на которую нет в таблицах, то изменение такой строки не повлечёт неожиданностей в работе скрипта? Возможные варианты: длина строки не меняется/уменьшается. Мне кажется, это может повлиять только на подсчёт хэша от этой строки, а кому он нужен в данном случае? Но, как я заметил по исходникам Lua, у Lua есть какой-то кэшбуфер удалённых сборкой мусора строк, я не понял, что это такое и для чего он используется...
Примечание: если dll уменьшает размер строки, то она корректирует это в поле длины строки (и если надо, типе строки: короткая/длинная строка).
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
26.04.2024 13:38:01
Не понятно что значит "нет ссылок"? Откуда строка Lua взялась в скрипте?
При этом str не используется для индексирования в таблицах, т.е. нет такого: table.str ...
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
27.04.2024 07:51:24
1. И где здесь dll 2. Есть штатное API для изменения значений переменных О чем ваш вопрс?
Пользователь
Сообщений: Регистрация: 27.12.2022
27.04.2024 10:25:31
Здесь подразумевается, что str изменилась с пом. моей dll. Вопрос: будет ли после этого скрипт работать корректно? Зачем для этого выписывать эту dll, она просто изменяет байты в массиве с содержимым этой строки...
Пользователь
Сообщений: Регистрация: 20.03.2023
27.04.2024 15:50:15
А профайлер показал, что изменение строки - узкое место, на которое тратится больше всего времени? Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
Пользователь
Сообщений: Регистрация: 27.12.2022
27.04.2024 16:14:16
Цитата
paluke написал: Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
Да, хочу, чтобы кто-то знающий подтвердил, что это будет незаметно для Луа (меня беспокоит какой-то непонятный буфер удалённых строк), на будущее может пригодиться в хозяйстве. Только почему сразу ноль целых хрен десятых, а вдруг будет больше?
При этом str не используется для индексирования в таблицах, т.е. нет такого: table.str ...
Похвально, что Вы интересуетесь такими вопросами, на которые скорее всего Вам на этом форуме не ответят. Но чтобы ответить Вам на него мало информации. ---------------- Попробуйте уточнить следующее: как вы предполагаете изменить значение локальной переменной. Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию. т е чтобы изменить ее из DLL надо сделать хорошие грабли и достать большой бубен.
Пользователь
Сообщений: Регистрация: 27.12.2022
27.04.2024 16:27:20
Возможность менять строку из dll может означать, что не надо будет оправлять эту строку в мусор хрен знает сколько раз.
Пользователь
Сообщений: Регистрация: 27.12.2022
27.04.2024 16:42:30
Цитата
nikolz написал: как вы предполагаете изменить значение локальной переменной. Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию.
Странное рассуждение... Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.
А вдруг кто-то знает, но не хочет сказать... Вот TGB, по-моему, глубоко копает.
написал: как вы предполагаете изменить значение локальной переменной. Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию.
Странное рассуждение... Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.
А вдруг кто-то знает, но не хочет сказать... Вот TGB, по-моему, глубоко копает.
Вы на ходу придумываете? Вы хотя бы смотрели что написали. Где в вашем примере структура?
Код
local str = 'abc'
--------------------------- "Один дурак может задать столько вопросов,что сто мудрецов не смогут ответить"
Пользователь
Сообщений: Регистрация: 12.05.2020
28.04.2024 08:21:08
Цитата
Serge123 написал: Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.
Далее: char* str_h = (char*) Адрес структуры; И с str_h (указатель открытый для записи) делаете все, что хотите (в пределах размера строки). Но, написанное выше не отменяет, то, что так делать не стоит. Вам интересно стрелять по своим ногам? Если вы так сильно озабочены эффективностью (только непонятно что вас не устраивает, конкретно для решения вашей задачи, в Lua?), то, наверное, для вас имеет смысл все, кроме интерфейса с QUIK, писать на C (а может быть на MASM ). Все остальное будет менее эффективно и скорее всего затратнее, с учетом необходимости выполнения научно-исследовательской работы по скрещиванию dll с Lua .
Не в моём примере структура, а в 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 глазами хакера" (за почасовую ставку школьной уборщицы).
Чукча не читатель, чукча писатель
Цитата
TGB написал: Вам интересно стрелять по своим ногам?
Примеры хоть и работают, но ноги иногда чувствуют себя неуютно.
Цитата
TGB написал: для вас имеет смысл все, кроме интерфейса с QUIK, писать на C (а может быть на MASM ).
Надо как-то оценить, в каком случае будет быстрее работать и во сколько раз. Сейчас на 2-ядерном ЦП, подозреваю, что и поток Квика с коллбэками и поток с main могут выполняться на одном ядре, поэтому с переносом работы в поток main и ожиданием события может получиться полная ерунда, надо будет это проверить на 6-ядерном ЦП.
Сейчас gcc настолько хорошо оптимизирует, что я как-то написал оптимизированную программку на flat assembler, а на C аналогичная работала заметно быстрее...
Пользователь
Сообщений: Регистрация: 27.12.2022
29.04.2024 20:44:08
Кстати, хотел спросить: почему на lua.org исходники даются для вер. 5.4.6, а бинарники лишь для вер. 5.4.2? В составе Квика lua54.dll откуда берётся: квиковцы компилируют её из исходников? Они что-то перед компиляцией меняют в исходниках Lua?
Пользователь
Сообщений: Регистрация: 20.03.2023
02.05.2024 13:32:46
Меняют конечно. Как минимум, туда добавлено несколько функций: os.sysdate(), table.sconcat(), table.sremove(), table.sinsert(), table.ssort(). А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
Пользователь
Сообщений: Регистрация: 27.12.2022
02.05.2024 18:02:29
Цитата
paluke написал: А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
Ясно, спасибо, я как-то заметил, что в исходниках эти лок и анлок присутствуют в виде заглушек. Получается, что нельзя самому что-то для своего удобства изменить в исходниках и получить настроенную под себя dll для Квика...
Пользователь
Сообщений: Регистрация: 20.03.2023
02.05.2024 19:11:56
Цитата
Serge123 написал: Получается, что нельзя самому что-то для своего удобства изменить в исходниках и получить настроенную под себя dll для Квика...
Вы же хакер, можете заменить часть бинарника, заодно проверите, защищён ли он от этого как-нибудь.
Пользователь
Сообщений: Регистрация: 12.05.2020
02.05.2024 22:57:29
Цитата
paluke написал: А еще должна быть какая-то непустая реализация макросов lua_lock()/lua_unlock() в llimits.h
Если интересно, то предложенный и проверенный мною вариант реализации этих макросов для обеспечения многопоточности QLua: ------
Пользователь
Сообщений: Регистрация: 27.12.2022
03.05.2024 12:13:51
Цитата
funduk написал: Вы же хакер, можете заменить часть бинарника,
Я не хакер, я недавно перешёл на C, и часто приходится смотреть в справке по языку, как и чем что сделать. Я набираю программы в редакторе Фара и не пользуюсь отладчиками. Просто я слегка разобрался в структурах таблиц, строк и нодов...