generate new setters in type-generator

This commit is contained in:
Joshua Warner 2014-06-25 14:10:39 -06:00
parent ed1f34dca3
commit 07a9599d1a

View File

@ -216,8 +216,9 @@ std::string enumName(Module& module, Field& f) {
std::string& type = f.typeName; std::string& type = f.typeName;
if (type == "void*") { if (type == "void*") {
return "word"; return "word";
} } else if(type == "maybe_object") {
if(f.javaSpec.size() != 0 && (f.javaSpec[0] == 'L' || f.javaSpec[0] == '[')) { return "uintptr_t";
} else if(f.javaSpec.size() != 0 && (f.javaSpec[0] == 'L' || f.javaSpec[0] == '[')) {
return "object"; return "object";
} }
std::map<std::string, Class*>::iterator it = module.classes.find(f.typeName); std::map<std::string, Class*>::iterator it = module.classes.find(f.typeName);
@ -370,7 +371,7 @@ unsigned
sizeOf(Module& module, const std::string& type) sizeOf(Module& module, const std::string& type)
{ {
if (type == "object" if (type == "object"
or type == "intptr_t" or type == "uintptr_t") or type == "intptr_t" or type == "uintptr_t" or type == "maybe_object")
{ {
return BytesPerWord; return BytesPerWord;
} else if (type == "unsigned" or type == "int") { } else if (type == "unsigned" or type == "int") {
@ -870,6 +871,8 @@ std::string cppFieldType(Module& module, Field& f) {
assert(f.typeName.size() > 0); assert(f.typeName.size() > 0);
if(it != module.classes.end()) { if(it != module.classes.end()) {
return cppClassName(it->second); return cppClassName(it->second);
} else if(f.typeName == "maybe_object") {
return "uintptr_t";
} else { } else {
return f.typeName; return f.typeName;
} }
@ -976,15 +979,11 @@ writeConstructorInitializations(Output* out, Class* cl)
for(std::vector<Field*>::iterator it = cl->fields.begin(); it != cl->fields.end(); ++it) { for(std::vector<Field*>::iterator it = cl->fields.begin(); it != cl->fields.end(); ++it) {
Field& f = **it; Field& f = **it;
if(!f.polyfill) { if(!f.polyfill) {
out->write(" o->"); out->write(" o->set");
out->write(capitalize(f.name));
out->write("(t, ");
out->write(obfuscate(f.name)); out->write(obfuscate(f.name));
out->write("("); out->write(");\n");
if(f.threadParam) {
out->write("t");
}
out->write(") = ");
out->write(obfuscate(f.name));
out->write(";\n");
} }
} }
} }
@ -1002,10 +1001,48 @@ void writeClassDeclarations(Output* out, Module& module)
out->write("\n"); out->write("\n");
} }
bool isFieldGcVisible(Module& module, Field& f) {
return (f.typeName == "maybe_object" || enumName(module, f) == "object") && !f.nogc;
}
void writeClassAccessors(Output* out, Module& module, Class* cl) void writeClassAccessors(Output* out, Module& module, Class* cl)
{ {
for(std::vector<Field*>::iterator it = cl->fields.begin(); it != cl->fields.end(); ++it) { for(std::vector<Field*>::iterator it = cl->fields.begin(); it != cl->fields.end(); ++it) {
Field& f = **it; Field& f = **it;
if(!f.polyfill) {
out->write(" void set");
out->write(capitalize(f.name));
out->write("(Thread* t UNUSED, ");
out->write(cppFieldType(module, f));
out->write(" value) { ");
if(isFieldGcVisible(module, f)) {
out->write("set(t, reinterpret_cast<object>(this), ");
out->write(capitalize(cl->name));
out->write(capitalize(f.name));
out->write(", reinterpret_cast<object>(value));");
} else {
out->write("field_at<");
out->write(cppFieldType(module, f));
out->write(">(");
out->write(capitalize(cl->name));
out->write(capitalize(f.name));
out->write(") = value;");
}
out->write(" }\n");
out->write(" ");
out->write(cppFieldType(module, f));
out->write("* ");
out->write(obfuscate(f.name));
out->write("Ptr() { return &field_at<");
out->write(cppFieldType(module, f));
out->write(">(");
out->write(capitalize(cl->name));
out->write(capitalize(f.name));
out->write("); }\n");
}
out->write(" "); out->write(" ");
out->write(cppFieldType(module, f)); out->write(cppFieldType(module, f));
if(!f.polyfill) { if(!f.polyfill) {
@ -1032,19 +1069,52 @@ void writeClassAccessors(Output* out, Module& module, Class* cl)
if(cl->arrayField) { if(cl->arrayField) {
Field& f = *cl->arrayField; Field& f = *cl->arrayField;
out->write(" avian::util::Slice<"); out->write(" avian::util::Slice<");
out->write(f.typeName); // if(f.typeName != "maybe_object" && isFieldGcVisible(module, f)) {
// out->write("const ");
// }
out->write(cppFieldType(module, f));
out->write("> "); out->write("> ");
out->write(obfuscate(f.name)); out->write(obfuscate(f.name));
out->write("() { return avian::util::Slice<"); out->write("() { return avian::util::Slice<");
out->write(f.typeName); // if(f.typeName != "maybe_object" && isFieldGcVisible(module, f)) {
// out->write("const ");
// }
out->write(cppFieldType(module, f));
out->write("> (&field_at<"); out->write("> (&field_at<");
out->write(f.typeName); // if(f.typeName != "maybe_object" && isFieldGcVisible(module, f)) {
// out->write("const ");
// }
out->write(cppFieldType(module, f));
out->write(">("); out->write(">(");
out->write(capitalize(cl->name)); out->write(capitalize(cl->name));
out->write(capitalize(f.name)); out->write(capitalize(f.name));
out->write("), field_at<uintptr_t>("); out->write("), field_at<uintptr_t>(");
out->write(capitalize(cl->name)); out->write(capitalize(cl->name));
out->write("Length)); }\n"); out->write("Length)); }\n");
out->write(" void set");
out->write(capitalize(f.name));
out->write("Element(Thread* t UNUSED, size_t index, ");
out->write(cppFieldType(module, f));
out->write(" value) { ");
if(isFieldGcVisible(module, f)) {
out->write("set(t, reinterpret_cast<object>(this), ");
out->write(capitalize(cl->name));
out->write(capitalize(f.name));
out->write(" + index * (");
out->write(sizeOf(module, f.typeName));
out->write("), reinterpret_cast<object>(value));");
} else {
out->write("field_at<");
out->write(cppFieldType(module, f));
out->write(">(");
out->write(capitalize(cl->name));
out->write(capitalize(f.name));
out->write(" + index * (");
out->write(sizeOf(module, f.typeName));
out->write(")) = value;");
}
out->write(" }\n");
} }
} }
@ -1229,7 +1299,7 @@ typeObjectMask(Module& module, Class* cl)
for(std::vector<Field*>::iterator it = cl->fields.begin(); it != cl->fields.end(); it++) { for(std::vector<Field*>::iterator it = cl->fields.begin(); it != cl->fields.end(); it++) {
Field& f = **it; Field& f = **it;
unsigned offset = f.offset / BytesPerWord; unsigned offset = f.offset / BytesPerWord;
if(enumName(module, f) == "object" && !f.nogc) { if(isFieldGcVisible(module, f)) {
set(&mask, offset); set(&mask, offset);
} }
} }
@ -1237,7 +1307,7 @@ typeObjectMask(Module& module, Class* cl)
if(cl->arrayField) { if(cl->arrayField) {
Field& f = *cl->arrayField; Field& f = *cl->arrayField;
unsigned offset = f.offset / BytesPerWord; unsigned offset = f.offset / BytesPerWord;
if(enumName(module, f) == "object" && !f.nogc) { if(isFieldGcVisible(module, f)) {
set(&mask, offset); set(&mask, offset);
} }
} }