table: add tests and improve performance
							parent
							
								
									09fa0f1540
								
							
						
					
					
						commit
						586a886975
					
				|  | @ -76,7 +76,7 @@ pub fn (t Type) set_nr_muls(nr_muls int) Type { | ||||||
| 	if nr_muls < 0 || nr_muls > 255 { | 	if nr_muls < 0 || nr_muls > 255 { | ||||||
| 		panic('set_nr_muls: nr_muls must be between 0 & 255') | 		panic('set_nr_muls: nr_muls must be between 0 & 255') | ||||||
| 	} | 	} | ||||||
| 	return (((int(t) >> 24) & 0xff) << 24) | (nr_muls << 16) | (u16(t) & 0xffff) | 	return int(t) & 0xff00ffff | (nr_muls << 16) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // increments nr_nuls on `t` and return it
 | // increments nr_nuls on `t` and return it
 | ||||||
|  | @ -86,7 +86,8 @@ pub fn (t Type) to_ptr() Type { | ||||||
| 	if nr_muls == 255 { | 	if nr_muls == 255 { | ||||||
| 		panic('to_ptr: nr_muls is already at max of 255') | 		panic('to_ptr: nr_muls is already at max of 255') | ||||||
| 	} | 	} | ||||||
| 	return (((int(t) >> 24) & 0xff) << 24) | ((nr_muls + 1) << 16) | (u16(t) & 0xffff) | 
 | ||||||
|  | 	return int(t) & 0xff00ffff | ((nr_muls + 1) << 16) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // decrement nr_muls on `t` and return it
 | // decrement nr_muls on `t` and return it
 | ||||||
|  | @ -96,37 +97,37 @@ pub fn (t Type) deref() Type { | ||||||
| 	if nr_muls == 0 { | 	if nr_muls == 0 { | ||||||
| 		panic('deref: type `$t` is not a pointer') | 		panic('deref: type `$t` is not a pointer') | ||||||
| 	} | 	} | ||||||
| 	return (((int(t) >> 24) & 0xff) << 24) | ((nr_muls - 1) << 16) | (u16(t) & 0xffff) | 	return int(t) & 0xff00ffff | ((nr_muls - 1) << 16) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // set `flag` on `t` and return `t`
 | // set `flag` on `t` and return `t`
 | ||||||
| [inline] | [inline] | ||||||
| pub fn (t Type) set_flag(flag TypeFlag) Type { | pub fn (t Type) set_flag(flag TypeFlag) Type { | ||||||
| 	return ((((int(t) >> 24) & 0xff) | 1 << int(flag)) << 24) | (((int(t) >> 16) & 0xff) << 16) | (u16(t) & 0xffff) |   return int(t) | (1 << (int(flag) + 24)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // clear `flag` on `t` and return `t`
 | // clear `flag` on `t` and return `t`
 | ||||||
| [inline] | [inline] | ||||||
| pub fn (t Type) clear_flag(flag TypeFlag) Type { | pub fn (t Type) clear_flag(flag TypeFlag) Type { | ||||||
| 	return ((((int(t) >> 24) & 0xff) & ~(1 << int(flag))) << 24) | (((int(t) >> 16) & 0xff) << 16) | (u16(t) & 0xffff) |   return int(t) & ~(1 << (int(flag) + 24)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // clear all flags
 | // clear all flags
 | ||||||
| [inline] | [inline] | ||||||
| pub fn (t Type) clear_flags() Type { | pub fn (t Type) clear_flags() Type { | ||||||
| 	return 0 | (((int(t) >> 16) & 0xff) << 16) | (u16(t) & 0xffff) | 	return int(t) & 0xffffff | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // return true if `flag` is set on `t`
 | // return true if `flag` is set on `t`
 | ||||||
| [inline] | [inline] | ||||||
| pub fn (t Type) has_flag(flag TypeFlag) bool { | pub fn (t Type) has_flag(flag TypeFlag) bool { | ||||||
| 	return (((int(t) >> 24) & 0xff) >> int(flag)) & 1 == 1 |   return int(t) & (1 << (int(flag) + 24)) > 0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // copy flags & nr_muls from `t_from` to `t` and return `t`
 | // copy flags & nr_muls from `t_from` to `t` and return `t`
 | ||||||
| [inline] | [inline] | ||||||
| pub fn (t Type) derive(t_from Type) Type { | pub fn (t Type) derive(t_from Type) Type { | ||||||
| 	return (((int(t_from) >> 24) & 0xff) << 24) | (((int(t_from) >> 16) & 0xff) << 16) | (u16(t) & 0xffff) | 	return (0xffff0000 & t_from) | u16(t) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // return new type with TypeSymbol idx set to `idx`
 | // return new type with TypeSymbol idx set to `idx`
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,102 @@ | ||||||
|  | import table | ||||||
|  | 
 | ||||||
|  | fn test_idx() { | ||||||
|  |   mut t := table.new_type(table.void_type_idx) | ||||||
|  | 	assert t.idx() == table.void_type_idx | ||||||
|  | 
 | ||||||
|  |   t = table.new_type(table.i8_type_idx) | ||||||
|  | 	assert t.idx() == table.i8_type_idx | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_muls() { | ||||||
|  |   mut t := table.new_type(table.void_type_idx) | ||||||
|  | 
 | ||||||
|  |   idx := t.idx() | ||||||
|  | 
 | ||||||
|  | 	assert t.nr_muls() == 0 | ||||||
|  | 
 | ||||||
|  | 	for i in 0..32 { | ||||||
|  | 		t = t.set_nr_muls(i) | ||||||
|  | 		assert t.nr_muls() == i | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	t = t.set_nr_muls(0) | ||||||
|  | 	assert t.nr_muls() == 0 | ||||||
|  | 	assert t.is_ptr() == false | ||||||
|  | 
 | ||||||
|  | 	t = t.to_ptr() | ||||||
|  | 	assert t.nr_muls() == 1 | ||||||
|  | 	assert t.is_ptr() == true | ||||||
|  | 
 | ||||||
|  | 	t = t.to_ptr() | ||||||
|  | 	assert t.nr_muls() == 2 | ||||||
|  | 	assert t.is_ptr() == true | ||||||
|  | 
 | ||||||
|  | 	t = t.deref() | ||||||
|  | 	assert t.nr_muls() == 1 | ||||||
|  | 	assert t.is_ptr() == true | ||||||
|  | 
 | ||||||
|  | 	t = t.deref() | ||||||
|  | 	assert t.nr_muls() == 0 | ||||||
|  | 	assert t.is_ptr() == false | ||||||
|  | 
 | ||||||
|  | 	assert t.idx() == idx | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_flags() { | ||||||
|  |   mut t := table.new_type(table.void_type_idx) | ||||||
|  | 
 | ||||||
|  |   idx := t.idx() | ||||||
|  |   nr_muls := t.nr_muls() | ||||||
|  | 
 | ||||||
|  |   t = t.set_flag(table.TypeFlag.optional) | ||||||
|  |   assert t.has_flag(table.TypeFlag.optional) == true | ||||||
|  |   assert t.has_flag(table.TypeFlag.variadic) == false | ||||||
|  |   assert t.has_flag(table.TypeFlag.generic) == false | ||||||
|  | 
 | ||||||
|  |   t = t.set_flag(table.TypeFlag.variadic) | ||||||
|  |   assert t.has_flag(table.TypeFlag.optional) == true | ||||||
|  |   assert t.has_flag(table.TypeFlag.variadic) == true | ||||||
|  |   assert t.has_flag(table.TypeFlag.generic) == false | ||||||
|  | 
 | ||||||
|  |   t = t.set_flag(table.TypeFlag.generic) | ||||||
|  |   assert t.has_flag(table.TypeFlag.optional) == true | ||||||
|  |   assert t.has_flag(table.TypeFlag.variadic) == true | ||||||
|  |   assert t.has_flag(table.TypeFlag.generic) == true | ||||||
|  | 
 | ||||||
|  |   assert t.idx() == idx | ||||||
|  |   assert t.nr_muls() == nr_muls | ||||||
|  | 
 | ||||||
|  |   t = t.clear_flag(table.TypeFlag.optional) | ||||||
|  |   assert t.has_flag(table.TypeFlag.optional) == false | ||||||
|  |   assert t.has_flag(table.TypeFlag.variadic) == true | ||||||
|  |   assert t.has_flag(table.TypeFlag.generic) == true | ||||||
|  | 
 | ||||||
|  |   t = t.clear_flag(table.TypeFlag.variadic) | ||||||
|  |   assert t.has_flag(table.TypeFlag.optional) == false | ||||||
|  |   assert t.has_flag(table.TypeFlag.variadic) == false | ||||||
|  |   assert t.has_flag(table.TypeFlag.generic) == true | ||||||
|  | 
 | ||||||
|  |   t = t.clear_flag(table.TypeFlag.generic) | ||||||
|  |   assert t.has_flag(table.TypeFlag.optional) == false | ||||||
|  |   assert t.has_flag(table.TypeFlag.variadic) == false | ||||||
|  |   assert t.has_flag(table.TypeFlag.generic) == false | ||||||
|  | 
 | ||||||
|  |   assert t.idx() == idx | ||||||
|  |   assert t.nr_muls() == nr_muls | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn test_derive() { | ||||||
|  |   mut t := table.new_type(table.i8_type_idx) | ||||||
|  |   t = t.set_flag(table.TypeFlag.generic) | ||||||
|  |   t = t.set_flag(table.TypeFlag.variadic) | ||||||
|  | 	t = t.set_nr_muls(10) | ||||||
|  | 
 | ||||||
|  |   mut t2 := table.new_type(table.i16_type_idx) | ||||||
|  | 	t2 = t2.derive(t) | ||||||
|  |   assert t2.has_flag(table.TypeFlag.optional) == false | ||||||
|  |   assert t2.has_flag(table.TypeFlag.variadic) == true | ||||||
|  |   assert t2.has_flag(table.TypeFlag.generic) == true | ||||||
|  |   assert t2.nr_muls() == 10 | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue