/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// PrepareAndDispatch() is called by SharedStub() and calls the actual method. // // - 'args[]' contains the arguments passed on stack // - 'gpregs[]' contains the arguments passed in integer registers // - 'fpregs[]' contains the arguments passed in floating point registers // // The parameters are mapped into an array of type 'nsXPTCMiniVariant' // and then the method gets called. // // Both ABIs use the same register assignment strategy, as per this // example from V1 ABI section 3.2.3 and V2 ABI section 2.2.3.2 [page 43]: // // typedef struct { // int a; // double dd; // } sparm; // sparm s, t; // int c, d, e; // long double ld; // double ff, gg, hh; // // x = func(c, ff, d, ld, s, gg, t, e, hh); // // Parameter Register Offset in parameter save area // c r3 0-7 (not stored in parameter save area) // ff f1 8-15 (not stored) // d r5 16-23 (not stored) // ld f2,f3 24-39 (not stored) // s r8,r9 40-55 (not stored) // gg f4 56-63 (not stored) // t (none) 64-79 (stored in parameter save area) // e (none) 80-87 (stored) // hh f5 88-95 (not stored) // // i.e., each successive FPR usage skips a GPR, but not the other way around.
uint64_t* ap = args; // |that| is implicit in the calling convention; we really do start at the // first GPR (as opposed to x86_64).
uint32_t nr_gpr = 0;
uint32_t nr_fpr = 0;
uint64_t value;
if (i == indexOfJSContext) { if (nr_gpr < GPR_COUNT)
nr_gpr++; else
ap++;
}
if (!param.IsOut() && type == nsXPTType::T_DOUBLE) { if (nr_fpr < FPR_COUNT) {
dp->val.d = fpregs[nr_fpr++]; // Even if we have enough FPRs, still skip space in // the parameter area if we ran out of placeholder GPRs. if (nr_gpr < GPR_COUNT) {
nr_gpr++;
} else {
ap++;
}
} else {
dp->val.d = *(double*)ap++;
} continue;
} if (!param.IsOut() && type == nsXPTType::T_FLOAT) { if (nr_fpr < FPR_COUNT) { // Single-precision floats are passed in FPRs too.
dp->val.f = (float)fpregs[nr_fpr++]; if (nr_gpr < GPR_COUNT) {
nr_gpr++;
} else {
ap++;
}
} else { #ifdef __LITTLE_ENDIAN__
dp->val.f = *(float*)ap++; #else // Big endian needs adjustment to point to the least // significant word. float* p = (float*)ap;
p++;
dp->val.f = *p;
ap++; #endif
} continue;
} if (nr_gpr < GPR_COUNT)
value = gpregs[nr_gpr++]; else
value = *ap++;
switch (type) { case nsXPTType::T_I8: dp->val.i8 = (int8_t) value; break; case nsXPTType::T_I16: dp->val.i16 = (int16_t) value; break; case nsXPTType::T_I32: dp->val.i32 = (int32_t) value; break; case nsXPTType::T_I64: dp->val.i64 = (int64_t) value; break; case nsXPTType::T_U8: dp->val.u8 = (uint8_t) value; break; case nsXPTType::T_U16: dp->val.u16 = (uint16_t) value; break; case nsXPTType::T_U32: dp->val.u32 = (uint32_t) value; break; case nsXPTType::T_U64: dp->val.u64 = (uint64_t) value; break; case nsXPTType::T_BOOL: dp->val.b = (bool) value; break; case nsXPTType::T_CHAR: dp->val.c = (char) value; break; case nsXPTType::T_WCHAR: dp->val.wc = (wchar_t) value; break;
default:
NS_ERROR("bad type"); break;
}
}
nsresult result = self->mOuter->CallMethod((uint16_t) methodIndex, info,
paramBuffer);
return result;
}
// Load r11 with the constant 'n' and branch to SharedStub(). // // As G++3 ABI contains the length of the functionname in the mangled // name, it is difficult to get a generic assembler mechanism like // in the G++ 2.95 case. // XXX Yes, it's ugly that we're relying on gcc's name-mangling here; // however, it's quick, dirty, and'll break when the ABI changes on // us, which is what we want ;-). // Create names would be like: // _ZN14nsXPTCStubBase5Stub1Ev // _ZN14nsXPTCStubBase6Stub12Ev // _ZN14nsXPTCStubBase7Stub123Ev // _ZN14nsXPTCStubBase8Stub1234Ev // etc. // Use assembler directives to get the names right.
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.