non.libs versions of the so paths, because some versions of libtool
add .libs implicitly and others don't.
+ * dpas/dpas-builtin.c, dpas/dpas-parser.y, dpas/dpas-types.c,
+ dpas/dpas-types.h: add the "SameType" and "SameShape" builtins,
+ to assist with unit testing type coercions.
+
2004-05-11 Rhys Weatherley <rweather@southern-storm.com.au>
* include/jit/jit-insn.h, jit/jit-insn.c, jit/jit-interp.cpp,
return result;
}
+/*
+ * Determine if two values/types have identical types.
+ */
+static dpas_semvalue dpas_same_type(dpas_semvalue *args, int num_args)
+{
+ dpas_semvalue result;
+ if((!dpas_sem_is_rvalue(args[0]) && !dpas_sem_is_type(args[0])) ||
+ (!dpas_sem_is_rvalue(args[1]) && !dpas_sem_is_type(args[1])))
+ {
+ dpas_error("invalid operands to `SameType'");
+ dpas_sem_set_error(result);
+ }
+ else if(dpas_type_identical(dpas_sem_get_type(args[0]),
+ dpas_sem_get_type(args[1]), 0))
+ {
+ dpas_sem_set_rvalue
+ (result, dpas_type_boolean,
+ jit_value_create_nint_constant
+ (dpas_current_function(), dpas_type_boolean, 1));
+ }
+ else
+ {
+ dpas_sem_set_rvalue
+ (result, dpas_type_boolean,
+ jit_value_create_nint_constant
+ (dpas_current_function(), dpas_type_boolean, 0));
+ }
+ return result;
+}
+
+/*
+ * Determine if two values/types have the same basic shape.
+ */
+static dpas_semvalue dpas_same_shape(dpas_semvalue *args, int num_args)
+{
+ dpas_semvalue result;
+ if((!dpas_sem_is_rvalue(args[0]) && !dpas_sem_is_type(args[0])) ||
+ (!dpas_sem_is_rvalue(args[1]) && !dpas_sem_is_type(args[1])))
+ {
+ dpas_error("invalid operands to `SameShape'");
+ dpas_sem_set_error(result);
+ }
+ else if(dpas_type_identical(dpas_sem_get_type(args[0]),
+ dpas_sem_get_type(args[1]), 1))
+ {
+ dpas_sem_set_rvalue
+ (result, dpas_type_boolean,
+ jit_value_create_nint_constant
+ (dpas_current_function(), dpas_type_boolean, 1));
+ }
+ else
+ {
+ dpas_sem_set_rvalue
+ (result, dpas_type_boolean,
+ jit_value_create_nint_constant
+ (dpas_current_function(), dpas_type_boolean, 0));
+ }
+ return result;
+}
+
/*
* Builtins that we currently recognize.
*/
#define DPAS_BUILTIN_TERMINATE 4
#define DPAS_BUILTIN_NEW 5
#define DPAS_BUILTIN_DISPOSE 6
+#define DPAS_BUILTIN_SAMETYPE 7
+#define DPAS_BUILTIN_SAMESHAPE 8
/*
* Table that defines the builtins.
{"Terminate", DPAS_BUILTIN_TERMINATE, dpas_terminate, 1},
{"New", DPAS_BUILTIN_NEW, dpas_new, 1},
{"Dispose", DPAS_BUILTIN_DISPOSE, dpas_dispose, 1},
+ {"SameType", DPAS_BUILTIN_SAMETYPE, dpas_same_type, 2},
+ {"SameShape", DPAS_BUILTIN_SAMESHAPE, dpas_same_shape, 2},
};
#define num_builtins (sizeof(builtins) / sizeof(dpas_builtin))
dpas_type_nil = jit_type_create_tagged
(jit_type_void_ptr, DPAS_TAG_NIL, 0, 0, 1);
dpas_type_size_t = get_uint_type(sizeof(size_t));
- dpas_type_ptrdiff_t = get_uint_type(sizeof(ptrdiff_t));
+ dpas_type_ptrdiff_t = get_int_type(sizeof(ptrdiff_t));
/*
* Register all of the builtin types.
}
return 0;
}
+
+int dpas_type_identical(jit_type_t type1, jit_type_t type2, int normalize)
+{
+ if(normalize)
+ {
+ type1 = jit_type_normalize(type1);
+ type2 = jit_type_normalize(type2);
+ }
+ if(jit_type_get_kind(type1) != jit_type_get_kind(type2))
+ {
+ return 0;
+ }
+ switch(jit_type_get_kind(type1))
+ {
+ case JIT_TYPE_STRUCT:
+ case JIT_TYPE_UNION:
+ {
+ if(jit_type_get_size(type1) != jit_type_get_size(type2))
+ {
+ return 0;
+ }
+ }
+ break;
+
+ case JIT_TYPE_SIGNATURE:
+ {
+ /* TODO */
+ }
+ break;
+
+ case JIT_TYPE_PTR:
+ {
+ return dpas_type_identical
+ (jit_type_get_ref(type1), jit_type_get_ref(type2), 0);
+ }
+ /* Not reached */
+
+ case JIT_TYPE_FIRST_TAGGED + DPAS_TAG_NAME:
+ {
+ if(jit_stricmp((char *)jit_type_get_tagged_data(type1),
+ (char *)jit_type_get_tagged_data(type2)) != 0)
+ {
+ return 0;
+ }
+ }
+ break;
+
+ case JIT_TYPE_FIRST_TAGGED + DPAS_TAG_VAR:
+ {
+ return dpas_type_identical
+ (jit_type_get_tagged_type(type1),
+ jit_type_get_tagged_type(type2), 0);
+ }
+ /* Not reached */
+
+ case JIT_TYPE_FIRST_TAGGED + DPAS_TAG_SUBRANGE:
+ {
+ }
+ break;
+
+ case JIT_TYPE_FIRST_TAGGED + DPAS_TAG_ENUM:
+ {
+ if(jit_stricmp
+ (((dpas_enum *)jit_type_get_tagged_data(type1))->name,
+ ((dpas_enum *)jit_type_get_tagged_data(type2))->name) != 0)
+ {
+ return 0;
+ }
+ }
+ break;
+
+ case JIT_TYPE_FIRST_TAGGED + DPAS_TAG_SET:
+ {
+ return dpas_type_identical
+ ((jit_type_t)jit_type_get_tagged_data(type1),
+ (jit_type_t)jit_type_get_tagged_data(type2), 0);
+ }
+ /* Not reached */
+
+ case JIT_TYPE_FIRST_TAGGED + DPAS_TAG_ARRAY:
+ {
+ /* TODO */
+ }
+ break;
+
+ case JIT_TYPE_FIRST_TAGGED + DPAS_TAG_CONFORMANT_ARRAY:
+ {
+ /* TODO */
+ }
+ break;
+ }
+ return 1;
+}