rVM 0.0.9 → 0.0.10
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/lib/rvm.rb +4 -4
- data/lib/rvm/acts_as_rvm_type.rb +116 -0
- data/lib/rvm/classes.rb +0 -1
- data/lib/rvm/classes/association.rb +36 -0
- data/lib/rvm/functions.rb +1 -2
- data/lib/rvm/functions/association/assoc_get.rb +25 -0
- data/lib/rvm/functions/association/assoc_set.rb +28 -0
- data/lib/rvm/functions/collection/get.rb +37 -0
- data/lib/rvm/functions/collection/set.rb +37 -0
- data/lib/rvm/functions/{array → collection}/size.rb +6 -3
- data/lib/rvm/interpreter.rb +18 -1
- metadata +12 -4
data/lib/rvm.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require 'rvm/interpreter'
|
2
|
-
require 'rvm/classes'
|
3
|
-
require 'rvm/functions'
|
4
|
-
require 'rvm/languages'
|
1
|
+
require File.dirname(__FILE__) +'/rvm/interpreter'
|
2
|
+
require File.dirname(__FILE__) +'/rvm/classes'
|
3
|
+
require File.dirname(__FILE__) +'/rvm/functions'
|
4
|
+
require File.dirname(__FILE__) +'/rvm/languages'
|
5
5
|
require 'timeout'
|
6
6
|
|
7
7
|
# This is the rVM library. Including it loads the very basic functionalites rVM offers.
|
@@ -0,0 +1,116 @@
|
|
1
|
+
|
2
|
+
# RVM::ActsAsRVMType is a mixin that allows to quickly publish classes and types
|
3
|
+
# to the rVM interpreter without going through the hassle of defining each
|
4
|
+
# function on it's own and publisheing every varialbe that is watned.
|
5
|
+
#
|
6
|
+
# == Example
|
7
|
+
# class Test
|
8
|
+
# # Add the readers and writers for
|
9
|
+
# attr_accessor :var
|
10
|
+
# include RVM::ActsAsRVMType
|
11
|
+
# acts_as_rvm_type
|
12
|
+
# register_variable :var
|
13
|
+
# register_function :to_s
|
14
|
+
# end
|
15
|
+
|
16
|
+
|
17
|
+
module RVM::ActsAsRVMType
|
18
|
+
|
19
|
+
# Called when included, loads the class methods and the instance methods needed.
|
20
|
+
def self.included(mod)
|
21
|
+
mod.extend(RVM::ActsAsRVMType::ActsAsRVMTypeMethods)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
module ActsAsRVMTypeMethods
|
26
|
+
# This function sets up the class to be a registerd class for rVM.
|
27
|
+
# It also sets it up to allow the use of +register_variable+ and
|
28
|
+
# +register_function+.
|
29
|
+
def acts_as_rvm_type
|
30
|
+
# registering as class
|
31
|
+
extend RVM::Plugin
|
32
|
+
plugin_host RVM::Classes
|
33
|
+
register_for self.class.to_s.gsub(/(\w)([A-Z])/,"\1_" + "\2".downcase).to_sym
|
34
|
+
|
35
|
+
#initializing empty functions and variables hashes
|
36
|
+
@functions = {}
|
37
|
+
@variables = {}
|
38
|
+
|
39
|
+
#including DSL functions
|
40
|
+
extend RVM::ActsAsRVMType::ActsAsRVMTypeInstanceMethods
|
41
|
+
|
42
|
+
#including methods in class
|
43
|
+
include RVM::ActsAsRVMType::ActsAsRVMTypeSingeltonMethods
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module ActsAsRVMTypeSingeltonMethods
|
48
|
+
# This function will set up the variables for a rVM and replaces
|
49
|
+
# the current function with a shorter and faster one.
|
50
|
+
def variables
|
51
|
+
puts self.class
|
52
|
+
@variables = {}
|
53
|
+
#gets the variables hash from the Test class and maps it to a getter/setter Class
|
54
|
+
self.class.object_variables.each do |name, data|
|
55
|
+
published_as, writable = data
|
56
|
+
@variables[published_as.to_s] = RVM::Interpreter::VariableStorageCallback.new(self, name, writable)
|
57
|
+
end
|
58
|
+
#redefinces the variables method to remove overhead from mapping
|
59
|
+
instance_eval do
|
60
|
+
def variables
|
61
|
+
@variables
|
62
|
+
end
|
63
|
+
end
|
64
|
+
@variables
|
65
|
+
end
|
66
|
+
|
67
|
+
# This function will set up the variables for a rVM and replaces
|
68
|
+
# the current function with a shorter and faster one.
|
69
|
+
def functions
|
70
|
+
@functions = self.class.object_functions.dup
|
71
|
+
instance_eval do
|
72
|
+
def functions
|
73
|
+
@functions
|
74
|
+
end
|
75
|
+
end
|
76
|
+
@functions ||= @@functions.dup
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
module ActsAsRVMTypeInstanceMethods
|
82
|
+
|
83
|
+
# This registers a variable for the rVM interface, it allows the scripts
|
84
|
+
# to read and write them. If +writable+ is set this will be a read only
|
85
|
+
# variable. It alls an be published to rVM under a different name,
|
86
|
+
# by passing +published_as+.
|
87
|
+
def register_variable name, writable = true, published_as = name
|
88
|
+
@variables[published_as.to_s] = [name.to_sym, writable]
|
89
|
+
end
|
90
|
+
|
91
|
+
# This registers a variable for the rVM interface, it allows the scripts
|
92
|
+
# to read and write them. If +writable+ is set this will be a read only
|
93
|
+
# variable. It alls an be published to rVM under a different name,
|
94
|
+
# by passing +published_as+.
|
95
|
+
def register_function name, published_as = "#{name}"
|
96
|
+
@functions[published_as.to_s] = Class.new(RVM::Functions::Function) do @name = name; end
|
97
|
+
class << @functions[published_as.to_s]
|
98
|
+
def execute params, env
|
99
|
+
env.read_var_val(:self).send(@name, *params)
|
100
|
+
end
|
101
|
+
|
102
|
+
def signature
|
103
|
+
[:any]
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def object_variables
|
109
|
+
@variables
|
110
|
+
end
|
111
|
+
def object_functions
|
112
|
+
@functions
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
data/lib/rvm/classes.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
module RVM
|
2
|
+
module Classes
|
3
|
+
class Association < Hash
|
4
|
+
extend Plugin
|
5
|
+
plugin_host Classes
|
6
|
+
register_for :association
|
7
|
+
@@type = :association
|
8
|
+
|
9
|
+
def data_type
|
10
|
+
:list
|
11
|
+
end
|
12
|
+
|
13
|
+
def variables
|
14
|
+
@variables ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def functions
|
19
|
+
@functions ||= {
|
20
|
+
'size' => RVM::Functions[:size],
|
21
|
+
'length' => RVM::Functions[:size],
|
22
|
+
'get' => RVM::Functions[:assoc_get],
|
23
|
+
'set' => RVM::Functions[:assoc_set],
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize source= {}, sepperator = ' '
|
28
|
+
super()
|
29
|
+
if source.is_a?(::Hash) # Okay we've to hack here to get sure we get the /real/ String
|
30
|
+
self.merge! source
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/rvm/functions.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
module RVM
|
2
|
+
module Functions
|
3
|
+
class AssocGet < RVM::Functions::Function
|
4
|
+
class << self
|
5
|
+
def execute params, env
|
6
|
+
if params.length == 2
|
7
|
+
assoc = params.shift
|
8
|
+
key = params.shift
|
9
|
+
assoc[key]
|
10
|
+
elsif params.length == 1 and (this = env.read_var_val(:self)).is_a?(RVM::Classes[:association])
|
11
|
+
this[params.shift]
|
12
|
+
else
|
13
|
+
RVM::Classes[:error].new(1,"FUNCTION (#{self.class}) EXPECTS 2 or 1 ARGUMENTS BUT GOT #{params.length}")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def signature
|
18
|
+
[:any]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
register_for :assoc_get
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RVM
|
2
|
+
module Functions
|
3
|
+
class AssocSet < RVM::Functions::Function
|
4
|
+
class << self
|
5
|
+
def execute params, env
|
6
|
+
if params.length == 3
|
7
|
+
assoc = params.shift
|
8
|
+
key = params.shift
|
9
|
+
value = params.shift
|
10
|
+
assoc[key] = value
|
11
|
+
elsif params.length == 2 and (this = env.read_var_val(:self)).is_a?(RVM::Classes[:association])
|
12
|
+
key = params.shift
|
13
|
+
value = params.shift
|
14
|
+
this[key] = value
|
15
|
+
else
|
16
|
+
RVM::Classes[:error].new(1,"FUNCTION (#{self.class}) EXPECTS 3 or 2 ARGUMENTS BUT GOT #{params.length}")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def signature
|
21
|
+
[:any]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
register_for :assoc_set
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.dirname(__FILE__) +'/../array/at'
|
2
|
+
require File.dirname(__FILE__) +'/../association/assoc_get'
|
3
|
+
module RVM
|
4
|
+
module Functions
|
5
|
+
class Get < RVM::Functions::Function
|
6
|
+
class << self
|
7
|
+
FUNCTION_MAP = {
|
8
|
+
RVM::Classes::List => RVM::Functions::At,
|
9
|
+
Classes::Association => RVM::Functions::AssocGet
|
10
|
+
}
|
11
|
+
def execute params, env
|
12
|
+
if params.length == 2
|
13
|
+
if fun = FUNCTION_MAP[params.first.class]
|
14
|
+
fun.execute(params, env)
|
15
|
+
else
|
16
|
+
RVM::Classes[:error].new(1, "FUNCTION (#{self.class}) does not accept #{params.first.class}")
|
17
|
+
end
|
18
|
+
elsif params.length == 1 and (this = env.read_var_val(:self)).is_a?(RVM::Classes[:association])
|
19
|
+
if fun = FUNCTION_MAP[this]
|
20
|
+
fun.execute(params, env)
|
21
|
+
else
|
22
|
+
RVM::Classes[:error].new(1, "FUNCTION (#{self.class}) does not accept #{thiss.class}")
|
23
|
+
end
|
24
|
+
else
|
25
|
+
RVM::Classes[:error].new(1, "FUNCTION (#{self.class}) EXPECTS 2 or 1 ARGUMENTS BUT GOT #{params.length}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def signature
|
30
|
+
[:any]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
register_for :get
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.dirname(__FILE__) +'/../array/set_at'
|
2
|
+
require File.dirname(__FILE__) +'/../association/assoc_set'
|
3
|
+
module RVM
|
4
|
+
module Functions
|
5
|
+
class Set < RVM::Functions::Function
|
6
|
+
class << self
|
7
|
+
FUNCTION_MAP = {
|
8
|
+
RVM::Classes::List => RVM::Functions::SetAt,
|
9
|
+
Classes::Association => RVM::Functions::AssocSet
|
10
|
+
}
|
11
|
+
def execute params, env
|
12
|
+
if params.length == 2
|
13
|
+
if fun = FUNCTION_MAP[params.first.class]
|
14
|
+
fun.execute(params, env)
|
15
|
+
else
|
16
|
+
RVM::Classes[:error].new(1, "FUNCTION (#{self.class}) does not accept #{params.first.class}")
|
17
|
+
end
|
18
|
+
elsif params.length == 1 and (this = env.read_var_val(:self)).is_a?(RVM::Classes[:association])
|
19
|
+
if fun = FUNCTION_MAP[this]
|
20
|
+
fun.execute(params, env)
|
21
|
+
else
|
22
|
+
RVM::Classes[:error].new(1, "FUNCTION (#{self.class}) does not accept #{thiss.class}")
|
23
|
+
end
|
24
|
+
else
|
25
|
+
RVM::Classes[:error].new(1, "FUNCTION (#{self.class}) EXPECTS 2 or 1 ARGUMENTS BUT GOT #{params.length}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def signature
|
30
|
+
[:any]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
register_for :set
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
module RVM
|
2
2
|
module Functions
|
3
3
|
class Size < Function
|
4
|
-
class << self
|
4
|
+
class << self
|
5
|
+
COLLECTION_CLASSES = [
|
6
|
+
RVM::Classes::List,
|
7
|
+
RVM::Classes::Association
|
8
|
+
]
|
5
9
|
def execute params, env
|
6
|
-
if (this = env.read_var_val(:self))
|
10
|
+
if COLLECTION_CLASSES.include?(this = env.read_var_val(:self)) and params.empty?
|
7
11
|
RVM::Classes[:number].new(this.size)
|
8
12
|
elsif params.length == 1
|
9
13
|
RVM::Classes[:number].new(params[0].size)
|
@@ -11,7 +15,6 @@ module RVM
|
|
11
15
|
RVM::Classes[:error].new(1,"FUNCTION (#{self.class}) EXPECTS 2 ARGUMENTS BUT GOT #{params.length}")
|
12
16
|
end
|
13
17
|
end
|
14
|
-
|
15
18
|
def signature
|
16
19
|
[:any]
|
17
20
|
end
|
data/lib/rvm/interpreter.rb
CHANGED
@@ -22,11 +22,28 @@ module RVM
|
|
22
22
|
RVM::Interpreter::Constant.new(RVM::Classes[type].new(value), pos)
|
23
23
|
end
|
24
24
|
|
25
|
+
|
26
|
+
class VariableStorageCallback
|
27
|
+
def initialize obj, var, writable = true
|
28
|
+
@obj = obj
|
29
|
+
@get = var.to_sym
|
30
|
+
@set = "#{var}=".to_sym
|
31
|
+
@writable = writable
|
32
|
+
end
|
33
|
+
def val= v
|
34
|
+
@obj.send(@set,v) if @writable
|
35
|
+
end
|
36
|
+
def val
|
37
|
+
@obj.send(@get)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
25
41
|
class VariableStorage
|
26
42
|
attr_accessor :val
|
27
|
-
def initialize val, writable = true
|
43
|
+
def initialize val = nil, writable = true, &block
|
28
44
|
@writable = writable
|
29
45
|
@val = val
|
46
|
+
instance_eval(&block) if block
|
30
47
|
end
|
31
48
|
|
32
49
|
def val=v
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rVM
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Heinz N. Gies
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-07-
|
12
|
+
date: 2008-07-21 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,7 +23,9 @@ extra_rdoc_files:
|
|
23
23
|
- README
|
24
24
|
files:
|
25
25
|
- lib/rvm
|
26
|
+
- lib/rvm/acts_as_rvm_type.rb
|
26
27
|
- lib/rvm/classes
|
28
|
+
- lib/rvm/classes/association.rb
|
27
29
|
- lib/rvm/classes/block.rb
|
28
30
|
- lib/rvm/classes/boolean.rb
|
29
31
|
- lib/rvm/classes/class.rb
|
@@ -39,8 +41,14 @@ files:
|
|
39
41
|
- lib/rvm/functions/array/append.rb
|
40
42
|
- lib/rvm/functions/array/at.rb
|
41
43
|
- lib/rvm/functions/array/set_at.rb
|
42
|
-
- lib/rvm/functions/array/size.rb
|
43
44
|
- lib/rvm/functions/array.rb
|
45
|
+
- lib/rvm/functions/association
|
46
|
+
- lib/rvm/functions/association/assoc_get.rb
|
47
|
+
- lib/rvm/functions/association/assoc_set.rb
|
48
|
+
- lib/rvm/functions/collection
|
49
|
+
- lib/rvm/functions/collection/get.rb
|
50
|
+
- lib/rvm/functions/collection/set.rb
|
51
|
+
- lib/rvm/functions/collection/size.rb
|
44
52
|
- lib/rvm/functions/general
|
45
53
|
- lib/rvm/functions/general/cmp.rb
|
46
54
|
- lib/rvm/functions/general/eq.rb
|
@@ -120,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
128
|
requirements: []
|
121
129
|
|
122
130
|
rubyforge_project: rmush
|
123
|
-
rubygems_version: 1.
|
131
|
+
rubygems_version: 1.2.0
|
124
132
|
signing_key:
|
125
133
|
specification_version: 2
|
126
134
|
summary: A ruby based VM that lets one add secure scripting to ruby applications.
|