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 {