citrus-compiler 0.8.2 → 0.8.3
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/README.rdoc +1 -1
- data/example/simple.ct +1 -1
- data/lib/citrus/compiler/array.rb +4 -3
- data/lib/citrus/compiler/block.rb +4 -0
- data/lib/citrus/compiler/generator.rb +12 -6
- data/lib/citrus/compiler/variable.rb +1 -1
- data/lib/citrus/nodes.rb +16 -3
- metadata +4 -4
data/README.rdoc
CHANGED
@@ -10,7 +10,7 @@ Being linear, it could be called very c-like, but it has been written to have a
|
|
10
10
|
|
11
11
|
* Dynamically typed
|
12
12
|
* Extremely ruby-like syntax
|
13
|
-
* Integer, Float, String, Boolean, Array, and Range types
|
13
|
+
* Integer, Float, String, Symbol, Boolean, Array, and Range types
|
14
14
|
* Easy integration of C functions into the API
|
15
15
|
|
16
16
|
It's prime examples are in the example directory, but here is an excerpt from factorial.ct:
|
data/example/simple.ct
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Citrus
|
2
2
|
class Array
|
3
3
|
|
4
|
+
attr_writer :length
|
4
5
|
attr_accessor :pointer
|
5
6
|
|
6
7
|
def self.create(values, builder)
|
@@ -12,16 +13,16 @@ module Citrus
|
|
12
13
|
self.new(ary)
|
13
14
|
end
|
14
15
|
|
15
|
-
def initialize(pointer,
|
16
|
+
def initialize(pointer, length=nil)
|
16
17
|
@pointer = pointer
|
17
|
-
@length =
|
18
|
+
@length = length
|
18
19
|
end
|
19
20
|
|
20
21
|
def length
|
21
22
|
unless @length.nil?
|
22
23
|
return @length
|
23
24
|
else
|
24
|
-
return INT.from_i(LLVM::C.LLVMGetArrayLength(LLVM::Type(@pointer).element_type))
|
25
|
+
return @length = INT.from_i(LLVM::C.LLVMGetArrayLength(LLVM::Type(@pointer).element_type))
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -28,9 +28,7 @@ module Citrus
|
|
28
28
|
@builder.store(first, iteration)
|
29
29
|
index = @builder.alloca(INT)
|
30
30
|
@builder.store(INT.from_i(0), index)
|
31
|
-
ib = @builder.insert_block
|
32
31
|
self.preploop(:while)
|
33
|
-
lb = @builder.insert_block
|
34
32
|
self.while(self.compare(full ? :<= : :<, @builder.load(iteration), last)) do |gw|
|
35
33
|
ival = gw.builder.load(index)
|
36
34
|
val = gw.builder.load(iteration)
|
@@ -40,7 +38,7 @@ module Citrus
|
|
40
38
|
gw.builder.store(gw.equate(:+, ival, gw.number(1)), index)
|
41
39
|
end
|
42
40
|
ival = @builder.load(index)
|
43
|
-
return Array.new(ary,
|
41
|
+
return Array.new(ary, ival)
|
44
42
|
end
|
45
43
|
|
46
44
|
def string(value)
|
@@ -123,8 +121,16 @@ module Citrus
|
|
123
121
|
end
|
124
122
|
|
125
123
|
def assign_index(name, index, value)
|
126
|
-
ary = self.load(name)
|
127
|
-
|
124
|
+
ary = self.load(name)
|
125
|
+
length = @builder.alloca(INT)
|
126
|
+
@builder.store(ary.length, length)
|
127
|
+
tb = self.block do |gb|
|
128
|
+
gb.builder.store(gb.equate(:+, index, gb.number(1)), length)
|
129
|
+
end
|
130
|
+
cond = gb.compare(:<=, ary.length, index)
|
131
|
+
self.condition(cond, tb.bb, self.block.bb)
|
132
|
+
ary.length = @builder.load(length)
|
133
|
+
ptr = @builder.gep(ary.pointer, [INT.from_i(0), index])
|
128
134
|
@builder.store(value, ptr)
|
129
135
|
end
|
130
136
|
|
@@ -226,7 +232,7 @@ module Citrus
|
|
226
232
|
def case(val, cases, elseblock)
|
227
233
|
ncases = {}
|
228
234
|
for pair in cases
|
229
|
-
ncases[pair[0]
|
235
|
+
ncases[pair[0]] = pair[1].bb
|
230
236
|
end
|
231
237
|
switch = @builder.switch(val, elseblock.bb, ncases)
|
232
238
|
@basic_block = self.block.bb
|
data/lib/citrus/nodes.rb
CHANGED
@@ -26,19 +26,32 @@ module Citrus
|
|
26
26
|
|
27
27
|
class Assign < Node
|
28
28
|
def codegen(g)
|
29
|
-
|
29
|
+
val = expression.codegen(g).last
|
30
|
+
unless op.value.empty?
|
31
|
+
val = g.equate(op.value, g.load(var.value), expression.codegen(g).last)
|
32
|
+
end
|
33
|
+
g.assign(var.value, val)
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
37
|
class GlobalEq < Node
|
34
38
|
def codegen(g)
|
35
|
-
|
39
|
+
val = expression.codegen(g).last
|
40
|
+
unless op.value.empty?
|
41
|
+
val = g.load_index(op.value, g.load_global(globalvar.value), expression.codegen(g).last)
|
42
|
+
end
|
43
|
+
g.assign_global(globalvar.value, val)
|
36
44
|
end
|
37
45
|
end
|
38
46
|
|
39
47
|
class IndexEq < Node
|
40
48
|
def codegen(g)
|
41
|
-
|
49
|
+
val = expression.codegen(g).last
|
50
|
+
unless op.value.empty?
|
51
|
+
ival = g.load_index(index.var.value, index.expression.codegen(g).last)
|
52
|
+
val = g.equate(op.value, ival, expression.codegen(g).last)
|
53
|
+
end
|
54
|
+
g.assign_index(index.var.value, index.expression.codegen(g).last, val)
|
42
55
|
end
|
43
56
|
end
|
44
57
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: citrus-compiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 57
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
9
|
+
- 3
|
10
|
+
version: 0.8.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mac Malone
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-05-
|
18
|
+
date: 2011-05-07 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: treetop
|