json: fix enums and byte, cleanup
							parent
							
								
									776c57a478
								
							
						
					
					
						commit
						0c7bac4ba7
					
				| 
						 | 
					@ -66,6 +66,7 @@ mut:
 | 
				
			||||||
	pcs_declarations     strings.Builder // -prof profile counter declarations for each function
 | 
						pcs_declarations     strings.Builder // -prof profile counter declarations for each function
 | 
				
			||||||
	hotcode_definitions  strings.Builder // -live declarations & functions
 | 
						hotcode_definitions  strings.Builder // -live declarations & functions
 | 
				
			||||||
	options              strings.Builder // `Option_xxxx` types
 | 
						options              strings.Builder // `Option_xxxx` types
 | 
				
			||||||
 | 
						json_forward_decls   strings.Builder // `Option_xxxx` types
 | 
				
			||||||
	file                 ast.File
 | 
						file                 ast.File
 | 
				
			||||||
	fn_decl              &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
 | 
						fn_decl              &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
 | 
				
			||||||
	last_fn_c_name       string
 | 
						last_fn_c_name       string
 | 
				
			||||||
| 
						 | 
					@ -129,6 +130,7 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string
 | 
				
			||||||
		pcs_declarations: strings.new_builder(100)
 | 
							pcs_declarations: strings.new_builder(100)
 | 
				
			||||||
		hotcode_definitions: strings.new_builder(100)
 | 
							hotcode_definitions: strings.new_builder(100)
 | 
				
			||||||
		options: strings.new_builder(100)
 | 
							options: strings.new_builder(100)
 | 
				
			||||||
 | 
							json_forward_decls: strings.new_builder(100)
 | 
				
			||||||
		table: table
 | 
							table: table
 | 
				
			||||||
		pref: pref
 | 
							pref: pref
 | 
				
			||||||
		fn_decl: 0
 | 
							fn_decl: 0
 | 
				
			||||||
| 
						 | 
					@ -193,6 +195,8 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string
 | 
				
			||||||
	b.writeln(g.type_definitions.str())
 | 
						b.writeln(g.type_definitions.str())
 | 
				
			||||||
	b.writeln('\n// V Option_xxx definitions:')
 | 
						b.writeln('\n// V Option_xxx definitions:')
 | 
				
			||||||
	b.writeln(g.options.str())
 | 
						b.writeln(g.options.str())
 | 
				
			||||||
 | 
						b.writeln('\n// V json forward decls:')
 | 
				
			||||||
 | 
						b.writeln(g.json_forward_decls.str())
 | 
				
			||||||
	b.writeln('\n// V definitions:')
 | 
						b.writeln('\n// V definitions:')
 | 
				
			||||||
	b.writeln(g.definitions.str())
 | 
						b.writeln(g.definitions.str())
 | 
				
			||||||
	b.writeln('\n// V profile counters:')
 | 
						b.writeln('\n// V profile counters:')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ fn (mut g Gen) gen_json_for_type(typ table.Type) {
 | 
				
			||||||
	mut enc := strings.new_builder(100)
 | 
						mut enc := strings.new_builder(100)
 | 
				
			||||||
	sym := g.table.get_type_symbol(typ)
 | 
						sym := g.table.get_type_symbol(typ)
 | 
				
			||||||
	styp := g.typ(typ)
 | 
						styp := g.typ(typ)
 | 
				
			||||||
	if sym.name in ['int', 'string', 'bool', 'f32', 'f64', 'i8', 'i16', 'i64', 'byte', 'u16', 'u32', 'u64', 'bool'] {
 | 
						if is_js_prim(sym.name) || sym.kind == .enum_{
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if sym.kind == .array {
 | 
						if sym.kind == .array {
 | 
				
			||||||
| 
						 | 
					@ -40,9 +40,10 @@ fn (mut g Gen) gen_json_for_type(typ table.Type) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Make sure that this optional type actually exists
 | 
						// Make sure that this optional type actually exists
 | 
				
			||||||
	g.register_optional(typ)
 | 
						g.register_optional(typ)
 | 
				
			||||||
 | 
						dec_fn_dec := 'Option_$styp ${dec_fn_name}(cJSON* root)'
 | 
				
			||||||
	dec.writeln('
 | 
						dec.writeln('
 | 
				
			||||||
//Option_$styp ${dec_fn_name}(cJSON* root, $styp* res) {
 | 
					//Option_$styp ${dec_fn_name}(cJSON* root, $styp* res) {
 | 
				
			||||||
Option_$styp ${dec_fn_name}(cJSON* root) {
 | 
					$dec_fn_dec {
 | 
				
			||||||
  $styp res;
 | 
					  $styp res;
 | 
				
			||||||
  if (!root) {
 | 
					  if (!root) {
 | 
				
			||||||
    const char *error_ptr = cJSON_GetErrorPtr();
 | 
					    const char *error_ptr = cJSON_GetErrorPtr();
 | 
				
			||||||
| 
						 | 
					@ -54,11 +55,15 @@ Option_$styp ${dec_fn_name}(cJSON* root) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
')
 | 
					')
 | 
				
			||||||
 | 
						g.json_forward_decls.writeln('$dec_fn_dec;')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Code gen encoder
 | 
						// Code gen encoder
 | 
				
			||||||
	// encode_TYPE funcs receive an object to encode
 | 
						// encode_TYPE funcs receive an object to encode
 | 
				
			||||||
	enc_fn_name := js_enc_name(sym.name)
 | 
						enc_fn_name := js_enc_name(sym.name)
 | 
				
			||||||
 | 
						enc_fn_dec := 'cJSON* ${enc_fn_name}($styp val)'
 | 
				
			||||||
 | 
						g.json_forward_decls.writeln('$enc_fn_dec;\n')
 | 
				
			||||||
	enc.writeln('
 | 
						enc.writeln('
 | 
				
			||||||
cJSON* ${enc_fn_name}($styp val) {
 | 
					$enc_fn_dec {
 | 
				
			||||||
\tcJSON *o = cJSON_CreateObject();')
 | 
					\tcJSON *o = cJSON_CreateObject();')
 | 
				
			||||||
	if sym.kind == .array {
 | 
						if sym.kind == .array {
 | 
				
			||||||
		// Handle arrays
 | 
							// Handle arrays
 | 
				
			||||||
| 
						 | 
					@ -85,7 +90,6 @@ cJSON* ${enc_fn_name}($styp val) {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			field_type := g.typ(field.typ)
 | 
								field_type := g.typ(field.typ)
 | 
				
			||||||
			enc_name := js_enc_name(field_type)
 | 
					 | 
				
			||||||
			if 'raw' in field.attrs {
 | 
								if 'raw' in field.attrs {
 | 
				
			||||||
				dec.writeln(' res . ${c_name(field.name)} = tos2(cJSON_PrintUnformatted(' + 'js_get(root, "$name")));')
 | 
									dec.writeln(' res . ${c_name(field.name)} = tos2(cJSON_PrintUnformatted(' + 'js_get(root, "$name")));')
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
| 
						 | 
					@ -95,12 +99,21 @@ cJSON* ${enc_fn_name}($styp val) {
 | 
				
			||||||
				dec_name := js_dec_name(field_type)
 | 
									dec_name := js_dec_name(field_type)
 | 
				
			||||||
				if is_js_prim(field_type) {
 | 
									if is_js_prim(field_type) {
 | 
				
			||||||
					dec.writeln(' res . ${c_name(field.name)} = $dec_name (js_get(root, "$name"));')
 | 
										dec.writeln(' res . ${c_name(field.name)} = $dec_name (js_get(root, "$name"));')
 | 
				
			||||||
 | 
									} else if g.table.get_type_symbol(field.typ).kind == .enum_ {
 | 
				
			||||||
 | 
										dec.writeln(' res . ${c_name(field.name)} = json__decode_u64(js_get(root, "$name"));')
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					// dec.writeln(' $dec_name (js_get(root, "$name"), & (res . $field.name));')
 | 
										// dec.writeln(' $dec_name (js_get(root, "$name"), & (res . $field.name));')
 | 
				
			||||||
					dec.writeln('  res . ${c_name(field.name)} = *($field_type*) $dec_name (js_get(root,"$name")).data;')
 | 
										dec.writeln('  res . ${c_name(field.name)} = *($field_type*) $dec_name (js_get(root,"$name")).data;')
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			enc.writeln('\tcJSON_AddItemToObject(o, "$name", ${enc_name}(val.${c_name(field.name)}));')
 | 
					
 | 
				
			||||||
 | 
								mut enc_name := js_enc_name(field_type)
 | 
				
			||||||
 | 
								if g.table.get_type_symbol(field.typ).kind == .enum_ {
 | 
				
			||||||
 | 
									enc.writeln('\tcJSON_AddItemToObject(o, "$name", json__encode_u64(val.${c_name(field.name)}));')
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									enc.writeln('\tcJSON_AddItemToObject(o, "$name", ${enc_name}(val.${c_name(field.name)}));')
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// cJSON_delete
 | 
						// cJSON_delete
 | 
				
			||||||
| 
						 | 
					@ -125,7 +138,8 @@ fn js_dec_name(typ string) string {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn is_js_prim(typ string) bool {
 | 
					fn is_js_prim(typ string) bool {
 | 
				
			||||||
	return typ == 'int' || typ == 'string' || typ == 'bool' || typ == 'f32' || typ == 'f64' ||
 | 
						return typ == 'int' || typ == 'string' || typ == 'bool' || typ == 'f32' || typ == 'f64' ||
 | 
				
			||||||
		typ == 'i8' || typ == 'i16' || typ == 'i64' || typ == 'u16' || typ == 'u32' || typ == 'u64'
 | 
							typ == 'i8' || typ == 'i16' || typ == 'i64' || typ == 'u16' || typ == 'u32' || typ == 'u64' ||
 | 
				
			||||||
 | 
							typ == 'byte'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn (mut g Gen) decode_array(value_type table.Type) string {
 | 
					fn (mut g Gen) decode_array(value_type table.Type) string {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue