From be7be41580f9c93e57fda39facd1e5caad14f3c2 Mon Sep 17 00:00:00 2001 From: Greg Williams Date: Fri, 25 Jul 2014 15:13:29 -0400 Subject: [PATCH] Updated to latest version of Unity. Removed -Wno-duplicate-decl-specifier flag from all YAML files, since unsupported in some versions of gcc. Reimplemented ignore in specific files and generated code using a pragmas instead, which are setup to ignore undefined pragma values. Added initial .travis.yml file for TravisCI builds. --- .gitignore | 4 +- .gitmodules | 6 +- .travis.yml | 8 ++ README | 25 +++- Rakefile | 112 ++++++++++++++++++ lib/cmock_generator.rb | 4 + rakefile.rb | 21 ++-- targets/clang_strict.yml | 1 - targets/gcc.yml | 1 - targets/gcc_64.yml | 1 - test/system/systest_generator.rb | 58 +++++---- test/system/test_compilation/const.h | 8 +- .../nonstandard_parsed_stuff_2.yml | 22 ++-- test/unit/cmock_generator_main_test.rb | 90 ++++++++------ vendor/c_exception | 2 +- vendor/unity | 2 +- 16 files changed, 266 insertions(+), 99 deletions(-) create mode 100644 .travis.yml create mode 100644 Rakefile diff --git a/.gitignore b/.gitignore index 1477e15b..bd6ddd0c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ test/system/build test/system/generated *.sublime-project -Gemfile.lock \ No newline at end of file +Gemfile.lock +.rake_t_cache +.DS_Store diff --git a/.gitmodules b/.gitmodules index 33e8370f..af418942 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,8 @@ [submodule "vendor/unity"] path = vendor/unity - url = git://github.com/ThrowTheSwitch/Unity.git + url = https://github.com/throwtheswitch/unity.git + branch = master [submodule "vendor/c_exception"] path = vendor/c_exception - url = git://github.com/ThrowTheSwitch/CException.git + url = https://github.com/throwtheswitch/cexception.git + branch = master diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..8dc27c82 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,8 @@ +language: ruby +rvm: + - "1.9.3" + - "2.0.0" +install: + - bundle install +script: + - bundle exec ci diff --git a/README b/README index 3c336602..49f54fea 100644 --- a/README +++ b/README @@ -1,10 +1,25 @@ -Welcome to CMock. +Welcome to CMock! + +![](http://travis-ci.org/atomicobject/kinetic-c.png?branch=master) + +[CMock build status](http://travis-ci.org/throwtheswitch/kinetic-c) is provided via [Travis CI](http://travis-ci.org) + +Getting Started +================ + + > git clone --recursive https://github.com/throwtheswitch/cmock.git + > cd cmock + > bundle install # Ensures you have all RubyGems needed + > bundle execute rake # Run all CMock library tests + +API Documentation +================= * Not sure what you're doing? -** The docs are in /docs +** [View docs/CMock_Summary.md](docs/CMock_Summary.md) * Interested in our MIT-style license? -** That's in /docs too +** [View docs/license.txt](docs/license.txt) * Are there examples? -** Try /examples +** They are all in [/examples](examples/) * Any other resources to check out? -** Sure. How about ThrowTheSwitch.org +** Definitely! Check out our developer portal on [ThrowTheSwitch.org](http://throwtheswitch.org) diff --git a/Rakefile b/Rakefile new file mode 100644 index 00000000..0ff24118 --- /dev/null +++ b/Rakefile @@ -0,0 +1,112 @@ +# ============================================================================== +# CMock Project - Automatic Mock Generation for C +# Copyright (c) 2007-2014 Mike Karlesky, Mark VanderVoord, Greg Williams +# [Released under MIT License. Please refer to license.txt for details] +# ============================================================================== + +require './config/test_environment' +require 'rake' +require 'rake/clean' +require 'rake/testtask' +require './rakefile_helper' + +require 'rspec/core/rake_task' + +include RakefileHelpers + +DEFAULT_CONFIG_FILE = 'gcc.yml' +CMOCK_ROOT = File.expand_path(File.dirname(__FILE__)) + +SYSTEM_TEST_SUPPORT_DIRS = [ + File.join(CMOCK_ROOT, 'test/system/generated'), + File.join(CMOCK_ROOT, 'test/system/build') +] + +SYSTEM_TEST_SUPPORT_DIRS.each do |dir| + p dir + directory(dir) + CLOBBER.include(dir) +end + + +task :prep_system_tests => SYSTEM_TEST_SUPPORT_DIRS + +configure_clean +configure_toolchain(DEFAULT_CONFIG_FILE) + +task :default => ['test:all'] +task :ci => [:no_color, :default] +task :cruise => :ci + +desc "Load configuration" +task :config, :config_file do |t, args| + args = {:config_file => DEFAULT_CONFIG_FILE} if args[:config_file].nil? + args = {:config_file => args[:config_file] + '.yml'} unless args[:config_file] =~ /\.yml$/i + configure_toolchain(args[:config_file]) +end + +namespace :test do + desc "Run all unit and system tests" + task :all => [:clobber, :prep_system_tests, 'test:units', 'test:c', 'test:system'] + + desc "Run Unit Tests" + Rake::TestTask.new('units') do |t| + t.pattern = 'test/unit/*_test.rb' + t.verbose = true + end + + #individual unit tests + FileList['test/unit/*_test.rb'].each do |test| + Rake::TestTask.new(File.basename(test,'.*')) do |t| + t.pattern = test + t.verbose = true + end + end + + desc "Run C Unit Tests" + task :c => [:prep_system_tests] do + build_and_test_c_files + end + + desc "Run System Tests" + task :system => [:clobber, :prep_system_tests] do + #get a list of all system tests, removing unsupported tests for this compiler + sys_unsupported = $cfg['unsupported'].map {|a| 'test/system/test_interactions/'+a+'.yml'} + sys_tests_to_run = FileList['test/system/test_interactions/*.yml'] - sys_unsupported + compile_unsupported = $cfg['unsupported'].map {|a| SYSTEST_COMPILE_MOCKABLES_PATH+a+'.h'} + compile_tests_to_run = FileList[SYSTEST_COMPILE_MOCKABLES_PATH + '*.h'] - compile_unsupported + unless (sys_unsupported.empty? and compile_unsupported.empty?) + report "\nIgnoring these system tests..." + sys_unsupported.each {|a| report a} + compile_unsupported.each {|a| report a} + end + report "\nRunning system tests..." + tests_failed = run_system_test_interactions(sys_tests_to_run) + raise "System tests failed." if (tests_failed > 0) + + run_system_test_compilations(compile_tests_to_run) + end + + #individual system tests + FileList['test/system/test_interactions/*.yml'].each do |test| + desc "Run system test #{File.basename(test,'.*')}" + task "test:#{File.basename(test,'.*')}" do + run_system_test_interactions([test]) + end + end + + desc "Profile Mock Generation" + task :profile => [:clobber, :prep_system_tests] do + run_system_test_profiles(FileList[SYSTEST_COMPILE_MOCKABLES_PATH + '*.h']) + end +end + +task :no_color do + $colour_output = false +end + +RSpec::Core::RakeTask.new(:spec) do |t| + spec_path = File.join(CMOCK_ROOT, 'test/spec') + t.pattern = spec_path + '/*_spec.rb' +end + diff --git a/lib/cmock_generator.rb b/lib/cmock_generator.rb index cc57b9ec..48ec4503 100644 --- a/lib/cmock_generator.rb +++ b/lib/cmock_generator.rb @@ -74,6 +74,10 @@ def create_mock_header_header(file, filename) plugin_includes = @plugins.run(:include_files) file << plugin_includes if (!plugin_includes.empty?) file << "\n" + file << "/* Ignore the following warnings, since we are copying code */\n" + file << "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n" + file << "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n" + file << "\n" end def create_typedefs(file, typedefs) diff --git a/rakefile.rb b/rakefile.rb index c53e844a..3129da09 100644 --- a/rakefile.rb +++ b/rakefile.rb @@ -1,8 +1,8 @@ - # ========================================== +# ============================================================================== # CMock Project - Automatic Mock Generation for C -# Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams +# Copyright (c) 2007-2014 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ============================================================================== require './config/test_environment' require 'rake' @@ -23,7 +23,6 @@ ] SYSTEM_TEST_SUPPORT_DIRS.each do |dir| - p dir directory(dir) CLOBBER.include(dir) end @@ -53,7 +52,7 @@ t.pattern = 'test/unit/*_test.rb' t.verbose = true end - + #individual unit tests FileList['test/unit/*_test.rb'].each do |test| Rake::TestTask.new(File.basename(test,'.*')) do |t| @@ -61,12 +60,12 @@ t.verbose = true end end - + desc "Run C Unit Tests" task :c => [:prep_system_tests] do build_and_test_c_files end - + desc "Run System Tests" task :system => [:clobber, :prep_system_tests] do #get a list of all system tests, removing unsupported tests for this compiler @@ -82,10 +81,10 @@ report "\nRunning system tests..." tests_failed = run_system_test_interactions(sys_tests_to_run) raise "System tests failed." if (tests_failed > 0) - + run_system_test_compilations(compile_tests_to_run) end - + #individual system tests FileList['test/system/test_interactions/*.yml'].each do |test| desc "Run system test #{File.basename(test,'.*')}" @@ -93,7 +92,7 @@ run_system_test_interactions([test]) end end - + desc "Profile Mock Generation" task :profile => [:clobber, :prep_system_tests] do run_system_test_profiles(FileList[SYSTEST_COMPILE_MOCKABLES_PATH + '*.h']) @@ -108,4 +107,4 @@ spec_path = File.join(CMOCK_ROOT, 'test/spec') t.pattern = spec_path + '/*_spec.rb' end - \ No newline at end of file + diff --git a/targets/clang_strict.yml b/targets/clang_strict.yml index 18ca6e30..6dc6bc3c 100644 --- a/targets/clang_strict.yml +++ b/targets/clang_strict.yml @@ -36,7 +36,6 @@ compiler: - '-Wwrite-strings' - '-Wbad-function-cast' - '-Wno-missing-prototypes' #we've been lazy about things like setUp and tearDown - - '-Wno-duplicate-decl-specifier' #allows us to test things like "const char const *"" - '-fms-extensions' - '-fno-omit-frame-pointer' - '-ffloat-store' diff --git a/targets/gcc.yml b/targets/gcc.yml index 57c62d38..c0ceb576 100644 --- a/targets/gcc.yml +++ b/targets/gcc.yml @@ -10,7 +10,6 @@ compiler: - '-Wall' - '-Wextra' - '-Wunused-parameter' - - '-Wno-duplicate-decl-specifier' - '-Wno-address' - '-std=c99' - '-pedantic' diff --git a/targets/gcc_64.yml b/targets/gcc_64.yml index cba6a083..7a725cba 100644 --- a/targets/gcc_64.yml +++ b/targets/gcc_64.yml @@ -10,7 +10,6 @@ compiler: - '-m64' - '-Wall' - '-Wunused-parameter' - - '-Wno-duplicate-decl-specifier' - '-Wno-address' - '-std=c99' - '-pedantic' diff --git a/test/system/systest_generator.rb b/test/system/systest_generator.rb index 36f7bb15..f04337a8 100644 --- a/test/system/systest_generator.rb +++ b/test/system/systest_generator.rb @@ -2,7 +2,7 @@ # CMock Project - Automatic Mock Generation for C # Copyright (c) 2007 Mike Karlesky, Mark VanderVoord, Greg Williams # [Released under MIT License. Please refer to license.txt for details] -# ========================================== +# ========================================== require 'yaml' @@ -26,31 +26,31 @@ class SystemTestGenerator - + def generate_files(test_cases) test_cases.each do |filename| yaml_hash = YAML.load_file(filename) - + name = File.basename(filename, YAML_EXTENSION) namix = "#{name}_" - + generate_cmock_config(yaml_hash, namix) generate_code(yaml_hash, namix, name) end end private - + def generate_cmock_config(yaml_hash, namix) cmock_yaml = yaml_hash.clone cmock_yaml.delete(:systest) cmock = cmock_yaml[:cmock] - + cmock[:mock_path] = GENERATED_PATH cmock[:includes] = (cmock[:includes] || []) + [namix + TYPES_H] cmock[:mock_prefix] = MOCK_PREFIX if not yaml_hash[:systest][:unity_helper].nil? - cmock[:includes] << namix + UNITY_HELPER_H + cmock[:includes] << namix + UNITY_HELPER_H cmock[:unity_helper_path] = GENERATED_PATH + namix + UNITY_HELPER_H end @@ -58,29 +58,29 @@ def generate_cmock_config(yaml_hash, namix) YAML.dump(cmock_yaml, out) end end - - def generate_code(yaml_hash, namix, name) + + def generate_code(yaml_hash, namix, name) generate_types_file(yaml_hash, namix) generate_mockable_file(yaml_hash, namix) generate_unity_helper_files(yaml_hash, namix) - + generate_test_file(yaml_hash, namix, name) generate_source_file(yaml_hash, namix, name) end - + def generate_types_file(yaml_hash, namix) types = yaml_hash[:systest][:types] return if types.nil? - + write_header_file(GENERATED_PATH + namix + TYPES_H, namix.upcase + 'TYPES_H') do |out| out.puts(types) end end - + def generate_mockable_file(yaml_hash, namix) mockable = yaml_hash[:systest][:mockable] return if mockable.nil? - + write_header_file(GENERATED_PATH + namix + MOCKABLE_H, namix.upcase + 'MOCKABLE_H', [namix + TYPES_H]) do |out| out.puts(mockable) end @@ -89,7 +89,7 @@ def generate_mockable_file(yaml_hash, namix) def generate_unity_helper_files(yaml_hash, namix) unity_helper = yaml_hash[:systest][:unity_helper] return if unity_helper.nil? - + write_header_file(GENERATED_PATH + namix + UNITY_HELPER_H, namix.upcase + 'UNITY_HELPER_H', [namix + TYPES_H]) do |out| out.puts(unity_helper[:header]) end @@ -102,12 +102,12 @@ def generate_unity_helper_files(yaml_hash, namix) def generate_test_file(yaml_hash, namix, name) tests = yaml_hash[:systest][:tests] return if tests.nil? - + includes = [UNITY_H, CMOCK_H] includes << (namix + UNITY_HELPER_H) if not yaml_hash[:systest][:unity_helper].nil? includes << [MOCK_PREFIX + namix + MOCKABLE_H] includes << [name + H_EXTENSION] - + write_source_file(GENERATED_PATH + TEST_PREFIX + name + C_EXTENSION, includes.flatten) do |out| out.puts(tests[:common]) out.puts('') @@ -117,29 +117,29 @@ def generate_test_file(yaml_hash, namix, name) out.puts(test[:code].gsub!(/test\(\)/, "void test#{index+1}(void)")) out.puts('') end - end + end end def generate_source_file(yaml_hash, namix, name) source = yaml_hash[:systest][:source] return if source.nil? - + header_file = name + H_EXTENSION - + includes = yaml_hash[:systest][:types].nil? ? [] : [(namix + TYPES_H)] write_header_file(GENERATED_PATH + header_file, name.upcase, includes) do |out| out.puts(source[:header]) - end + end includes = [] includes << (namix + TYPES_H) if not yaml_hash[:systest][:types].nil? includes << (namix + MOCKABLE_H) if not yaml_hash[:systest][:mockable].nil? includes << header_file - + write_source_file(GENERATED_PATH + name + C_EXTENSION, includes.flatten) do |out| out.puts(source[:code]) - end + end end def write_header_file(filename, upcase_name, include_list=[]) @@ -151,11 +151,14 @@ def write_header_file(filename, upcase_name, include_list=[]) out.puts("#include \"#{include}\"") end out.puts('') + out.puts('#pragma GCC diagnostic ignored "-Wunknown-pragmas"') + out.puts('#pragma GCC diagnostic ignored "-Wduplicate-decl-specifier"') + out.puts('') yield(out) out.puts('') out.puts("#endif // _#{upcase_name}") out.puts('') - end + end end def write_source_file(filename, include_list=[]) @@ -164,11 +167,14 @@ def write_source_file(filename, include_list=[]) out.puts("#include \"#{include}\"") end out.puts('') + out.puts('#pragma GCC diagnostic ignored "-Wunknown-pragmas"') + out.puts('#pragma GCC diagnostic ignored "-Wduplicate-decl-specifier"') + out.puts('') yield(out) out.puts('') - end + end end - + end diff --git a/test/system/test_compilation/const.h b/test/system/test_compilation/const.h index e17c4658..7d100e11 100644 --- a/test/system/test_compilation/const.h +++ b/test/system/test_compilation/const.h @@ -4,12 +4,14 @@ [Released under MIT License. Please refer to license.txt for details] ========================================== */ +#pragma GCC diagnostic ignored "-Wunknown-pragmas" +#pragma GCC diagnostic ignored "-Wduplicate-decl-specifier" + struct _DUMMY_T { unsigned int a; float b; }; void const_variants1( const char* a, int const, unsigned short const * c ); -void const_variants2( +void const_variants2( struct _DUMMY_T const * const param1, const unsigned long int const * const param2, - const struct _DUMMY_T const * param3 ); - + const struct _DUMMY_T const * param3 ); diff --git a/test/system/test_interactions/nonstandard_parsed_stuff_2.yml b/test/system/test_interactions/nonstandard_parsed_stuff_2.yml index f9c95381..506e7ee8 100644 --- a/test/system/test_interactions/nonstandard_parsed_stuff_2.yml +++ b/test/system/test_interactions/nonstandard_parsed_stuff_2.yml @@ -6,26 +6,26 @@ :systest: :types: | - - + + :mockable: | void foo(unsigned char** a); unsigned char** bar(void); - :source: - :header: | + :source: + :header: | void function_a(void); :code: | void function_a(void) { foo(bar()); } - + :tests: :common: | void setUp(void) {} void tearDown(void) {} - + :units: - :pass: TRUE :should: 'handle two dimensional array of unsigned characters just like we would handle a single dimensional array in expect (where we really only care about first element)' @@ -34,13 +34,13 @@ { unsigned char a[] = { 1, 2, 3, 4, 5, 6 }; unsigned char** pa = (unsigned char**)(&a); - + bar_ExpectAndReturn(pa); foo_Expect(pa); - + function_a(); } - + - :pass: FALSE :should: 'handle two dimensional array of unsigned characters just like we would handle a single dimensional array in expect as failures (where we really only care about first element)' :code: | @@ -50,10 +50,10 @@ unsigned char b[] = { 5, 6, 7, 8, 9, 0 }; unsigned char** pa = (unsigned char**)(&a); unsigned char** pb = (unsigned char**)(&b); - + bar_ExpectAndReturn(pa); foo_Expect(pb); - + function_a(); } ... diff --git a/test/unit/cmock_generator_main_test.rb b/test/unit/cmock_generator_main_test.rb index 94a7546b..a6041f96 100644 --- a/test/unit/cmock_generator_main_test.rb +++ b/test/unit/cmock_generator_main_test.rb @@ -85,15 +85,20 @@ def teardown define_name = "MOCKPOUTPOUTFISH_H" mock_name = "MockPoutPoutFish" output = [] - expected = [ "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", - "#ifndef _#{define_name}\n", - "#define _#{define_name}\n\n", - "#include \"ConfigRequiredHeader1.h\"\n", - "#include \"ConfigRequiredHeader2.h\"\n", - "#include \"#{orig_filename}\"\n", - "#include \"PluginRequiredHeader.h\"\n", - "\n" - ] + expected = [ + "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", + "#ifndef _#{define_name}\n", + "#define _#{define_name}\n\n", + "#include \"ConfigRequiredHeader1.h\"\n", + "#include \"ConfigRequiredHeader2.h\"\n", + "#include \"#{orig_filename}\"\n", + "#include \"PluginRequiredHeader.h\"\n", + "\n", + "/* Ignore the following warnings, since we are copying code */\n", + "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n", + "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n", + "\n", + ] @plugins.expect.run(:include_files).returns("#include \"PluginRequiredHeader.h\"\n") @@ -121,15 +126,20 @@ def teardown define_name = "MOCKPOUT_POUT_FISH_H" mock_name = "MockPout_Pout_Fish" output = [] - expected = [ "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", - "#ifndef _#{define_name}\n", - "#define _#{define_name}\n\n", - "#include \"ConfigRequiredHeader1.h\"\n", - "#include \"ConfigRequiredHeader2.h\"\n", - "#include \"#{orig_filename}\"\n", - "#include \"PluginRequiredHeader.h\"\n", - "\n" - ] + expected = [ + "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", + "#ifndef _#{define_name}\n", + "#define _#{define_name}\n\n", + "#include \"ConfigRequiredHeader1.h\"\n", + "#include \"ConfigRequiredHeader2.h\"\n", + "#include \"#{orig_filename}\"\n", + "#include \"PluginRequiredHeader.h\"\n", + "\n", + "/* Ignore the following warnings, since we are copying code */\n", + "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n", + "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n", + "\n", + ] @plugins.expect.run(:include_files).returns("#include \"PluginRequiredHeader.h\"\n") @@ -144,14 +154,19 @@ def teardown define_name = "MOCKPOUTPOUTFISH_H" mock_name = "MockPoutPoutFish" output = [] - expected = [ "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", - "#ifndef _#{define_name}\n", - "#define _#{define_name}\n\n", - "#include \"ConfigRequiredHeader1.h\"\n", - "#include \"ConfigRequiredHeader2.h\"\n", - "#include \"#{orig_filename}\"\n", - "\n" - ] + expected = [ + "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", + "#ifndef _#{define_name}\n", + "#define _#{define_name}\n\n", + "#include \"ConfigRequiredHeader1.h\"\n", + "#include \"ConfigRequiredHeader2.h\"\n", + "#include \"#{orig_filename}\"\n", + "\n", + "/* Ignore the following warnings, since we are copying code */\n", + "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n", + "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n", + "\n", + ] @plugins.expect.run(:include_files).returns('') @@ -166,15 +181,20 @@ def teardown define_name = "MOCKPOUTPOUTFISH_H" mock_name = "MockPoutPoutFish" output = [] - expected = [ "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", - "#ifndef _#{define_name}\n", - "#define _#{define_name}\n\n", - "#include \"ConfigRequiredHeader1.h\"\n", - "#include \"ConfigRequiredHeader2.h\"\n", - "#include \"#{orig_filename}\"\n", - "#include \"PluginRequiredHeader.h\"\n", - "\n" - ] + expected = [ + "/* AUTOGENERATED FILE. DO NOT EDIT. */\n", + "#ifndef _#{define_name}\n", + "#define _#{define_name}\n\n", + "#include \"ConfigRequiredHeader1.h\"\n", + "#include \"ConfigRequiredHeader2.h\"\n", + "#include \"#{orig_filename}\"\n", + "#include \"PluginRequiredHeader.h\"\n", + "\n", + "/* Ignore the following warnings, since we are copying code */\n", + "#pragma GCC diagnostic ignored \"-Wunknown-pragmas\"\n", + "#pragma GCC diagnostic ignored \"-Wduplicate-decl-specifier\"\n", + "\n", + ] @plugins.expect.run(:include_files).returns("#include \"PluginRequiredHeader.h\"\n") diff --git a/vendor/c_exception b/vendor/c_exception index 0571b990..f64bdb2e 160000 --- a/vendor/c_exception +++ b/vendor/c_exception @@ -1 +1 @@ -Subproject commit 0571b990b67b750bb597dd71d510ef3e5289f619 +Subproject commit f64bdb2ea11bd5a5895d7e455a343e2bc72a74c2 diff --git a/vendor/unity b/vendor/unity index fe2c691e..47a778d6 160000 --- a/vendor/unity +++ b/vendor/unity @@ -1 +1 @@ -Subproject commit fe2c691e9dcc69668e9043ed7a0b61dc7021662e +Subproject commit 47a778d606fbfabde459b0f725a67b18c1bce6ee