]> git.mdlowis.com Git - proto/cerise-c.git/commitdiff
finished record code generation
authorMike Lowis <mike.lowis@gentex.com>
Thu, 9 Jan 2025 02:40:52 +0000 (21:40 -0500)
committerMike Lowis <mike.lowis@gentex.com>
Thu, 9 Jan 2025 02:40:52 +0000 (21:40 -0500)
Int.c
cerise-c.m
lib/codegen.rb
lib/parser.rb
runtime.h

diff --git a/Int.c b/Int.c
index af75d41f77f05b32cdeb643db96a7f5b1904d750..55de580a4dfdcb1706b795a2f19e2d29e743d642 100644 (file)
--- a/Int.c
+++ b/Int.c
@@ -2,6 +2,7 @@
 
 int Foo_Bar();
 
+
 typedef int Int_T;
 int Int_SumInts(int, int);
 
index 5a46ca3cd789c428686c3160165eb2cf87fb3e7a..045c1a563fee3029706e342a27c7ba70a0ac15b5 100644 (file)
@@ -191,8 +191,8 @@ TestIfBlocks(){
 TestRecords(){
     def foo = new Records:Rec1 { foo = 42 }
     assert foo.foo == 42
-#    set foo.foo = 43
-#    assert foo.foo == 43
+    set foo.foo = 43
+    assert foo.foo == 43
 }
 
 AddTwoNums(a : int, b : int)
@@ -216,5 +216,6 @@ Main()
     TestGtEqOps()
     TestNeqOps()
     TestIfBlocks()
+    TestRecords()
     Int:SumInts(1,2)
 }
index 78d7c8f0df91f717c3d4a955b1f2f800ad182bf0..0d2a3c9733fdea33d01eeddce9b68ad4f4d8e8cd 100644 (file)
@@ -147,13 +147,13 @@ class Codegen
       puts ""
     end
 
-#    # output imported record declarations
-#    imported_mods.each do |mod|
-#      @syms[mod[:name]].type.exports.each do |name, val|
-#        define_sym(val) if val.kind == :type
-#      end
-#      puts ""
-#    end
+    # output imported record declarations
+    imported_mods.each do |mod|
+      @syms[mod[:name]].type.exports.each do |name, val|
+        define_sym(val) if val.kind == :type
+      end
+      puts ""
+    end
 
     # output this modules symbol declarations
     @syms.each { |name, val| declare_sym(val) }
@@ -269,6 +269,13 @@ class Codegen
       else
         putln "#{type} #{result} = Array_Get(#{lvar}, #{rvar});"
       end
+    elsif v.op == "."
+
+      lvar = emit(v.left)
+      result = mktemp();
+      putln "#{type} #{result} = (#{lvar}->#{v.right.name});"
+
+
     else
       lvar = emit(v.left)
       rvar = emit(v.right)
@@ -309,7 +316,10 @@ class Codegen
           putln "#{type} #{result} = (#{lvar} != #{rvar});"
         end
       when :new
-        putln "#{type} #{result} = 0;"
+        putln "#{type} #{result} = Record_Create(sizeof(#{type[0..-2]}));"
+        v.right.each do |field, value|
+          putln "#{result}->#{field} = #{emit(value)};"
+        end
       else
         raise "not implemented"
       end
@@ -342,29 +352,20 @@ class Codegen
     @syms.add_sym(v.name.name, v.loc, :local, v.type, v.value)
     temp = emit(v.value)
     error v, "invalid local definition: #{v.name.name}" if not @locals.index(v.name.name)
-
-#    if v.type.module.nil?
-#      sym = @syms[v.type.name].value || @syms[v.type.name].type
-#    else
-#      if type.module == @parser.module
-#        sym = @syms[v.type.name].type || @syms[v.type.name].value
-#      else
-#        sym = @syms[v.type.module].type.exports[v.type.name]
-#        sym = sym.type || sym.value
-#      end
-#    end
-#    is_record = sym.is_a?(Value::Type) and sym.form == :record
-
     putln "#{type_to_s(v.value.type)} #{v.name.name} = #{temp};"
   end
 
   def emit_set(v)
     if v.name.is_a? IR::Op
-      error v, "not a valid array or hash access expression" if v.name.op != "["
+      error v, "not a valid array or hash access expression" if (v.name.op != "[") && (v.name.op != ".")
       object = emit(v.name.left)
       key = emit(v.name.right)
       value = emit(v.value)
-      putln "Array_Set(#{object}, #{key}, #{value});"
+      if (v.name.op == ".")
+        putln "#{object}->#{v.name.right.name} = #{value};"
+      else
+        putln "Array_Set(#{object}, #{key}, #{value});"
+      end
     else
       temp = emit(v.value)
       error v,  "invalid local definition: #{v.name.name}" if not @locals.index(v.name.name)
index 7f3a4d0386e060ed3679ddbd1d6d904bfc31e5f0..830752ec7dba17f4aae1e7c63750428095b8f2cb 100644 (file)
@@ -364,6 +364,8 @@ class Parser
     name = identifier()
     if matches("[")
       name = array_or_hash_access(name)
+    elsif matches(".")
+      name = record_access(name)
     end
     expect ("=")
     value = expression()
index b50568b0cb11dc2e0a7cc6b857f0ceee3a781d73..2cbc11a7b7bd4229532ca60a0ba50e19f95be239 100644 (file)
--- a/runtime.h
+++ b/runtime.h
@@ -50,7 +50,14 @@ static inline void Assert(char* file, int lineno, bool val)
     }
 }
 
-/* Strings
+/* Records
+ *************************************************/
+static inline void* Record_Create(size_t sz)
+{
+    return calloc(1, sz);
+}
+
+/* Arrays
  *************************************************/
 
 #pragma GCC diagnostic push