mt-lang 0.2.20 → 0.2.21

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98c4dc25b7d1fb3ab4931eed5fd30c29e30448a3b2c3fe85d6b58d823fab7baa
4
- data.tar.gz: a025a925117c16e69f85667f4411a5d09b92ac0ea65e6ec061111578db39001a
3
+ metadata.gz: e599b2192dada4fb02cbcefc522482028adce79482a53965f2715895ced1c744
4
+ data.tar.gz: 2a4b8540ee7050b98707aee9cdd15b6f18504c8f401f9590c03720a49d88de78
5
5
  SHA512:
6
- metadata.gz: e18ef0444a502981b66eed892a94ccc92918c2d1254669d912e27a8e43b552d360cbc9d4eaf386935b141700ee992eedb365093c00bd67e35e3d878e20f17fbb
7
- data.tar.gz: 1e642ded750895e1cabc818bff33c7a88beffc463975d46dc98a2a45cb7eb07d53ee57580fee90fd31b3d8af011e4477a41779044c535513a444457bcd12a902
6
+ metadata.gz: a308513fd5d5aac4ab32c9707b1bb066851b103b4c3ff9521e880f0bdaf7501968329da6fa6a98487077f532189b0931bb4e715e2a495f359e383320ecc1b212
7
+ data.tar.gz: d6f99733d6bc1be8eff2d4002b7b2e7d8aa8b1b6a48fe7ca26631a0ffc3780bafadcee2003c73afa473c457d59c736845d3e34f96e0a13ea1b3a48920b294b2c
data/lib/milk_tea/base.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require "pathname"
4
4
 
5
5
  module MilkTea
6
- VERSION = "0.2.20"
6
+ VERSION = "0.2.21"
7
7
 
8
8
  def self.root
9
9
  @root ||= Pathname.new(File.expand_path("../..", __dir__))
@@ -1074,7 +1074,15 @@ module MilkTea
1074
1074
  lower_expression(prepared_value, env:, expected_type: target.type)
1075
1075
  end
1076
1076
  update_cstr_metadata_for_assignment!(statement, prepared_value, env)
1077
- if statement.operator == "=" && contains_proc_storage_type?(target.type)
1077
+ operator = statement.operator
1078
+ if ["+=", "-=", "*=", "/="].include?(operator) &&
1079
+ (target.type.is_a?(Types::Vector) || target.type.is_a?(Types::Matrix) || target.type.is_a?(Types::Quaternion))
1080
+ binary_op = operator[0...-1]
1081
+ expanded = lower_vector_binary_op(binary_op, target, target.type, value, value.type, target.type)
1082
+ value = expanded || IR::Binary.new(operator: binary_op, left: target, right: value, type: target.type)
1083
+ operator = "="
1084
+ end
1085
+ if operator == "=" && contains_proc_storage_type?(target.type)
1078
1086
  rhs_name = fresh_c_temp_name(env, "proc_assign")
1079
1087
  lowered << IR::LocalDecl.new(name: rhs_name, linkage_name: rhs_name, type: target.type, value:)
1080
1088
  rhs = IR::Name.new(name: rhs_name, type: target.type, pointer: false)
@@ -1082,7 +1090,7 @@ module MilkTea
1082
1090
  lowered.concat(lower_proc_contained_guarded_release_statements(target, target.type))
1083
1091
  lowered << IR::Assignment.new(target:, operator: "=", value: rhs)
1084
1092
  else
1085
- lowered << IR::Assignment.new(target:, operator: statement.operator, value:)
1093
+ lowered << IR::Assignment.new(target:, operator:, value:)
1086
1094
  end
1087
1095
  lowered
1088
1096
  end
@@ -211,7 +211,15 @@ module MilkTea
211
211
  end
212
212
  update_cstr_metadata_for_assignment!(statement, prepared_value, local_env)
213
213
  local_defers.concat(suppress_format_releases_for_assignment(prepared_cleanups, target.type))
214
- if statement.operator == "=" && contains_proc_storage_type?(target.type)
214
+ operator = statement.operator
215
+ if ["+=", "-=", "*=", "/="].include?(operator) &&
216
+ (target.type.is_a?(Types::Vector) || target.type.is_a?(Types::Matrix) || target.type.is_a?(Types::Quaternion))
217
+ binary_op = operator[0...-1]
218
+ expanded = lower_vector_binary_op(binary_op, target, target.type, value, value.type, target.type)
219
+ value = expanded || IR::Binary.new(operator: binary_op, left: target, right: value, type: target.type)
220
+ operator = "="
221
+ end
222
+ if operator == "=" && contains_proc_storage_type?(target.type)
215
223
  # Materialize the RHS to a C temp to avoid evaluating aggregate literals multiple times
216
224
  # and to ensure retain/release operate on a stable struct value throughout the sequence.
217
225
  rhs_name = fresh_c_temp_name(local_env, "proc_assign")
@@ -224,7 +232,7 @@ module MilkTea
224
232
  lowered.concat(lower_proc_contained_guarded_release_statements(target, target.type))
225
233
  lowered << IR::Assignment.new(target:, operator: "=", value: rhs)
226
234
  else
227
- lowered << IR::Assignment.new(target:, operator: statement.operator, value:)
235
+ lowered << IR::Assignment.new(target:, operator:, value:)
228
236
  end
229
237
  when AST::IfStmt
230
238
  if statement.inline
@@ -176,7 +176,11 @@ module MilkTea
176
176
  enum_type = @ctx.types.fetch(decl.name)
177
177
  backing_type = enum_type.backing_type
178
178
  members = decl.members.map do |member|
179
- value = lower_expression(member.value, env: empty_env, expected_type: backing_type)
179
+ value = if member.value
180
+ lower_expression(member.value, env: empty_env, expected_type: backing_type)
181
+ else
182
+ IR::IntegerLiteral.new(value: enum_type.member_value(member.name), type: backing_type)
183
+ end
180
184
  IR::EnumMember.new(name: member.name, linkage_name: enum_member_c_name(enum_type, member.name), value:)
181
185
  end
182
186
 
@@ -260,6 +260,8 @@ module MilkTea
260
260
  end
261
261
  when IR::ArrayLiteral
262
262
  "#{expression.type}(#{expression.elements.map { |element| render_expression(element) }.join(', ')})"
263
+ when IR::Assignment
264
+ "#{render_expression(expression.target)} #{expression.operator} #{render_expression(expression.value)}"
263
265
  else
264
266
  raise ArgumentError, "unsupported IR expression #{expression.class.name}"
265
267
  end
@@ -495,16 +495,21 @@ module MilkTea
495
495
  line: statement.line, column: statement.column,
496
496
  )
497
497
  when "+=", "-=", "*=", "/="
498
- raise_sema_error("operator #{statement.operator} requires matching numeric types, got #{target_type} and #{value_type}") unless target_type.numeric? && value_type.numeric?
498
+ binary_op = statement.operator[0...-1]
499
+ if (result_type = vector_arithmetic_result(binary_op, target_type, value_type))
500
+ raise_sema_error("operator #{statement.operator} on #{target_type} and #{value_type} produces #{result_type}, expected #{target_type}") unless result_type == target_type
501
+ else
502
+ raise_sema_error("operator #{statement.operator} requires matching numeric types, got #{target_type} and #{value_type}") unless target_type.numeric? && value_type.numeric?
499
503
 
500
- ensure_assignable!(
501
- value_type,
502
- target_type,
503
- "operator #{statement.operator} requires matching numeric types, got #{target_type} and #{value_type}",
504
- expression: statement.value,
505
- contextual_int_to_float: contextual_int_to_float_target?(target_type),
506
- line: statement.line, column: statement.column,
507
- )
504
+ ensure_assignable!(
505
+ value_type,
506
+ target_type,
507
+ "operator #{statement.operator} requires matching numeric types, got #{target_type} and #{value_type}",
508
+ expression: statement.value,
509
+ contextual_int_to_float: contextual_int_to_float_target?(target_type),
510
+ line: statement.line, column: statement.column,
511
+ )
512
+ end
508
513
  when "%="
509
514
  unless common_integer_type(target_type, value_type) == target_type
510
515
  raise_sema_error("operator #{statement.operator} requires compatible integer types, got #{target_type} and #{value_type}")
@@ -1378,7 +1383,7 @@ module MilkTea
1378
1383
 
1379
1384
  def stack_safe_pointer_source?(binding)
1380
1385
  return false unless binding.type
1381
- ref_type?(binding.type) || own_type?(binding.type)
1386
+ ref_type?(binding.type) || own_type?(binding.type) || (binding.mutable && binding.kind == :param)
1382
1387
  end
1383
1388
 
1384
1389
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mt-lang
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.20
4
+ version: 0.2.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Long (Teefan) Tran
@@ -586,7 +586,7 @@ metadata:
586
586
  homepage_uri: https://teefan.github.io/mt-lang/
587
587
  source_code_uri: https://github.com/teefan/mt-lang
588
588
  post_install_message: |
589
- Milk Tea 0.2.20 installed!
589
+ Milk Tea 0.2.21 installed!
590
590
 
591
591
  System requirements:
592
592
  - A C compiler (gcc or clang) must be available on PATH