Mercurial > repos > tabletprog
comparison cbackend.js @ 78:abc6f3d644a4
Use Boehm-GC for garbage collection. Also make no_impl print on stderr rather than standard in and return a non-zero error code.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 15 Jul 2012 18:11:00 -0700 |
parents | ab6f24d6945d |
children | 7f635666c73d |
comparison
equal
deleted
inserted
replaced
77:8a9b96888b7d | 78:abc6f3d644a4 |
---|---|
440 int32.addInclude('<string.h>'); | 440 int32.addInclude('<string.h>'); |
441 int32.addMessage('string', { | 441 int32.addMessage('string', { |
442 vars: {str: 'string *'}, | 442 vars: {str: 'string *'}, |
443 lines: [ | 443 lines: [ |
444 'str = (string *)make_object(&string_meta, NULL, 0);', | 444 'str = (string *)make_object(&string_meta, NULL, 0);', |
445 'str->data = malloc(12);', | 445 'str->data = GC_MALLOC(12);', |
446 'sprintf(str->data, "%d", self->num);', | 446 'sprintf(str->data, "%d", self->num);', |
447 'str->length = str->bytes = strlen(str->data);', | 447 'str->length = str->bytes = strlen(str->data);', |
448 'return &(str->header);' | 448 'return &(str->header);' |
449 ] | 449 ] |
450 }); | 450 }); |
492 array.addMessage('append', { | 492 array.addMessage('append', { |
493 vars: {tmp: 'object **'}, | 493 vars: {tmp: 'object **'}, |
494 lines: [ | 494 lines: [ |
495 'if (self->storage == self->size) {', | 495 'if (self->storage == self->size) {', |
496 ' self->storage *= 2;', | 496 ' self->storage *= 2;', |
497 ' tmp = realloc(self->data, self->storage * sizeof(object *));', | 497 ' tmp = GC_REALLOC(self->data, self->storage * sizeof(object *));', |
498 ' if (!tmp) {', | 498 ' if (!tmp) {', |
499 ' fputs("Failed to increase array size\\n", stderr);', | 499 ' fputs("Failed to increase array size\\n", stderr);', |
500 ' exit(1);', | 500 ' exit(1);', |
501 ' }', | 501 ' }', |
502 ' self->data = tmp;', | 502 ' self->data = tmp;', |
575 'argbo = va_arg(args, object *);', | 575 'argbo = va_arg(args, object *);', |
576 'argb = (string *)mcall(' + getMethodId('string') + ', 1, argbo);', | 576 'argb = (string *)mcall(' + getMethodId('string') + ', 1, argbo);', |
577 'out = (string *)make_object(&string_meta, NULL, 0);', | 577 'out = (string *)make_object(&string_meta, NULL, 0);', |
578 'out->bytes = self->bytes + argb->bytes;', | 578 'out->bytes = self->bytes + argb->bytes;', |
579 'out->length = self->length + argb->length;', | 579 'out->length = self->length + argb->length;', |
580 'out->data = malloc(out->bytes+1);', | 580 'out->data = GC_MALLOC_ATOMIC(out->bytes+1);', |
581 'memcpy(out->data, self->data, self->bytes);', | 581 'memcpy(out->data, self->data, self->bytes);', |
582 'memcpy(out->data + self->bytes, argb->data, argb->bytes + 1);', | 582 'memcpy(out->data + self->bytes, argb->data, argb->bytes + 1);', |
583 'return &(out->header);' | 583 'return &(out->header);' |
584 ] | 584 ] |
585 }); | 585 }); |
638 vars: {str: 'string *', size: 'obj_int32 *', filedes: 'obj_int32 *'}, | 638 vars: {str: 'string *', size: 'obj_int32 *', filedes: 'obj_int32 *'}, |
639 lines: [ | 639 lines: [ |
640 'filedes = va_arg(args, obj_int32 *);', | 640 'filedes = va_arg(args, obj_int32 *);', |
641 'size = va_arg(args, obj_int32 *);', | 641 'size = va_arg(args, obj_int32 *);', |
642 'str = (string *)make_object(&string_meta, NULL, 0);', | 642 'str = (string *)make_object(&string_meta, NULL, 0);', |
643 'str->data = malloc(size->num + 1);', | 643 'str->data = GC_MALLOC_ATOMIC(size->num + 1);', |
644 'str->length = str->bytes = read(filedes->num, str->data, size->num);', | 644 'str->length = str->bytes = read(filedes->num, str->data, size->num);', |
645 'if (str->bytes < 0) { str->bytes = str->length = 0; }', | 645 'if (str->bytes < 0) { str->bytes = str->length = 0; }', |
646 'str->data[str->bytes] = 0;', | 646 'str->data[str->bytes] = 0;', |
647 'return &(str->header);' | 647 'return &(str->header);' |
648 ] | 648 ] |
852 forwarddec += '\tobject * ' + escapeCName(varname) + ';\n'; | 852 forwarddec += '\tobject * ' + escapeCName(varname) + ';\n'; |
853 } | 853 } |
854 } | 854 } |
855 forwarddec += '} lambda_' + mynum + '_env;\n' | 855 forwarddec += '} lambda_' + mynum + '_env;\n' |
856 | 856 |
857 var myenvinit = '\tlambda_' + mynum + '_env * myenv = malloc(sizeof(lambda_' + mynum + '_env));\n'; | 857 var myenvinit = '\tlambda_' + mynum + '_env * myenv = GC_MALLOC(sizeof(lambda_' + mynum + '_env));\n'; |
858 if (this.symbols.needsParentEnv) { | 858 if (this.symbols.needsParentEnv) { |
859 myenvinit += '\tmyenv->parent = env;\n'; | 859 myenvinit += '\tmyenv->parent = env;\n'; |
860 } | 860 } |
861 this.symbols.envtype = 'lambda_' + mynum + '_env'; | 861 this.symbols.envtype = 'lambda_' + mynum + '_env'; |
862 } else { | 862 } else { |