Exemple #1
0
dfsch_object_t* dfsch_make_class(dfsch_object_t* superclass,
                                 char* name,
                                 dfsch_object_t* slots){
  class_t* klass = (class_t*)dfsch_make_object(DFSCH_CLASS_TYPE);

  klass->standard_type.name = name;
  klass->standard_type.slots = make_slots(slots);
  klass->standard_type.flags = DFSCH_TYPEF_USER_EXTENSIBLE;
  if (superclass){
    class_t* super = DFSCH_ASSERT_INSTANCE(superclass,
                                           DFSCH_CLASS_TYPE);

    klass->standard_type.superclass = (dfsch_type_t*)super;

    klass->standard_type.size = 
      adjust_sizes(klass->standard_type.slots,
                   klass->standard_type.superclass->size);

    klass->initvalues = super->initvalues;
    klass->initargs = super->initargs;

  } else {
    klass->standard_type.superclass = NULL;
    klass->standard_type.size = adjust_sizes(klass->standard_type.slots,
                                             sizeof(dfsch_object_t));
  }

  klass->standard_type.write = instance_write;

  /* klass->standard_type.equal_p = class_equal_p;
  klass->standard_type.apply = class_apply;
  klass->standard_type.hash = class_hash;*/

  return (dfsch_object_t*)klass;
}
Exemple #2
0
dfsch_object_t* dfsch_make_instance(dfsch_object_t* klass,
                                    dfsch_object_t* args){
  dfsch_object_t* obj;
  class_t* c = DFSCH_ASSERT_INSTANCE(klass, DFSCH_CLASS_TYPE);

  obj = dfsch_make_object((dfsch_type_t*)c);

  call_initialize_instance(obj, c, args);


  return obj;
}
Exemple #3
0
void dfsch_close_file_port(dfsch_object_t* port){
  file_port_t* p = 
    (file_port_t*)DFSCH_ASSERT_INSTANCE(port, 
                                        (dfsch_type_t*)DFSCH_FILE_PORT_TYPE);

  p = (file_port_t*) port;

  if (p->close && p->open){
    fclose(p->file);
    p->open = 0;
  }  
}
Exemple #4
0
dfsch_object_t* dfsch_process_close_port(dfsch_object_t* port){
  process_port_t* p = DFSCH_ASSERT_INSTANCE(port, DFSCH_PROCESS_PORT_TYPE);
  int r;
  if (p->open){
    p->open = 0;
    r = pclose(p->file);
    if (r == -1){
      dfsch_error("Error while closing process port", 
                  dfsch_make_string_cstr(strerror(errno)));
    }
    return DFSCH_MAKE_FIXNUM(r);
  }
  return NULL;
}