jsval can now be a parameter or return type. Got rid of unused variable warnings. Fixed secMan leak.

This commit is contained in:
vidur%netscape.com 1999-08-27 06:06:24 +00:00
parent 052759e560
commit 379ded57ab
8 changed files with 103 additions and 16 deletions

View File

@ -32,8 +32,7 @@
static const char *kNPLStr = \
"/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n"
" *\n"
" * The contents of this file are subject to the Netscape Public License\n"
" *\n"" * The contents of this file are subject to the Netscape Public License\n"
" * Version 1.0 (the \"NPL\"); you may not use this file except in\n"
" * compliance with the NPL. You may obtain a copy of the NPL at\n"
" * http://www.mozilla.org/NPL/\n"
@ -147,6 +146,9 @@ FileGen::GetVariableTypeForMethodLocal(char *aBuffer, IdlVariable &aVariable)
case TYPE_FUNC:
sprintf(aBuffer, kObjTypeStr, aVariable.GetTypeName());
break;
case TYPE_JSVAL:
strcpy(aBuffer, "jsval");
break;
default:
// XXX Fail for other cases
break;
@ -193,6 +195,9 @@ FileGen::GetVariableTypeForLocal(char *aBuffer, IdlVariable &aVariable)
case TYPE_FUNC:
sprintf(aBuffer, kObjTypeStr, aVariable.GetTypeName());
break;
case TYPE_JSVAL:
strcpy(aBuffer, "jsval");
break;
default:
// XXX Fail for other cases
break;
@ -239,6 +244,9 @@ FileGen::GetVariableTypeForParameter(char *aBuffer, IdlVariable &aVariable)
case TYPE_FUNC:
sprintf(aBuffer, kObjTypeStr, aVariable.GetTypeName());
break;
case TYPE_JSVAL:
strcpy(aBuffer, "jsval");
break;
default:
// XXX Fail for other cases
break;

View File

@ -481,6 +481,9 @@ IdlVariable* IdlParser::ParseConst(IdlSpecification &aSpecification)
case UINT_TOKEN:
constObj->SetType(TYPE_UINT);
break;
case JSVAL_TOKEN:
constObj->SetType(TYPE_JSVAL);
break;
// string type
case STRING_TOKEN:
constObj->SetType(TYPE_STRING);
@ -625,6 +628,9 @@ IdlAttribute* IdlParser::ParseAttribute(IdlSpecification &aSpecification, int aT
case UINT_TOKEN:
attrObj->SetType(TYPE_UINT);
break;
case JSVAL_TOKEN:
attrObj->SetType(TYPE_JSVAL);
break;
// string type
case STRING_TOKEN:
attrObj->SetType(TYPE_STRING);
@ -714,6 +720,9 @@ IdlFunction* IdlParser::ParseFunction(IdlSpecification &aSpecification, Token *a
case UINT_TOKEN:
funcObj->SetReturnValue(TYPE_UINT);
break;
case JSVAL_TOKEN:
funcObj->SetReturnValue(TYPE_JSVAL);
break;
// string type
case STRING_TOKEN:
funcObj->SetReturnValue(TYPE_STRING);
@ -963,6 +972,9 @@ IdlParameter* IdlParser::ParseFunctionParameter(IdlSpecification &aSpecification
case UINT_TOKEN:
argObj->SetType(TYPE_UINT);
break;
case JSVAL_TOKEN:
argObj->SetType(TYPE_JSVAL);
break;
// string type
case STRING_TOKEN:
argObj->SetType(TYPE_STRING);

View File

@ -181,6 +181,9 @@ Token* IdlScanner::NextToken()
case 'i':
IKeywords(mTokenName + 1, mCurrentToken);
break;
case 'j':
JKeywords(mTokenName + 1, mCurrentToken);
break;
case 'l':
LKeywords(mTokenName + 1, mCurrentToken);
break;
@ -745,6 +748,41 @@ void IdlScanner::IKeywords(char *aCurrentPos, Token *aToken)
}
}
//
// 'jsval' is the only keyword starting with 'j'.
// If that is not it, it must be an identifier
//
void IdlScanner::JKeywords(char *aCurrentPos, Token *aToken)
{
int c = mInputFile->get();
if (c != EOF && c == 's' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'v' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'a' && (*aCurrentPos++ = c) && (c = mInputFile->get()) &&
c != EOF && c == 'l' && (*aCurrentPos++ = c)) {
// if terminated is a keyword
c = mInputFile->get();
if (c != EOF) {
if (isalpha(c) || isdigit(c) || c == '_') {
// more characters, it must be an identifier
*aCurrentPos++ = c;
Identifier(aCurrentPos, aToken);
}
else {
// it is a keyword
aToken->SetToken(JSVAL_TOKEN);
mInputFile->putback(c);
}
}
else {
aToken->SetToken(JSVAL_TOKEN);
}
}
else {
// it must be an identifier
KeywordMismatch(c, aCurrentPos, aToken);
}
}
//
// 'long' is the only keyword starting with 'l'.
// If that is not it, it must be an identifier

View File

@ -59,6 +59,7 @@ enum EIDLTokenType {
INT_TOKEN,
UINT_TOKEN,
STRING_TOKEN,
JSVAL_TOKEN,
INPUT_PARAM_TOKEN,
OUTPUT_PARAM_TOKEN,
INOUT_PARAM_TOKEN,
@ -192,6 +193,7 @@ protected:
void EKeywords(char *aCurrentPos, Token *aToken);
void FKeywords(char *aCurrentPos, Token *aToken);
void IKeywords(char *aCurrentPos, Token *aToken);
void JKeywords(char *aCurrentPos, Token *aToken);
void LKeywords(char *aCurrentPos, Token *aToken);
void NKeywords(char *aCurrentPos, Token *aToken);
void OKeywords(char *aCurrentPos, Token *aToken);

View File

@ -134,6 +134,10 @@ void IdlVariable::GetTypeAsString(char *aString, size_t aStringSize)
if (aStringSize > 4) {
strcpy(aString, "void");
}
case TYPE_JSVAL:
if (aStringSize > 4) {
strcpy(aString, "jsval");
}
break;
}
}

View File

@ -41,6 +41,7 @@ enum Type {
TYPE_XPIDL_OBJECT,
TYPE_FUNC,
TYPE_VOID,
TYPE_JSVAL,
TYPE_UNKNOWN
};

View File

@ -97,9 +97,8 @@ static const char kIncludeDefaultsStr[] = "\n"
"#include \"nsIJSScriptObject.h\"\n"
"#include \"nsIScriptObjectOwner.h\"\n"
"#include \"nsIScriptGlobalObject.h\"\n"
#ifdef USE_COMPTR
"#include \"nsCOMPtr.h\"\n"
#else
#ifndef USE_COMPTR
"#include \"nsIPtr.h\"\n"
#endif
"#include \"nsString.h\"\n";
@ -316,9 +315,8 @@ static const char kPropFuncBeginStr[] = "\n"
static const char kIntCaseStr[] =
" if (JSVAL_IS_INT(id)) {\n"
" nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);\n"
" nsIScriptSecurityManager *secMan;\n"
" PRBool ok = PR_FALSE;\n"
" if (NS_OK != scriptCX->GetSecurityManager(&secMan)) {\n"
" nsCOMPtr<nsIScriptSecurityManager> secMan;\n"
" if (NS_OK != scriptCX->GetSecurityManager(getter_AddRefs(secMan))) {\n"
" return JS_FALSE;\n"
" }\n"
" switch(JSVAL_TO_INT(id)) {\n";
@ -327,9 +325,8 @@ static const char kIntCaseNamedItemStr[] =
" PRBool checkNamedItem = PR_TRUE;\n"
" if (JSVAL_IS_INT(id)) {\n"
" nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);\n"
" nsIScriptSecurityManager *secMan;\n"
" PRBool ok = PR_FALSE;\n"
" if (NS_OK != scriptCX->GetSecurityManager(&secMan)) {\n"
" nsCOMPtr<nsIScriptSecurityManager> secMan;\n"
" if (NS_OK != scriptCX->GetSecurityManager(getter_AddRefs(secMan))) {\n"
" return JS_FALSE;\n"
" }\n"
" checkNamedItem = PR_FALSE;\n"
@ -339,14 +336,12 @@ static const char kPropFuncDefaultStr[] =
" default:\n"
" return nsJSUtils::nsCallJSScriptObject%sProperty(a, cx, id, vp);\n"
" }\n"
" NS_RELEASE(secMan);\n"
" }\n";
static const char kPropFuncDefaultNamedItemStr[] =
" default:\n"
" checkNamedItem = PR_TRUE;\n"
" }\n"
" NS_RELEASE(secMan);\n"
" }\n";
static const char kPropFuncDefaultItemStr[] =
@ -469,6 +464,7 @@ static const char kPropFuncNamedItemNonPrimaryStr[] =
static const char kPropCaseBeginStr[] =
" case %s_%s:\n"
" {\n"
" PRBool ok = PR_FALSE;\n"
" secMan->CheckScriptAccess(scriptCX, obj, \"%s.%s\", &ok);\n"
" if (!ok) {\n"
" //Need to throw error here\n"
@ -653,6 +649,9 @@ static const char kIntGetCaseStr[] =
static const char kBoolGetCaseStr[] =
" *vp = BOOLEAN_TO_JSVAL(prop);\n";
static const char kJSValGetCaseStr[] =
" *vp = prop;\n";
void
JSStubGen::GeneratePropGetter(ofstream *file,
IdlInterface &aInterface,
@ -683,6 +682,9 @@ JSStubGen::GeneratePropGetter(ofstream *file,
case TYPE_UINT:
case_str = kIntGetCaseStr;
break;
case TYPE_JSVAL:
case_str = kJSValGetCaseStr;
break;
case TYPE_STRING:
case_str = kStringGetCaseStr;
break;
@ -794,6 +796,9 @@ static const char kBoolSetCaseStr[] =
" return JS_FALSE;\n"
" }\n";
static const char kJSValSetCaseStr[] =
" prop = *vp;\n";
void
JSStubGen::GeneratePropSetter(ofstream *file,
IdlInterface &aInterface,
@ -822,6 +827,9 @@ JSStubGen::GeneratePropSetter(ofstream *file,
case TYPE_UINT:
sprintf(case_buf, kIntSetCaseStr, attr_type);
break;
case TYPE_JSVAL:
strcpy(case_buf, kJSValSetCaseStr);
break;
case TYPE_STRING:
strcpy(case_buf, kStringSetCaseStr);
break;
@ -977,8 +985,8 @@ static const char kMethodBodyBeginStr[] = "\n"
" *rval = JSVAL_NULL;\n"
"\n"
" nsIScriptContext *scriptCX = (nsIScriptContext *)JS_GetContextPrivate(cx);\n"
" nsIScriptSecurityManager *secMan;\n"
" if (NS_OK != scriptCX->GetSecurityManager(&secMan)) {\n"
" nsCOMPtr<nsIScriptSecurityManager> secMan;\n"
" if (NS_OK != scriptCX->GetSecurityManager(getter_AddRefs(secMan))) {\n"
" return JS_FALSE;\n"
" }\n"
" {\n"
@ -988,7 +996,6 @@ static const char kMethodBodyBeginStr[] = "\n"
" //Need to throw error here\n"
" return JS_FALSE;\n"
" }\n"
" NS_RELEASE(secMan);\n"
" }\n"
"\n"
" // If there's no private data, this must be the prototype, so ignore\n"
@ -1066,6 +1073,12 @@ static const char kMethodFuncParamStr[] =
#define JSGEN_GENERATE_FUNCPARAM(buffer, paramNum, paramType) \
sprintf(buffer, kMethodFuncParamStr, paramNum, paramNum)
static const char kMethodJSValParamStr[] =
" b%d = argv[%d];\n";
#define JSGEN_GENERATE_JSVALPARAM(buffer, paramNum) \
sprintf(buffer, kMethodJSValParamStr, paramNum, paramNum)
static const char kMethodParamListStr[] = "b%d";
static const char kMethodParamListDelimiterStr[] = ", ";
static const char kMethodParamEllipsisStr[] = "cx, argv+%d, argc-%d";
@ -1103,6 +1116,9 @@ static const char kMethodBoolRetStr[] =
static const char kMethodVoidRetStr[] =
" *rval = JSVAL_VOID;\n";
static const char kMethodJSValRetStr[] =
" *rval = nativeRet;\n";
static const char kMethodBadParamStr[] =
" if (argc < %d) {\n"
" JS_ReportError(cx, \"Function %s requires %d parameter%s\");\n"
@ -1206,6 +1222,9 @@ JSStubGen::GenerateMethods(IdlSpecification &aSpec)
case TYPE_UINT:
JSGEN_GENERATE_INTPARAM(buf, p);
break;
case TYPE_JSVAL:
JSGEN_GENERATE_JSVALPARAM(buf, p);
break;
case TYPE_STRING:
JSGEN_GENERATE_STRINGPARAM(buf, p);
break;
@ -1271,6 +1290,9 @@ JSStubGen::GenerateMethods(IdlSpecification &aSpec)
case TYPE_UINT:
*file << kMethodIntRetStr;
break;
case TYPE_JSVAL:
*file << kMethodJSValRetStr;
break;
case TYPE_STRING:
*file << kMethodStringRetStr;
break;

View File

@ -78,7 +78,7 @@ static const char *kMethodForwardStr = " NS_IMETHOD %s(%s) { return _to %s(%
static const char *kParamStr = "%s a%s";
static const char *kCallParamStr = "a%s";
static const char *kDelimiterStr = ", ";
static const char *kEllipsisParamStr = "JSContext *cx, jsval *argv, PRUint32 argc";
static const char *kEllipsisParamStr = "JSContext* cx, jsval* argv, PRUint32 argc";
static const char *kEllipsisCallStr = "cx, argv, argc";
static const char *kReturnStr = "%s%s aReturn";
static const char *kReturnCallStr = "aReturn";