Object* Unlambda_call(Object* self, Object* other){ if(World_getDebug(getWorld())){ Object_print(self, "operator"); Object_print(other, "operand"); } return self->fProc(self, other); }
int Object_lookup_method_arity(Object *object, bstring name) { // Special case: Function#apply bstring special_call = bfromcstr("apply"); if(object->type == tFunction && bstrcmp(name, special_call)==0) { return 2; } bdestroy(special_call); // end of special Object *fn = Object_lookup_slot(object, name); if(!fn) { printf("Undefined slot #%s for ", bdata(name)); Object_print(object); printf("\n"); die("\nCould not find slot."); } if(fn->type != tFunction) { // it is a normal attribute return -2; } if(fn->native) { NativeMethod *method = (NativeMethod*)fn->value.other; return method->arity; } else { VMMethod *method = (VMMethod*)fn->value.other; return method->arity; } }
char *test_print() { object = Object_new(); Object_print(object); Object_destroy(object); object = True_new(); Object_print(object); Object_destroy_immortal(object); object = False_new(); Object_print(object); Object_destroy_immortal(object); object = Nil_new(); Object_print(object); Object_destroy_immortal(object); object = Integer_new(123); Object_print(object); Object_destroy(object); bstring hello = bfromcstr("hello"); object = String_new(hello); Object_print(object); Object_destroy(object); return NULL; }
void Stack_print(Stack* stack) { int i; Object* elt; fprintf(stderr, "Stack at %p\n", stack); fprintf(stderr, "\tsize %d\n", stack->size); fprintf(stderr, "\tpointer %p\n", stack->pointer); fprintf(stderr, "\ttop %p (%d)\n", &stack->pointer[stack->topi], stack->topi); fprintf(stderr, "------------------------\n"); Stack_TOP_DOWN(stack, i) { elt = stack->pointer[i]; fprintf(stderr, "%d: ", i); Object_print(elt); }
void Registers_print(Object **registers, int registers_count) { int i = 0; printf("Register dump: \n"); for(i=0; i < registers_count; i++) { printf("\t[%i]: ", i); if (registers[i] != NULL) { Object_print(registers[i]); } else { printf("(empty)"); } printf("\n"); } }
void Object_print(Object* object) { assert(object != NULL && "Cannot print null object"); if(object == Lobby) { printf("Lobby"); return; } switch(object->type) { case tInteger: printf("%i", object->value.integer); break; case tString: printf("%s", bdata(object->value.string)); break; case tArray: printf("["); DArray *array = (DArray*)object->value.other; int i = 0, count = DArray_count(array); for(i=0; i < count; i++) { Object_print((Object*)DArray_at(array, i)); if (i+1 != count) printf(", "); } printf("]"); break; case tHash: printf("#<tHash:%p>", object); break; case tFunction: printf("#<tFunction:%p @method=\"%p\">", object, object->value.other); break; case tTrue: printf("true"); break; case tFalse: printf("false"); break; case tNil: printf("nil"); break; case tObject: printf("#<tObject:%p>", object); break; } }
Object* Object_new(ObjectType* type) { Object* op = NULL; op = malloc(sizeof(Object)); if (!op) { return NULL; } op->type = type; if (type->size == 0) { op->data = NULL; fprintf(stderr, "Object requested no space\n\t"); Object_print(op); } else { op->data = malloc(type->size); if (!op->data) { // TODO: dealloc op return NULL; } } return op; }