メールの詳細(トピック表示)
Phi::PRINTER.printers
投稿者:take_tkさん 2006/01/10 18:22 MLNo.2035 [メール表示]
たけ(tk)です
下記のスクリプトを apollo.exe で実行すると、「:ok」が表示された後で、変
なエラーメッセージが出ます。
ruby.exe や ruby_ap.exe では出ない。
841a の問題ではなく、前から。
p Phi::PRINTER.printers.to_a なら出ない。
再現しますか?
----
require "phi"
p Phi::PRINTER
p Phi::PRINTER.printers
p :ok
----
#<Phi::Printer:0xecf2d0>
#<Phi::Strings: "EPSON PM-A700", "Acrobat Distiller", "\\edicube-02\lp8300", "\\edicube-02\lp7900">
:ok
method `inspect' called on terminated object (0xb65ec8) (NotImplementedError)
G:\apollo\1.rb:4:in `to_s'
Phi = C:/Program Files/Apollo/bin/phi.so .. ( version 0.841a_vcl60 )
Ruby = ruby_so_path?? .. ( version 1.8.4 )
Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武
読み込み中...- MLNo.2036 moriqさん (0) 2006/01/10 18:38 [メール表示する]
-
MLNo.2038
take_tkさん
(0) 2006/01/27 18:15 [メール表示する]

たけ(tk)です
[ap-dev:2036] Re: Phi::PRINTER.printers にて
Kazuhiro Yoshidaさん曰く:
> GC周りですかね。
なんとなく、原因判明。
(1)$DEBUG=trueで実行すると、printers[i].inspect で例外が出ているのに、
それが表示されていないことが分かる。
----
require "phi"
$DEBUG = true
p Phi::PRINTER
p Phi::PRINTER.printers
p :ok
----
#
Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb6098c)
Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb66e8c)
Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb620bc)
Exception `NotImplementedError' at G:\apollo\1.rb:5 - method `inspect' called on terminated object (0xb67e64)
#
:ok
Exception `NotImplementedError' at G:\apollo\1.rb:0 - method `inspect' called on terminated object (0xb67e64)
method `inspect' called on terminated object (0xb67e64) (NotImplementedError)
G:\apollo\1.rb:5:in `to_s'
----
(2)どこで例外が出ているかというと uStrings.pas の Strings_to_s の
ap_protect(ap_inspect, obj, state) で出ている。
C:/Program Files/Apollo/src/u/uStrings.pas
function Strings_to_s(This: Tvalue): Tvalue; cdecl;
var
real: TStrings;
S: string;
obj, str: Tvalue;
i: Integer;
state: Integer;
begin
real := ap_data_get_struct(This);
S := '#<' + dl_class_name_of(This) + ': ';
for i := 0 to real.Count-1 do
begin
if i > 0 then S := S + ', ';
S := S + AnsiQuotedStr(real[i], '"');
if real.Objects[i] <> nil then
begin
obj := Tvalue(real.Objects[i]);
if obj = This then
S := S + '=>' + '(self)'
else begin
str := ap_protect(ap_inspect, obj, state); ←ここ
if state = 0 then S := S + '=>' + ap_str_ptr(str);
end;
end;
end;
S := S + '>';
result := ap_String(S);
end;
(3)何故、NotImplementedError かというと、printers.objects[]にはDelphi
の TPrinterDevice オブジェクトが入っているから。そこから Tvalue を取り出
そうとしてもエラーになる。
C:/Program Files/Borland/Delphi6/Source/Vcl/Printers.pas
with TPrinterDevice(Printers.Objects[PrinterIndex]) do
ということのようです。
Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武

-
MLNo.2039
take_tkさん
(0) 2006/02/03 16:08 [メール表示する]

たけ(tk)です
対策としては次のようなモノか? でも、ちょっと、大がかりすぎ?
(1)objects_usedインスタンス変数を追加する。RO。
(2)objects_useable?メソッドを追加する。
(2−1)objects_used=trueならtrue、(前に調べて、既に使われている)
(2−2)objectsがすべてnilならtrue、
(2−3)それ以外であればfalseを返す。
(3)objectsにセットする場合には、
(3−1)objects_useableを調べ、falseなら例外を生成する。
(3−2)objectsにセットした場合には、objects_used変数にtrueをセットする。
(4)objectsを参照しようとする場合に、objects_useableを調べて、trueならnil
を返す。
Take_tk = KUMAGAI Hidetake
たけ(tk)=熊谷秀武

-
MLNo.2040
take_tkさん
(0) 2006/02/04 11:19 [メール表示する]

たけ(tk)です。
[ap-dev:2039] Re: Phi::PRINTER.printers にて
take_tkさん 曰く:
> 対策としては次のようなモノか? でも、ちょっと、大がかりすぎ?
もうちょっと簡単になるか?
(1)@…_useableインスタンス変数を追加する。nil:未検査、true:利
用可能、false:利用付加。Rubyからの直接参照不可。
(2)objects_useable?メソッドを追加する。
(2−1)@…_useable<>nilならその値を返す。
(2−2)objectsがすべてnilならtrue、
(2−3)それ以外であればfalseを@…_useableにセットしたうえ、
それを返す。つまり、初回の一度しか調べない。
(3)objectsにセットする場合には、objects_useable?を調べ、falseなら例外
を生成する。
(4)objectsを参照しようとする場合に、objects_useable?を調べて、trueな
らnilを返す。
* 問題点:objects_useable?で調べた後にDelphiが利用したことは点検できな
い。(前のバージョンではRubyでobjectsを使用した後にDelphiが利用したこと
を点検できない)。
take_tk = kumagai hidetake

-
MLNo.2041
take_tkさん
(0) 2006/02/05 21:33 [メール表示する]

たけ(tk)です。
コミットしちゃいました。
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/apollo/apollo/src/u/uStrings.pas?sortby=date&r2=1.3&r1=1.2
require "phi"
p Phi::PRINTER
p Phi::PRINTER.printers
p Phi::PRINTER.printers.objects_useable? #=> false
p :ok
[ap-dev:2040] Re: Phi::PRINTER.printers にて
take_tkさん 曰く:
> もうちょっと簡単になるか?
>
> (1)@…_useableインスタンス変数を追加する。nil:未検査、true:利
> 用可能、false:利用付加。Rubyからの直接参照不可。
>
> (2)objects_useable?メソッドを追加する。
> (2−1)@…_useable<>nilならその値を返す。
> (2−2)objectsがすべてnilならtrue、
> (2−3)それ以外であればfalseを@…_useableにセットしたうえ、
> それを返す。つまり、初回の一度しか調べない。
>
> (3)objectsにセットする場合には、objects_useable?を調べ、falseなら例外
> を生成する。
>
> (4)objectsを参照しようとする場合に、objects_useable?を調べて、trueな
> らnilを返す。
take_tk = kumagai hidetake

- MLNo.2042 moriqさん (0) 2006/02/08 16:18 [メール表示する]

