void InterpreterRuntime::SignatureHandlerGenerator::pass_object() { Argument jni_arg(jni_offset(), false); Argument java_arg( offset(), true); Register Rtmp1 = O0; Register Rtmp2 = jni_arg.is_register() ? jni_arg.as_register() : O0; Register Rtmp3 = G3_scratch; // the handle for a receiver will never be null bool do_NULL_check = offset() != 0 || is_static(); Address h_arg = Address(Llocals, Interpreter::local_offset_in_bytes(offset())); __ ld_ptr(h_arg, Rtmp1); if (!do_NULL_check) { __ add(h_arg.base(), h_arg.disp(), Rtmp2); } else { if (Rtmp1 == Rtmp2) __ tst(Rtmp1); else __ addcc(G0, Rtmp1, Rtmp2); // optimize mov/test pair Label L; __ brx(Assembler::notZero, true, Assembler::pt, L); __ delayed()->add(h_arg.base(), h_arg.disp(), Rtmp2); __ bind(L); } __ store_ptr_argument(Rtmp2, jni_arg); // this is often a no-op }
void InterpreterRuntime::SignatureHandlerGenerator::pass_object() { Argument jni_arg(jni_offset(), false); Argument java_arg( offset(), true); Register Rtmp1 = O0; Register Rtmp2 = jni_arg.is_register() ? jni_arg.as_register() : O0; Register Rtmp3 = G3_scratch; // the handle for a receiver will never be null bool do_NULL_check = offset() != 0 || is_static(); Address h_arg = Address(Llocals, Interpreter::local_offset_in_bytes(offset())); __ ld_ptr(h_arg, Rtmp1); #ifdef ASSERT if (TaggedStackInterpreter) { // check we have the obj and not the tag Label ok; __ mov(frame::TagReference, Rtmp3); __ cmp(Rtmp1, Rtmp3); __ brx(Assembler::notEqual, true, Assembler::pt, ok); __ delayed()->nop(); __ stop("Native object passed tag by mistake"); __ bind(ok); } #endif // ASSERT if (!do_NULL_check) { __ add(h_arg.base(), h_arg.disp(), Rtmp2); } else { if (Rtmp1 == Rtmp2) __ tst(Rtmp1); else __ addcc(G0, Rtmp1, Rtmp2); // optimize mov/test pair Label L; __ brx(Assembler::notZero, true, Assembler::pt, L); __ delayed()->add(h_arg.base(), h_arg.disp(), Rtmp2); __ bind(L); } __ store_ptr_argument(Rtmp2, jni_arg); // this is often a no-op }
void getenc(encoding ev, int width[256]) { int i, SCMseen, Ccnt, wx, cc; FILE *afm; char *name, ns; for (i=0; i < 256; i++) { ev[i] = NULL; width[i] = -1000; } if (encfile) { enc = fopen(encfile, "r"); if (enc == NULL) fatal("Can't open %s\n", encfile); if (nextsymbol() != '/') fatal("missing '/encoding' in %s\n", encfile); if (nextsymbol() != '[') fatal("missing '[' in %s\n", encfile); i = 0; while (i < 256 && (ns = nextsymbol()) == '/') { name = string(pline); if (strcmp(name, ".notdef") == 0) { i++; remove_string(); continue; } addcc(name, i++); } if (i != 256) fatal("missing %d symbols in %s\n", 256-i, encfile); if (nextsymbol() != ']') fatal("missing ']' in %s\n", encfile); fclose(enc); } afm = fopen(afmfile, "r"); if (afm == NULL) fatal("Can't open %s\n", afmfile); SCMseen = 0; Ccnt = 0; while (fgets(line, LINEBUF-1, afm)) if (strncmp(line, "StartCharMetrics", 16) == 0) { SCMseen = 1; break; } if (SCMseen == 0) fatal("%s: no valid AFM file\n", afmfile); while (fgets(line, LINEBUF-1, afm)) { if (strncmp(line, "EndCharMetrics", 14) == 0) break; if (strncmp(line, "C ", 2) != 0) fatal("%s: unexpected line\n", afmfile); /* Gracefully terminate when the AFM file is not valid. Every line */ /* in the AFM file should specify a "C"haracter, a "WX"idth, and */ /* a "N"ame. (ndw) */ pline = value_after(line, "C"); if (pline == NULL) fatal("\nBad char metric in %s (no char):\n\t %s\n", afmfile, line); cc = decimal(pline); pline = value_after(pline, "WX"); if (pline == NULL) fatal("\nBad char metric in %s (no width):\n\t %s\n", afmfile, line); wx = decimal(pline); pline = value_after(pline, "N"); if (pline == NULL) fatal("\nBad char metric in %s (no name):\n\t %s\n", afmfile, line); name = string(pline); if (encfile) { if ((i = getcc(name)) == -1) { remove_string(); continue; } do { /* allow more occurences per name */ ev[i] = name; width[i] = wx; i = getcc(name); } while (i >= 0); } else if (cc >= 0 && cc <= 255) { /* ndw: 10/13/92 */ ev[cc] = name; width[cc] = wx; } else if (cc > 255) printf("Char code %d ignored (out of range).\n", cc); Ccnt++; } if (Ccnt == 0) fatal("%s: no characters selected\n", afmfile); }
void getenc(char **fontname, char **encname, encoding ev, int width[256]) { int i, len, SCMseen, Ccnt, wx, cc; FILE *afm; char *name, ns; for (i=0; i < 256; i++) { ev[i] = NULL; width[i] = -1000; } if (encfile) { enc = fopen(encfile, "r"); if (enc == NULL) fatal("Can't open %s\n", encfile); if (nextsymbol() != '/') fatal("missing '/encoding' in %s\n", encfile); *encname = nextpsname(); if (nextsymbol() != '[') fatal("missing '[' in %s\n", encfile); i = 0; while (i < 256 && (ns = nextsymbol()) == '/') { name = my_string(pline); if (strcmp(name, ".notdef") == 0) { i++; remove_string(); continue; } addcc(name, i++); } if (i != 256) fatal("missing %d symbols in %s\n", 256-i, encfile); if (nextsymbol() != ']') fatal("missing ']' in %s\n", encfile); fclose(enc); } afm = fopen(afmfile, "r"); if (afm == NULL) fatal("Can't open %s\n", afmfile); /* * Scan header of AFM file and take the FontName and EncodingScheme * (used for identification purposes in the PK postamble) * Stop after reading `StartCharMetrics'. */ SCMseen = 0; Ccnt = 0; while (fgets(line, LINEBUF-1, afm)) { if (strncmp(line, "FontName", 8) == 0) { pline = value_after(line, "FontName"); len = strlen(pline); if (*(pline+len-1) == '\n') { *(pline+len-1) = '\0'; len--; } *fontname = malloc(len + 1); if (*fontname == NULL) fatal("Out of memory\n"); strcpy(*fontname, pline); } else if (encname == NULL && strncmp(line, "EncodingScheme", 8) == 0) { pline = value_after(line, "EncodingScheme"); len = strlen(pline); if (*(pline+len-1) == '\n') { *(pline+len-1) = '\0'; len--; } *encname = malloc(len + 1); if (*encname == NULL) fatal("Out of memory\n"); strcpy(*encname, pline); } else if (strncmp(line, "StartCharMetrics", 16) == 0) { SCMseen = 1; break; } } if (SCMseen == 0) fatal("%s: no metrics info\n", afmfile); while (fgets(line, LINEBUF-1, afm)) { if (strncmp(line, "EndCharMetrics", 14) == 0) break; if (strncmp(line, "C ", 2) != 0) fatal("%s: unexpected line\n", afmfile); /* Gracefully terminate when the AFM file is not valid. Every line */ /* in the AFM file should specify a "C"haracter, a "WX"idth, and */ /* a "N"ame. (ndw) */ pline = value_after(line, "C"); if (pline == NULL) fatal("\nBad char metric in %s (no char):\n\t %s\n", afmfile, line); cc = decimal(pline); pline = value_after(pline, "WX"); if (pline == NULL) fatal("\nBad char metric in %s (no width):\n\t %s\n", afmfile, line); wx = decimal(pline); pline = value_after(pline, "N"); if (pline == NULL) fatal("\nBad char metric in %s (no name):\n\t %s\n", afmfile, line); name = my_string(pline); if (encfile) { if ((i = getcc(name)) == -1) { remove_string(); continue; } do { /* allow more occurences per name */ ev[i] = name; width[i] = wx; i = getcc(name); } while (i >= 0); } else if (cc >= 0 && cc <= 255) { /* ndw: 10/13/92 */ ev[cc] = name; width[cc] = wx; } else if (cc > 255) msg("Char code %d ignored (out of range).\n", cc); Ccnt++; } if (Ccnt == 0) fatal("%s: no characters selected\n", afmfile); }