File: external_routine.e

package info (click to toggle)
smarteiffel 1.1-11
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 12,288 kB
  • ctags: 40,785
  • sloc: ansic: 35,791; lisp: 4,036; sh: 1,783; java: 895; ruby: 613; python: 209; makefile: 115; csh: 78; cpp: 50
file content (137 lines) | stat: -rw-r--r-- 3,924 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
-- This file is part of SmartEiffel The GNU Eiffel Compiler Tools and Libraries
--
-- SmartEiffel is  free software;  you can redistribute it and/or  modify it
-- under  the terms of the  GNU General Public License, as published by  the
-- Free Software Foundation; either version 2, or (at your option) any later
-- version.
-- SmartEiffel is distributed in the hope that it will be useful but WITHOUT 
-- ANY WARRANTY;  without  even the implied warranty  of MERCHANTABILITY  or
-- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-- more details.  You should have received a copy of  the GNU General Public
-- License along with SmartEiffel;  see the file COPYING.  If not,  write to
-- the Free Software Foundation,  Inc., 59 Temple Place - Suite 330,  Boston, 
-- MA 02111-1307, USA.
--
-- Copyright(C) 1994-2002: INRIA - LORIA (INRIA Lorraine) - ESIAL U.H.P.
--			   - University of Nancy 1 - FRANCE
-- Copyright(C) 2003:      INRIA - LORIA (INRIA Lorraine) - I.U.T. Charlemagne
--			   - University of Nancy 2 - FRANCE
--
--		 Dominique COLNET, Suzanne COLLIN, Olivier ZENDRA,
--			   Philippe RIBET, Cyril ADRIAN
--
-- http://SmartEiffel.loria.fr - SmartEiffel@loria.fr
--
deferred class EXTERNAL_ROUTINE
   --
   -- For routines implemented with a call to a foreign language.
   -- Root of EXTERNAL_PROCEDURE and EXTERNAL_FUNCTION.
   --

inherit E_ROUTINE

feature

   native: NATIVE

   alias_string: STRING

   is_deferred: BOOLEAN is false

   frozen set_rescue_compound(c: COMPOUND) is
      do
         if c /= Void then
            error_handler.add_position(c.start_position)
         else
            error_handler.add_position(start_position)
         end
         error_handler.append("External feature must not have rescue compound.")
         error_handler.print_as_fatal_error
      end

   frozen use_current: BOOLEAN is
      do
         Result := native.use_current(Current)
      end

   external_name: STRING is
      local
	 native_c_plus_plus: NATIVE_C_PLUS_PLUS; tmp: STRING
      do
	 native_c_plus_plus ?= native
	 if native_c_plus_plus = Void then
	    Result := c_plus_plus_name
	 else
	    -- For C++, there is always a wrapping function :
	    tmp := first_name.to_string
	    !!Result.make(tmp.count + 8)
	    Result.append(once "cpp")
	    base_class.id.append_in(Result)
	    Result.append(tmp)
	 end
      end

feature {NATIVE_C}

   argument_rank_of(arg_name: STRING): INTEGER is
	 -- Gives 0 or the index of `arg_name'.
      require
	 arg_name = string_aliaser.item(arg_name)
      do
	 if arguments /= Void then
	    Result := arguments.rank_of(arg_name)
	 end
      ensure
	 arguments /= Void implies Result.in_range(0,arguments.count)
	 arguments = Void implies Result = 0
      end

feature {NATIVE_C_PLUS_PLUS}

   c_plus_plus_name: STRING is
	 -- The name of the corresponding member in C++ is the
	 -- `alias_string' if any or the `first_name' itself.
      do
         if alias_string = Void then
            Result := first_name.to_string
         else
            Result := alias_string
         end
      end

feature {EXTERNAL_ROUTINE_VISITOR}

   accept(visitor: EXTERNAL_ROUTINE_VISITOR) is
      deferred
      end

feature {NONE}

   pretty_print_routine_body is
      do
         pretty_printer.keyword(once "external")
         native.pretty_print
         if not external_name.is_equal(first_name.to_string) or else
            names.count > 1 then
            pretty_printer.indent
            pretty_printer.keyword(once "alias")
            pretty_printer.put_character('%"')
            pretty_printer.put_string(external_name)
            pretty_printer.put_character('%"')
         end
      end

   pretty_print_rescue is
      do
      end

   make_external_routine(n: like native; desc: STRING) is
      require
         n /= void
      do
         native := n
         alias_string := desc
      end

end -- EXTERNAL_ROUTINE