rucy 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+ gem "rake"
3
+ gem "gemcutter"
data/Gemfile.lock ADDED
@@ -0,0 +1,12 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ gemcutter (0.7.0)
5
+ rake (0.8.7)
6
+
7
+ PLATFORMS
8
+ ruby
9
+
10
+ DEPENDENCIES
11
+ gemcutter
12
+ rake
data/README ADDED
@@ -0,0 +1,4 @@
1
+
2
+ = Rucy - A Ruby C++ Extension Helper Library
3
+
4
+ == by @tokujiros
data/Rakefile ADDED
@@ -0,0 +1,58 @@
1
+ # -*- mode: ruby; coding: utf-8 -*-
2
+ $: << File.expand_path(File.dirname __FILE__)
3
+ require 'rbconfig'
4
+ require 'support'
5
+
6
+
7
+ NAME = 'rucy'
8
+
9
+ SRCDIR = 'src'
10
+ INCDIR = 'include'
11
+ LIBDIR = 'lib'
12
+ EXTDIR = 'ext'
13
+ TASKDIR = 'task'
14
+
15
+ EXTEXT = RbConfig::CONFIG['DLEXT'] || 'so'
16
+
17
+ incroot = RbConfig::CONFIG['rubyhdrdir']
18
+ INCDIRS = [
19
+ 'include',
20
+ incroot,
21
+ "#{incroot}/#{RUBY_PLATFORM}",
22
+ '/opt/local/include',
23
+ '/opt/include'
24
+ ]
25
+
26
+ RBS = glob '**/*.rb'
27
+
28
+ RUBY = ENV['RUBY'] || 'ruby'
29
+ GEM = ENV['GEM'] || 'gem'
30
+ MAKE = ENV['MAKE'] || 'make'
31
+ CC = RbConfig::CONFIG['CC'] || ENV['CC'] || 'g++'
32
+ CFLAGS = '-Wall -O'
33
+ AR = ENV['AR'] || 'ar'
34
+ ARFLAGS = 'crs'
35
+
36
+
37
+ task :default => :ext
38
+
39
+ task :lib => 'lib:build'
40
+
41
+ task :ext => 'ext:build'
42
+
43
+ task :gem => 'gem:build'
44
+
45
+ task :install => 'gem:install'
46
+
47
+ task :uninstall => 'gem:uninstall'
48
+
49
+ task :clean => ['lib:clean', 'ext:clean', 'gem:clean']
50
+
51
+ task :test => :ext do
52
+ Dir['test/**/test_*.rb'].each do |rb|
53
+ sh %( ruby #{rb} )
54
+ end
55
+ end
56
+
57
+
58
+ Dir["#{TASKDIR}/**/*.rake"].each {|path| load path}
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+ %w[../../lib].each do |path|
3
+ $: << File.expand_path(File.join File.dirname(__FILE__), *path.split('/'))
4
+ end
5
+ require 'rubygems'
6
+ require 'mkmf'
7
+ require 'rucy'
8
+
9
+
10
+ DEBUG = ENV["DEBUG"] || false
11
+
12
+ DEFS = []
13
+ INCDIRS = %w[/opt/local/include /opt/include]
14
+ LIBDIRS = []
15
+
16
+ HEADERS = %w[
17
+ boost/noncopyable.hpp
18
+ ruby.h
19
+ rucy.h
20
+ ]
21
+ LIBS = %w[stdc++ rucy]
22
+
23
+
24
+ DEFS << "_DEBUG" if DEBUG
25
+
26
+ case RUBY_PLATFORM
27
+ when /cygwin/
28
+ DEFS << "WIN32" << "WINDOWS" << "CYGWIN"
29
+ when /mswin/
30
+ DEFS << "WIN32" << "WINDOWS"
31
+ when /darwin/
32
+ DEFS << "COCOA"
33
+ end
34
+
35
+ $CPPFLAGS << DEFS.map {|s| " -D#{s}"}.join
36
+ $CPPFLAGS << INCDIRS.map {|s| " -I#{s}"}.join
37
+ $LDFLAGS << LIBDIRS.map {|s| " -L#{s}"}.join
38
+ $LOCAL_LIBS << " -lrucy"
39
+
40
+ dir_config "boost"
41
+ dir_config "rucy", Rucy.root_dir
42
+
43
+
44
+ Config::CONFIG.each {|key, val| val.gsub!(/gcc/, "g++")}
45
+
46
+ exit 1 unless HEADERS.all? {|s| have_header(s)}
47
+ exit 1 unless LIBS.all? {|s| have_library(s)}
48
+
49
+
50
+ create_makefile "rucy/tester"
@@ -0,0 +1,102 @@
1
+ #include <rucy.h>
2
+
3
+
4
+ using namespace Rucy;
5
+
6
+
7
+ static
8
+ RUBY_DEF0(do_nothing)
9
+ {
10
+ }
11
+ RUBY_END
12
+
13
+ static
14
+ RUBY_DEF0(return_nil)
15
+ {
16
+ return Qnil;
17
+ }
18
+ RUBY_END
19
+
20
+ static
21
+ RUBY_DEF0(return_int)
22
+ {
23
+ return Value(1);
24
+ }
25
+ RUBY_END
26
+
27
+ static
28
+ RUBY_DEF0(return_float)
29
+ {
30
+ return Value(1.0f);
31
+ }
32
+ RUBY_END
33
+
34
+ static
35
+ RUBY_DEF0(return_string)
36
+ {
37
+ return Value("");
38
+ }
39
+ RUBY_END
40
+
41
+ static
42
+ RUBY_DEF0(raise_ruby_exception)
43
+ {
44
+ throw RubyException(rb_eStandardError, "raise_ruby_exception");
45
+ }
46
+ RUBY_END
47
+
48
+ static
49
+ RUBY_DEF0(raise_in_eval)
50
+ {
51
+ eval("raise 'raise_in_eval'");
52
+ }
53
+ RUBY_END
54
+
55
+ static
56
+ RUBY_DEF0(throw_std_exception)
57
+ {
58
+ throw std::exception();
59
+ }
60
+ RUBY_END
61
+
62
+ static
63
+ RUBY_DEF0(throw_std_runtime_error)
64
+ {
65
+ throw std::runtime_error("std::runtime_error");
66
+ }
67
+ RUBY_END
68
+
69
+ static
70
+ RUBY_DEF0(throw_std_string)
71
+ {
72
+ throw std::string("std::string");
73
+ }
74
+ RUBY_END
75
+
76
+ static
77
+ RUBY_DEF0(throw_cstring)
78
+ {
79
+ throw "cstring";
80
+ }
81
+ RUBY_END
82
+
83
+
84
+ extern "C" void
85
+ Init_tester ()
86
+ {
87
+ if (!init()) return;
88
+
89
+ define_module("Rucy")
90
+ .define_class("Tester")
91
+ .define_method("do_nothing", do_nothing)
92
+ .define_method("return_nil", return_nil)
93
+ .define_method("return_int", return_int)
94
+ .define_method("return_float", return_float)
95
+ .define_method("return_string", return_string)
96
+ .define_method("raise_ruby_exception", raise_ruby_exception)
97
+ .define_method("raise_in_eval", raise_in_eval)
98
+ .define_method("throw_std_exception", throw_std_exception)
99
+ .define_method("throw_std_runtime_error", throw_std_runtime_error)
100
+ .define_method("throw_std_string", throw_std_string)
101
+ .define_method("throw_cstring", throw_cstring);
102
+ }
@@ -0,0 +1,37 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __RUCY_CLASS_H__
4
+ #define __RUCY_CLASS_H__
5
+
6
+
7
+ #include <rucy/module.h>
8
+
9
+
10
+ namespace Rucy
11
+ {
12
+
13
+
14
+ class Class : public Module
15
+ {
16
+
17
+ typedef Module Super;
18
+
19
+ public:
20
+
21
+ Class (VALUE v = Qnil);
22
+
23
+ Class define_alloc_func (RubyFunction0 fun);
24
+
25
+ Class define_alloc_func (const char* name, RubyFunction0 fun);
26
+ // for RUBY_METHOD macro
27
+
28
+ };// Class
29
+
30
+
31
+ Class define_class (const char* name, Value super = rb_cObject);
32
+
33
+
34
+ }// Rucy
35
+
36
+
37
+ #endif//EOH
@@ -0,0 +1,97 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __RUCY_DEFS_H__
4
+ #define __RUCY_DEFS_H__
5
+
6
+
7
+ #include <ruby.h>
8
+
9
+
10
+ namespace Rucy
11
+ {
12
+
13
+
14
+ class Value;
15
+
16
+
17
+ typedef VALUE (*RubyFunctionN) (int argc, const Value* argv, Value self);
18
+ typedef VALUE (*RubyFunction0) (Value self);
19
+ typedef VALUE (*RubyFunction1) (Value self, Value v1);
20
+ typedef VALUE (*RubyFunction2) (Value self, Value v1, Value v2);
21
+ typedef VALUE (*RubyFunction3) (Value self, Value v1, Value v2, Value v3);
22
+ typedef VALUE (*RubyFunction4) (Value self, Value v1, Value v2, Value v3, Value v4);
23
+ typedef VALUE (*RubyFunction5) (Value self, Value v1, Value v2, Value v3, Value v4, Value v5);
24
+ typedef VALUE (*RubyFunction6) (Value self, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6);
25
+ typedef VALUE (*RubyFunction7) (Value self, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7);
26
+ typedef VALUE (*RubyFunction8) (Value self, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7, Value v8);
27
+
28
+
29
+ }// Rucy
30
+
31
+
32
+ #define RUBY_DEF_ALLOC(name, klass) \
33
+ VALUE name (Value klass) \
34
+ { \
35
+ RUBY_TRY
36
+ #define RUBY_DEFN(name) \
37
+ VALUE name (int argc, const Value* argv, Value self) \
38
+ { \
39
+ RUBY_TRY
40
+ #define RUBY_DEF0(name) \
41
+ VALUE name (Value self) \
42
+ { \
43
+ RUBY_TRY
44
+ #define RUBY_DEF1(name, v1) \
45
+ VALUE name (Value self, Value v1) \
46
+ { \
47
+ RUBY_TRY
48
+ #define RUBY_DEF2(name, v1, v2) \
49
+ VALUE name (Value self, Value v1, Value v2) \
50
+ { \
51
+ RUBY_TRY
52
+ #define RUBY_DEF3(name, v1, v2, v3) \
53
+ VALUE name (Value self, Value v1, Value v2, Value v3) \
54
+ { \
55
+ RUBY_TRY
56
+ #define RUBY_DEF4(name, v1, v2, v3, v4) \
57
+ VALUE name (Value self, Value v1, Value v2, Value v3, Value v4) \
58
+ { \
59
+ RUBY_TRY
60
+ #define RUBY_DEF5(name, v1, v2, v3, v4, v5) \
61
+ VALUE name (Value self, Value v1, Value v2, Value v3, Value v4, Value v5) \
62
+ { \
63
+ RUBY_TRY
64
+ #define RUBY_DEF6(name, v1, v2, v3, v4, v5, v6) \
65
+ VALUE name (Value self, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6) \
66
+ { \
67
+ RUBY_TRY
68
+ #define RUBY_DEF7(name, v1, v2, v3, v4, v5, v6, v7) \
69
+ VALUE name (Value self, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7) \
70
+ { \
71
+ RUBY_TRY
72
+ #define RUBY_DEF8(name, v1, v2, v3, v4, v5, v6, v7, v8) \
73
+ VALUE name (Value self, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7, Value v8) \
74
+ { \
75
+ RUBY_TRY
76
+
77
+ #define RUBY_END \
78
+ RUBY_CATCH \
79
+ return Qnil; \
80
+ }
81
+
82
+ #ifdef RUCY_USE_DEF
83
+ #define DEFN RUBY_DEFN
84
+ #define DEF0 RUBY_DEF0
85
+ #define DEF1 RUBY_DEF1
86
+ #define DEF2 RUBY_DEF2
87
+ #define DEF3 RUBY_DEF3
88
+ #define DEF4 RUBY_DEF4
89
+ #define DEF5 RUBY_DEF5
90
+ #define DEF6 RUBY_DEF6
91
+ #define DEF7 RUBY_DEF7
92
+ #define DEF8 RUBY_DEF8
93
+ #define END RUBY_END
94
+ #endif
95
+
96
+
97
+ #endif//EOH
@@ -0,0 +1,56 @@
1
+ // -*- c++ -*-
2
+ % require 'support'
3
+ #pragma once
4
+ #ifndef __RUCY_DEFS_H__
5
+ #define __RUCY_DEFS_H__
6
+
7
+
8
+ #include <ruby.h>
9
+
10
+
11
+ namespace Rucy
12
+ {
13
+
14
+
15
+ class Value;
16
+
17
+
18
+ typedef VALUE (*RubyFunctionN) (int argc, const Value* argv, Value self);
19
+ % NTIMES.each do |n|
20
+ typedef VALUE (*RubyFunction<%= n %>) (Value self<%= params(n) {|i| ", Value v#{i}"} %>);
21
+ % end
22
+
23
+
24
+ }// Rucy
25
+
26
+
27
+ #define RUBY_DEF_ALLOC(name, klass) \
28
+ VALUE name (Value klass) \
29
+ { \
30
+ RUBY_TRY
31
+ #define RUBY_DEFN(name) \
32
+ VALUE name (int argc, const Value* argv, Value self) \
33
+ { \
34
+ RUBY_TRY
35
+ % NTIMES.each do |n|
36
+ #define RUBY_DEF<%= n %>(name<%= params(n) {|i| ", v#{i}"} %>) \
37
+ VALUE name (Value self<%= params(n) {|i| ", Value v#{i}"} %>) \
38
+ { \
39
+ RUBY_TRY
40
+ % end
41
+
42
+ #define RUBY_END \
43
+ RUBY_CATCH \
44
+ return Qnil; \
45
+ }
46
+
47
+ #ifdef RUCY_USE_DEF
48
+ #define DEFN RUBY_DEFN
49
+ % NTIMES.each do |n|
50
+ #define DEF<%= n %> RUBY_DEF<%= n %>
51
+ % end
52
+ #define END RUBY_END
53
+ #endif
54
+
55
+
56
+ #endif//EOH
@@ -0,0 +1,124 @@
1
+ // -*- c++ -*-
2
+ #pragma once
3
+ #ifndef __RUCY_EXCEPTION_H__
4
+ #define __RUCY_EXCEPTION_H__
5
+
6
+
7
+ #include <stdexcept>
8
+ #include <rucy/value.h>
9
+ #include <rucy/class.h>
10
+
11
+
12
+ namespace Rucy
13
+ {
14
+
15
+
16
+ Class native_error_class ();
17
+ // class Rucy::NativeError < RuntimeError
18
+
19
+
20
+ void error (const char* format, ...);
21
+
22
+ void raise (Value exception, const char* format = NULL, ...);
23
+
24
+
25
+ void type_error (const char* format = NULL, ...);
26
+
27
+ void argument_error (const char* format = NULL, ...);
28
+
29
+ void argument_error (
30
+ const char* method, int nargs, int nargs_expected,
31
+ int n1 = -1, int n2 = -1, int n3 = -1, int n4 = -1, int n5 = -1);
32
+
33
+ void not_implemented_error (const char* format = NULL, ...);
34
+
35
+
36
+ class RubyException : public std::runtime_error
37
+ {
38
+
39
+ typedef std::runtime_error Super;
40
+
41
+ public:
42
+
43
+ RubyException (Value exception);
44
+
45
+ RubyException (Value type, const char* format, ...);
46
+
47
+ const char* what () const throw();
48
+
49
+ Value value () const;
50
+
51
+ private:
52
+
53
+ /*Global*/Value val;
54
+
55
+ };// RubyException
56
+
57
+
58
+ struct RubyJumptag
59
+ {
60
+
61
+ public:
62
+
63
+ int tag;
64
+
65
+ RubyJumptag (int tag);
66
+
67
+ };// RubyJumptag
68
+
69
+
70
+ }// Rucy
71
+
72
+
73
+ #define RUBY_TRY \
74
+ VALUE RUCY__rubyexception__ = Qnil; \
75
+ int RUCY__rubyjumptag__ = 0; \
76
+ \
77
+ goto RUCY__ruby_try_start__; \
78
+ \
79
+ RUCY__ruby_jump_tag__: \
80
+ if (RUCY__rubyjumptag__) rb_jump_tag(RUCY__rubyjumptag__); \
81
+ RUBY_THROW(rb_exc_new2(Rucy::native_error_class(), "Bad jump tag.")); \
82
+ \
83
+ RUCY__ruby_raise_exception__: \
84
+ rb_exc_raise(RUCY__rubyexception__); \
85
+ \
86
+ RUCY__ruby_try_start__: \
87
+ try \
88
+ {
89
+
90
+ #define RUBY_CATCH \
91
+ } \
92
+ catch (const Rucy::RubyJumptag& e) \
93
+ { \
94
+ RUCY__rubyjumptag__ = e.tag; \
95
+ goto RUCY__ruby_jump_tag__; \
96
+ } \
97
+ catch (const Rucy::RubyException& e) \
98
+ { \
99
+ RUBY_THROW(e.value()); \
100
+ } \
101
+ catch (const std::exception& e) \
102
+ { \
103
+ RUBY_THROW(rb_exc_new2(Rucy::native_error_class(), e.what())); \
104
+ } \
105
+ catch (const std::string& s) \
106
+ { \
107
+ RUBY_THROW(rb_exc_new2(Rucy::native_error_class(), s.c_str())); \
108
+ } \
109
+ catch (const char* s) \
110
+ { \
111
+ RUBY_THROW(rb_exc_new2(Rucy::native_error_class(), s)); \
112
+ } \
113
+ catch (...) \
114
+ { \
115
+ RUBY_THROW(rb_exc_new2( \
116
+ Rucy::native_error_class(), "Unknown C++ exception thrown.")); \
117
+ }
118
+
119
+ #define RUBY_THROW(exception) \
120
+ RUCY__rubyexception__ = (exception); \
121
+ goto RUCY__ruby_raise_exception__
122
+
123
+
124
+ #endif//EOH