Class: FFI::Tcl::Interp

Inherits:
PrettyStruct show all
Defined in:
lib/ffi-tk/ffi/tcl/interp.rb

Constant Summary collapse

EVAL_GLOBAL =
0x20000
EVAL_DIRECT =
0x40000

Constants inherited from PrettyStruct

PrettyStruct::ACCESSOR_CODE

Instance Method Summary collapse

Methods inherited from PrettyStruct

layout

Instance Method Details

#do_events_until(flag = 0) ⇒ Object



66
67
68
69
70
71
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 66

def do_events_until(flag = 0)
  begin
    wait_for_event(0.1)
    Tcl.do_one_event(flag)
  end until yield
end

#do_events_while(flag = 0) ⇒ Object



73
74
75
76
77
78
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 73

def do_events_while(flag = 0)
  begin
    wait_for_event(0.1)
    Tcl.do_one_event(flag)
  end while yield
end

#do_one_event(flag = 0) ⇒ Object



62
63
64
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 62

def do_one_event(flag = 0)
  Tcl.do_one_event(flag)
end

#eval(string) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 80

def eval(string)
  if $DEBUG
    if string =~ /\n/
      puts "\neval: %p" % [string]
    else
      puts "\neval: %s" % [string]
    end
  end

  code = Tcl.eval_ex(self, string, string.bytesize, EVAL_DIRECT)
  puts 'eval= %p' % [code] if $DEBUG
  return true if code == 0

  message = guess_result.to_s
  puts 'eval= %p' % [message] if $DEBUG

  if message.empty?
    raise 'Failure during eval of: %p' % [string]
  else
    raise '%s during eval of: %p' % [message, string]
  end
end

#guess_resultObject



18
19
20
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 18

def guess_result
  EvalResult.guess(self, Obj.new(Tcl.get_obj_result(self)))
end

#inspectObject



14
15
16
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 14

def inspect
  'Interp'
end

#obj_resultObject



22
23
24
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 22

def obj_result
  Obj.new(Tcl.get_obj_result(self))
end

#obj_result=(ruby_obj) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 26

def obj_result=(ruby_obj)
  obj =
    case ruby_obj
    when true
      Tcl.new_boolean_obj(1)
    when false
      Tcl.new_boolean_obj(0)
    when String
      Tcl.new_string_obj(ruby_obj, ruby_obj.bytesize)
    when Integer
      Tcl.new_int_obj(ruby_obj)
    when Exception
      string = [ruby_obj.message, *ruby_obj.backtrace].join("\n")
      Tcl.new_string_obj(string, string.bytesize)
    else
      if ruby_obj.respond_to?(:to_tcl)
        ruby_obj.to_tcl
      else
        raise ArgumentError, "Don't know how to set %p automatically" % [ruby_obj]
      end
    end

  Tcl.set_obj_result(self, obj)
end

#wait_for_event(seconds = 0.0) ⇒ Object



51
52
53
54
55
56
57
58
59
60
# File 'lib/ffi-tk/ffi/tcl/interp.rb', line 51

def wait_for_event(seconds = 0.0)
  if seconds && seconds > 0.0
    seconds, microseconds = (seconds * 1000).divmod(1000)
    time = TclTime.new(seconds, microseconds)
  else
    time = nil
  end

  Tcl.wait_for_event(time)
end