Example #1
0
static void thread0_thread_refl_fault(struct uthread *uth,
                                      struct user_context *ctx)
{
	unsigned int trap_nr = __arch_refl_get_nr(ctx);
	unsigned int err = __arch_refl_get_err(ctx);
	unsigned long aux = __arch_refl_get_aux(ctx);

	assert(ctx->type == ROS_HW_CTX);
	switch (trap_nr) {
	case HW_TRAP_PAGE_FAULT:
		if (!handle_page_fault(uth, err, aux))
			refl_error(uth, trap_nr, err, aux);
		break;
	default:
		refl_error(uth, trap_nr, err, aux);
	}
}
Example #2
0
int
main (int argc, char *argv[])
{
  struct refl *refl = refl_begin ();
  if (refl == NULL)
    error (1, 0, "refl_begin: %s", refl_errmsg (refl_error ()));

  struct refl_module *mod = refl_module_cur (refl);
  if (mod == NULL)
    error (1, 0, "refl_module_cur: %s", refl_errmsg (refl_error ()));

  struct refl_type *mystruct = refl_type_named (refl, mod, "mystruct");
  assert (mystruct != NULL);

  {
    char *str;
    if (refl_type_dump (refl, mystruct, &str) < 0)
      error (1, 0, "refl_type_named: %s", refl_errmsg (refl_error ()));
    fprintf (stderr, "mystruct is: '%s'\n", str);
    free (str);
  }

  {
    struct refl_object *obj = refl_object_named (refl, mod, "ddd");
    if (obj != NULL)
      {
	struct refl_type *type = refl_object_type (obj);
	assert (type != NULL);

	char *str;
	if (refl_type_dump (refl, type, &str) >= 0)
	  {
	    fprintf (stderr, "type of ddd: '%s'\n", str);
	    free (str);
	  }

	size_t sz = refl_type_sizeof (refl, type);
	assert (sz == sizeof (void *));
	union
	{
	  void (*ptr)(int);
	  char buf[1];
	} u;

	memcpy (u.buf, refl_object_cdata (obj), sizeof u);
	fprintf (stderr, "ddd value: %p\ndirect call: ",
		 (void *)(uintptr_t)u.ptr);
	u.ptr (17);
      }
  }

  {
    struct refl_object *obj = refl_new (refl, mystruct);
    if (obj == NULL)
      error (1, 0, "refl_new: %s", refl_errmsg (refl_error ()));

    struct refl_object *o = refl_access (refl, obj, "o");
    if (o == NULL)
      error (1, 0, "refl_access: %s", refl_errmsg (refl_error ()));
    struct refl_object *o_j = refl_access (refl, o, "j");
    if (o_j == NULL)
      error (1, 0, "refl_access: %s", refl_errmsg (refl_error ()));

    struct mystruct *my = (struct mystruct *)refl_object_cdata (obj);

    refl_assign_int (o_j, 7);
    d (my);

    refl_assign_int (o_j, 4);
    d (my);

    refl_assign_int (refl_access (refl, obj, "i"), 1);
    refl_assign_int (refl_access (refl, obj, "k"), 6);
    d (my);
  }

  {
    struct refl_method *st = refl_method_named (refl, mod, "something");
    assert (st != NULL);

    struct refl_object *ft = refl_new (refl,
				       refl_type_named (refl, mod, "int"));
    assert (ft != NULL);
    refl_assign_int (ft, 42);

    struct refl_object *rv = NULL;
    if (refl_method_call (refl, st, &ft, 1, &rv) < 0)
      error (1, 0, "refl_method_call: %s", refl_errmsg (refl_error ()));
    assert (rv != NULL);
    fprintf (stderr, "return value: %d\n", *(int *)refl_object_cdata (rv));
  }

  {
    struct refl_object *vppp = refl_object_named (refl, mod, "valueppp");
    while (1)
      {
	bool isptr;
	if (refl_type_is_pointer (refl_object_type (vppp), &isptr) < 0)
	  error (1, 0, "refl_type_is_pointer: %s", refl_errmsg (refl_error ()));
	if (!isptr)
	  break;
	fprintf (stderr, "deref\n");
	vppp = refl_deref (refl, vppp);
	if (vppp == NULL)
	  error (1, 0, "refl_deref: %s", refl_errmsg (refl_error ()));
      }
    fprintf (stderr, "v = %d\n", *(int *)refl_object_cdata (vppp));
  }

  refl_end (refl);
  return 0;
}