diff --git a/spec/compiler/config_spec.cr b/spec/compiler/config_spec.cr index 1803638dde43..4dfceff7968d 100644 --- a/spec/compiler/config_spec.cr +++ b/spec/compiler/config_spec.cr @@ -4,9 +4,8 @@ require "./spec_helper" describe Crystal::Config do it ".host_target" do {% begin %} - # TODO: CRYSTAL_SPEC_COMPILER_BIN must be quoted (#11456) - {% compiler = (env("CRYSTAL_SPEC_COMPILER_BIN") || "bin/crystal").id %} - Crystal::Config.host_target.should eq Crystal::Codegen::Target.new({{ `#{compiler} --version`.lines[-1] }}.lchop("Default target: ")) + {% host_triple = Crystal.constant("HOST_TRIPLE") || Crystal::DESCRIPTION.lines[-1].gsub(/^Default target: /, "") %} + Crystal::Config.host_target.should eq Crystal::Codegen::Target.new({{ host_triple }}) {% end %} end diff --git a/spec/std/char/reader_spec.cr b/spec/std/char/reader_spec.cr index 4d9ec1924f4f..6197a3d4b6c8 100644 --- a/spec/std/char/reader_spec.cr +++ b/spec/std/char/reader_spec.cr @@ -102,6 +102,7 @@ describe "Char::Reader" do reader.pos.should eq(0) reader.current_char.ord.should eq(0) reader.has_previous?.should be_false + reader.has_next?.should be_false end it "gets previous char (ascii)" do @@ -109,8 +110,10 @@ describe "Char::Reader" do reader.pos.should eq(4) reader.current_char.should eq('o') reader.has_previous?.should be_true + reader.has_next?.should be_true reader.previous_char.should eq('l') + reader.has_next?.should be_true reader.previous_char.should eq('l') reader.previous_char.should eq('e') reader.previous_char.should eq('h') @@ -126,8 +129,10 @@ describe "Char::Reader" do reader.pos.should eq(9) reader.current_char.should eq('語') reader.has_previous?.should be_true + reader.has_next?.should be_true reader.previous_char.should eq('本') + reader.has_next?.should be_true reader.previous_char.should eq('日') reader.previous_char.should eq('á') reader.previous_char.should eq('h') diff --git a/src/char/reader.cr b/src/char/reader.cr index ae1a20258db4..cb307117cdbb 100644 --- a/src/char/reader.cr +++ b/src/char/reader.cr @@ -59,7 +59,6 @@ struct Char @pos = pos.to_i @current_char = '\0' @current_char_width = 0 - @end = false decode_current_char end @@ -69,7 +68,6 @@ struct Char @pos = @string.bytesize @current_char = '\0' @current_char_width = 0 - @end = false decode_previous_char end @@ -83,7 +81,7 @@ struct Char # reader.peek_next_char # => '\0' # ``` def has_next? : Bool - !@end + @pos < @string.bytesize end # Reads the next character in the string, @@ -177,7 +175,7 @@ struct Char # C # ``` def each(&) : Nil - while @pos < @string.bytesize + while has_next? yield current_char @pos += @current_char_width @@ -251,26 +249,22 @@ struct Char private def decode_current_char decode_char_at(@pos) do |code_point, width, error| @current_char_width = width - @end = @pos == @string.bytesize @error = error @current_char = code_point.unsafe_chr end end private def decode_previous_char - if @pos == 0 - @end = @pos == @string.bytesize - else - while @pos > 0 - @pos -= 1 - break if (byte_at(@pos) & 0xC0) != 0x80 - end - decode_char_at(@pos) do |code_point, width, error| - @current_char_width = width - @end = @pos == @string.bytesize - @error = error - @current_char = code_point.unsafe_chr - end + return if @pos == 0 + + while @pos > 0 + @pos -= 1 + break if (byte_at(@pos) & 0xC0) != 0x80 + end + decode_char_at(@pos) do |code_point, width, error| + @current_char_width = width + @error = error + @current_char = code_point.unsafe_chr end end diff --git a/src/compiler/crystal/program.cr b/src/compiler/crystal/program.cr index 97808279061c..936fc6a0a270 100644 --- a/src/compiler/crystal/program.cr +++ b/src/compiler/crystal/program.cr @@ -118,7 +118,7 @@ module Crystal # A `ProgressTracker` object which tracks compilation progress. property progress_tracker = ProgressTracker.new - property codegen_target = Config.host_target + getter codegen_target = Config.host_target getter predefined_constants = Array(Const).new @@ -289,6 +289,8 @@ module Crystal define_crystal_string_constant "LIBRARY_RPATH", Crystal::CrystalLibraryPath.default_rpath define_crystal_string_constant "VERSION", Crystal::Config.version define_crystal_string_constant "LLVM_VERSION", Crystal::Config.llvm_version + define_crystal_string_constant "HOST_TRIPLE", Crystal::Config.host_target.to_s + define_crystal_string_constant "TARGET_TRIPLE", Crystal::Config.host_target.to_s end private def define_crystal_string_constant(name, value) @@ -307,6 +309,11 @@ module Crystal property(target_machine : LLVM::TargetMachine) { codegen_target.to_target_machine } + def codegen_target=(@codegen_target : Codegen::Target) : Codegen::Target + crystal.types["TARGET_TRIPLE"].as(Const).value.as(StringLiteral).value = codegen_target.to_s + @codegen_target + end + # Returns the `Type` for `Array(type)` def array_of(type) array.instantiate [type] of TypeVar