From 379ded57ab4b0b8e3e9da77888a91b1382325d6a Mon Sep 17 00:00:00 2001 From: "vidur%netscape.com" Date: Fri, 27 Aug 1999 06:06:24 +0000 Subject: [PATCH] jsval can now be a parameter or return type. Got rid of unused variable warnings. Fixed secMan leak. --- dom/tools/FileGen.cpp | 12 ++++++++-- dom/tools/IdlParser.cpp | 12 ++++++++++ dom/tools/IdlScanner.cpp | 38 +++++++++++++++++++++++++++++++ dom/tools/IdlScanner.h | 2 ++ dom/tools/IdlVariable.cpp | 4 ++++ dom/tools/IdlVariable.h | 1 + dom/tools/JSStubGen.cpp | 48 ++++++++++++++++++++++++++++----------- dom/tools/XPCOMGen.cpp | 2 +- 8 files changed, 103 insertions(+), 16 deletions(-) diff --git a/dom/tools/FileGen.cpp b/dom/tools/FileGen.cpp index ff8174d4f451..f76d64dea7e0 100644 --- a/dom/tools/FileGen.cpp +++ b/dom/tools/FileGen.cpp @@ -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; diff --git a/dom/tools/IdlParser.cpp b/dom/tools/IdlParser.cpp index 6a70cd8e67e0..8c89efd698bf 100644 --- a/dom/tools/IdlParser.cpp +++ b/dom/tools/IdlParser.cpp @@ -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); diff --git a/dom/tools/IdlScanner.cpp b/dom/tools/IdlScanner.cpp index 86432a2d6f9e..1eeb0a6bbac9 100644 --- a/dom/tools/IdlScanner.cpp +++ b/dom/tools/IdlScanner.cpp @@ -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 diff --git a/dom/tools/IdlScanner.h b/dom/tools/IdlScanner.h index 9b8ce16c5e5b..30cc263401cf 100644 --- a/dom/tools/IdlScanner.h +++ b/dom/tools/IdlScanner.h @@ -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); diff --git a/dom/tools/IdlVariable.cpp b/dom/tools/IdlVariable.cpp index aa7ad2386d4a..246f616a732e 100644 --- a/dom/tools/IdlVariable.cpp +++ b/dom/tools/IdlVariable.cpp @@ -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; } } diff --git a/dom/tools/IdlVariable.h b/dom/tools/IdlVariable.h index 917c3482af5e..31a87c632404 100644 --- a/dom/tools/IdlVariable.h +++ b/dom/tools/IdlVariable.h @@ -41,6 +41,7 @@ enum Type { TYPE_XPIDL_OBJECT, TYPE_FUNC, TYPE_VOID, + TYPE_JSVAL, TYPE_UNKNOWN }; diff --git a/dom/tools/JSStubGen.cpp b/dom/tools/JSStubGen.cpp index 713285500e09..073223619f0f 100644 --- a/dom/tools/JSStubGen.cpp +++ b/dom/tools/JSStubGen.cpp @@ -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 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 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 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; diff --git a/dom/tools/XPCOMGen.cpp b/dom/tools/XPCOMGen.cpp index 514706cc0dcf..5a1e9f5dc072 100644 --- a/dom/tools/XPCOMGen.cpp +++ b/dom/tools/XPCOMGen.cpp @@ -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";