carbon-core 0.1.1 → 0.2.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.
- checksums.yaml +4 -4
- data/.gitattributes +17 -0
- data/.gitignore +0 -0
- data/.rspec +0 -0
- data/.rubocop.yml +0 -0
- data/.travis.yml +0 -0
- data/.yardopts +0 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +0 -0
- data/LICENSE.txt +0 -0
- data/README.md +0 -0
- data/Rakefile +0 -0
- data/Vagrantfile +0 -0
- data/carbon.gemspec +0 -0
- data/lib/carbon.rb +25 -1
- data/lib/carbon/concrete.rb +4 -2
- data/lib/carbon/concrete/build.rb +21 -13
- data/lib/carbon/concrete/index.rb +53 -159
- data/lib/carbon/concrete/item.rb +0 -0
- data/lib/carbon/concrete/item/base.rb +14 -27
- data/lib/carbon/concrete/item/class.rb +71 -0
- data/lib/carbon/concrete/item/class/element.rb +42 -0
- data/lib/carbon/concrete/item/data.rb +0 -0
- data/lib/carbon/concrete/item/function.rb +35 -39
- data/lib/carbon/concrete/item/internal.rb +17 -19
- data/lib/carbon/concrete/item/struct.rb +12 -7
- data/lib/carbon/concrete/item/struct/element.rb +0 -0
- data/lib/carbon/concrete/item/trait.rb +9 -10
- data/lib/carbon/concrete/item/trait/expectation.rb +0 -0
- data/lib/carbon/concrete/request.rb +137 -136
- data/lib/carbon/concrete/type.rb +126 -21
- data/lib/carbon/concrete/type/function.rb +26 -10
- data/lib/carbon/concrete/type/generic.rb +19 -3
- data/lib/carbon/concrete/type/name.rb +0 -0
- data/lib/carbon/concrete/type/parse.rb +1 -0
- data/lib/carbon/concrete/type/part.rb +9 -1
- data/lib/carbon/core.rb +6 -1
- data/lib/carbon/core/int.rb +0 -0
- data/lib/carbon/core/integer.rb +0 -0
- data/lib/carbon/core/integer/cast.rb +0 -0
- data/lib/carbon/core/integer/math.rb +0 -0
- data/lib/carbon/core/integer/misc.rb +17 -1
- data/lib/carbon/core/integer/pole.rb +0 -0
- data/lib/carbon/core/integer/ship.rb +8 -4
- data/lib/carbon/core/integer/sign.rb +0 -0
- data/lib/carbon/core/integer/type.rb +0 -0
- data/lib/carbon/core/integer/zero.rb +0 -0
- data/lib/carbon/core/main.rb +50 -0
- data/lib/carbon/core/pointer.rb +0 -0
- data/lib/carbon/core/pointer/access.rb +1 -1
- data/lib/carbon/core/pointer/cast.rb +0 -0
- data/lib/carbon/core/pointer/math.rb +14 -0
- data/lib/carbon/core/pointer/memory.rb +2 -4
- data/lib/carbon/core/pointer/type.rb +0 -0
- data/lib/carbon/core/void.rb +20 -0
- data/lib/carbon/counter.rb +27 -0
- data/lib/carbon/errors.rb +13 -0
- data/lib/carbon/tacky.rb +0 -0
- data/lib/carbon/tacky/block.rb +0 -0
- data/lib/carbon/tacky/builder.rb +3 -6
- data/lib/carbon/tacky/context.rb +4 -10
- data/lib/carbon/tacky/function.rb +0 -24
- data/lib/carbon/tacky/instruction.rb +2 -5
- data/lib/carbon/tacky/instruction/generation.rb +19 -41
- data/lib/carbon/tacky/parameter.rb +0 -0
- data/lib/carbon/tacky/reference.rb +0 -0
- data/lib/carbon/tacky/typed.rb +0 -0
- data/lib/carbon/tacky/value.rb +0 -2
- data/lib/carbon/version.rb +1 -1
- data/scripts/core.rb +0 -0
- data/scripts/test.rb +5 -7
- metadata +9 -4
- data/lib/carbon/tacky/instruction/dependencies.rb +0 -33
- data/lib/carbon/tacky/instruction/typeof.rb +0 -25
@@ -9,7 +9,6 @@ module Carbon
|
|
9
9
|
# function, the generics associated with the function, and the parameters
|
10
10
|
# of the function.
|
11
11
|
#
|
12
|
-
# @todo TODO: add generic parameters.
|
13
12
|
# @note
|
14
13
|
# **This class is frozen upon initialization.** This means that any
|
15
14
|
# attempt to modify it will result in an error. In most cases, the
|
@@ -26,7 +25,7 @@ module Carbon
|
|
26
25
|
# @api public
|
27
26
|
# @example
|
28
27
|
# type = Carbon::Type("A.+(A, B)")
|
29
|
-
# func = type.
|
28
|
+
# func = type.function
|
30
29
|
# func.name # => "+"
|
31
30
|
# @return [::String] The name of the function.
|
32
31
|
attr_reader :name
|
@@ -38,23 +37,35 @@ module Carbon
|
|
38
37
|
# @api public
|
39
38
|
# @example
|
40
39
|
# type = Carbon::Type("A.+(A, B)")
|
41
|
-
# func = type.
|
40
|
+
# func = type.function
|
42
41
|
# func.parameters
|
43
|
-
# # => [#<Carbon::Concrete::Type
|
44
|
-
# # #<Carbon::Concrete::Type
|
45
|
-
# @return [::Array<Type
|
42
|
+
# # => [#<Carbon::Concrete::Type A>,
|
43
|
+
# # #<Carbon::Concrete::Type B>]
|
44
|
+
# @return [::Array<Type>]
|
46
45
|
attr_reader :parameters
|
47
46
|
|
47
|
+
# The generics used in the function definition.
|
48
|
+
#
|
49
|
+
# @api public
|
50
|
+
# @example
|
51
|
+
# type = Carbon::Type("A.+<T>(A, T)")
|
52
|
+
# func = type.function
|
53
|
+
# func.generics
|
54
|
+
# # => [#<Carbon::Concrete::Type::Generic T>]
|
55
|
+
# @return [::Array<Type>]
|
56
|
+
attr_reader :generics
|
57
|
+
|
48
58
|
# Initialize the function.
|
49
59
|
#
|
50
60
|
# @see #name
|
51
61
|
# @see #params
|
52
62
|
# @param name [::String] The name of the function.
|
53
|
-
# @param params [::Array<Type
|
63
|
+
# @param params [::Array<Type>] The parameters of the function.
|
54
64
|
# This is frozen before stored.
|
55
|
-
def initialize(name, params)
|
56
|
-
@name = name
|
65
|
+
def initialize(name, params, generics = [])
|
66
|
+
@name = name.to_s
|
57
67
|
@parameters = params
|
68
|
+
@generics = generics
|
58
69
|
deep_freeze!
|
59
70
|
end
|
60
71
|
|
@@ -68,7 +79,12 @@ module Carbon
|
|
68
79
|
# func.to_s # => "+(Test<T>)"
|
69
80
|
# @return [::String]
|
70
81
|
def to_s
|
71
|
-
|
82
|
+
if @generics.any?
|
83
|
+
"#{@name}<#{@generics.map(&:to_s).join(',')}>" \
|
84
|
+
"(#{@parameters.map(&:to_s).join(', ')})".freeze
|
85
|
+
else
|
86
|
+
"#{@name}(#{@parameters.map(&:to_s).join(', ')})".freeze
|
87
|
+
end
|
72
88
|
end
|
73
89
|
|
74
90
|
# Returns the interned version of this function. In contrast to
|
@@ -41,6 +41,13 @@ module Carbon
|
|
41
41
|
# @return [Set<Type>] The traits the generic has to implement.
|
42
42
|
attr_reader :implements
|
43
43
|
|
44
|
+
# The location of the type. This is used for interfacing with other
|
45
|
+
# programs that require a location of some sort.
|
46
|
+
#
|
47
|
+
# @api semiprivate
|
48
|
+
# @return [Object]
|
49
|
+
attr_reader :location
|
50
|
+
|
44
51
|
# Initialize the generic part of the type.
|
45
52
|
#
|
46
53
|
# @see #name
|
@@ -48,7 +55,8 @@ module Carbon
|
|
48
55
|
# @param name [Type] The name of the generic.
|
49
56
|
# @param implements [Set<Type>] The traits the generic must
|
50
57
|
# implement, if any.
|
51
|
-
def initialize(name, implements)
|
58
|
+
def initialize(name, implements, location: nil)
|
59
|
+
@location = location
|
52
60
|
@name = name
|
53
61
|
@implements = Set.new(implements)
|
54
62
|
deep_freeze!
|
@@ -67,12 +75,12 @@ module Carbon
|
|
67
75
|
# other.is_a?(Generic) # => true
|
68
76
|
# result = generic.sub("T" => other)
|
69
77
|
# result.to_s # => "Carbon::String: Carbon::Sized"
|
70
|
-
# @param mapping [{::String => Type
|
78
|
+
# @param mapping [{::String => Type}] The mapping.
|
71
79
|
# @return [Type::Generic] A different instance of the generic, if it's
|
72
80
|
# in the mapping.
|
73
81
|
# @return [self] otherwise.
|
74
82
|
def sub(mapping)
|
75
|
-
mapping.fetch(@name
|
83
|
+
Generic.new(mapping.fetch(@name, @name), @implements)
|
76
84
|
end
|
77
85
|
|
78
86
|
# Compares this generic instance to another generic instance. If the
|
@@ -112,6 +120,14 @@ module Carbon
|
|
112
120
|
@name.to_s
|
113
121
|
end
|
114
122
|
end
|
123
|
+
|
124
|
+
# Accepts the current visitor unto itself.
|
125
|
+
#
|
126
|
+
# @param visitor [#visit]
|
127
|
+
# @return [Object]
|
128
|
+
def accept(visitor, *params)
|
129
|
+
visitor.visit(self, *params)
|
130
|
+
end
|
115
131
|
end
|
116
132
|
end
|
117
133
|
end
|
File without changes
|
@@ -36,15 +36,23 @@ module Carbon
|
|
36
36
|
# @return [<Type::Generic>] The generics.
|
37
37
|
attr_reader :generics
|
38
38
|
|
39
|
+
# The location of the type. This is used for interfacing with other
|
40
|
+
# programs that require a location of some sort.
|
41
|
+
#
|
42
|
+
# @api semiprivate
|
43
|
+
# @return [Object]
|
44
|
+
attr_reader :location
|
45
|
+
|
39
46
|
# Initialize the part with the given value and generics.
|
40
47
|
#
|
41
48
|
# @see #value
|
42
49
|
# @see #generics
|
43
50
|
# @param value [::String] The value.
|
44
51
|
# @param generics [<Type::Generic>] The generics.
|
45
|
-
def initialize(value, generics)
|
52
|
+
def initialize(value, generics, location: nil)
|
46
53
|
@value = value
|
47
54
|
@generics = generics
|
55
|
+
@location = location
|
48
56
|
deep_freeze!
|
49
57
|
end
|
50
58
|
|
data/lib/carbon/core.rb
CHANGED
@@ -40,16 +40,20 @@ module Carbon
|
|
40
40
|
# @api private
|
41
41
|
# @return [void]
|
42
42
|
def self.finalize
|
43
|
+
@index = Concrete::Index.new
|
43
44
|
Core::Integer.define_integer
|
44
45
|
Core::Pointer.define_pointer
|
45
46
|
index.finalize
|
46
47
|
end
|
47
48
|
|
49
|
+
def self.define_main(build, pass)
|
50
|
+
Core::Main.define_main_function(build.module, build.index, pass)
|
51
|
+
end
|
52
|
+
|
48
53
|
def self.find
|
49
54
|
if PATH.exist?
|
50
55
|
Concrete.load(PATH.read)
|
51
56
|
else
|
52
|
-
@index = Concrete::Index.new
|
53
57
|
finalize.tap { |i| PATH.write(Concrete.dump(i)) }
|
54
58
|
end
|
55
59
|
end
|
@@ -57,5 +61,6 @@ module Carbon
|
|
57
61
|
require "carbon/core/int"
|
58
62
|
require "carbon/core/integer"
|
59
63
|
require "carbon/core/pointer"
|
64
|
+
require "carbon/core/main"
|
60
65
|
end
|
61
66
|
end
|
data/lib/carbon/core/int.rb
CHANGED
File without changes
|
data/lib/carbon/core/integer.rb
CHANGED
File without changes
|
File without changes
|
File without changes
|
@@ -8,6 +8,7 @@ module Carbon
|
|
8
8
|
# functions that don't fit in any of the other category. These functions
|
9
9
|
# include:
|
10
10
|
#
|
11
|
+
# - `.null(): self`
|
11
12
|
# - `.next(self): self`
|
12
13
|
# - `.succ(self): self`
|
13
14
|
# - `.abs(self): self`
|
@@ -18,7 +19,7 @@ module Carbon
|
|
18
19
|
# - `.size(self): Carbon::UInt32`
|
19
20
|
#
|
20
21
|
# These functions are defined on all of the integer types except boolean.
|
21
|
-
# However, `.size`
|
22
|
+
# However, `.size` and `.null` are also defined on boolean.
|
22
23
|
#
|
23
24
|
# @api private
|
24
25
|
module Misc
|
@@ -40,6 +41,21 @@ module Carbon
|
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
44
|
+
# Defines the null function. This defines a function that returns a
|
45
|
+
# null (zero) integer value.
|
46
|
+
#
|
47
|
+
# @param int [Core::Int] The integer type.
|
48
|
+
# @return [void]
|
49
|
+
def define_null_function(int)
|
50
|
+
function_name = int.name.call(:null, [])
|
51
|
+
Core.define(function: function_name) do |function|
|
52
|
+
function[:return] = int.name
|
53
|
+
function[:definition].add("entry").build do |b|
|
54
|
+
b.ret(b._null(int.name).as(int.name))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
43
59
|
# Define the next functions for the given integer type. These
|
44
60
|
# functions just return the given number incremented by one. This is
|
45
61
|
# implemented without any calls. This function defines both the
|
File without changes
|
@@ -61,11 +61,15 @@ module Carbon
|
|
61
61
|
|
62
62
|
def define_ship_definition_compare(params, blocks)
|
63
63
|
blocks[0]
|
64
|
-
.build
|
65
|
-
|
64
|
+
.build do |b|
|
65
|
+
b.br(b.icmp(:lt, *params).as(Carbon::Boolean),
|
66
|
+
blocks[1], blocks[2])
|
67
|
+
end
|
66
68
|
blocks[2]
|
67
|
-
.build
|
68
|
-
|
69
|
+
.build do |b|
|
70
|
+
b.br(b.icmp(:eq, *params).as(Carbon::Boolean),
|
71
|
+
blocks[3], blocks[4])
|
72
|
+
end
|
69
73
|
end
|
70
74
|
end
|
71
75
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Core
|
6
|
+
module Main
|
7
|
+
class << self
|
8
|
+
def define_main_function(mod, index, pass)
|
9
|
+
main_params = [LLVM::Int32.type, LLVM::Int8.type.pointer.pointer]
|
10
|
+
main = mod.functions.add("main", main_params, LLVM::Int32.type)
|
11
|
+
define_main_definition(mod, main, index, pass)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def define_main_definition(mod, func, index, pass)
|
17
|
+
if pass.function.parameters.size == 2
|
18
|
+
define_main_definition_params(mod, func, index, pass)
|
19
|
+
else
|
20
|
+
define_main_definition_noparams(mod, func, index, pass)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def define_main_definition_params(mod, func, index, pass)
|
25
|
+
argc, argv = func.params
|
26
|
+
argc.name, argv.name = "argc", "argv"
|
27
|
+
func.basic_blocks.append("entry").build do |b|
|
28
|
+
if index.fetch(pass).first.return != Carbon::Void
|
29
|
+
b.ret(b.call(mod.functions[pass.to_s], argc, argv))
|
30
|
+
else
|
31
|
+
b.call(mod.function[pass.to_s], argc, argv)
|
32
|
+
b.ret(LLVM::Int(0))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def define_main_definition_noparams(mod, func, index, pass)
|
38
|
+
func.basic_blocks.append("entry").build do |b|
|
39
|
+
if index.fetch(pass).first.return != Carbon::Void
|
40
|
+
b.ret(b.call(mod.functions[pass.to_s]))
|
41
|
+
else
|
42
|
+
b.call(mod.function[pass.to_s])
|
43
|
+
b.ret(LLVM::Int(0))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/carbon/core/pointer.rb
CHANGED
File without changes
|
@@ -84,7 +84,7 @@ module Carbon
|
|
84
84
|
|
85
85
|
private
|
86
86
|
|
87
|
-
def define_array_set_definition(
|
87
|
+
def define_array_set_definition(_int, definition)
|
88
88
|
entry = definition.add("entry").build
|
89
89
|
this, index, value = definition.params
|
90
90
|
this.name, index.name, value.name = %w(self index value)
|
File without changes
|
@@ -51,6 +51,15 @@ module Carbon
|
|
51
51
|
|
52
52
|
COMP_OPERATIONS.each { |op| define_comp_pointer_function(op) }
|
53
53
|
define_space_pointer_function
|
54
|
+
define_null_function
|
55
|
+
end
|
56
|
+
|
57
|
+
def define_null_function
|
58
|
+
function_name = PTYPE.call(:null, [])
|
59
|
+
Core.define(function: function_name) do |function|
|
60
|
+
function[:return] = PTYPE
|
61
|
+
define_null_definition(function[:definition])
|
62
|
+
end
|
54
63
|
end
|
55
64
|
|
56
65
|
# Defines the `<=>` function for two pointers. This returns `-1`,
|
@@ -183,6 +192,11 @@ module Carbon
|
|
183
192
|
|
184
193
|
entry.ret(entry.gep(this, other).as(PTYPE))
|
185
194
|
end
|
195
|
+
|
196
|
+
def define_null_definition(definition)
|
197
|
+
entry = definition.add("entry").build
|
198
|
+
entry.ret(entry.null(PTYPE).as(PTYPE))
|
199
|
+
end
|
186
200
|
end
|
187
201
|
end
|
188
202
|
end
|
@@ -60,10 +60,8 @@ module Carbon
|
|
60
60
|
size = definition.params[0]
|
61
61
|
size.name = "size"
|
62
62
|
|
63
|
-
element = entry.sizeof(PTYPEGEN).as(Carbon::Type("Carbon::UInt64"))
|
64
63
|
size = convert_int_size(int, size, entry)
|
65
|
-
|
66
|
-
entry.ret(entry.malloc(total).as(PTYPE))
|
64
|
+
entry.ret(entry.array_malloc(PTYPEGEN, size).as(PTYPE))
|
67
65
|
end
|
68
66
|
|
69
67
|
def define_free_definition(definition)
|
@@ -75,7 +73,7 @@ module Carbon
|
|
75
73
|
end
|
76
74
|
|
77
75
|
def convert_int_size(int, value, entry)
|
78
|
-
size = Int.find(sign: :unsigned, size:
|
76
|
+
size = Int.find(sign: :unsigned, size: 32)
|
79
77
|
name = int.name.call(size.cast, [int.name])
|
80
78
|
entry.call(name, value).as(size.name)
|
81
79
|
end
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
module Core
|
6
|
+
module Void
|
7
|
+
class << self
|
8
|
+
def define_void
|
9
|
+
define_void_type
|
10
|
+
end
|
11
|
+
|
12
|
+
def define_void_type
|
13
|
+
Core.define(internal: Carbon::Void) do |internal|
|
14
|
+
internal[:kind] = :void
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Carbon
|
5
|
+
# A mutable counter for giving out incremental ids.
|
6
|
+
#
|
7
|
+
# @api private
|
8
|
+
class Counter
|
9
|
+
# The value.
|
10
|
+
# @return [::Numeric]
|
11
|
+
attr_reader :value
|
12
|
+
|
13
|
+
# Initialize the counter.
|
14
|
+
#
|
15
|
+
# @param value [::Numeric] The initial value of the counter.
|
16
|
+
def initialize(value = 0)
|
17
|
+
@value = value
|
18
|
+
end
|
19
|
+
|
20
|
+
# Increments the counter by one, and returns the new value.
|
21
|
+
#
|
22
|
+
# @return [::Numeric]
|
23
|
+
def increment
|
24
|
+
@value += 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|