Если есть просто строка Lua, ссылок на которую нет в таблицах, то изменение такой строки не повлечёт неожиданностей в работе скрипта? Возможные варианты: длина строки не меняется/уменьшается. Мне кажется, это может повлиять только на подсчёт хэша от этой строки, а кому он нужен в данном случае? Но, как я заметил по исходникам Lua, у Lua есть какой-то кэшбуфер удалённых сборкой мусора строк, я не понял, что это такое и для чего он используется...
Примечание: если dll уменьшает размер строки, то она корректирует это в поле длины строки (и если надо, типе строки: короткая/длинная строка).
Здесь подразумевается, что str изменилась с пом. моей dll. Вопрос: будет ли после этого скрипт работать корректно? Зачем для этого выписывать эту dll, она просто изменяет байты в массиве с содержимым этой строки...
А профайлер показал, что изменение строки - узкое место, на которое тратится больше всего времени? Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
paluke написал: Или вы хотите разбираться с тем, как поменять значение в обход api, c рисками неопределенного поведения, ради ускорения в ноль целых хрен десятых процента?
Да, хочу, чтобы кто-то знающий подтвердил, что это будет незаметно для Луа (меня беспокоит какой-то непонятный буфер удалённых строк), на будущее может пригодиться в хозяйстве. Только почему сразу ноль целых хрен десятых, а вдруг будет больше?
При этом str не используется для индексирования в таблицах, т.е. нет такого: table.str ...
Похвально, что Вы интересуетесь такими вопросами, на которые скорее всего Вам на этом форуме не ответят. Но чтобы ответить Вам на него мало информации. ---------------- Попробуйте уточнить следующее: как вы предполагаете изменить значение локальной переменной. Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию. т е чтобы изменить ее из DLL надо сделать хорошие грабли и достать большой бубен.
nikolz написал: как вы предполагаете изменить значение локальной переменной. Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию.
Странное рассуждение... Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.
А вдруг кто-то знает, но не хочет сказать... Вот TGB, по-моему, глубоко копает.
nikolz написал: как вы предполагаете изменить значение локальной переменной. Она не передается как таблицы по указателю, поэтому Вы не получите к ней доступ в функции, а получите ее копию.
Странное рассуждение... Адрес структуры для локальной строки передаётся в виде указателя в параметре при вызове из Lua скрипта моей dll.
А вдруг кто-то знает, но не хочет сказать... Вот TGB, по-моему, глубоко копает.
Вы на ходу придумываете? Вы хотя бы смотрели что написали. Где в вашем примере структура?
Код
local str = 'abc'
--------------------------- "Один дурак может задать столько вопросов,что сто мудрецов не смогут ответить"
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 аналогичная работала заметно быстрее...
Кстати, хотел спросить: почему на 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 для Квика...
funduk написал: Вы же хакер, можете заменить часть бинарника,
Я не хакер, я недавно перешёл на C, и часто приходится смотреть в справке по языку, как и чем что сделать. Я набираю программы в редакторе Фара и не пользуюсь отладчиками. Просто я слегка разобрался в структурах таблиц, строк и нодов...