red 3.4.2 → 3.5.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/History.txt CHANGED
@@ -1,3 +1,14 @@
1
+ == 3.5.0 2008-08-13
2
+
3
+ * 2 major enhancements:
4
+ * Added support for child classes.
5
+ * Updated method for "call to returned function"; now use "_".
6
+
7
+ * 3 bug fixes:
8
+ * Fixed Prototype library's handling of class_variables; now separated out into an Object.extend declaration.
9
+ * String quoting is now properly handled in foo["eval#{string}"]-type calls.
10
+ * Added parentheses wrapping to sugared operators ('+', '*', '||', '&&', etc) in order to solve chained method problems.
11
+
1
12
  == 3.4.2 2008-08-12
2
13
 
3
14
  * 1 major enhancement:
@@ -64,14 +64,20 @@ module Red
64
64
  end
65
65
 
66
66
  def compile_internals(options = {})
67
- variable_name, slot = [@variable_name, @slot].compile_nodes(:quotes => '')
68
67
  expression = @expression.compile_node(:as_argument => true)
69
- receiver = self.compile_receiver(variable_name, slot)
68
+ receiver = self.compile_receiver
70
69
  return [receiver, expression]
71
70
  end
72
71
 
73
- def compile_receiver(variable_name, slot)
74
- return ([:symbol, :string].include?((@slot.data_type rescue :node)) ? "%s.%s" : "%s[%s]") % [variable_name, slot]
72
+ def compile_receiver
73
+ variable_name = @variable_name.compile_node
74
+ if [:symbol, :string].include?((@slot.data_type rescue :node))
75
+ slot = @slot.compile_node(:quotes => '')
76
+ "%s.%s"
77
+ else
78
+ slot = @slot.compile_node
79
+ "%s[%s]"
80
+ end % [variable_name, slot]
75
81
  end
76
82
  end
77
83
 
@@ -107,7 +113,12 @@ module Red
107
113
  end
108
114
 
109
115
  def compile_receiver(receiver, slot)
110
- return ([:symbol, :string].include?((@slot.data_type rescue :node)) ? "%s.%s" : "%s[%s]") % [receiver, slot]
116
+ if [:symbol, :string].include?((@slot.data_type rescue :node))
117
+ "%s.%s"
118
+ else
119
+ slot = @slot.compile_node(:quotes => "'")
120
+ "%s[%s]"
121
+ end % [receiver, slot]
111
122
  end
112
123
  end
113
124
 
@@ -39,13 +39,13 @@ module Red
39
39
 
40
40
  class MethodNode # :nodoc:
41
41
  def compile_node(options = {})
42
- call_to_returned_function = [DefinitionNode::InstanceMethodNode, CallNode::BlockNode].include?(@receiver.class) ? :call : false
43
- receiver, function = [@receiver, @function].compile_nodes
42
+ receiver = @receiver.compile_node
43
+ function = @function.compile_node(:quotes => '')
44
44
  arguments = @arguments.compile_nodes(:as_argument => true, :quotes => "'")
45
45
  return ("$%s(%s)" % [receiver = ((receiver == '$-') || (receiver == 'id' && @@red_library == :Prototype) ? nil : receiver), arguments.first]).gsub('$$','$').gsub('$class','$$') if @receiver.is_a?(VariableNode::GlobalVariableNode) && function == '-'
46
46
  case function.to_sym
47
- when :-, :+, :<, :>, :>=, :<=, :%, :*, :/, :^, :==, :===, :instanceof
48
- "%s %s %s" % [receiver, function, arguments.first]
47
+ when :-, :+, :<, :>, :>=, :<=, :%, :*, :/, :^, :==, :===, :instanceof, :in
48
+ "(%s %s %s)" % [receiver, function, arguments.first]
49
49
  when :raise
50
50
  "throw(%s)" % [arguments.first]
51
51
  when :new
@@ -59,8 +59,8 @@ module Red
59
59
  else
60
60
  "%s[%s]"
61
61
  end % [receiver, arguments.first]
62
- when call_to_returned_function
63
- "(%s)(%s)" % [receiver, arguments]
62
+ when :_
63
+ "%s(%s)" % [receiver, arguments]
64
64
  else
65
65
  receiver += '.' unless receiver.empty?
66
66
  "%s%s(%s)" % [receiver, function, arguments.join(', ')]
@@ -10,13 +10,13 @@ module Red
10
10
 
11
11
  class AndNode < ConjunctionNode # :nodoc:
12
12
  def compile_node(options = {})
13
- return "%s && %s" % self.compile_internals
13
+ return "(%s && %s)" % self.compile_internals
14
14
  end
15
15
  end
16
16
 
17
17
  class OrNode < ConjunctionNode # :nodoc:
18
18
  def compile_node(options = {})
19
- return "%s || %s" % self.compile_internals
19
+ return "(%s || %s)" % self.compile_internals
20
20
  end
21
21
  end
22
22
  end
@@ -10,6 +10,7 @@ module Red
10
10
  case @@red_library
11
11
  when :Prototype
12
12
  @initializer = block_node.rassoc(:initialize)
13
+ @classes = block_node.select {|node| (node.first == :class) rescue false }.build_nodes
13
14
  @properties = block_node.select {|node| (node.first == :cvdecl) rescue false }.build_nodes
14
15
  @functions = block_node.select {|node| ![:block, :scope].include?(node) && ((node.first != :cvdecl) rescue false) }.build_nodes
15
16
  else
@@ -18,6 +19,7 @@ module Red
18
19
  @arguments = (args_node[1..-1] || []).build_nodes
19
20
  @initializer = initializer_node.assoc(:scope).assoc(:block).reject {|node| node == args_node}.build_node
20
21
  end
22
+ @classes = block_node.select {|node| (node.first == :class) rescue false }.build_nodes
21
23
  @properties = block_node.select {|node| (node.first == :cvdecl) rescue false }.build_nodes
22
24
  @functions = block_node.select {|node| (node != initializer_node) && ![:block, :scope].include?(node) && ((node.first != :cvdecl) rescue false) }.build_nodes
23
25
  end
@@ -27,7 +29,9 @@ module Red
27
29
  def compile_node(options = {})
28
30
  old_class = @@red_class
29
31
  @@red_class = @class
30
- if @initializer
32
+ if options[:as_prototype]
33
+ output = self.compile_as_child_class
34
+ elsif @initializer
31
35
  case @@red_library
32
36
  when :Prototype
33
37
  output = self.compile_as_prototype_class
@@ -41,10 +45,17 @@ module Red
41
45
  return output
42
46
  end
43
47
 
48
+ def compile_as_child_class
49
+ class_name = @class_name.compile_node
50
+ slots = (@classes | @properties | @functions).compile_nodes(:as_prototype => true).compact.join(', ')
51
+ return "%s: { %s }" % [class_name, slots]
52
+ end
53
+
44
54
  def compile_as_prototype_class
45
55
  class_name = @class_name.compile_node
46
- slots = (@properties | @functions).compile_nodes(:as_prototype => true).compact.join(', ')
47
- return "%s%s = Class.create({ %s })" % [self.var?, class_name, slots]
56
+ functions = @functions.compile_nodes(:as_prototype => true).compact.join(', ')
57
+ properties = @properties.compile_nodes(:as_prototype => true).compact.join(', ')
58
+ return "%s%s = Class.create({ %s });Object.extend(%s, { %s })" % [self.var?, class_name, functions, class_name, properties]
48
59
  end
49
60
 
50
61
  def compile_as_standard_class(options = {})
@@ -15,7 +15,7 @@ module Red
15
15
  case @initial
16
16
  when DataNode::NilNode : :nil
17
17
  when DataNode::RangeNode : :range
18
- when DataNode::StringNode : :string
18
+ when DataNode::StringNode : (@subsequent.empty? ? :string : :eval)
19
19
  when DataNode::SymbolNode : :symbol
20
20
  else @initial.value.is_a?(Numeric) ? :numeric : :regexp
21
21
  end
@@ -23,7 +23,7 @@ module Red
23
23
 
24
24
  class ArrayNode < LiteralNode # :nodoc:
25
25
  def compile_node(options = {})
26
- elements = @subsequent.unshift(@initial).compile_nodes.join(', ')
26
+ elements = @subsequent.unshift(@initial).compile_nodes.reject {|element| element.empty? }.join(', ')
27
27
  return "[%s]" % [elements]
28
28
  end
29
29
  end
data/lib/red/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Red
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 3
4
- MINOR = 4
5
- TINY = 2
4
+ MINOR = 5
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.2
4
+ version: 3.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Sielaff
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-08-12 00:00:00 -04:00
12
+ date: 2008-08-13 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency