mirror of
https://github.com/google/flatbuffers.git
synced 2026-06-09 14:46:26 +00:00
Unsigned types in Java now return bigger size signed types.
(Java doesn't support unsigned types). ubyte/ushort return as int uint returns as long (all with correct masking) ulong still returns as long, as before. Tested: on Linux & Windows. Bug 17521464 Change-Id: Id6bc8f38fc8c1a2f4e6733c6980dc6b6e322b452
This commit is contained in:
@@ -167,6 +167,51 @@ static std::string GenTypeGet(const LanguageParameters &lang,
|
||||
: GenTypePointer(lang, type);
|
||||
}
|
||||
|
||||
// Find the destination type the user wants to receive the value in (e.g.
|
||||
// one size higher signed types for unsigned serialized values in Java).
|
||||
static Type DestinationType(const LanguageParameters &lang, const Type &type,
|
||||
bool vectorelem) {
|
||||
if (lang.language != GeneratorOptions::kJava) return type;
|
||||
switch (type.base_type) {
|
||||
case BASE_TYPE_UCHAR: return Type(BASE_TYPE_INT);
|
||||
case BASE_TYPE_USHORT: return Type(BASE_TYPE_INT);
|
||||
case BASE_TYPE_UINT: return Type(BASE_TYPE_LONG);
|
||||
case BASE_TYPE_VECTOR:
|
||||
if (vectorelem)
|
||||
return DestinationType(lang, type.VectorType(), vectorelem);
|
||||
// else fall thru:
|
||||
default: return type;
|
||||
}
|
||||
}
|
||||
|
||||
// Mask to turn serialized value into destination type value.
|
||||
static std::string DestinationMask(const LanguageParameters &lang,
|
||||
const Type &type, bool vectorelem) {
|
||||
if (lang.language != GeneratorOptions::kJava) return "";
|
||||
switch (type.base_type) {
|
||||
case BASE_TYPE_UCHAR: return " & 0xFF";
|
||||
case BASE_TYPE_USHORT: return " & 0xFFFF";
|
||||
case BASE_TYPE_UINT: return " & 0xFFFFFFFFL";
|
||||
case BASE_TYPE_VECTOR:
|
||||
if (vectorelem)
|
||||
return DestinationMask(lang, type.VectorType(), vectorelem);
|
||||
// else fall thru:
|
||||
default: return "";
|
||||
}
|
||||
}
|
||||
|
||||
// Cast necessary to correctly read serialized unsigned values.
|
||||
static std::string DestinationCast(const LanguageParameters &lang,
|
||||
const Type &type) {
|
||||
if (lang.language == GeneratorOptions::kJava &&
|
||||
(type.base_type == BASE_TYPE_UINT ||
|
||||
(type.base_type == BASE_TYPE_VECTOR &&
|
||||
type.element == BASE_TYPE_UINT))) return "(long)";
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
static std::string GenDefaultValue(const Value &value) {
|
||||
return value.type.base_type == BASE_TYPE_BOOL
|
||||
? (value.constant == "0" ? "false" : "true")
|
||||
@@ -276,7 +321,11 @@ static void GenStructArgs(const LanguageParameters &lang,
|
||||
GenStructArgs(lang, *field.value.type.struct_def, code_ptr,
|
||||
(field.value.type.struct_def->name + "_").c_str());
|
||||
} else {
|
||||
code += ", " + GenTypeBasic(lang, field.value.type) + " " + nameprefix;
|
||||
code += ", ";
|
||||
code += GenTypeBasic(lang,
|
||||
DestinationType(lang, field.value.type, false));
|
||||
code += " ";
|
||||
code += nameprefix;
|
||||
code += MakeCamel(field.name, lang.first_camel_upper);
|
||||
}
|
||||
}
|
||||
@@ -304,8 +353,16 @@ static void GenStructBody(const LanguageParameters &lang,
|
||||
(field.value.type.struct_def->name + "_").c_str());
|
||||
} else {
|
||||
code += " builder." + FunctionStart(lang, 'P') + "ut";
|
||||
code += GenMethod(lang, field.value.type) + "(" += nameprefix;
|
||||
code += MakeCamel(field.name, lang.first_camel_upper) + ");\n";
|
||||
code += GenMethod(lang, field.value.type) + "(";
|
||||
auto argname = nameprefix + MakeCamel(field.name, lang.first_camel_upper);
|
||||
std::string type_mask = DestinationMask(lang, field.value.type, false);
|
||||
if (type_mask.length()) {
|
||||
code += "(" + GenTypeBasic(lang, field.value.type) + ")";
|
||||
code += "(" + argname + type_mask + ")";
|
||||
} else {
|
||||
code += argname;
|
||||
}
|
||||
code += ");\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -363,7 +420,11 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
||||
if (field.deprecated) continue;
|
||||
GenComment(field.doc_comment, code_ptr, " ");
|
||||
std::string type_name = GenTypeGet(lang, field.value.type);
|
||||
std::string method_start = " public " + type_name + " " +
|
||||
std::string type_name_dest =
|
||||
GenTypeGet(lang, DestinationType(lang, field.value.type, true));
|
||||
std::string dest_mask = DestinationMask(lang, field.value.type, true);
|
||||
std::string dest_cast = DestinationCast(lang, field.value.type);
|
||||
std::string method_start = " public " + type_name_dest + " " +
|
||||
MakeCamel(field.name, lang.first_camel_upper);
|
||||
// Generate the accessors that don't do object reuse.
|
||||
if (field.value.type.base_type == BASE_TYPE_STRUCT) {
|
||||
@@ -381,7 +442,7 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
||||
code += "(new ";
|
||||
code += type_name + "(), j); }\n";
|
||||
}
|
||||
std::string getter = GenGetter(lang, field.value.type);
|
||||
std::string getter = dest_cast + GenGetter(lang, field.value.type);
|
||||
code += method_start + "(";
|
||||
// Most field accessors need to retrieve and test the field offset first,
|
||||
// this is the prefix code for that:
|
||||
@@ -390,14 +451,15 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
||||
"); return o != 0 ? ";
|
||||
std::string default_cast = "";
|
||||
if (lang.language == GeneratorOptions::kCSharp)
|
||||
default_cast = "(" + type_name + ")";
|
||||
default_cast = "(" + type_name_dest + ")";
|
||||
if (IsScalar(field.value.type.base_type)) {
|
||||
if (struct_def.fixed) {
|
||||
code += ") { return " + getter;
|
||||
code += "(bb_pos + " + NumToString(field.value.offset) + ")";
|
||||
code += dest_mask;
|
||||
} else {
|
||||
code += offset_prefix + getter;
|
||||
code += "(o + bb_pos) : " + default_cast;
|
||||
code += "(o + bb_pos)" + dest_mask + " : " + default_cast;
|
||||
code += GenDefaultValue(field.value);
|
||||
}
|
||||
} else {
|
||||
@@ -436,7 +498,7 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
||||
} else {
|
||||
code += index;
|
||||
}
|
||||
code += ") : ";
|
||||
code += ")" + dest_mask + " : ";
|
||||
code += IsScalar(field.value.type.element)
|
||||
? default_cast + "0"
|
||||
: "null";
|
||||
@@ -506,7 +568,10 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
||||
it != struct_def.fields.vec.end(); ++it) {
|
||||
auto &field = **it;
|
||||
if (field.deprecated) continue;
|
||||
code += ",\n " + GenTypeBasic(lang, field.value.type) + " ";
|
||||
code += ",\n ";
|
||||
code += GenTypeBasic(lang,
|
||||
DestinationType(lang, field.value.type, false));
|
||||
code += " ";
|
||||
code += field.name;
|
||||
// Java doesn't have defaults, which means this method must always
|
||||
// supply all arguments, and thus won't compile when fields are added.
|
||||
@@ -553,13 +618,21 @@ static void GenStruct(const LanguageParameters &lang, const Parser &parser,
|
||||
code += " public static void " + FunctionStart(lang, 'A') + "dd";
|
||||
code += MakeCamel(field.name);
|
||||
code += "(FlatBufferBuilder builder, ";
|
||||
code += GenTypeBasic(lang, field.value.type);
|
||||
code += GenTypeBasic(lang,
|
||||
DestinationType(lang, field.value.type, false));
|
||||
auto argname = MakeCamel(field.name, false);
|
||||
if (!IsScalar(field.value.type.base_type)) argname += "Offset";
|
||||
code += " " + argname + ") { builder." + FunctionStart(lang, 'A') + "dd";
|
||||
code += GenMethod(lang, field.value.type) + "(";
|
||||
code += NumToString(it - struct_def.fields.vec.begin()) + ", ";
|
||||
code += argname + ", " + GenDefaultValue(field.value);
|
||||
std::string type_mask = DestinationMask(lang, field.value.type, false);
|
||||
if (type_mask.length()) {
|
||||
code += "(" + GenTypeBasic(lang, field.value.type) + ")";
|
||||
code += "(" + argname + type_mask + ")";
|
||||
} else {
|
||||
code += argname;
|
||||
}
|
||||
code += ", " + GenDefaultValue(field.value);
|
||||
code += "); }\n";
|
||||
if (field.value.type.base_type == BASE_TYPE_VECTOR) {
|
||||
auto vector_type = field.value.type.VectorType();
|
||||
|
||||
Reference in New Issue
Block a user