Синтаксис Pharo FFI

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
19 messages Options
Reply | Threaded
Open this post in threaded view
|

Синтаксис Pharo FFI

Victor Metelitsa-2
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Denis Kudriashov
Пишите в майлинг лис фары. У меня с этим опыта не много.  
А с английский текстом работает? (с русским текстом aString is WideString, а с английским - ByteString)


28 октября 2016 г., 13:22 пользователь Victor Metelitsa <[hidden email]> написал:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Victor Metelitsa-2
Я ж говорю - с кириллицей даже и не рискую, это будет дополнительный уровень сложности.
Кстати, а где новые VM берут? Надеюсь, их не надо компилить самостоятельно?

On Friday, October 28, 2016 at 4:41:24 PM UTC+5, Denis Kudriashov wrote:
Пишите в майлинг лис фары. У меня с этим опыта не много.  
А с английский текстом работает? (с русским текстом aString is WideString, а с английским - ByteString)


28 октября 2016 г., 13:22 пользователь Victor Metelitsa <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="LanJg-kkCAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">vvm...@...> написал:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="LanJg-kkCAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Denis Kudriashov
Я обычно беру отсюда http://files.pharo.org.
Но travis билдит все и выкладывает на bintray (ссылку не помню)


28 октября 2016 г., 13:51 пользователь Victor Metelitsa <[hidden email]> написал:
Я ж говорю - с кириллицей даже и не рискую, это будет дополнительный уровень сложности.
Кстати, а где новые VM берут? Надеюсь, их не надо компилить самостоятельно?

On Friday, October 28, 2016 at 4:41:24 PM UTC+5, Denis Kudriashov wrote:
Пишите в майлинг лис фары. У меня с этим опыта не много.  
А с английский текстом работает? (с русским текстом aString is WideString, а с английским - ByteString)


28 октября 2016 г., 13:22 пользователь Victor Metelitsa <[hidden email]> написал:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Victor Metelitsa-2
http://files.pharo.org/platform/Pharo5.0-win.zip ?
Там имидж обновляют время от времени, а VM остаётся майской.

Вроде бы дошло, как можно работать.

stringLength5: aString
    ^ self ffiCall: #(#int #strlen #(#FFIExternalArray #aString)) module: LibC

и после этого и
... FFIExternalArray externalNewType: 'char' size: ...
годится, и
.. FFIExternalArray externalNewType: 'uint8' size: ...
тоже.

On Friday, October 28, 2016 at 5:01:20 PM UTC+5, Denis Kudriashov wrote:
Я обычно беру отсюда <a href="http://www.google.com/url?q=http%3A%2F%2Ffiles.pharo.org&amp;sa=D&amp;sntz=1&amp;usg=AFQjCNH6Y2ZeP-SmTnSzX_liqpoIifj-nA" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Ffiles.pharo.org\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH6Y2ZeP-SmTnSzX_liqpoIifj-nA&#39;;return true;" onclick="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Ffiles.pharo.org\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH6Y2ZeP-SmTnSzX_liqpoIifj-nA&#39;;return true;">http://files.pharo.org.
Но travis билдит все и выкладывает на bintray (ссылку не помню)


28 октября 2016 г., 13:51 пользователь Victor Metelitsa <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="G1VU5v8lCAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">vvm...@...> написал:
Я ж говорю - с кириллицей даже и не рискую, это будет дополнительный уровень сложности.
Кстати, а где новые VM берут? Надеюсь, их не надо компилить самостоятельно?

On Friday, October 28, 2016 at 4:41:24 PM UTC+5, Denis Kudriashov wrote:
Пишите в майлинг лис фары. У меня с этим опыта не много.  
А с английский текстом работает? (с русским текстом aString is WideString, а с английским - ByteString)


28 октября 2016 г., 13:22 пользователь Victor Metelitsa <[hidden email]> написал:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
<a href="http://groups.google.ru/group/sugr" rel="nofollow" target="_blank" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="G1VU5v8lCAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Denis Kudriashov
Даже не знаю. Вообще прилез не обновляется. Это пришлось только сделать для мака из-за не совместимости с новой Sierr-ой.
Я беру виртуалку отсюда http://files.pharo.org/vm/pharo-spur32/ , а имидж отсюда http://files.pharo.org/image/60/.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Denis Kudriashov
6 -я версия довольно стабильная.

28 октября 2016 г., 16:18 пользователь Denis Kudriashov <[hidden email]> написал:
Даже не знаю. Вообще прилез не обновляется. Это пришлось только сделать для мака из-за не совместимости с новой Sierr-ой.
Я беру виртуалку отсюда http://files.pharo.org/vm/pharo-spur32/ , а имидж отсюда http://files.pharo.org/image/60/.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Igor Stasenko
In reply to this post by Victor Metelitsa-2


2016-10-28 13:22 GMT+02:00 Victor Metelitsa <[hidden email]>:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.

насколько я помню для инстанций FFIExternalArray нужно использовать адрес.
По крайней мере так было изначально в NativeBoost. 

    v := self stringLength2: p address.
                                              ^^^^^^
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Denis Kudriashov
Hello Игорь.
Возвращайся в фару :)

28 октября 2016 г., 20:35 пользователь Igor Stasenko <[hidden email]> написал:


2016-10-28 13:22 GMT+02:00 Victor Metelitsa <[hidden email]>:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.

насколько я помню для инстанций FFIExternalArray нужно использовать адрес.
По крайней мере так было изначально в NativeBoost. 

    v := self stringLength2: p address.
                                              ^^^^^^
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Victor Metelitsa-2
In reply to this post by Igor Stasenko
Я ожидал, что внутренняя логика UFFI сама догадается, что если в описании функции есть "char *", а я вызываю с параметром, который был выделен как p:= FFIExternalArray externalNewType: 'char' size: aString size + 1, то надо подставить адрес (а если вместо 'char' использую что-то несовместимое, то только тогда будет несоответствие/невозможность преобразования). Но она не догадывается. А как, спрашивается, подставить адрес? Вместо p использовать p handle? Как-то подозрительно, хотя попробовать и можно.

Кроме того, удивительна разница в обработке "char *" и "uint8 *". 

В качестве "документации" я использую https://ci.inria.fr/pharo-contribution/view/Books/job/PharoBookWorkInProgress/lastSuccessfulBuild/artifact/book-result/UnifiedFFI/UnifiedFFI.pdf ,

оттуда взята идея с FFIExternalArray, экземпляр данного класса присваивается полю "char *" структуры, и это UFFI отлично понимает. Вы, конечно, можете ссылаться на то, что имеются ещё и тесты, но когда я вижу, что параметру "char *" передаётся "somestring asByteArray with: 0", это понимания не прибавляет. Что, если с C-стороны в этот массив что-то попытаются записать? Это учтено или считается, что с той стороны ничего такого не будет, и как тогда быть, если мне это надо (я читаю строки и т.п. из базы данных)?

Короче, что-то непонятное происходит под ковром, и надо лезть под ковёр. Похоже, с учётом этого Цынкомовское и VAST'овское попроще будет.

On Friday, October 28, 2016 at 11:35:42 PM UTC+5, Igor Stasenko wrote:


2016-10-28 13:22 GMT+02:00 Victor Metelitsa <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="WNtPcoU7CAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">vvm...@...>:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.

насколько я помню для инстанций FFIExternalArray нужно использовать адрес.
По крайней мере так было изначально в NativeBoost. 

    v := self stringLength2: p address.
                                              ^^^^^^
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="WNtPcoU7CAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Victor Metelitsa-2
In reply to this post by Victor Metelitsa-2
Ещё какие ужасы:

    rc = SQLGetDescRec(hIRD,
                       i,
                       colname,
                       sizeof(colname),
                       &namelen,
                       &type,
                       &subtype,
                       &width,
                       &precision,
                       &scale,
                       &nullable);
Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить.

Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа
{
  val ...;
  nullind ...;
}

и затем вызывают функцию с ,,, &param.val, ..., &param,nullind

Если само определение структуры в UFFI ещё более-менее, то получение эквивалента &param.nullind и т.п. ещё "предстоит открыть".




--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Denis Kudriashov
Умоляю вас, пишите в Pharo-dev mailing list. Это реально важно, сообщить сообществу о ваших проблемах с системой, со стороны ваших задач и требований.
Pharo - это open source, если вы не расскажите о своих проблемах и идеях, ничего не измениться, и Pharo не станет лучше.
И тоже самое с документацией. Вы видите, что можно улучшить. Сообщите об этом (не нам, а сообществу Pharo).

Кроме того, думаю, здесь нет людей с опытом UFFI

29 октября 2016 г., 10:05 пользователь Victor Metelitsa <[hidden email]> написал:
Ещё какие ужасы:

    rc = SQLGetDescRec(hIRD,
                       i,
                       colname,
                       sizeof(colname),
                       &namelen,
                       &type,
                       &subtype,
                       &width,
                       &precision,
                       &scale,
                       &nullable);
Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить.

Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа
{
  val ...;
  nullind ...;
}

и затем вызывают функцию с ,,, &param.val, ..., &param,nullind

Если само определение структуры в UFFI ещё более-менее, то получение эквивалента &param.nullind и т.п. ещё "предстоит открыть".




--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Victor Metelitsa-2
Вы зачем-то принимаете это близко к сердцу. А я просто занимаюсь "что вижу, о том пою". В англоязычном мэйллисте с диким трафиком и с моим плохим английским это делать неудобно, не говоря о том, что я уже как-то пробовал спросить про проблему с ODBC несколько лет назад и никакой реакции не получил.

И, в принципе, я надеюсь постепенно разобраться со всем сам. По-видимому, то, что я уже знаю, достаточно для того, чтобы построить интерфейс к СУБД. Коннектиться к базу я уже научился, остальное, как я ожидаю, чисто ручная работа. Разве что будет "не изящненько" (см. соотв. анекдот).

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Igor Stasenko
In reply to this post by Victor Metelitsa-2


2016-10-29 10:05 GMT+02:00 Victor Metelitsa <[hidden email]>:
Ещё какие ужасы:

    rc = SQLGetDescRec(hIRD,
                       i,
                       colname,
                       sizeof(colname),
                       &namelen,
                       &type,
                       &subtype,
                       &width,
                       &precision,
                       &scale,
                       &nullable);
Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить.

Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа
{
  val ...;
  nullind ...;
}

и затем вызывают функцию с ,,, &param.val, ..., &param,nullind

Если само определение структуры в UFFI ещё более-менее, то получение эквивалента &param.nullind и т.п. ещё "предстоит открыть".

 
для return-value параметров вовсе не обязательно использовать FFIExternalArray .. это как использовать микроскоп для забивания гвоздей.
опять-же это я про то что было в NB, а во что сейчас оно превратилось в UFFI я имею слабое представление.
смотрите  FFIExternalValue
 


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Igor Stasenko
In reply to this post by Denis Kudriashov


2016-10-28 20:39 GMT+02:00 Denis Kudriashov <[hidden email]>:
Hello Игорь.
Возвращайся в фару :)

может быть когда нибудь.. у меня пока период отдыха от всего этого
 
28 октября 2016 г., 20:35 пользователь Igor Stasenko <[hidden email]> написал:



2016-10-28 13:22 GMT+02:00 Victor Metelitsa <[hidden email]>:
Пытаюсь разобраться. Первоначально всё казалось просто и прозрачно, но теперь пошли удивления.

Положим,

stringLength1: aString
^ self ffiCall: #( int strlen (String aString) ) module: LibC

OK, "self stringLength1: 'Anana'" даёт 5, вроде как работает (кириллицу я пока не рискую). Но я хочу попробовать что-то более общее, вот так:

stringLength2: aString
^ self ffiCall: #( int strlen (char * aString) ) module: LibC


и вызвать так:

 testStringLength2: aString
"
    self testStringLength2: 'anana'
"   | p v |
    p := FFIExternalArray externalNewType: 'char' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char ].
    p at: aString size + 1 put: (Character value: 0).
    v := self stringLength2: p.

насколько я помню для инстанций FFIExternalArray нужно использовать адрес.
По крайней мере так было изначально в NativeBoost. 

    v := self stringLength2: p address.
                                              ^^^^^^
    p free.
    ^ v.

Вызываю - Could not coerce arguments. Мне это странно.

А что, если попробовать так:
stringLength3: aString
^ self ffiCall: #( int strlen (uint8 * aString) ) module: LibC

testStringLength3: aString
"
    self testStringLength3: 'anana'
"    | p v |
    p := FFIExternalArray externalNewType: 'uint8' size: aString size + 1.
    aString doWithIndex: [ :char :i | p at: i put: char asInteger ].
    p at: aString size + 1 put: ("Character value:" 0).
    v := self stringLength3: p.
    p free.
    ^ v.

Ага, ошибка не вылетела. Вот только результат почему-то 3 вместо ожидаемого 5.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Victor Metelitsa-2
In reply to this post by Igor Stasenko
Лучше так, чем совсем никак.

А есть там удобная работа с неизвестной на этапе компиляции структурой? Т.е., я только во время выполнения узнаю, что, оказывается, по смещению n лежат четыре uint32, а по смещению m в том же массиве байтов - int64?


On Wednesday, November 2, 2016 at 12:54:56 AM UTC+5, Igor Stasenko wrote:


2016-10-29 10:05 GMT+02:00 Victor Metelitsa <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="lTGYrKnPAAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">vvm...@...>:
Ещё какие ужасы:

    rc = SQLGetDescRec(hIRD,
                       i,
                       colname,
                       sizeof(colname),
                       &namelen,
                       &type,
                       &subtype,
                       &width,
                       &precision,
                       &scale,
                       &nullable);
Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить.

Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа
{
  val ...;
  nullind ...;
}

и затем вызывают функцию с ,,, &param.val, ..., &param,nullind

Если само определение структуры в UFFI ещё более-менее, то получение эквивалента &param.nullind и т.п. ещё "предстоит открыть".

 
для return-value параметров вовсе не обязательно использовать FFIExternalArray .. это как использовать микроскоп для забивания гвоздей.
опять-же это я про то что было в NB, а во что сейчас оно превратилось в UFFI я имею слабое представление.
смотрите  FFIExternalValue
 


--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="lTGYrKnPAAAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Igor Stasenko


2016-11-01 22:37 GMT+01:00 Victor Metelitsa <[hidden email]>:
Лучше так, чем совсем никак.

А есть там удобная работа с неизвестной на этапе компиляции структурой? Т.е., я только во время выполнения узнаю, что, оказывается, по смещению n лежат четыре uint32, а по смещению m в том же массиве байтов - int64?

В смаллтолке нет "этапа компиляции" там всегда ран-тайм. Поэтому не вижу никаких преград динамически генерировать структуры с заданными типами и смещениями. На самом деле так оно и работает изначально. Единственно, что юзер интерфейс для сишных структур заточен под статичные структуры. Но ничего не мешает подпилить ее под динамичные -с помощью субклассинга существующего класса или переребрасывания нужных кусков кода в свой новый класс который будет заниматься тем что вам нужно. Смотрите код, изучайте как это сделано.
 

On Wednesday, November 2, 2016 at 12:54:56 AM UTC+5, Igor Stasenko wrote:


2016-10-29 10:05 GMT+02:00 Victor Metelitsa <[hidden email]>:
Ещё какие ужасы:

    rc = SQLGetDescRec(hIRD,
                       i,
                       colname,
                       sizeof(colname),
                       &namelen,
                       &type,
                       &subtype,
                       &width,
                       &precision,
                       &scale,
                       &nullable);
Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить.

Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа
{
  val ...;
  nullind ...;
}

и затем вызывают функцию с ,,, &param.val, ..., &param,nullind

Если само определение структуры в UFFI ещё более-менее, то получение эквивалента &param.nullind и т.п. ещё "предстоит открыть".

 
для return-value параметров вовсе не обязательно использовать FFIExternalArray .. это как использовать микроскоп для забивания гвоздей.
опять-же это я про то что было в NB, а во что сейчас оно превратилось в UFFI я имею слабое представление.
смотрите  FFIExternalValue
 


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Victor Metelitsa-2
Для меня оно логически поделено - генерация классов и байткода, с одной стороны, и исполнение байткода, с другой.  Конечно, править байткод прямо во время его выполнения - это круто, но я бы предпочёл, как минимум, чтобы происходящее было бы лучше документировано. Ну... по крайней мере, уже после обнаружения FFIExternalArray мне стало понятно, что с какой-то обёрткой над DB2 CLI и Oracle OCI я справиться должен....

On Wednesday, November 2, 2016 at 5:14:00 PM UTC+5, Igor Stasenko wrote:


2016-11-01 22:37 GMT+01:00 Victor Metelitsa <<a href="javascript:" target="_blank" gdf-obfuscated-mailto="IFf2LxcFAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">vvm...@...>:
Лучше так, чем совсем никак.

А есть там удобная работа с неизвестной на этапе компиляции структурой? Т.е., я только во время выполнения узнаю, что, оказывается, по смещению n лежат четыре uint32, а по смещению m в том же массиве байтов - int64?

В смаллтолке нет "этапа компиляции" там всегда ран-тайм. Поэтому не вижу никаких преград динамически генерировать структуры с заданными типами и смещениями. На самом деле так оно и работает изначально. Единственно, что юзер интерфейс для сишных структур заточен под статичные структуры. Но ничего не мешает подпилить ее под динамичные -с помощью субклассинга существующего класса или переребрасывания нужных кусков кода в свой новый класс который будет заниматься тем что вам нужно. Смотрите код, изучайте как это сделано.
 

On Wednesday, November 2, 2016 at 12:54:56 AM UTC+5, Igor Stasenko wrote:


2016-10-29 10:05 GMT+02:00 Victor Metelitsa <[hidden email]>:
Ещё какие ужасы:

    rc = SQLGetDescRec(hIRD,
                       i,
                       colname,
                       sizeof(colname),
                       &namelen,
                       &type,
                       &subtype,
                       &width,
                       &precision,
                       &scale,
                       &nullable);
Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить.

Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа
{
  val ...;
  nullind ...;
}

и затем вызывают функцию с ,,, &param.val, ..., &param,nullind

Если само определение структуры в UFFI ещё более-менее, то получение эквивалента &param.nullind и т.п. ещё "предстоит открыть".

 
для return-value параметров вовсе не обязательно использовать FFIExternalArray .. это как использовать микроскоп для забивания гвоздей.
опять-же это я про то что было в NB, а во что сейчас оно превратилось в UFFI я имею слабое представление.
смотрите  FFIExternalValue
 


--
--
<a href="http://groups.google.ru/group/sugr" rel="nofollow" target="_blank" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" rel="nofollow" target="_blank" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
<a href="http://groups.google.ru/group/sugr" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;" onclick="this.href=&#39;http://groups.google.ru/group/sugr&#39;;return true;">http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес <a href="javascript:" target="_blank" gdf-obfuscated-mailto="IFf2LxcFAQAJ" rel="nofollow" onmousedown="this.href=&#39;javascript:&#39;;return true;" onclick="this.href=&#39;javascript:&#39;;return true;">sugr+uns...@googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке <a href="https://groups.google.com/d/optout" target="_blank" rel="nofollow" onmousedown="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;" onclick="this.href=&#39;https://groups.google.com/d/optout&#39;;return true;">https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|

Re: Синтаксис Pharo FFI

Igor Stasenko


2016-11-02 15:19 GMT+01:00 Victor Metelitsa <[hidden email]>:
Для меня оно логически поделено - генерация классов и байткода, с одной стороны, и исполнение байткода, с другой.  Конечно, править байткод прямо во время его выполнения - это круто, но я бы предпочёл, как минимум, чтобы происходящее было бы лучше документировано. Ну... по крайней мере, уже после обнаружения FFIExternalArray мне стало понятно, что с какой-то обёрткой над DB2 CLI и Oracle OCI я справиться должен....


Ну ты спросил, я ответил.
Какой вопрос - такой и ответ.
"А можно сначала стулья, а потом деньги?" - можна, но деньги вперед
:)
Ну и вообще по таким вопросам лучше общаться в группе фаро..
 
On Wednesday, November 2, 2016 at 5:14:00 PM UTC+5, Igor Stasenko wrote:


2016-11-01 22:37 GMT+01:00 Victor Metelitsa <[hidden email]>:
Лучше так, чем совсем никак.

А есть там удобная работа с неизвестной на этапе компиляции структурой? Т.е., я только во время выполнения узнаю, что, оказывается, по смещению n лежат четыре uint32, а по смещению m в том же массиве байтов - int64?

В смаллтолке нет "этапа компиляции" там всегда ран-тайм. Поэтому не вижу никаких преград динамически генерировать структуры с заданными типами и смещениями. На самом деле так оно и работает изначально. Единственно, что юзер интерфейс для сишных структур заточен под статичные структуры. Но ничего не мешает подпилить ее под динамичные -с помощью субклассинга существующего класса или переребрасывания нужных кусков кода в свой новый класс который будет заниматься тем что вам нужно. Смотрите код, изучайте как это сделано.
 

On Wednesday, November 2, 2016 at 12:54:56 AM UTC+5, Igor Stasenko wrote:


2016-10-29 10:05 GMT+02:00 Victor Metelitsa <[hidden email]>:
Ещё какие ужасы:

    rc = SQLGetDescRec(hIRD,
                       i,
                       colname,
                       sizeof(colname),
                       &namelen,
                       &type,
                       &subtype,
                       &width,
                       &precision,
                       &scale,
                       &nullable);
Я пока что на каждый & завожу отдельный FFIExternalArray размером 1. Размер кода - огого, и неплохо бы его сократить.

Ещё было странное замечание в документации DB2 CLI. Прежде всего, надо заметить, что когда мы извлекаем значение поля в записи таблицы DB2, требуются две переменных - для собственно значения и для null-индикатора. Так вот, там было рекомендовано помещать их в структуру - якобы при смежном размещении работает быстрее. Как бы то ни было, определяют что-то типа
{
  val ...;
  nullind ...;
}

и затем вызывают функцию с ,,, &param.val, ..., &param,nullind

Если само определение структуры в UFFI ещё более-менее, то получение эквивалента &param.nullind и т.п. ещё "предстоит открыть".

 
для return-value параметров вовсе не обязательно использовать FFIExternalArray .. это как использовать микроскоп для забивания гвоздей.
опять-же это я про то что было в NB, а во что сейчас оно превратилось в UFFI я имею слабое представление.
смотрите  FFIExternalValue
 


--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.



--
Best regards,
Igor Stasenko.

--
--
http://groups.google.ru/group/sugr
---
Вы получили это сообщение, поскольку подписаны на группу "Russian Smalltalk User Group".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес [hidden email].
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.