got the ruby-generated type info actually working
diff --git a/aos/build/queues.gypi b/aos/build/queues.gypi
index 7ae0d89..884b173 100644
--- a/aos/build/queues.gypi
+++ b/aos/build/queues.gypi
@@ -118,6 +118,7 @@
},
'dependencies': [
'<(AOS)/common/common.gyp:queues',
+ '<(AOS)/common/common.gyp:once',
],
'export_dependent_settings': [
'<(AOS)/common/common.gyp:queues',
diff --git a/aos/build/queues/compiler.rb b/aos/build/queues/compiler.rb
index 9c0270f..8c643c7 100644
--- a/aos/build/queues/compiler.rb
+++ b/aos/build/queues/compiler.rb
@@ -102,6 +102,7 @@
cpp_tree.add_cc_include("aos/common/byteorder.h".inspect)
cpp_tree.add_cc_include("aos/common/inttypes.h".inspect)
cpp_tree.add_cc_include("aos/common/queue_types.h".inspect)
+ cpp_tree.add_cc_include("aos/common/once.h".inspect)
cpp_tree.add_cc_using("::aos::to_network")
cpp_tree.add_cc_using("::aos::to_host")
cpp_tree.add_swig_header_include("aos/common/queue.h".inspect)
diff --git a/aos/build/queues/output/message_dec.rb b/aos/build/queues/output/message_dec.rb
index 92e32e5..e5905c2 100644
--- a/aos/build/queues/output/message_dec.rb
+++ b/aos/build/queues/output/message_dec.rb
@@ -6,26 +6,28 @@
class Target::StructBase < Target::Node
def create_DoGetType(type_class, cpp_tree)
- member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType* ","DoGetType")
+ member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","DoGetType")
member_func.static = true
-# member_func.const = true
fields = []
+ register_members = []
@members.each do |member|
tId = member.getTypeID()
fieldName = member.name.inspect
if(member.respond_to?(:add_TypeRegister))
- member.add_TypeRegister(type_class, member_func)
+ register_members.push(member)
end
fields << "new ::aos::MessageType::Field{#{tId}, #{fieldName}}"
end
+ register_members.uniq do |member|
+ member.type
+ end.each do |member|
+ member.add_TypeRegister(cpp_tree, type_class, member_func)
+ end
id = getTypeID()
member_func.suite << ("static const ::aos::MessageType kMsgMessageType(#{id}, #{@name.inspect}, {" +
"#{fields.join(", ")}})");
type_class.add_member(member_func)
-# val = CPP::StaticVar.new(type_class, "const int", "asdf")
-# val.args << 0
-# type_class.add_member(val)
- member_func.suite << "::type_cache::Add(&kMsgMessageType)"
+ member_func.suite << "::aos::type_cache::Add(kMsgMessageType)"
member_func.suite << CPP::Return.new("&kMsgMessageType")
end
def simpleStr()
@@ -132,10 +134,11 @@
"::aos::Message::Size()"))
end
def create_GetType(type_class, cpp_tree)
- member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType& ","GetType")
- member_func.const = true
+ member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","GetType")
+ type_class.add_member(member_func)
+ member_func.static = true
member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
- member_func.suite << CPP::Return.new("*getter.Get()")
+ member_func.suite << CPP::Return.new("getter.Get()")
end
def self.builder_loc(loc)
return @builder_loc if(@builder_loc)
@@ -278,7 +281,7 @@
f_call.args.dont_wrap = true
end
def getTypeID()
- Digest::SHA1.hexdigest(@type)[0..7].to_i(16) & 0x4000 #ensures is primative
+ Digest::SHA1.hexdigest(@type)[0..7].to_i(16) | 0x4000 #ensures is primative
end
def simpleStr()
"#{@type} #{@name}"
diff --git a/aos/build/queues/output/q_file.rb b/aos/build/queues/output/q_file.rb
index 1ef47a4..532c6f7 100644
--- a/aos/build/queues/output/q_file.rb
+++ b/aos/build/queues/output/q_file.rb
@@ -155,7 +155,6 @@
cons = CPP::Constructor.new(init_class)
init_class.add_member(:public,cons)
cons.suite << if_stmt = CPP::If.new("0 == #{counter}++")
- if_stmt.suite << "printf(#{"making a #{@name}!\n".inspect})"
cons_call = CPP::FuncCall.new("new #{type_name}")
cons_call.args.push(@loc.queue_name(@name).inspect)
@@ -165,12 +164,10 @@
cons_call.args.push(@loc.queue_name(@name + "." + queue.name).inspect)
end
if_stmt.suite << CPP::Assign.new("#{@name}_ptr",cons_call)
- if_stmt.else_suite << CPP::FuncCall.build("printf","already made a #{@name}\n".inspect)
destruct = CPP::Destructor.new(init_class)
destruct.suite << if_stmt = CPP::If.new("0 == --#{counter}")
- if_stmt.suite << "printf(#{"deleting a #{@name}!! :) !!\n".inspect})"
if_stmt.suite << "delete #{@name}_ptr"
if_stmt.suite << CPP::Assign.new("#{@name}_ptr","NULL")
diff --git a/aos/build/queues/output/q_struct.rb b/aos/build/queues/output/q_struct.rb
index 14ba385..868f1f2 100644
--- a/aos/build/queues/output/q_struct.rb
+++ b/aos/build/queues/output/q_struct.rb
@@ -7,20 +7,12 @@
def add_member(member)
@members << member
end
- def add_TypeRegister(o_type, member_func)
- type = cpp_tree.get(self)
- if(@loc == o_type.loc) #use relative name
- tName = type.name
- else #use full name
- tName = @loc.to_cpp_id(type.name)
- end
- member_func.suite << "#{tName}::TypeGet()"
- end
def create_GetType(type_class, cpp_tree)
- member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType& ","GetType")
+ member_func = CPP::MemberFunc.new(type_class,"const ::aos::MessageType*","GetType")
+ type_class.add_member(member_func)
member_func.static = true
member_func.suite << "static ::aos::Once<const ::aos::MessageType> getter(#{type_class.name}::DoGetType)"
- member_func.suite << CPP::Return.new("*getter.Get()")
+ member_func.suite << CPP::Return.new("getter.Get()")
end
def create(cpp_tree)
return self if(@extern)
@@ -90,6 +82,11 @@
def create_usage(cpp_tree)
return "#{type_name(cpp_tree)} #{@name}"
end
+ def add_TypeRegister(cpp_tree, o_type, member_func)
+ type = cpp_tree.get(@type)
+ tName = @type.loc.to_cpp_id(type.name)
+ member_func.suite << "#{tName}::GetType()"
+ end
def fetchPrintArgs(args, parent = "")
@type.fetchPrintArgs(args, parent + "#{@name}.")
end
diff --git a/aos/build/queues/output/queue_dec.rb b/aos/build/queues/output/queue_dec.rb
index 8c3bd51..6ffe8c5 100644
--- a/aos/build/queues/output/queue_dec.rb
+++ b/aos/build/queues/output/queue_dec.rb
@@ -62,18 +62,15 @@
cons = CPP::Constructor.new(init_class)
init_class.add_member(:public,cons)
cons.suite << if_stmt = CPP::If.new("0 == #{counter}++")
- if_stmt.suite << "printf(#{"making a #{@name} queue!\n".inspect})"
cons_call = CPP::FuncCall.new("new #{type_name}")
cons_call.args.push(@loc.queue_name(@name).inspect)
if_stmt.suite << CPP::Assign.new("#{@name}_ptr",cons_call)
- if_stmt.else_suite << CPP::FuncCall.build("printf","already made a #{@name}\n".inspect)
destruct = CPP::Destructor.new(init_class)
init_class.add_member(:public,destruct)
destruct.suite << if_stmt = CPP::If.new("0 == --#{counter}")
- if_stmt.suite << "printf(#{"deleting a #{@name}!! :) !!\n".inspect})"
if_stmt.suite << "delete #{@name}_ptr"
if_stmt.suite << CPP::Assign.new("#{@name}_ptr","NULL")
diff --git a/aos/common/queue.h b/aos/common/queue.h
index 9f6bc9d..210c61e 100644
--- a/aos/common/queue.h
+++ b/aos/common/queue.h
@@ -49,7 +49,7 @@
// Writes the contents of the message to the provided buffer.
size_t Print(char *buffer, int length) const;
- const MessageType *GetType() const;
+ static const MessageType *GetType();
};
template <class T> class Queue;