Browse Source

added hl_dyn_op (no impl for now, only error)

Nicolas Cannasse 8 years ago
parent
commit
5e212cdef0
2 changed files with 24 additions and 0 deletions
  1. 16 0
      src/hl.h
  2. 8 0
      src/std/cast.c

+ 16 - 0
src/hl.h

@@ -506,6 +506,22 @@ HL_API void hl_dyn_setp( vdynamic *d, int hfield, hl_type *t, void *ptr );
 HL_API void hl_dyn_setf( vdynamic *d, int hfield, float f );
 HL_API void hl_dyn_setd( vdynamic *d, int hfield, double v );
 
+typedef enum {
+	OpAdd,
+	OpSub,
+	OpMul,
+	OpMod,
+	OpDiv,
+	OpShl,
+	OpShr,
+	OpUShr,
+	OpAnd,
+	OpOr,
+	OpXor,
+	OpLast
+} DynOp;
+HL_API vdynamic *hl_dyn_op( int op, vdynamic *a, vdynamic *b );
+
 HL_API vclosure *hl_alloc_closure_void( hl_type *t, void *fvalue );
 HL_API vclosure *hl_alloc_closure_ptr( hl_type *fullt, void *fvalue, void *ptr );
 HL_API vclosure *hl_make_fun_wrapper( vclosure *c, hl_type *to );

+ 8 - 0
src/std/cast.c

@@ -389,6 +389,14 @@ HL_PRIM bool hl_type_safe_cast( hl_type *a, hl_type *b ) {
 	return hl_safe_cast(a,b);
 }
 
+HL_PRIM vdynamic *hl_dyn_op( int op, vdynamic *a, vdynamic *b ) {
+	static uchar *op_names[] = { USTR("+"), USTR("-"), USTR("*"), USTR("%"), USTR("/"), USTR("<<"), USTR(">>"), USTR(">>>"), USTR("&"), USTR("|"), USTR("^") };
+	if( op < 0 || op >= OpLast ) hl_error_msg(USTR("Invalid op %d"),op);
+	hl_error_msg(USTR("Can't perform dyn op %s %s %s"),hl_type_str(a->t),op_names[op],hl_type_str(b->t));
+	return NULL;
+}
+
 DEFINE_PRIM(_I32, dyn_compare, _DYN _DYN);
 DEFINE_PRIM(_DYN, value_cast, _DYN _TYPE);
 DEFINE_PRIM(_BOOL, type_safe_cast, _TYPE _TYPE);
+DEFINE_PRIM(_DYN, dyn_op, _I32 _DYN _DYN);