Sync with trunk r58687.

svn path=/branches/ros-csrss/; revision=58690
This commit is contained in:
Hermès Bélusca-Maïto
2013-04-06 15:28:22 +00:00
254 changed files with 17541 additions and 12062 deletions
+11 -6
View File
@@ -337,7 +337,7 @@ ata_send_scsi(
{
ULONG status;
PSCSI_PASS_THROUGH_WITH_BUFFERS sptwb;
ULONG data_len = BufferLength;
//ULONG data_len = BufferLength;
ULONG len;
len = BufferLength + offsetof(SCSI_PASS_THROUGH_WITH_BUFFERS, ucDataBuf);
@@ -1065,7 +1065,7 @@ ata_list(
{
char dev_name[64];
HANDLE h;
BOOLEAN uniata_driven;
//BOOLEAN uniata_driven;
if(bus_id == -1) {
for(bus_id=0; TRUE; bus_id++) {
@@ -1074,7 +1074,7 @@ ata_list(
}
return TRUE;
}
uniata_driven = ata_adapter_info(bus_id, g_adapter_info);
/*uniata_driven =*/ ata_adapter_info(bus_id, g_adapter_info);
sprintf(dev_name, "\\\\.\\Scsi%d:", bus_id);
h = ata_open_dev(dev_name);
if(!h)
@@ -1230,8 +1230,13 @@ ata_hide(
&to, sizeof(to),
NULL, 0,
&returned);
if(!status) {
printf("Delete failed\n");
} else {
printf("Device is detached\n");
}
ata_close_dev(h);
return TRUE;
return status ? TRUE : FALSE;
} // end ata_hide()
BOOLEAN
@@ -1289,7 +1294,7 @@ ata_scan(
FALSE);
}
ata_close_dev(h);
return TRUE;
return status ? TRUE : FALSE;
} // end ata_scan()
CHAR*
@@ -1656,7 +1661,7 @@ ata_power_mode(
NULL, 0, FALSE,
&senseData, &returned);
ata_close_dev(h);
return TRUE;
return status ? TRUE : FALSE;
} // end ata_power_mode()
int
+1 -1
View File
@@ -444,7 +444,7 @@ BEGIN
IDS_CONV_CONSUMPTION "Consumption (engines)"
IDS_CONV_CURRENCY "Συνάλλαγμα"
IDS_CONV_ENERGY "Ενέργεια"
IDS_CONV_LENGTH "Lenghts"
IDS_CONV_LENGTH "Lengths"
IDS_CONV_POWER "Δύναμη"
IDS_CONV_PRESSURE "Πίεση"
IDS_CONV_TEMPERATURE "Θερμοκρασία"
+1 -1
View File
@@ -448,7 +448,7 @@ BEGIN
IDS_CONV_CONSUMPTION "Consumption (engines)"
IDS_CONV_CURRENCY "Currencies"
IDS_CONV_ENERGY "Energy"
IDS_CONV_LENGTH "Lenghts"
IDS_CONV_LENGTH "Lengths"
IDS_CONV_POWER "Power"
IDS_CONV_PRESSURE "Pressure"
IDS_CONV_TEMPERATURE "Temperature"
+1 -1
View File
@@ -449,7 +449,7 @@ BEGIN
IDS_CONV_CONSUMPTION "Consumption (engines)"
IDS_CONV_CURRENCY "Currencies"
IDS_CONV_ENERGY "Energy"
IDS_CONV_LENGTH "Lenghts"
IDS_CONV_LENGTH "Lengths"
IDS_CONV_POWER "Power"
IDS_CONV_PRESSURE "Pressure"
IDS_CONV_TEMPERATURE "Temperature"
@@ -19,7 +19,7 @@ IDS_WLAN_DISCONNECT, "\nWLAN disconnesso\n"
/* === */
IDS_MSG_WEP_ENABLED, "WEP abilitato: %s\n"
IDS_MSG_NETWORK_MODE, "Modalità di rete: %s\n"
IDS_MSG_CURRENT_WIRELESS, "\Informazioni correnti per la configurazione wireless:\n\n"
IDS_MSG_CURRENT_WIRELESS, "\nInformazioni correnti per la configurazione wireless:\n\n"
IDS_MSG_ENCRYPTED, "Crittografia: %s\n"
IDS_MSG_NETWORK_TYPE, "Tipologia rete: %s\n"
IDS_MSG_RSSI, "RSSI: %i dBm\n"
+1 -1
View File
@@ -184,7 +184,7 @@ BEGIN
IDS_AVAILABLEFORINST "Disponible pour installation"
IDS_UPDATES "Mises à jour"
IDS_APPLICATIONS "Applications"
IDS_CHOOSE_FOLDER_TEXT "Choisissez un dossier dans lequel seront téléchargés les programmes :"
IDS_CHOOSE_FOLDER_TEXT "Choisissez un dossier dans lequel les programmes seront téléchargés :"
IDS_CHOOSE_FOLDER_ERROR "Le dossier que vous avez spécifié n'existe pas. Le créer ?"
IDS_USER_NOT_ADMIN "Vous devez être un administrateur pour démarrer ""ReactOS Applications Manager""!"
IDS_APP_REG_REMOVE "Etes-vous sûr de vouloir supprimer les données du programme installé du registre ?"
@@ -118,7 +118,7 @@ audio_resampler_acm::open( void )
//
// Calcs source buffer lenght
// Calcs source buffer length
//
src_buflen = ( unsigned int )
@@ -130,7 +130,7 @@ audio_resampler_acm::open( void )
//
// Calcs destination source buffer lenght
// Calcs destination source buffer length
// with help of ACM apis
//
+1 -1
View File
@@ -229,7 +229,7 @@ class audio_wavein
//
// Set seconds lenght for each
// Set seconds length for each
// buffer.
//
+1 -1
View File
@@ -152,7 +152,7 @@ audio_waveout::init_headers_( void )
//
// Sets the correct base address and
// lenght for the little buffer.
// length for the little buffer.
//
wave_headers[ i ].dwBufferLength = mb_size / buffers;
+1 -1
View File
@@ -45,7 +45,7 @@ END
STRINGTABLE
BEGIN
IDS_STRPOS "Position: %.2f s"//FIXME
IDS_STRDUR "Lenght: %.2f s"
IDS_STRDUR "Length: %.2f s"
IDS_STRBUF "Buffer: %.2f kb"
IDS_STRFMT "%.1f kHz %u bits"
IDS_STRMONO "mono"
+1 -1
View File
@@ -45,7 +45,7 @@ END
STRINGTABLE
BEGIN
IDS_STRPOS "Position: %.2f s"
IDS_STRDUR "Lenght: %.2f s"
IDS_STRDUR "Length: %.2f s"
IDS_STRBUF "Buffer: %.2f kb"
IDS_STRFMT "%.1f kHz %u bits"
IDS_STRMONO "mono"
+1 -1
View File
@@ -45,7 +45,7 @@ END
STRINGTABLE
BEGIN
IDS_STRPOS "Position: %.2f s"//FIXME
IDS_STRDUR "Lenght: %.2f s"
IDS_STRDUR "Length: %.2f s"
IDS_STRBUF "Buffer: %.2f kb"
IDS_STRFMT "%.1f kHz %u bits"
IDS_STRMONO "mono"
+1 -1
View File
@@ -983,7 +983,7 @@ BOOL LogfWriteData(PLOGFILE LogFile, DWORD BufSize, PBYTE Buffer)
/* Check the size of the record as the record adding may be larger */
if (OverWriteLength >= BufSize)
{
DPRINT("Record will fit. Lenght %d, BufSize %d\n", OverWriteLength, BufSize);
DPRINT("Record will fit. Length %d, BufSize %d\n", OverWriteLength, BufSize);
LogFile->Header.StartOffset = LogfOffsetByNumber(LogFile, LogFile->Header.OldestRecordNumber);
break;
}
+1 -1
View File
@@ -785,7 +785,7 @@ INT cmd_copy(LPTSTR param)
_tcscpy(tmpDestPath, szDestPath);
_tcscat(tmpDestPath, _T("\\"));
/* Can't put a file into a folder that isnt there */
/* Can't put a file into a folder that isn't there */
if (_tcscmp(tmpDestPath, _T("\\\\.\\")) &&
!IsExistingDirectory(tmpDestPath))
{
+2 -2
View File
@@ -107,7 +107,7 @@ RemoveFile (LPTSTR lpFileName, DWORD dwFlags, WIN32_FIND_DATA* f)
{
/*setting file to normal, not saving old attrs first
because the file is going to be deleted anyways
so the only thing that matters is that it isnt
so the only thing that matters is that it isn't
read only.*/
SetFileAttributes(lpFileName,FILE_ATTRIBUTE_NORMAL);
}
@@ -513,7 +513,7 @@ INT CommandDelete (LPTSTR param)
for (i = 0; i < args && !(dwFiles & 0x80000000); i++)
{
/*this checks to see if it isnt a flag, if it isnt, we assume it is a file name*/
/*this checks to see if it is a flag; if it isn't, we assume it is a file name*/
if((*arg[i] == _T('/')) || (*arg[i] == _T('-')))
continue;
+4 -4
View File
@@ -1,10 +1,10 @@
General Overview of How THings Work
General Overview of How Things Work
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
First it comes into _main in cmd.c(1811). The command line params are taking in and if it is unicode it uses CommandLineToArgvW.
This can cause a problem on older machines and that is why we have our own custom _CommandLineToArgvW to help this along.
We pull in the launch directory as the inital dir and set that in _tchdir. We make a handle to the default console out using CreateFile.
We pull in the launch directory as the initial dir and set that in _tchdir. We make a handle to the default console out using CreateFile.
Then we call Initialize(). Here we need to load ntdll.dll if it isnt loaded(windows 9x machines).
Then we call Initialize(). Here we need to load ntdll.dll if it isn't loaded (windows 9x machines).
We also setup some global vars like default io handles and nErrorLevel and set %prompt% to $P$G.
This is where all command lines switches given to cmd on startup are done.
@@ -32,7 +32,7 @@ It calls a function called SearchForExecuteable() to find the full path name and
Some useful functions that are used a lot:
split() - splits a string into an array of string on spaces that arent inside quotes. which you need to call freep() on later t clean up.
split() - splits a string into an array of string on spaces that aren't inside quotes. which you need to call freep() on later t clean up.
//Split it´s used to take the Arguments from Command Line,it´s the best option for almost all the cases.
//If the Command has special needs as Dir, it´s better to make a Parser INSIDE that Command(as DIR has)
//Dont get mad(as i did): Split() can be find in Misc.c file.Really easy to follow.
+1 -1
View File
@@ -223,7 +223,7 @@ INT cmd_rename (LPTSTR param)
}
if (!_tcschr(srcPattern, _T('\\'))) //If srcPattern isnt a Path but a name:
if (!_tcschr(srcPattern, _T('\\'))) //If srcPattern isn't a Path but a name:
{
srcFILE=srcPattern;
if(_tcschr(dstPattern, _T('\\')))
+1 -1
View File
@@ -28,7 +28,7 @@ So it changes the name of hello.txt in the current directory.
3)Syntax errors:
-Way #1 with different Subdirectories path: ren c:\ie\hello.txt c:\hi\hi.txt, this is not possible.Since ren doesnt move files,just rename them.
-Way #2 semi path in destiny: ren hello.txt c:\ie\hi.txt. This feature isnt available.
-Way #2 semi path in destiny: ren hello.txt c:\ie\hi.txt. This feature isn't available.
**************************************************
+1 -1
View File
@@ -7,7 +7,7 @@ This is pretty straight forward. When doing this make sure to take into account
Not sure what is wrong with it, put probably more then just one thing blocking this. For sure pipes break when it is compiled as unicode.
*Move.c code clean up
It works, but it needs to be cleaned up, the code is long and overly complex for what it needs to do. Also, we can remove the hack to cover for MoveFileEx bug as it isnt a bug anymore.
It works, but it needs to be cleaned up, the code is long and overly complex for what it needs to do. Also, we can remove the hack to cover for MoveFileEx bug as it isn't a bug anymore.
*If rewrite
It works decent but looks _awful_. Very hard to maintain and/or understand what the hell is going on.
+1 -1
View File
@@ -343,7 +343,7 @@ WinLdrSetProcessorContext(void)
/* Disable Interrupts */
_disable();
/* Re-initalize EFLAGS */
/* Re-initialize EFLAGS */
__writeeflags(0);
/* Set the new PML4 */
+1 -1
View File
@@ -429,7 +429,7 @@ WinLdrSetProcessorContext(void)
// Disable Interrupts
_disable();
// Re-initalize EFLAGS
// Re-initialize EFLAGS
__writeeflags(0);
// Set the PDBR
+1 -1
View File
@@ -672,7 +672,7 @@ FrLdrMapModule(FILE *KernelImage, PCHAR ImageName, PCHAR MemLoadAddr, ULONG Kern
* FrLdrMapKernel
* INTERNAL
*
* Maps the Kernel into memory, does PE Section Mapping, initalizes the
* Maps the Kernel into memory, does PE Section Mapping, initializes the
* uninitialized data sections, and relocates the image.
*
* Params:
+1 -1
View File
@@ -43,7 +43,7 @@
#define EXT2_MAGIC 0xEF53
/* Amount of indirect blocks in an inode. */
#define INDIRECT_BLOCKS 12
/* Maximum lenght of a pathname. */
/* Maximum length of a pathname. */
#define EXT2_PATH_MAX 4096
/* Maximum nesting of symlinks, used to prevent a loop. */
#define EXT2_MAX_SYMLINKCNT 8
+24 -21
View File
@@ -20,28 +20,31 @@
#pragma once
// Key codes
#define KEY_EXTENDED 0x00
#define KEY_ENTER 0x0D
#define KEY_BACKSPACE 0x08
#define KEY_SPACE 0x20
#define KEY_EXTENDED 0x00
#define KEY_ENTER 0x0D
#define KEY_BACKSPACE 0x08
#define KEY_DELETE 0x53
#define KEY_SPACE 0x20
#define KEY_LEFTSHIFT 0x2A
#define KEY_HOME 0x47
#define KEY_UP 0x48
#define KEY_DOWN 0x50
#define KEY_LEFT 0x4B
#define KEY_RIGHT 0x4D
#define KEY_ESC 0x1B
#define KEY_CAPS_LOCK 0x3A
#define KEY_F1 0x3B
#define KEY_F2 0x3C
#define KEY_F3 0x3D
#define KEY_F4 0x3E
#define KEY_F5 0x3F
#define KEY_F6 0x40
#define KEY_F7 0x41
#define KEY_F8 0x42
#define KEY_F9 0x43
#define KEY_UP 0x48
#define KEY_DOWN 0x50
#define KEY_LEFT 0x4B
#define KEY_RIGHT 0x4D
#define KEY_ESC 0x1B
#define KEY_CAPS_LOCK 0x3A
#define KEY_F1 0x3B
#define KEY_F2 0x3C
#define KEY_F3 0x3D
#define KEY_F4 0x3E
#define KEY_F5 0x3F
#define KEY_F6 0x40
#define KEY_F7 0x41
#define KEY_F8 0x42
#define KEY_F9 0x43
#define KEY_F10 0x44
#define KEY_KEYPAD_PLUS 0x4e
#define KEY_END 0x4f
#define KEY_F11 0x57
#define KEY_F12 0x58
#define KEY_KEYPAD_PLUS 0x4E
#define KEY_END 0x4F
#define KEY_SEND 0xE7
+2
View File
@@ -61,6 +61,7 @@ VOID UiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillChar,
VOID UiDrawShadow(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom); // Draws a shadow on the bottom and right sides of the area specified
VOID UiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr); // Draws a box around the area specified
VOID UiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr); // Draws text at coordinates specified
VOID UiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr); // Draws text at coordinates specified
VOID UiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr); // Draws centered text at the coordinates specified and clips the edges
VOID UiDrawStatusText(PCSTR StatusText); // Draws text at the very bottom line on the screen
VOID UiUpdateDateTime(VOID); // Updates the date and time
@@ -123,6 +124,7 @@ typedef struct tagUIVTBL
VOID (*DrawShadow)(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom);
VOID (*DrawBox)(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr);
VOID (*DrawText)(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr);
VOID (*DrawText2)(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr);
VOID (*DrawCenteredText)(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr);
VOID (*DrawStatusText)(PCSTR StatusText);
VOID (*UpdateDateTime)(VOID);
+1
View File
@@ -32,6 +32,7 @@ VOID GuiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR FillCha
VOID GuiDrawShadow(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom); // Draws a shadow on the bottom and right sides of the area specified
VOID GuiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr); // Draws a box around the area specified
VOID GuiDrawText(ULONG X, ULONG Y, PUCHAR Text, UCHAR Attr); // Draws text at coordinates specified
VOID GuiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PUCHAR Text, UCHAR Attr); // Draws text at coordinates specified
VOID GuiDrawStatusText(PCSTR StatusText); // Draws text at the very bottom line on the screen
VOID GuiUpdateDateTime(VOID); // Updates the date and time
VOID GuiSaveScreen(PUCHAR Buffer); // Saves the screen so that it can be restored later
+1
View File
@@ -22,6 +22,7 @@ VOID NoUiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillCha
VOID NoUiDrawShadow(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom);
VOID NoUiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr);
VOID NoUiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr);
VOID NoUiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr);
VOID NoUiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr);
VOID NoUiDrawStatusText(PCSTR StatusText);
VOID NoUiUpdateDateTime(VOID);
+1
View File
@@ -35,6 +35,7 @@ VOID TuiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillChar
VOID TuiDrawShadow(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom); // Draws a shadow on the bottom and right sides of the area specified
VOID TuiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr); // Draws a box around the area specified
VOID TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr); // Draws text at coordinates specified
VOID TuiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr); // Draws text at coordinates specified
VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr); // Draws centered text at the coordinates specified and clips the edges
VOID TuiDrawStatusText(PCSTR StatusText); // Draws text at the very bottom line on the screen
VOID TuiUpdateDateTime(VOID); // Updates the date and time
+50 -16
View File
@@ -84,11 +84,28 @@ UiDrawText(IN ULONG X,
{
ULONG i, j;
/* Draw the text character by character, but don't exceed the width */
/* Draw the text character by character, but don't exceed the width */
for (i = X, j = 0; Text[j] && i < UiScreenWidth; i++, j++)
{
/* Write the character */
MachVideoPutChar(Text[j], Attr, i, Y);
/* Write the character */
MachVideoPutChar(Text[j], Attr, i, Y);
}
}
VOID
UiDrawText2(IN ULONG X,
IN ULONG Y,
IN ULONG MaxNumChars,
IN PCSTR Text,
IN UCHAR Attr)
{
ULONG i, j;
/* Draw the text character by character, but don't exceed the width */
for (i = X, j = 0; Text[j] && i < UiScreenWidth && (MaxNumChars > 0 ? j < MaxNumChars : TRUE); i++, j++)
{
/* Write the character */
MachVideoPutChar(Text[j], Attr, i, Y);
}
}
@@ -397,7 +414,8 @@ NTAPI
UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo,
IN UiMenuKeyPressFilterCallback KeyPressFilter)
{
ULONG KeyEvent = 0, Selected, Count;
ULONG KeyEvent = 0;
ULONG Selected, Count;
/* Check for a keypress */
if (MachConsKbHit())
@@ -405,9 +423,7 @@ UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo,
/* Check if the timeout is not already complete */
if (MenuInfo->MenuTimeRemaining != -1)
{
//
// Cancel it and remove it
//
/* Cancel it and remove it */
MenuInfo->MenuTimeRemaining = -1;
UiDrawMenuBox(MenuInfo);
}
@@ -418,7 +434,10 @@ UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo,
/* Is it extended? Then get the extended key */
if (!KeyEvent) KeyEvent = MachConsGetCh();
/* Call the supplied key filter callback function to see if it is going to handle this keypress. */
/*
* Call the supplied key filter callback function to see
* if it is going to handle this keypress.
*/
if ((KeyPressFilter) && (KeyPressFilter(KeyEvent)))
{
/* It processed the key character, so redraw and exit */
@@ -427,41 +446,56 @@ UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo,
}
/* Process the key */
if ((KeyEvent == KEY_UP) || (KeyEvent == KEY_DOWN))
if ((KeyEvent == KEY_UP ) || (KeyEvent == KEY_DOWN) ||
(KeyEvent == KEY_HOME) || (KeyEvent == KEY_END ))
{
/* Get the current selected item and count */
Selected = MenuInfo->SelectedMenuItem;
Count = MenuInfo->MenuItemCount - 1;
/* Check if this was a key up and there's a selected menu item */
if ((KeyEvent == KEY_UP) && (Selected))
/* Check the key and change the selected menu item */
if ((KeyEvent == KEY_UP) && (Selected > 0))
{
/* Update the menu (Deselect previous item) */
/* Deselect previous item and go up */
MenuInfo->SelectedMenuItem--;
UiDrawMenuItem(MenuInfo, Selected);
Selected--;
/* Skip past any separators */
if ((Selected) &&
// Skip past any separators
if ((Selected > 0) &&
(MenuInfo->MenuItemList[Selected] == NULL))
{
MenuInfo->SelectedMenuItem--;
}
}
else if ( ((KeyEvent == KEY_UP) && (Selected == 0)) ||
(KeyEvent == KEY_END) )
{
/* Go to the end */
MenuInfo->SelectedMenuItem = Count;
UiDrawMenuItem(MenuInfo, Selected);
}
else if ((KeyEvent == KEY_DOWN) && (Selected < Count))
{
/* Update the menu (deselect previous item) */
/* Deselect previous item and go down */
MenuInfo->SelectedMenuItem++;
UiDrawMenuItem(MenuInfo, Selected);
Selected++;
/* Skip past any separators */
// Skip past any separators
if ((Selected < Count) &&
(MenuInfo->MenuItemList[Selected] == NULL))
{
MenuInfo->SelectedMenuItem++;
}
}
else if ( ((KeyEvent == KEY_DOWN) && (Selected == Count)) ||
(KeyEvent == KEY_HOME) )
{
/* Go to the beginning */
MenuInfo->SelectedMenuItem = 0;
UiDrawMenuItem(MenuInfo, Selected);
}
/* Select new item and update video buffer */
UiDrawMenuItem(MenuInfo, MenuInfo->SelectedMenuItem);
+12 -3
View File
@@ -40,6 +40,10 @@ VOID GuiDrawText(ULONG X, ULONG Y, PUCHAR Text, UCHAR Attr)
{
}
VOID GuiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PUCHAR Text, UCHAR Attr)
{
}
VOID GuiDrawStatusText(PCSTR StatusText)
{
}
@@ -80,13 +84,15 @@ UCHAR GuiTextToFillStyle(PCSTR FillStyleText)
const UIVTBL GuiVtbl =
{
/*GuiInitialize,
/*
GuiInitialize,
GuiUnInitialize,
GuiDrawBackdrop,
GuiFillArea,
GuiDrawShadow,
GuiDrawBox,
GuiDrawText,
GuiDrawText2,
GuiDrawCenteredText,
GuiDrawStatusText,
GuiUpdateDateTime,
@@ -99,9 +105,12 @@ const UIVTBL GuiVtbl =
GuiTextToFillStyle,
GuiFadeInBackdrop,
GuiFadeOut,
GuiDisplayMenu,*/
GuiDisplayMenu,
GuiDrawMenu,
*/
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL
};
#endif
+1
View File
@@ -143,6 +143,7 @@ const UIVTBL MiniTuiVtbl =
TuiDrawShadow,
TuiDrawBox,
TuiDrawText,
TuiDrawText2,
TuiDrawCenteredText,
MiniTuiDrawStatusText,
TuiUpdateDateTime,
+4
View File
@@ -37,6 +37,10 @@ VOID NoUiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr)
{
}
VOID NoUiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr)
{
}
VOID NoUiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr)
{
}
+103 -26
View File
@@ -318,7 +318,26 @@ VOID TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr)
ULONG i, j;
// Draw the text
for (i=X, j=0; Text[j] && i<UiScreenWidth; i++,j++)
for (i = X, j = 0; Text[j] && i < UiScreenWidth; i++, j++)
{
ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)] = (UCHAR)Text[j];
ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)+1] = Attr;
}
}
/*
* DrawText2()
* This function assumes coordinates are zero-based.
* MaxNumChars is the maximum number of characters to display.
* If MaxNumChars == 0, then display the whole string.
*/
VOID TuiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr)
{
PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer;
ULONG i, j;
// Draw the text
for (i = X, j = 0; Text[j] && i < UiScreenWidth && (MaxNumChars > 0 ? j < MaxNumChars : TRUE); i++, j++)
{
ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)] = (UCHAR)Text[j];
ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)+1] = Attr;
@@ -789,19 +808,20 @@ VOID TuiFadeOut(VOID)
BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
{
int width = 8;
unsigned int height = 1;
int curline = 0;
int k;
size_t i , j;
int x1, x2, y1, y2;
char temp[260];
char key;
int EditBoxLine;
ULONG EditBoxStartX, EditBoxEndX;
int EditBoxCursorX;
unsigned int EditBoxTextCount;
int EditBoxTextDisplayIndex;
INT width = 8;
ULONG height = 1;
INT curline = 0;
INT k;
size_t i , j;
INT x1, x2, y1, y2;
CHAR temp[260];
CHAR key;
BOOLEAN Extended;
INT EditBoxLine;
ULONG EditBoxStartX, EditBoxEndX;
INT EditBoxCursorX;
ULONG EditBoxTextLength, EditBoxTextPosition;
INT EditBoxTextDisplayIndex;
BOOLEAN ReturnCode;
PVOID ScreenBuffer;
@@ -855,7 +875,8 @@ BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
temp[j++] = MessageText[i];
}
EditBoxTextCount = 0;
EditBoxTextLength = 0;
EditBoxTextPosition = 0;
EditBoxLine = y2 - 2;
EditBoxStartX = x1 + 3;
EditBoxEndX = x2 - 3;
@@ -871,13 +892,20 @@ BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
VideoCopyOffScreenBufferToVRAM();
//
// Enter the text. Please keep in mind that the default input mode
// of the edit boxes is in insertion mode, that is, you can insert
// text without erasing the existing one.
//
for (;;)
{
if (MachConsKbHit())
{
Extended = FALSE;
key = MachConsGetCh();
if(key == KEY_EXTENDED)
{
Extended = TRUE;
key = MachConsGetCh();
}
@@ -893,23 +921,71 @@ BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
}
else if (key == KEY_BACKSPACE) // Remove a character
{
if (EditBoxTextCount)
if ( (EditBoxTextLength > 0) && (EditBoxTextPosition > 0) &&
(EditBoxTextPosition <= EditBoxTextLength) )
{
EditBoxTextCount--;
EditTextBuffer[EditBoxTextCount] = 0;
EditBoxTextPosition--;
memmove(EditTextBuffer + EditBoxTextPosition,
EditTextBuffer + EditBoxTextPosition + 1,
EditBoxTextLength - EditBoxTextPosition);
EditBoxTextLength--;
EditTextBuffer[EditBoxTextLength] = 0;
}
else
{
MachBeep();
}
}
else if (Extended && key == KEY_DELETE) // Remove a character
{
if ( (EditBoxTextLength > 0) &&
(EditBoxTextPosition < EditBoxTextLength) )
{
memmove(EditTextBuffer + EditBoxTextPosition,
EditTextBuffer + EditBoxTextPosition + 1,
EditBoxTextLength - EditBoxTextPosition);
EditBoxTextLength--;
EditTextBuffer[EditBoxTextLength] = 0;
}
else
{
MachBeep();
}
}
else if (key == KEY_HOME) // Go to the start of the buffer
{
EditBoxTextPosition = 0;
}
else if (key == KEY_END) // Go to the end of the buffer
{
EditBoxTextPosition = EditBoxTextLength;
}
else if (key == KEY_RIGHT) // Go right
{
if (EditBoxTextPosition < EditBoxTextLength)
EditBoxTextPosition++;
else
MachBeep();
}
else if (key == KEY_LEFT) // Go left
{
if (EditBoxTextPosition > 0)
EditBoxTextPosition--;
else
MachBeep();
}
else // Add this key to the buffer
{
if (EditBoxTextCount < Length - 1)
if ( (EditBoxTextLength < Length - 1) &&
(EditBoxTextPosition < Length - 1) )
{
EditTextBuffer[EditBoxTextCount] = key;
EditBoxTextCount++;
EditTextBuffer[EditBoxTextCount] = 0;
memmove(EditTextBuffer + EditBoxTextPosition + 1,
EditTextBuffer + EditBoxTextPosition,
EditBoxTextLength - EditBoxTextPosition);
EditTextBuffer[EditBoxTextPosition] = key;
EditBoxTextPosition++;
EditBoxTextLength++;
EditTextBuffer[EditBoxTextLength] = 0;
}
else
{
@@ -922,17 +998,17 @@ BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
UiFillArea(EditBoxStartX, EditBoxLine, EditBoxEndX, EditBoxLine, ' ', ATTR(UiEditBoxTextColor, UiEditBoxBgColor));
// Fill the text in
if (EditBoxTextCount > (EditBoxEndX - EditBoxStartX))
if (EditBoxTextPosition > (EditBoxEndX - EditBoxStartX))
{
EditBoxTextDisplayIndex = EditBoxTextCount - (EditBoxEndX - EditBoxStartX);
EditBoxTextDisplayIndex = EditBoxTextPosition - (EditBoxEndX - EditBoxStartX);
EditBoxCursorX = EditBoxEndX;
}
else
{
EditBoxTextDisplayIndex = 0;
EditBoxCursorX = EditBoxStartX + EditBoxTextCount;
EditBoxCursorX = EditBoxStartX + EditBoxTextPosition;
}
UiDrawText(EditBoxStartX, EditBoxLine, &EditTextBuffer[EditBoxTextDisplayIndex], ATTR(UiEditBoxTextColor, UiEditBoxBgColor));
UiDrawText2(EditBoxStartX, EditBoxLine, EditBoxEndX - EditBoxStartX + 1, &EditTextBuffer[EditBoxTextDisplayIndex], ATTR(UiEditBoxTextColor, UiEditBoxBgColor));
// Move the cursor
MachVideoSetTextCursorPosition(EditBoxCursorX, EditBoxLine);
@@ -963,6 +1039,7 @@ const UIVTBL TuiVtbl =
TuiDrawShadow,
TuiDrawBox,
TuiDrawText,
TuiDrawText2,
TuiDrawCenteredText,
TuiDrawStatusText,
TuiUpdateDateTime,
+25 -6
View File
@@ -495,7 +495,8 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo,
//
// Process the key
//
if ((KeyEvent == KEY_UP) || (KeyEvent == KEY_DOWN))
if ((KeyEvent == KEY_UP ) || (KeyEvent == KEY_DOWN) ||
(KeyEvent == KEY_HOME) || (KeyEvent == KEY_END ))
{
//
// Get the current selected item and count
@@ -504,28 +505,37 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo,
Count = MenuInfo->MenuItemCount - 1;
//
// Check if this was a key up and there's a selected menu item
// Check the key and change the selected menu item
//
if ((KeyEvent == KEY_UP) && (Selected))
if ((KeyEvent == KEY_UP) && (Selected > 0))
{
//
// Update the menu (Deselect previous item)
// Deselect previous item and go up
//
MenuInfo->SelectedMenuItem--;
TuiDrawMenuItem(MenuInfo, Selected);
Selected--;
// Skip past any separators
if ((Selected) &&
if ((Selected > 0) &&
(MenuInfo->MenuItemList[Selected] == NULL))
{
MenuInfo->SelectedMenuItem--;
}
}
else if ( ((KeyEvent == KEY_UP) && (Selected == 0)) ||
(KeyEvent == KEY_END) )
{
//
// Go to the end
//
MenuInfo->SelectedMenuItem = Count;
TuiDrawMenuItem(MenuInfo, Selected);
}
else if ((KeyEvent == KEY_DOWN) && (Selected < Count))
{
//
// Update the menu (deselect previous item)
// Deselect previous item and go down
//
MenuInfo->SelectedMenuItem++;
TuiDrawMenuItem(MenuInfo, Selected);
@@ -538,6 +548,15 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo,
MenuInfo->SelectedMenuItem++;
}
}
else if ( ((KeyEvent == KEY_DOWN) && (Selected == Count)) ||
(KeyEvent == KEY_HOME) )
{
//
// Go to the beginning
//
MenuInfo->SelectedMenuItem = 0;
TuiDrawMenuItem(MenuInfo, Selected);
}
//
// Select new item and update video buffer
+6
View File
@@ -62,6 +62,7 @@ UIVTBL UiVtbl =
NoUiDrawShadow,
NoUiDrawBox,
NoUiDrawText,
NoUiDrawText2,
NoUiDrawCenteredText,
NoUiDrawStatusText,
NoUiUpdateDateTime,
@@ -260,6 +261,11 @@ VOID UiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr)
UiVtbl.DrawText(X, Y, Text, Attr);
}
VOID UiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr)
{
UiVtbl.DrawText2(X, Y, MaxNumChars, Text, Attr);
}
VOID UiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr)
{
UiVtbl.DrawCenteredText(Left, Top, Right, Bottom, TextString, Attr);
+4 -4
View File
@@ -299,7 +299,7 @@ function(set_module_type MODULE TYPE)
# Set subsystem. Also take this as an occasion
# to error out if someone gave a non existing type
if((${TYPE} STREQUAL nativecui) OR (${TYPE} STREQUAL nativedll) OR (${TYPE} STREQUAL kernelmodedriver))
if((${TYPE} STREQUAL nativecui) OR (${TYPE} STREQUAL nativedll) OR (${TYPE} STREQUAL kernelmodedriver) OR (${TYPE} STREQUAL wdmdriver))
set(__subsystem native)
elseif(${TYPE} STREQUAL win32cui)
set(__subsystem console)
@@ -342,7 +342,7 @@ function(set_module_type MODULE TYPE)
OR (${TYPE} STREQUAL cpl))
set(__entrypoint DllMainCRTStartup)
set(__entrystack 12)
elseif(${TYPE} STREQUAL kernelmodedriver)
elseif((${TYPE} STREQUAL kernelmodedriver) OR (${TYPE} STREQUAL wdmdriver))
set(__entrypoint DriverEntry)
set(__entrystack 8)
elseif(${TYPE} STREQUAL nativedll)
@@ -369,12 +369,12 @@ function(set_module_type MODULE TYPE)
else()
message(STATUS "${MODULE} has no base address")
endif()
elseif(${TYPE} STREQUAL kernelmodedriver)
elseif((${TYPE} STREQUAL kernelmodedriver) OR (${TYPE} STREQUAL wdmdriver))
set_image_base(${MODULE} 0x00010000)
endif()
# Now do some stuff which is specific to each type
if(${TYPE} STREQUAL kernelmodedriver)
if((${TYPE} STREQUAL kernelmodedriver) OR (${TYPE} STREQUAL wdmdriver))
add_dependencies(${MODULE} bugcodes)
set_target_properties(${MODULE} PROPERTIES SUFFIX ".sys")
endif()
+2 -2
View File
@@ -221,7 +221,7 @@ macro(__windows_compiler_msvc lang)
set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_LINKER> /lib ${CMAKE_CL_NOLOGO} <LINK_FLAGS> /out:<TARGET> <OBJECTS> ")
set(CMAKE_${lang}_COMPILE_OBJECT
"<CMAKE_${lang}_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} <FLAGS> <DEFINES> /Fo<OBJECT> /Fd<TARGET_PDB> -c <SOURCE>${CMAKE_END_TEMP_FILE}")
"<CMAKE_${lang}_COMPILER> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} <FLAGS> <DEFINES> /Fo<OBJECT> /Fd<OBJECT_DIR>/ -c <SOURCE>${CMAKE_END_TEMP_FILE}")
set(CMAKE_${lang}_CREATE_PREPROCESSED_SOURCE
"<CMAKE_${lang}_COMPILER> > <PREPROCESSED_SOURCE> ${CMAKE_START_TEMP_FILE} ${CMAKE_CL_NOLOGO}${_COMPILE_${lang}} <FLAGS> <DEFINES> -E <SOURCE>${CMAKE_END_TEMP_FILE}")
set(CMAKE_${lang}_CREATE_ASSEMBLY_SOURCE
@@ -229,7 +229,7 @@ macro(__windows_compiler_msvc lang)
set(CMAKE_${lang}_COMPILER_LINKER_OPTION_FLAG_EXECUTABLE "/link")
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_${lang}_COMPILER> ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} <FLAGS> /Fe<TARGET> /Fd<TARGET_PDB> <OBJECTS> /link /implib:<TARGET_IMPLIB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}")
set(CMAKE_${lang}_LINK_EXECUTABLE "${_CMAKE_VS_LINK_EXE}<CMAKE_${lang}_COMPILER> ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} <FLAGS> /Fe<TARGET> <OBJECTS> /link /implib:<TARGET_IMPLIB> /pdb:<TARGET_PDB> /version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}")
set(CMAKE_${lang}_FLAGS_INIT "")
set(CMAKE_${lang}_FLAGS_DEBUG_INIT "")
+9 -2
View File
@@ -199,11 +199,18 @@ endfunction()
function(set_module_type_toolchain MODULE TYPE)
if(IS_CPP)
target_link_libraries(${MODULE} -lstdc++ -lsupc++ -lgcc -lmingwex)
if((${TYPE} STREQUAL "kernelmodedriver") OR (${TYPE} STREQUAL "wdmdriver"))
target_link_libraries(${MODULE} -lgcc)
else()
target_link_libraries(${MODULE} -lstdc++ -lsupc++ -lgcc -lmingwex)
endif()
endif()
if(${TYPE} STREQUAL "kernelmodedriver")
if((${TYPE} STREQUAL "kernelmodedriver") OR (${TYPE} STREQUAL "wdmdriver"))
add_target_link_flags(${MODULE} "-Wl,--exclude-all-symbols,-file-alignment=0x1000,-section-alignment=0x1000")
if(${TYPE} STREQUAL "wdmdriver")
add_target_link_flags(${MODULE} "-Wl,--wdmdriver")
endif()
endif()
endfunction()
+2
View File
@@ -112,6 +112,8 @@ function(set_module_type_toolchain MODULE TYPE)
add_target_link_flags(${MODULE} "/DLL")
elseif(${TYPE} STREQUAL "kernelmodedriver")
add_target_link_flags(${MODULE} "/DRIVER")
elseif(${TYPE} STREQUAL "wdmdriver")
add_target_link_flags(${MODULE} "/DRIVER:WDM")
endif()
endfunction()
-4
View File
@@ -8,10 +8,6 @@
*/
#include "precomp.h"
#ifndef _MSC_VER
const GUID KSCATEGORY_CLOCK = {0x53172480, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
#endif
const GUID IID_IKsClockForwarder = {0x877e4352, 0x6fea, 0x11d0, {0xb8, 0x63, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter);
-23
View File
@@ -11,11 +11,6 @@
const GUID IID_IKsPinPipe = {0xe539cd90, 0xa8b4, 0x11d1, {0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}};
const GUID IID_IKsPinEx = {0x7bb38260L, 0xd19c, 0x11d2, {0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e}};
#ifndef _MSC_VER
const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
KSPIN_INTERFACE StandardPinInterface =
{
{STATIC_KSINTERFACESETID_Standard},
@@ -30,24 +25,6 @@ KSPIN_MEDIUM StandardPinMedium =
0
};
#else
KSPIN_INTERFACE StandardPinInterface =
{
STATIC_KSINTERFACESETID_Standard,
KSINTERFACE_STANDARD_STREAMING,
0
};
KSPIN_MEDIUM StandardPinMedium =
{
STATIC_KSMEDIUMSETID_Standard,
KSMEDIUM_TYPE_ANYINSTANCE,
0
};
#endif
class CInputPin : public IPin,
public IKsPropertySet,
public IKsControl,
-3
View File
@@ -17,9 +17,6 @@ const GUID CLSID_KsQualityForwarder = {0xe05592e4, 0xc0b5, 0x11d0, {0
#ifndef _MSC_VER
const GUID CLSID_KsIBasicAudioInterfaceHandler = {0xb9f8ac3e, 0x0f71, 0x11d2, {0xb7, 0x2c, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d}};
const GUID KSPROPSETID_Pin = {0x8C134960, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
const GUID KSINTERFACESETID_Standard = {STATIC_KSINTERFACESETID_Standard};
const GUID CLSID_Proxy = {0x17CCA71B, 0xECD7, 0x11D0, {0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
#endif
static INTERFACE_TABLE InterfaceTable[] =
-6
View File
@@ -10,16 +10,10 @@
#ifndef _MSC_VER
const GUID IID_IPersistPropertyBag = {0x37D84F60, 0x42CB, 0x11CE, {0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51}};
const GUID GUID_NULL = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
const GUID IID_ISpecifyPropertyPages = {0xB196B28B, 0xBAB4, 0x101A, {0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}};
const GUID IID_IPersistStream = {0x00000109, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
const GUID KSPROPSETID_MediaSeeking = {0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
const GUID KSPROPSETID_Clock = {0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
const GUID KSEVENTSETID_Clock = {0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
const GUID KSPROPSETID_Stream = {0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}};
const GUID IID_IPersist = {0x0000010c, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
#endif
const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}};
const GUID IID_IKsAggregateControl = {0x7F40EAC0, 0x3947, 0x11D2, {0x87, 0x4E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
const GUID IID_IKsClockPropertySet = {0x5C5CBD84, 0xE755, 0x11D0, {0xAC, 0x18, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
-4
View File
@@ -8,10 +8,6 @@
*/
#include "precomp.h"
#ifndef _MSC_VER
const GUID KSCATEGORY_QUALITY = {0x97EBAACB, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
#endif
#define IID_IKsQualityForwarder KSCATEGORY_QUALITY
class CKsQualityForwarder : public IKsQualityForwarder
+7
View File
@@ -5233,6 +5233,8 @@ static BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, UINT ordinal)
static void wined3d_adapter_init_nogl(struct wined3d_adapter *adapter, UINT ordinal)
{
DISPLAY_DEVICEW display_device;
memset(adapter, 0, sizeof(*adapter));
adapter->ordinal = ordinal;
adapter->monitorPoint.x = -1;
@@ -5250,6 +5252,11 @@ static void wined3d_adapter_init_nogl(struct wined3d_adapter *adapter, UINT ordi
adapter->fragment_pipe = &none_fragment_pipe;
adapter->shader_backend = &none_shader_backend;
adapter->blitter = &cpu_blit;
display_device.cb = sizeof(display_device);
EnumDisplayDevicesW(NULL, ordinal, &display_device, 0);
TRACE("DeviceName: %s\n", debugstr_w(display_device.DeviceName));
strcpyW(adapter->DeviceName, display_device.DeviceName);
}
static void STDMETHODCALLTYPE wined3d_null_wined3d_object_destroyed(void *parent) {}
+7 -6
View File
@@ -33,17 +33,18 @@ if((ARCH STREQUAL "i386") AND (NOT MSVC))
x86/3dnow_xform3.S
x86/3dnow_xform4.S
x86/3dnow_normal.S
x86/sse_xform1.S
x86/sse_xform2.S
x86/sse_xform3.S
x86/sse_xform4.S
x86/sse_normal.S
# x86/sse_xform1.S
# x86/sse_xform2.S
# x86/sse_xform3.S
# x86/sse_xform4.S
# x86/sse_normal.S
x86/read_rgba_span_x86.S)
add_definitions(
-DUSE_X86_ASM
-DUSE_MMX_ASM
-DUSE_3DNOW_ASM
-DUSE_SSE_ASM)
# -DUSE_SSE_ASM
)
endif()
list(APPEND SOURCE
+2 -1
View File
@@ -1,7 +1,8 @@
add_definitions(
-D__WINESRC__
-D_WINE)
-D_WINE
-D_CRYPT32_)
remove_definitions(-D_WIN32_WINNT=0x502)
add_definitions(-D_WIN32_WINNT=0x600)
+2 -2
View File
@@ -828,7 +828,7 @@ BOOL WINAPI CryptStringToBinaryA(LPCSTR pszString,
ret = decoder(pszString, cchString, pbBinary, pcbBinary, pdwSkip, pdwFlags);
if (ret)
SetLastError(ret);
return (ret == ERROR_SUCCESS) ? TRUE : FALSE;
return ret == ERROR_SUCCESS;
}
static LONG decodeBase64BlockW(const WCHAR *in_buf, int in_len,
@@ -1160,5 +1160,5 @@ BOOL WINAPI CryptStringToBinaryW(LPCWSTR pszString,
ret = decoder(pszString, cchString, pbBinary, pcbBinary, pdwSkip, pdwFlags);
if (ret)
SetLastError(ret);
return (ret == ERROR_SUCCESS) ? TRUE : FALSE;
return ret == ERROR_SUCCESS;
}
+14 -19
View File
@@ -846,7 +846,7 @@ static BOOL container_matches_cert(PCCERT_CONTEXT pCert, LPCSTR container,
* keyProvInfo->pwszContainerName to be NULL or a heap-allocated container
* name.
*/
memcpy(&copy, keyProvInfo, sizeof(copy));
copy = *keyProvInfo;
copy.pwszContainerName = containerW;
matches = key_prov_info_matches_cert(pCert, &copy);
if (matches)
@@ -2220,9 +2220,7 @@ BOOL WINAPI CryptSignAndEncodeCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HANDLE hCrypt
info.ToBeSigned.cbData = encodedSize;
info.ToBeSigned.pbData = encoded;
memcpy(&info.SignatureAlgorithm,
pSignatureAlgorithm,
sizeof(info.SignatureAlgorithm));
info.SignatureAlgorithm = *pSignatureAlgorithm;
info.Signature.cbData = hashSize;
info.Signature.pbData = hash;
info.Signature.cUnusedBits = 0;
@@ -2243,8 +2241,10 @@ BOOL WINAPI CryptVerifyCertificateSignature(HCRYPTPROV_LEGACY hCryptProv,
DWORD dwCertEncodingType, const BYTE *pbEncoded, DWORD cbEncoded,
PCERT_PUBLIC_KEY_INFO pPublicKey)
{
CRYPT_DATA_BLOB blob = { cbEncoded, (BYTE *)pbEncoded };
return CryptVerifyCertificateSignatureEx(hCryptProv, dwCertEncodingType,
CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB, (void *)pbEncoded,
CRYPT_VERIFY_CERT_SIGN_SUBJECT_BLOB, &blob,
CRYPT_VERIFY_CERT_SIGN_ISSUER_PUBKEY, pPublicKey, 0, NULL);
}
@@ -2988,8 +2988,7 @@ static PCCERT_CONTEXT CRYPT_CreateSignedCert(const CRYPT_DER_BLOB *blob,
signedInfo.ToBeSigned.cbData = blob->cbData;
signedInfo.ToBeSigned.pbData = blob->pbData;
memcpy(&signedInfo.SignatureAlgorithm, sigAlgo,
sizeof(signedInfo.SignatureAlgorithm));
signedInfo.SignatureAlgorithm = *sigAlgo;
signedInfo.Signature.cbData = sigSize;
signedInfo.Signature.pbData = sig;
signedInfo.Signature.cUnusedBits = 0;
@@ -3040,8 +3039,7 @@ static void CRYPT_MakeCertInfo(PCERT_INFO info, const CRYPT_DATA_BLOB *pSerialNu
info->SerialNumber.cbData = pSerialNumber->cbData;
info->SerialNumber.pbData = pSerialNumber->pbData;
if (pSignatureAlgorithm)
memcpy(&info->SignatureAlgorithm, pSignatureAlgorithm,
sizeof(info->SignatureAlgorithm));
info->SignatureAlgorithm = *pSignatureAlgorithm;
else
{
info->SignatureAlgorithm.pszObjId = oid;
@@ -3068,8 +3066,7 @@ static void CRYPT_MakeCertInfo(PCERT_INFO info, const CRYPT_DATA_BLOB *pSerialNu
}
info->Subject.cbData = pSubjectIssuerBlob->cbData;
info->Subject.pbData = pSubjectIssuerBlob->pbData;
memcpy(&info->SubjectPublicKeyInfo, pubKey,
sizeof(info->SubjectPublicKeyInfo));
info->SubjectPublicKeyInfo = *pubKey;
if (pExtensions)
{
info->cExtension = pExtensions->cExtension;
@@ -3141,7 +3138,7 @@ PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HAN
PCCERT_CONTEXT context = NULL;
BOOL ret, releaseContext = FALSE;
PCERT_PUBLIC_KEY_INFO pubKey = NULL;
DWORD pubKeySize = 0,dwKeySpec = AT_SIGNATURE;
DWORD pubKeySize = 0, dwKeySpec;
TRACE("(%08lx, %p, %08x, %p, %p, %p, %p, %p)\n", hProv,
pSubjectIssuerBlob, dwFlags, pKeyProvInfo, pSignatureAlgorithm, pStartTime,
@@ -3153,6 +3150,7 @@ PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HAN
return NULL;
}
dwKeySpec = pKeyProvInfo ? pKeyProvInfo->dwKeySpec : AT_SIGNATURE;
if (!hProv)
{
if (!pKeyProvInfo)
@@ -3183,7 +3181,6 @@ PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HAN
if (!ret)
return NULL;
}
dwKeySpec = pKeyProvInfo->dwKeySpec;
/* check if the key is here */
ret = CryptGetUserKey(hProv,dwKeySpec,&hKey);
if(!ret)
@@ -3203,14 +3200,11 @@ PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HAN
releaseContext = TRUE;
}
}
else if (pKeyProvInfo)
{
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
}
CryptExportPublicKeyInfo(hProv, dwKeySpec, X509_ASN_ENCODING, NULL,
ret = CryptExportPublicKeyInfo(hProv, dwKeySpec, X509_ASN_ENCODING, NULL,
&pubKeySize);
if (!ret)
goto end;
pubKey = CryptMemAlloc(pubKeySize);
if (pubKey)
{
@@ -3244,6 +3238,7 @@ PCCERT_CONTEXT WINAPI CertCreateSelfSignCertificate(HCRYPTPROV_OR_NCRYPT_KEY_HAN
}
CryptMemFree(pubKey);
}
end:
if (releaseContext)
CryptReleaseContext(hProv, 0);
return context;
+8
View File
@@ -3162,6 +3162,7 @@ static BOOL match_domain_component(LPCWSTR allowed_component, DWORD allowed_len,
BOOL matches = TRUE;
*see_wildcard = FALSE;
if (server_len < allowed_len)
{
WARN_(chain)("domain component %s too short for %s\n",
@@ -3221,6 +3222,13 @@ static BOOL match_common_name(LPCWSTR server_name, const CERT_RDN_ATTR *nameAttr
TRACE_(chain)("CN = %s\n", debugstr_wn(allowed_component, allowed_len));
/* Remove trailing NULLs from the allowed name; while they shouldn't appear
* in a certificate in the first place, they sometimes do, and they should
* be ignored.
*/
while (allowed_len && allowed_component[allowed_len - 1] == 0)
allowed_len--;
/* From RFC 2818 (HTTP over TLS), section 3.1:
* "Names may contain the wildcard character * which is considered to match
* any single domain name component or component fragment. E.g.,
+20 -26
View File
@@ -692,8 +692,7 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc,
CryptMemAlloc(
cItems * sizeof(struct AsnArrayItemSize));
if (itemSizes)
memcpy(itemSizes, &itemSize,
sizeof(itemSize));
*itemSizes = itemSize;
}
if (itemSizes)
{
@@ -1310,22 +1309,17 @@ static BOOL CRYPT_AsnDecodeOidIgnoreTag(const BYTE *pbEncoded, DWORD cbEncoded,
if (dataLen)
{
/* The largest possible string for the first two components
* is 2.175 (= 2 * 40 + 175 = 255), so this is big enough.
*/
char firstTwo[6];
const BYTE *ptr;
char str[32];
snprintf(firstTwo, sizeof(firstTwo), "%d.%d",
snprintf(str, sizeof(str), "%d.%d",
pbEncoded[1 + lenBytes] / 40,
pbEncoded[1 + lenBytes] - (pbEncoded[1 + lenBytes] / 40)
* 40);
bytesNeeded += strlen(firstTwo) + 1;
bytesNeeded += strlen(str) + 1;
for (ptr = pbEncoded + 2 + lenBytes; ret &&
ptr - pbEncoded - 1 - lenBytes < dataLen; )
{
/* large enough for ".4000000" */
char str[9];
int val = 0;
while (ptr - pbEncoded - 1 - lenBytes < dataLen &&
@@ -1917,7 +1911,7 @@ static BOOL WINAPI CRYPT_AsnDecodeName(DWORD dwCertEncodingType,
sizeof(CERT_NAME_INFO),
CRYPT_AsnDecodeRdn, sizeof(CERT_RDN), TRUE,
offsetof(CERT_RDN, rgRDNAttr) };
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, NULL, &bytesNeeded,
@@ -2014,7 +2008,7 @@ static BOOL WINAPI CRYPT_AsnDecodeUnicodeName(DWORD dwCertEncodingType,
sizeof(CERT_NAME_INFO),
CRYPT_AsnDecodeUnicodeRdn, sizeof(CERT_RDN), TRUE,
offsetof(CERT_RDN, rgRDNAttr) };
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, NULL, &bytesNeeded,
@@ -2460,7 +2454,7 @@ static BOOL CRYPT_AsnDecodeNoticeReference(const BYTE *pbEncoded,
FALSE, TRUE, offsetof(CERT_POLICY_QUALIFIER_NOTICE_REFERENCE,
rgNoticeNumbers), 0 },
};
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
TRACE("%p, %d, %08x, %p, %d\n", pbEncoded, cbEncoded, dwFlags,
pvStructInfo, pvStructInfo ? *pcbStructInfo : 0);
@@ -2677,7 +2671,7 @@ static BOOL WINAPI CRYPT_AsnDecodePolicyQualifierUserNotice(
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
ret = CRYPT_AsnDecodePolicyQualifierUserNoticeInternal(pbEncoded,
cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded,
@@ -2771,7 +2765,7 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSAttribute(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
ret = CRYPT_AsnDecodePKCSAttributeInternal(pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL);
@@ -2912,7 +2906,7 @@ static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
if ((ret = CRYPT_AsnDecodePubKeyInfoInternal(pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL)))
@@ -2982,7 +2976,7 @@ static BOOL CRYPT_AsnDecodeBool(const BYTE *pbEncoded, DWORD cbEncoded,
else
{
*pcbStructInfo = sizeof(BOOL);
*(BOOL *)pvStructInfo = pbEncoded[2] ? TRUE : FALSE;
*(BOOL *)pvStructInfo = pbEncoded[2] != 0;
ret = TRUE;
}
TRACE("returning %d (%08x)\n", ret, GetLastError());
@@ -3414,7 +3408,7 @@ static BOOL WINAPI CRYPT_AsnDecodeAltName(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
if ((ret = CRYPT_AsnDecodeAltNameInternal(pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL)))
@@ -4002,7 +3996,7 @@ static BOOL WINAPI CRYPT_AsnDecodeOctets(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
if (!cbEncoded)
{
@@ -4111,7 +4105,7 @@ static BOOL WINAPI CRYPT_AsnDecodeBits(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
if (!cbEncoded)
{
@@ -4205,7 +4199,7 @@ static BOOL WINAPI CRYPT_AsnDecodeInt(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
if (!cbEncoded)
{
@@ -4298,7 +4292,7 @@ static BOOL WINAPI CRYPT_AsnDecodeInteger(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
if (pbEncoded[0] != ASN_INTEGER)
{
@@ -4406,7 +4400,7 @@ static BOOL WINAPI CRYPT_AsnDecodeUnsignedInteger(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
if ((ret = CRYPT_AsnDecodeUnsignedIntegerInternal(pbEncoded, cbEncoded,
dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL)))
@@ -4662,7 +4656,7 @@ static BOOL WINAPI CRYPT_AsnDecodeUtcTime(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
ret = CRYPT_AsnDecodeUtcTimeInternal(pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL);
@@ -4793,7 +4787,7 @@ static BOOL WINAPI CRYPT_AsnDecodeChoiceOfTime(DWORD dwCertEncodingType,
__TRY
{
DWORD bytesNeeded;
DWORD bytesNeeded = 0;
ret = CRYPT_AsnDecodeChoiceOfTimeInternal(pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, &bytesNeeded, NULL);
@@ -4938,7 +4932,7 @@ static BOOL CRYPT_AsnDecodeDistPointName(const BYTE *pbEncoded,
if (pbEncoded[0] == (ASN_CONTEXT | ASN_CONSTRUCTOR | 0))
{
DWORD bytesNeeded, dataLen;
DWORD bytesNeeded = 0, dataLen;
if ((ret = CRYPT_GetLen(pbEncoded, cbEncoded, &dataLen)))
{
+8 -21
View File
@@ -140,7 +140,7 @@ BOOL WINAPI CryptVerifyDetachedMessageSignature(
for (i = 0; ret && i < cToBeSigned; i++)
ret = CryptMsgUpdate(msg, rgpbToBeSigned[i], rgcbToBeSigned[i],
i == cToBeSigned - 1 ? TRUE : FALSE);
i == cToBeSigned - 1);
}
if (ret)
{
@@ -210,6 +210,9 @@ BOOL WINAPI CryptVerifyMessageSignature(PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
if (msg)
{
ret = CryptMsgUpdate(msg, pbSignedBlob, cbSignedBlob, TRUE);
if (ret && pcbDecoded)
ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, pbDecoded,
pcbDecoded);
if (ret)
{
CERT_INFO *certInfo = CRYPT_GetSignerCertInfoFromMsg(msg,
@@ -241,20 +244,6 @@ BOOL WINAPI CryptVerifyMessageSignature(PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
}
CryptMemFree(certInfo);
}
if (ret)
{
/* The caller is expected to pass a valid pointer to pcbDecoded
* when the message verifies successfully.
*/
if (pcbDecoded)
ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, pbDecoded,
pcbDecoded);
else
{
SetLastError(CRYPT_E_NOT_FOUND);
ret = FALSE;
}
}
CryptMsgClose(msg);
}
if(!ret && pcbDecoded)
@@ -296,16 +285,14 @@ BOOL WINAPI CryptHashMessage(PCRYPT_HASH_MESSAGE_PARA pHashPara,
memset(&info, 0, sizeof(info));
info.cbSize = sizeof(info);
info.hCryptProv = pHashPara->hCryptProv;
memcpy(&info.HashAlgorithm, &pHashPara->HashAlgorithm,
sizeof(info.HashAlgorithm));
info.HashAlgorithm = pHashPara->HashAlgorithm;
info.pvHashAuxInfo = pHashPara->pvHashAuxInfo;
msg = CryptMsgOpenToEncode(pHashPara->dwMsgEncodingType, flags, CMSG_HASHED,
&info, NULL, NULL);
if (msg)
{
for (i = 0, ret = TRUE; ret && i < cToBeHashed; i++)
ret = CryptMsgUpdate(msg, rgpbToBeHashed[i], rgcbToBeHashed[i],
i == cToBeHashed - 1 ? TRUE : FALSE);
ret = CryptMsgUpdate(msg, rgpbToBeHashed[i], rgcbToBeHashed[i], i == cToBeHashed - 1);
if (ret)
{
ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, pbHashedBlob,
@@ -356,7 +343,7 @@ BOOL WINAPI CryptVerifyDetachedMessageHash(PCRYPT_HASH_MESSAGE_PARA pHashPara,
for (i = 0; ret && i < cToBeHashed; i++)
{
ret = CryptMsgUpdate(msg, rgpbToBeHashed[i],
rgcbToBeHashed[i], i == cToBeHashed - 1 ? TRUE : FALSE);
rgcbToBeHashed[i], i == cToBeHashed - 1);
}
}
else
@@ -511,7 +498,7 @@ BOOL WINAPI CryptSignMessage(PCRYPT_SIGN_MESSAGE_PARA pSignPara,
for (i = 0; ret && i < cToBeSigned; ++i)
{
ret = CryptMsgUpdate(msg, rgpbToBeSigned[i], rgcbToBeSigned[i],
i == cToBeSigned - 1 ? TRUE : FALSE);
i == cToBeSigned - 1);
}
}
else
+5 -4
View File
@@ -1450,6 +1450,7 @@ static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags,
if (!ret)
{
CSignedEncodeMsg_Close(msg);
CryptMemFree(msg);
msg = NULL;
}
}
@@ -2397,16 +2398,16 @@ static BOOL CDecodeMsg_FinalizeSignedContent(CDecodeMsg *msg,
!strcmp(msg->u.signed_data.info->content.pszObjId,
szOID_RSA_data))
{
CRYPT_DATA_BLOB *blob;
CRYPT_DATA_BLOB *rsa_blob;
ret = CryptDecodeObjectEx(X509_ASN_ENCODING,
X509_OCTET_STRING, content->pbData, content->cbData,
CRYPT_DECODE_ALLOC_FLAG, NULL, &blob, &size);
CRYPT_DECODE_ALLOC_FLAG, NULL, &rsa_blob, &size);
if (ret)
{
ret = CSignedMsgData_Update(&msg->u.signed_data,
blob->pbData, blob->cbData, TRUE, Verify);
LocalFree(blob);
rsa_blob->pbData, rsa_blob->cbData, TRUE, Verify);
LocalFree(rsa_blob);
}
}
else
+4 -4
View File
@@ -842,7 +842,7 @@ static BOOL CRYPT_FormatBits(BYTE bits, const struct BitToString *map,
DWORD mapEntries, void *pbFormat, DWORD *pcbFormat, BOOL *first)
{
DWORD bytesNeeded = sizeof(WCHAR);
int i;
unsigned int i;
BOOL ret = TRUE, localFirst = *first;
for (i = 0; i < mapEntries; i++)
@@ -947,7 +947,7 @@ static BOOL WINAPI CRYPT_FormatKeyUsage(DWORD dwCertEncodingType,
else
{
static BOOL stringsLoaded = FALSE;
int i;
unsigned int i;
DWORD bitStringLen;
BOOL first = TRUE;
@@ -1866,7 +1866,7 @@ static BOOL CRYPT_FormatReason(DWORD dwFormatStrType,
static const WCHAR sep[] = { ',',' ',0 };
static const WCHAR bitsFmt[] = { ' ','(','%','0','2','x',')',0 };
static BOOL stringsLoaded = FALSE;
int i, numReasons = 0;
unsigned int i, numReasons = 0;
BOOL ret = TRUE;
DWORD bytesNeeded = sizeof(WCHAR);
WCHAR bits[6];
@@ -2317,7 +2317,7 @@ static BOOL WINAPI CRYPT_FormatNetscapeCertType(DWORD dwCertEncodingType,
else
{
static BOOL stringsLoaded = FALSE;
int i;
unsigned int i;
DWORD bitStringLen;
BOOL first = TRUE;
+9 -9
View File
@@ -684,7 +684,7 @@ BOOL WINAPI CryptUnregisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName,
CryptMemFree(szKey);
if (rc)
SetLastError(rc);
return rc ? FALSE : TRUE;
return !rc;
}
BOOL WINAPI CryptGetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName,
@@ -721,7 +721,7 @@ BOOL WINAPI CryptGetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName,
SetLastError(rc);
RegCloseKey(hKey);
}
return rc ? FALSE : TRUE;
return !rc;
}
BOOL WINAPI CryptSetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName,
@@ -758,7 +758,7 @@ BOOL WINAPI CryptSetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName,
SetLastError(rc);
RegCloseKey(hKey);
}
return rc ? FALSE : TRUE;
return !rc;
}
static LPCWSTR CRYPT_FindStringInMultiString(LPCWSTR multi, LPCWSTR toFind)
@@ -1053,9 +1053,6 @@ static const WCHAR rc2[] = { 'r','c','2',0 };
static const WCHAR rc4[] = { 'r','c','4',0 };
static const WCHAR sha[] = { 's','h','a',0 };
static const WCHAR sha1[] = { 's','h','a','1',0 };
static const WCHAR sha256[] = { 's','h','a','2','5','6',0 };
static const WCHAR sha384[] = { 's','h','a','3','8','4',0 };
static const WCHAR sha512[] = { 's','h','a','5','1','2',0 };
static const WCHAR RSA[] = { 'R','S','A',0 };
static const WCHAR RSA_KEYX[] = { 'R','S','A','_','K','E','Y','X',0 };
static const WCHAR RSA_SIGN[] = { 'R','S','A','_','S','I','G','N',0 };
@@ -1105,6 +1102,9 @@ static const WCHAR Phone[] = { 'P','h','o','n','e',0 };
static const WCHAR X21Address[] = { 'X','2','1','A','d','d','r','e','s','s',0 };
static const WCHAR dnQualifier[] =
{ 'd','n','Q','u','a','l','i','f','i','e','r',0 };
static const WCHAR SpcSpAgencyInfo[] = { 'S','p','c','S','p','A','g','e','n','c','y','I','n','f','o',0 };
static const WCHAR SpcFinancialCriteria[] = { 'S','p','c','F','i','n','a','n','c','i','a','l','C','r','i','t','e','r','i','a',0 };
static const WCHAR SpcMinimalCriteria[] = { 'S','p','c','M','i','n','i','m','a','l','C','r','i','t','e','r','i','a',0 };
static const WCHAR Email[] = { 'E','m','a','i','l',0 };
static const WCHAR GN[] = { 'G','N',0 };
@@ -1273,9 +1273,9 @@ static const struct OIDInfoConstructor {
{ 6, szOID_NETSCAPE_CA_POLICY_URL, 0, (LPCWSTR)IDS_NETSCAPE_CA_POLICY_URL, NULL },
{ 6, szOID_NETSCAPE_SSL_SERVER_NAME, 0, (LPCWSTR)IDS_NETSCAPE_SSL_SERVER_NAME, NULL },
{ 6, szOID_NETSCAPE_COMMENT, 0, (LPCWSTR)IDS_NETSCAPE_COMMENT, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.10", 0, (LPCWSTR)IDS_SPC_SP_AGENCY_INFO, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.27", 0, (LPCWSTR)IDS_SPC_FINANCIAL_CRITERIA, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.26", 0, (LPCWSTR)IDS_SPC_MINIMAL_CRITERIA, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.10", 0, SpcSpAgencyInfo, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.27", 0, SpcFinancialCriteria, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.26", 0, SpcMinimalCriteria, NULL },
{ 6, szOID_COUNTRY_NAME, 0, (LPCWSTR)IDS_COUNTRY, NULL },
{ 6, szOID_ORGANIZATION_NAME, 0, (LPCWSTR)IDS_ORGANIZATION, NULL },
{ 6, szOID_ORGANIZATIONAL_UNIT_NAME, 0, (LPCWSTR)IDS_ORGANIZATIONAL_UNIT, NULL },
+1 -1
View File
@@ -189,7 +189,7 @@ static const char *trust_status_to_str(DWORD status)
"\n\tbad name constraints");
if (status & CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT)
pos += snprintf(buf + pos, sizeof(buf) - pos,
"\n\tunsuported name constraint");
"\n\tunsupported name constraint");
if (status & CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT)
pos += snprintf(buf + pos, sizeof(buf) - pos,
"\n\tundefined name constraint");
+3 -3
View File
@@ -652,21 +652,21 @@ static BOOL CRYPT_WriteSerializedStoreToStream(HCERTSTORE store,
ret = output(handle, fileHeader, sizeof(fileHeader));
if (ret)
{
memcpy(&interface, pCertInterface, sizeof(interface));
interface = *pCertInterface;
interface.serialize = (SerializeElementFunc)CRYPT_SerializeCertNoHash;
ret = CRYPT_SerializeContextsToStream(output, handle, &interface,
store);
}
if (ret)
{
memcpy(&interface, pCRLInterface, sizeof(interface));
interface = *pCRLInterface;
interface.serialize = (SerializeElementFunc)CRYPT_SerializeCRLNoHash;
ret = CRYPT_SerializeContextsToStream(output, handle, &interface,
store);
}
if (ret)
{
memcpy(&interface, pCTLInterface, sizeof(interface));
interface = *pCTLInterface;
interface.serialize = (SerializeElementFunc)CRYPT_SerializeCTLNoHash;
ret = CRYPT_SerializeContextsToStream(output, handle, &interface,
store);
+3
View File
@@ -634,14 +634,17 @@ static BOOL CRYPT_LoadSIP(const GUID *pgSubject)
if (!sip.pfPut || temp != lib)
goto error;
FreeLibrary(temp);
temp = NULL;
sip.pfCreate = CRYPT_LoadSIPFunc(pgSubject, szCreate, &temp);
if (!sip.pfCreate || temp != lib)
goto error;
FreeLibrary(temp);
temp = NULL;
sip.pfVerify = CRYPT_LoadSIPFunc(pgSubject, szVerify, &temp);
if (!sip.pfVerify || temp != lib)
goto error;
FreeLibrary(temp);
temp = NULL;
sip.pfRemove = CRYPT_LoadSIPFunc(pgSubject, szRemoveSigned, &temp);
if (!sip.pfRemove || temp != lib)
goto error;
+3 -3
View File
@@ -163,7 +163,7 @@ static BOOL CRYPT_MemAddCert(PWINECRYPT_CERTSTORE store, void *cert,
if (ppStoreContext)
*ppStoreContext = CertDuplicateCertificateContext(context);
}
return context ? TRUE : FALSE;
return context != 0;
}
static void *CRYPT_MemEnumCert(PWINECRYPT_CERTSTORE store, void *pPrev)
@@ -208,7 +208,7 @@ static BOOL CRYPT_MemAddCrl(PWINECRYPT_CERTSTORE store, void *crl,
if (ppStoreContext)
*ppStoreContext = CertDuplicateCRLContext(context);
}
return context ? TRUE : FALSE;
return context != 0;
}
static void *CRYPT_MemEnumCrl(PWINECRYPT_CERTSTORE store, void *pPrev)
@@ -253,7 +253,7 @@ static BOOL CRYPT_MemAddCtl(PWINECRYPT_CERTSTORE store, void *ctl,
if (ppStoreContext)
*ppStoreContext = CertDuplicateCTLContext(context);
}
return context ? TRUE : FALSE;
return context != 0;
}
static void *CRYPT_MemEnumCtl(PWINECRYPT_CERTSTORE store, void *pPrev)
+15 -3
View File
@@ -16,7 +16,9 @@ list(APPEND SOURCE
activex.c
array.c
bool.c
compile.c
date.c
decode.c
dispex.c
engine.c
error.c
@@ -24,6 +26,8 @@ list(APPEND SOURCE
global.c
jscript.c
jscript_main.c
jsregexp.c
jsstr.c
jsutils.c
lex.c
math.c
@@ -32,15 +36,23 @@ list(APPEND SOURCE
parser.tab.c
regexp.c
string.c
rsrc.rc
vbarray.c
${CMAKE_CURRENT_BINARY_DIR}/jscript.def)
add_library(jscript SHARED ${SOURCE})
add_library(jscript SHARED ${SOURCE} rsrc.rc)
add_idl_headers(jscript_idlheader jscript_classes.idl)
if(NOT MSVC)
# FIXME: http://www.cmake.org/Bug/view.php?id=12998
#allow_warnings(jscript)
set_source_files_properties(${SOURCE} PROPERTIES COMPILE_FLAGS "-Wno-error")
endif()
set_module_type(jscript win32dll)
target_link_libraries(jscript wine)
add_importlibs(jscript user32 ole32 oleaut32 advapi32 msvcrt kernel32 ntdll)
add_pch(jscript jscript.h)
# jsglobal.tlb needs stdole2.tlb
add_dependencies(jscript stdole2)
add_dependencies(jscript jscript_idlheader stdole2)
add_cd_file(TARGET jscript DESTINATION reactos/system32 FOR all)
set_source_files_properties(rsrc.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/jsglobal.tlb)
+41 -36
View File
@@ -58,7 +58,7 @@ static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid)
{
IInternetHostSecurityManager *secmgr;
IInternetHostSecurityManager *secmgr = NULL;
IObjectWithSite *obj_site;
struct CONFIRMSAFETY cs;
IClassFactoryEx *cfex;
@@ -70,21 +70,25 @@ static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid)
GUID guid;
HRESULT hres;
TRACE("%s\n", debugstr_w(progid));
hres = CLSIDFromProgID(progid, &guid);
if(FAILED(hres))
return NULL;
TRACE("GUID %s\n", debugstr_guid(&guid));
secmgr = get_sec_mgr(ctx);
if(!secmgr)
return NULL;
if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
secmgr = get_sec_mgr(ctx);
if(!secmgr)
return NULL;
policy = 0;
hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN, (BYTE*)&policy, sizeof(policy),
(BYTE*)&guid, sizeof(GUID), 0, 0);
if(FAILED(hres) || policy != URLPOLICY_ALLOW)
return NULL;
policy = 0;
hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
(BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
if(FAILED(hres) || policy != URLPOLICY_ALLOW)
return NULL;
}
hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
if(FAILED(hres))
@@ -100,19 +104,21 @@ static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid)
if(FAILED(hres))
return NULL;
cs.clsid = guid;
cs.pUnk = obj;
cs.dwFlags = 0;
hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY, &bpolicy, &policy_size,
(BYTE*)&cs, sizeof(cs), 0);
if(SUCCEEDED(hres)) {
policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
CoTaskMemFree(bpolicy);
}
if(secmgr) {
cs.clsid = guid;
cs.pUnk = obj;
cs.dwFlags = 0;
hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
&bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
if(SUCCEEDED(hres)) {
policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
CoTaskMemFree(bpolicy);
}
if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
IUnknown_Release(obj);
return NULL;
if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
IUnknown_Release(obj);
return NULL;
}
}
hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
@@ -126,7 +132,6 @@ static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid)
}
IObjectWithSite_Release(obj_site);
if(!ax_site || FAILED(hres)) {
IObjectWithSite_Release(obj_site);
IUnknown_Release(obj);
return NULL;
}
@@ -135,12 +140,12 @@ static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid)
return obj;
}
static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
jsstr_t * progid;
IDispatch *disp;
IUnknown *obj;
BSTR progid;
HRESULT hres;
TRACE("\n");
@@ -150,24 +155,25 @@ static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
return E_NOTIMPL;
}
if(ctx->safeopt != (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)) {
if(ctx->safeopt != (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)
&& ctx->safeopt != INTERFACE_USES_DISPEX) {
FIXME("Unsupported safeopt %x\n", ctx->safeopt);
return E_NOTIMPL;
}
if(arg_cnt(dp) != 1) {
FIXME("unsupported arg_cnt %d\n", arg_cnt(dp));
if(argc != 1) {
FIXME("unsupported argc %d\n", argc);
return E_NOTIMPL;
}
hres = to_string(ctx, get_arg(dp,0), ei, &progid);
hres = to_string(ctx, argv[0], &progid);
if(FAILED(hres))
return hres;
obj = create_activex_object(ctx, progid);
SysFreeString(progid);
obj = create_activex_object(ctx, progid->str);
jsstr_release(progid);
if(!obj)
return throw_generic_error(ctx, ei, IDS_CREATE_OBJ_ERROR, NULL);
return throw_generic_error(ctx, JS_E_CANNOT_CREATE_OBJ, NULL);
hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&disp);
IUnknown_Release(obj);
@@ -176,14 +182,13 @@ static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
return E_NOTIMPL;
}
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = disp;
*r = jsval_disp(disp);
return S_OK;
}
HRESULT create_activex_constr(script_ctx_t *ctx, DispatchEx **ret)
HRESULT create_activex_constr(script_ctx_t *ctx, jsdisp_t **ret)
{
DispatchEx *prototype;
jsdisp_t *prototype;
HRESULT hres;
static const WCHAR ActiveXObjectW[] = {'A','c','t','i','v','e','X','O','b','j','e','c','t',0};
+319 -370
View File
File diff suppressed because it is too large Load Diff
+39 -42
View File
@@ -24,9 +24,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct {
DispatchEx dispex;
jsdisp_t dispex;
VARIANT_BOOL val;
BOOL val;
} BoolInstance;
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
@@ -38,8 +38,7 @@ static inline BoolInstance *bool_this(vdisp_t *jsthis)
}
/* ECMA-262 3rd Edition 15.6.4.2 */
static HRESULT Bool_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Bool_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
{
BoolInstance *bool;
@@ -49,51 +48,44 @@ static HRESULT Bool_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DIS
TRACE("\n");
if(!(bool = bool_this(jsthis)))
return throw_type_error(ctx, ei, IDS_NOT_BOOL, NULL);
return throw_type_error(ctx, JS_E_BOOLEAN_EXPECTED, NULL);
if(retv) {
BSTR val;
if(bool->val) val = SysAllocString(trueW);
else val = SysAllocString(falseW);
if(r) {
jsstr_t *val;
val = jsstr_alloc(bool->val ? trueW : falseW);
if(!val)
return E_OUTOFMEMORY;
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = val;
*r = jsval_string(val);
}
return S_OK;
}
/* ECMA-262 3rd Edition 15.6.4.3 */
static HRESULT Bool_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Bool_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
{
BoolInstance *bool;
TRACE("\n");
if(!(bool = bool_this(jsthis)))
return throw_type_error(ctx, ei, IDS_NOT_BOOL, NULL);
if(retv) {
V_VT(retv) = VT_BOOL;
V_BOOL(retv) = bool->val;
}
return throw_type_error(ctx, JS_E_BOOLEAN_EXPECTED, NULL);
if(r)
*r = jsval_bool(bool->val);
return S_OK;
}
static HRESULT Bool_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Bool_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
TRACE("\n");
switch(flags) {
case INVOKE_FUNC:
return throw_type_error(ctx, ei, IDS_NOT_FUNC, NULL);
return throw_type_error(ctx, JS_E_FUNCTION_EXPECTED, NULL);
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
@@ -117,36 +109,41 @@ static const builtin_info_t Bool_info = {
NULL
};
static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
HRESULT hres;
VARIANT_BOOL value = VARIANT_FALSE;
static const builtin_info_t BoolInst_info = {
JSCLASS_BOOLEAN,
{NULL, Bool_value, 0},
0, NULL,
NULL,
NULL
};
if(arg_cnt(dp)) {
hres = to_boolean(get_arg(dp,0), &value);
static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
BOOL value = FALSE;
HRESULT hres;
if(argc) {
hres = to_boolean(argv[0], &value);
if(FAILED(hres))
return hres;
}
switch(flags) {
case DISPATCH_CONSTRUCT: {
DispatchEx *bool;
jsdisp_t *bool;
hres = create_bool(ctx, value, &bool);
if(FAILED(hres))
return hres;
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(bool);
*r = jsval_obj(bool);
return S_OK;
}
case INVOKE_FUNC:
if(retv) {
V_VT(retv) = VT_BOOL;
V_BOOL(retv) = value;
}
if(r)
*r = jsval_bool(value);
return S_OK;
default:
@@ -157,7 +154,7 @@ static HRESULT BoolConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
return S_OK;
}
static HRESULT alloc_bool(script_ctx_t *ctx, DispatchEx *object_prototype, BoolInstance **ret)
static HRESULT alloc_bool(script_ctx_t *ctx, jsdisp_t *object_prototype, BoolInstance **ret)
{
BoolInstance *bool;
HRESULT hres;
@@ -169,7 +166,7 @@ static HRESULT alloc_bool(script_ctx_t *ctx, DispatchEx *object_prototype, BoolI
if(object_prototype)
hres = init_dispex(&bool->dispex, ctx, &Bool_info, object_prototype);
else
hres = init_dispex_from_constr(&bool->dispex, ctx, &Bool_info, ctx->bool_constr);
hres = init_dispex_from_constr(&bool->dispex, ctx, &BoolInst_info, ctx->bool_constr);
if(FAILED(hres)) {
heap_free(bool);
@@ -180,7 +177,7 @@ static HRESULT alloc_bool(script_ctx_t *ctx, DispatchEx *object_prototype, BoolI
return S_OK;
}
HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
HRESULT create_bool_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
{
BoolInstance *bool;
HRESULT hres;
@@ -191,14 +188,14 @@ HRESULT create_bool_constr(script_ctx_t *ctx, DispatchEx *object_prototype, Disp
if(FAILED(hres))
return hres;
hres = create_builtin_function(ctx, BoolConstr_value, BooleanW, NULL,
hres = create_builtin_constructor(ctx, BoolConstr_value, BooleanW, NULL,
PROPF_CONSTR|1, &bool->dispex, ret);
jsdisp_release(&bool->dispex);
return hres;
}
HRESULT create_bool(script_ctx_t *ctx, VARIANT_BOOL b, DispatchEx **ret)
HRESULT create_bool(script_ctx_t *ctx, BOOL b, jsdisp_t **ret)
{
BoolInstance *bool;
HRESULT hres;
File diff suppressed because it is too large Load Diff
+601 -716
View File
File diff suppressed because it is too large Load Diff
+180
View File
@@ -0,0 +1,180 @@
/*
* Copyright 2012 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "jscript.h"
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
/*
* This file implements algorithm for decoding scripts encoded by
* screnc.exe. The 'secret' algorithm that's well documented here:
* http://www.virtualconspiracy.com/content/articles/breaking-screnc
*/
static const unsigned char pick_encoding[64] = {
1,2,0,1,2,0,2,0,0,2,0,2,1,0,2,0,
1,0,2,0,1,1,2,0,0,2,1,0,2,0,0,2,
1,1,0,2,0,2,0,1,0,1,1,2,0,1,0,2,
1,0,2,0,1,1,2,0,0,1,1,2,0,1,0,2};
static const unsigned char dictionary[][3] = {
{0x00,0x00,0x00}, {0x01,0x01,0x01}, {0x02,0x02,0x02}, {0x03,0x03,0x03},
{0x04,0x04,0x04}, {0x05,0x05,0x05}, {0x06,0x06,0x06}, {0x07,0x07,0x07},
{0x08,0x08,0x08}, {0x7b,0x57,0x6e}, {0x0a,0x0a,0x0a}, {0x0b,0x0b,0x0b},
{0x0c,0x0c,0x0c}, {0x0d,0x0d,0x0d}, {0x0e,0x0e,0x0e}, {0x0f,0x0f,0x0f},
{0x10,0x10,0x10}, {0x11,0x11,0x11}, {0x12,0x12,0x12}, {0x13,0x13,0x13},
{0x14,0x14,0x14}, {0x15,0x15,0x15}, {0x16,0x16,0x16}, {0x17,0x17,0x17},
{0x18,0x18,0x18}, {0x19,0x19,0x19}, {0x1a,0x1a,0x1a}, {0x1b,0x1b,0x1b},
{0x1c,0x1c,0x1c}, {0x1d,0x1d,0x1d}, {0x1e,0x1e,0x1e}, {0x1f,0x1f,0x1f},
{0x32,0x2e,0x2d}, {0x30,0x47,0x75}, {0x21,0x7a,0x52}, {0x29,0x56,0x60},
{0x5b,0x42,0x71}, {0x38,0x6a,0x5e}, {0x33,0x2f,0x49}, {0x3d,0x26,0x5c},
{0x58,0x49,0x62}, {0x3a,0x41,0x7d}, {0x35,0x34,0x29}, {0x65,0x32,0x36},
{0x39,0x5b,0x20}, {0x5c,0x76,0x7c}, {0x56,0x72,0x7a}, {0x73,0x43,0x7f},
{0x66,0x38,0x6b}, {0x4e,0x39,0x63}, {0x45,0x70,0x33}, {0x6b,0x45,0x2b},
{0x62,0x68,0x68}, {0x59,0x71,0x51}, {0x78,0x4f,0x66}, {0x5e,0x09,0x76},
{0x7d,0x62,0x31}, {0x4a,0x44,0x64}, {0x6d,0x23,0x54}, {0x71,0x75,0x43},
{0x00,0x00,0x00}, {0x60,0x7e,0x3a}, {0x00,0x00,0x00}, {0x53,0x5e,0x7e},
{0x00,0x00,0x00}, {0x42,0x77,0x45}, {0x27,0x4a,0x2c}, {0x48,0x61,0x2a},
{0x72,0x5d,0x74}, {0x75,0x22,0x27}, {0x31,0x4b,0x37}, {0x37,0x6f,0x44},
{0x4d,0x4e,0x79}, {0x52,0x3b,0x59}, {0x22,0x4c,0x2f}, {0x54,0x50,0x6f},
{0x6a,0x67,0x26}, {0x47,0x2a,0x72}, {0x64,0x7d,0x6a}, {0x2d,0x74,0x39},
{0x20,0x54,0x7b}, {0x7f,0x2b,0x3f}, {0x2e,0x2d,0x38}, {0x4c,0x2c,0x77},
{0x5d,0x30,0x67}, {0x7e,0x6e,0x53}, {0x6c,0x6b,0x47}, {0x6f,0x66,0x34},
{0x79,0x35,0x78}, {0x74,0x25,0x5d}, {0x43,0x21,0x30}, {0x26,0x64,0x23},
{0x76,0x4d,0x5a}, {0x25,0x52,0x5b}, {0x24,0x63,0x6c}, {0x2b,0x3f,0x48},
{0x28,0x7b,0x55}, {0x23,0x78,0x70}, {0x41,0x29,0x69}, {0x34,0x28,0x2e},
{0x09,0x73,0x4c}, {0x2a,0x59,0x21}, {0x44,0x33,0x24}, {0x3f,0x7f,0x4e},
{0x77,0x6d,0x50}, {0x3b,0x55,0x09}, {0x55,0x53,0x56}, {0x69,0x7c,0x73},
{0x61,0x3a,0x35}, {0x63,0x5f,0x61}, {0x50,0x65,0x4b}, {0x67,0x46,0x58},
{0x51,0x58,0x3b}, {0x49,0x31,0x57}, {0x4f,0x69,0x22}, {0x46,0x6c,0x6d},
{0x68,0x5a,0x4d}, {0x7c,0x48,0x25}, {0x36,0x27,0x28}, {0x70,0x5c,0x46},
{0x6e,0x3d,0x4a}, {0x7a,0x24,0x32}, {0x2f,0x79,0x41}, {0x5f,0x37,0x3d},
{0x4b,0x60,0x5f}, {0x5a,0x51,0x4f}, {0x2c,0x20,0x42}, {0x57,0x36,0x65}};
static const int digits[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,
0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20,
0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff};
static BOOL decode_dword(const WCHAR *p, DWORD *ret)
{
DWORD i;
for(i=0; i<6; i++) {
if(p[i] > sizeof(digits)/sizeof(*digits) || digits[p[i]] == 0xff)
return FALSE;
}
if(p[6] != '=' || p[7] != '=')
return FALSE;
*ret = (digits[p[0]] << 2)
+ (digits[p[1]] >> 4)
+ ((digits[p[1]] & 0xf) << 12)
+ ((digits[p[2]] >> 2) << 8)
+ ((digits[p[2]] & 0x3) << 22)
+ (digits[p[3]] << 16)
+ ((digits[p[4]] << 2) << 24)
+ ((digits[p[5]] >> 4) << 24);
return TRUE;
}
HRESULT decode_source(WCHAR *code)
{
const WCHAR *src = code;
WCHAR *dst = code;
static const WCHAR decode_beginW[] = {'#','@','~','^'};
static const WCHAR decode_endW[] = {'^','#','~','@'};
while(*src) {
if(!strncmpW(src, decode_beginW, sizeof(decode_beginW)/sizeof(*decode_beginW))) {
DWORD len, i, j=0, csum, s=0;
src += sizeof(decode_beginW)/sizeof(*decode_beginW);
if(!decode_dword(src, &len))
return JS_E_INVALID_CHAR;
src += 8;
for(i=0; i<len; i++) {
if (src[i] == '@') {
switch(src[++i]) {
case '#':
s += dst[j++] = '\r';
break;
case '&':
s += dst[j++] = '\n';
break;
case '!':
s += dst[j++] = '<';
break;
case '*':
s += dst[j++] = '>';
break;
case '$':
s += dst[j++] = '@';
break;
default:
FIXME("unescape %c\n", src[i]);
return E_FAIL;
}
}else if (src[i] < 128) {
s += dst[j] = dictionary[src[i]][pick_encoding[j%64]];
j++;
}else {
FIXME("Unsupported char %c\n", src[i]);
return E_FAIL;
}
}
src += len;
dst += j;
if(!decode_dword(src, &csum) || s != csum)
return JS_E_INVALID_CHAR;
src += 8;
if(strncmpW(src, decode_endW, sizeof(decode_endW)/sizeof(*decode_endW)))
return JS_E_INVALID_CHAR;
src += sizeof(decode_endW)/sizeof(*decode_endW);
}else {
*dst++ = *src++;
}
}
*dst = 0;
TRACE("decoded %s\n", debugstr_w(code));
return S_OK;
}
+808 -347
View File
File diff suppressed because it is too large Load Diff
+1510 -2225
View File
File diff suppressed because it is too large Load Diff
+279 -226
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2008 Jacek Caban for CodeWeavers
* Copyright 2008,2011 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,91 +17,231 @@
*/
typedef struct _source_elements_t source_elements_t;
typedef struct _function_expression_t function_expression_t;
typedef struct _expression_t expression_t;
typedef struct _statement_t statement_t;
typedef struct _function_declaration_t {
function_expression_t *expr;
struct _function_declaration_t *next;
} function_declaration_t;
typedef struct _var_list_t {
const WCHAR *identifier;
struct _var_list_t *next;
} var_list_t;
typedef struct _func_stack {
function_declaration_t *func_head;
function_declaration_t *func_tail;
var_list_t *var_head;
var_list_t *var_tail;
struct _func_stack *next;
} func_stack_t;
typedef struct _parser_ctx_t {
LONG ref;
WCHAR *begin;
typedef struct {
const WCHAR *begin;
const WCHAR *end;
const WCHAR *ptr;
script_ctx_t *script;
source_elements_t *source;
BOOL nl;
BOOL implicit_nl_semicolon;
BOOL is_html;
BOOL lexer_error;
HRESULT hres;
jsheap_t heap;
func_stack_t *func_stack;
struct _parser_ctx_t *next;
heap_pool_t heap;
} parser_ctx_t;
HRESULT script_parse(script_ctx_t*,const WCHAR*,const WCHAR*,parser_ctx_t**);
void parser_release(parser_ctx_t*);
#define OP_LIST \
X(add, 1, 0,0) \
X(and, 1, 0,0) \
X(array, 1, 0,0) \
X(assign, 1, 0,0) \
X(assign_call,1, ARG_UINT, 0) \
X(bool, 1, ARG_INT, 0) \
X(bneg, 1, 0,0) \
X(call, 1, ARG_UINT, ARG_UINT) \
X(call_member,1, ARG_UINT, ARG_UINT) \
X(carray, 1, ARG_UINT, 0) \
X(case, 0, ARG_ADDR, 0) \
X(cnd_nz, 0, ARG_ADDR, 0) \
X(cnd_z, 0, ARG_ADDR, 0) \
X(delete, 1, 0,0) \
X(delete_ident,1,ARG_BSTR, 0) \
X(div, 1, 0,0) \
X(double, 1, ARG_DBL, 0) \
X(end_finally,1, 0,0) \
X(eq, 1, 0,0) \
X(eq2, 1, 0,0) \
X(forin, 0, ARG_ADDR, 0) \
X(func, 1, ARG_UINT, 0) \
X(gt, 1, 0,0) \
X(gteq, 1, 0,0) \
X(ident, 1, ARG_BSTR, 0) \
X(identid, 1, ARG_BSTR, ARG_INT) \
X(in, 1, 0,0) \
X(instanceof, 1, 0,0) \
X(int, 1, ARG_INT, 0) \
X(jmp, 0, ARG_ADDR, 0) \
X(jmp_z, 0, ARG_ADDR, 0) \
X(lshift, 1, 0,0) \
X(lt, 1, 0,0) \
X(lteq, 1, 0,0) \
X(member, 1, ARG_BSTR, 0) \
X(memberid, 1, ARG_UINT, 0) \
X(minus, 1, 0,0) \
X(mod, 1, 0,0) \
X(mul, 1, 0,0) \
X(neg, 1, 0,0) \
X(neq, 1, 0,0) \
X(neq2, 1, 0,0) \
X(new, 1, ARG_UINT, 0) \
X(new_obj, 1, 0,0) \
X(null, 1, 0,0) \
X(obj_prop, 1, ARG_BSTR, 0) \
X(or, 1, 0,0) \
X(pop, 1, ARG_UINT, 0) \
X(pop_except, 1, 0,0) \
X(pop_scope, 1, 0,0) \
X(postinc, 1, ARG_INT, 0) \
X(preinc, 1, ARG_INT, 0) \
X(push_except,1, ARG_ADDR, ARG_BSTR) \
X(push_scope, 1, 0,0) \
X(regexp, 1, ARG_STR, ARG_UINT) \
X(rshift, 1, 0,0) \
X(rshift2, 1, 0,0) \
X(str, 1, ARG_STR, 0) \
X(this, 1, 0,0) \
X(throw, 0, 0,0) \
X(throw_ref, 0, ARG_UINT, 0) \
X(throw_type, 0, ARG_UINT, ARG_STR) \
X(tonum, 1, 0,0) \
X(typeof, 1, 0,0) \
X(typeofid, 1, 0,0) \
X(typeofident,1, 0,0) \
X(refval, 1, 0,0) \
X(ret, 0, 0,0) \
X(setret, 1, 0,0) \
X(sub, 1, 0,0) \
X(undefined, 1, 0,0) \
X(var_set, 1, ARG_BSTR, 0) \
X(void, 1, 0,0) \
X(xor, 1, 0,0)
int parser_lex(void*,parser_ctx_t*);
typedef enum {
#define X(x,a,b,c) OP_##x,
OP_LIST
#undef X
OP_LAST
} jsop_t;
static inline void parser_addref(parser_ctx_t *ctx)
typedef union {
BSTR bstr;
LONG lng;
jsstr_t *str;
unsigned uint;
} instr_arg_t;
typedef enum {
ARG_NONE = 0,
ARG_ADDR,
ARG_BSTR,
ARG_DBL,
ARG_FUNC,
ARG_INT,
ARG_STR,
ARG_UINT
} instr_arg_type_t;
typedef struct {
jsop_t op;
union {
instr_arg_t arg[2];
double dbl;
} u;
} instr_t;
typedef struct _function_code_t {
BSTR name;
unsigned instr_off;
const WCHAR *source;
unsigned source_len;
unsigned func_cnt;
struct _function_code_t *funcs;
unsigned var_cnt;
BSTR *variables;
unsigned param_cnt;
BSTR *params;
} function_code_t;
typedef struct _bytecode_t {
LONG ref;
instr_t *instrs;
heap_pool_t heap;
function_code_t global_code;
WCHAR *source;
BSTR *bstr_pool;
unsigned bstr_pool_size;
unsigned bstr_cnt;
jsstr_t **str_pool;
unsigned str_pool_size;
unsigned str_cnt;
struct _bytecode_t *next;
} bytecode_t;
HRESULT compile_script(script_ctx_t*,const WCHAR*,const WCHAR*,const WCHAR*,BOOL,BOOL,bytecode_t**) DECLSPEC_HIDDEN;
void release_bytecode(bytecode_t*) DECLSPEC_HIDDEN;
static inline void bytecode_addref(bytecode_t *code)
{
ctx->ref++;
code->ref++;
}
HRESULT script_parse(script_ctx_t*,const WCHAR*,const WCHAR*,BOOL,parser_ctx_t**) DECLSPEC_HIDDEN;
void parser_release(parser_ctx_t*) DECLSPEC_HIDDEN;
int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN;
static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size)
{
return jsheap_alloc(&ctx->heap, size);
return heap_pool_alloc(&ctx->heap, size);
}
static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size)
{
return jsheap_alloc(&ctx->script->tmp_heap, size);
return heap_pool_alloc(&ctx->script->tmp_heap, size);
}
typedef struct _scope_chain_t {
LONG ref;
DispatchEx *obj;
jsdisp_t *jsobj;
IDispatch *obj;
struct _scope_chain_t *next;
} scope_chain_t;
HRESULT scope_push(scope_chain_t*,DispatchEx*,scope_chain_t**);
void scope_release(scope_chain_t*);
HRESULT scope_push(scope_chain_t*,jsdisp_t*,IDispatch*,scope_chain_t**) DECLSPEC_HIDDEN;
void scope_release(scope_chain_t*) DECLSPEC_HIDDEN;
static inline void scope_addref(scope_chain_t *scope)
{
scope->ref++;
}
typedef struct _except_frame_t except_frame_t;
struct _exec_ctx_t {
LONG ref;
parser_ctx_t *parser;
bytecode_t *code;
script_ctx_t *script;
scope_chain_t *scope_chain;
DispatchEx *var_disp;
jsdisp_t *var_disp;
IDispatch *this_obj;
function_code_t *func_code;
BOOL is_global;
jsval_t *stack;
unsigned stack_size;
unsigned top;
except_frame_t *except_frame;
jsval_t ret;
unsigned ip;
};
static inline void exec_addref(exec_ctx_t *ctx)
@@ -109,25 +249,12 @@ static inline void exec_addref(exec_ctx_t *ctx)
ctx->ref++;
}
typedef enum {
EXECT_PROGRAM,
EXECT_FUNCTION,
EXECT_EVAL
} exec_type_t;
void exec_release(exec_ctx_t*);
HRESULT create_exec_ctx(script_ctx_t*,IDispatch*,DispatchEx*,scope_chain_t*,exec_ctx_t**);
HRESULT exec_source(exec_ctx_t*,parser_ctx_t*,source_elements_t*,exec_type_t,jsexcept_t*,VARIANT*);
typedef struct _statement_t statement_t;
typedef struct _expression_t expression_t;
typedef struct _parameter_t parameter_t;
HRESULT create_source_function(parser_ctx_t*,parameter_t*,source_elements_t*,scope_chain_t*,
const WCHAR*,DWORD,DispatchEx**);
void exec_release(exec_ctx_t*) DECLSPEC_HIDDEN;
HRESULT create_exec_ctx(script_ctx_t*,IDispatch*,jsdisp_t*,scope_chain_t*,BOOL,exec_ctx_t**) DECLSPEC_HIDDEN;
HRESULT exec_source(exec_ctx_t*,bytecode_t*,function_code_t*,BOOL,jsval_t*) DECLSPEC_HIDDEN;
HRESULT create_source_function(script_ctx_t*,bytecode_t*,function_code_t*,scope_chain_t*,jsdisp_t**) DECLSPEC_HIDDEN;
typedef enum {
LT_INT,
LT_DOUBLE,
LT_STRING,
LT_BOOL,
@@ -138,11 +265,9 @@ typedef enum {
typedef struct {
literal_type_t type;
union {
LONG lval;
double dval;
const WCHAR *wstr;
VARIANT_BOOL bval;
IDispatch *disp;
BOOL bval;
struct {
const WCHAR *str;
DWORD str_len;
@@ -151,29 +276,38 @@ typedef struct {
} u;
} literal_t;
literal_t *parse_regexp(parser_ctx_t*);
literal_t *parse_regexp(parser_ctx_t*) DECLSPEC_HIDDEN;
literal_t *new_boolean_literal(parser_ctx_t*,BOOL) DECLSPEC_HIDDEN;
typedef struct _variable_declaration_t {
const WCHAR *identifier;
expression_t *expr;
struct _variable_declaration_t *next;
struct _variable_declaration_t *global_next; /* for compiler */
} variable_declaration_t;
typedef struct {
enum{
RT_NORMAL,
RT_RETURN,
RT_BREAK,
RT_CONTINUE
} type;
jsexcept_t ei;
} return_type_t;
typedef HRESULT (*statement_eval_t)(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
typedef enum {
STAT_BLOCK,
STAT_BREAK,
STAT_CONTINUE,
STAT_EMPTY,
STAT_EXPR,
STAT_FOR,
STAT_FORIN,
STAT_IF,
STAT_LABEL,
STAT_RETURN,
STAT_SWITCH,
STAT_THROW,
STAT_TRY,
STAT_VAR,
STAT_WHILE,
STAT_WITH
} statement_type_t;
struct _statement_t {
statement_eval_t eval;
statement_type_t type;
statement_t *next;
};
@@ -265,71 +399,106 @@ typedef struct {
statement_t *finally_statement;
} try_statement_t;
HRESULT block_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT var_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT empty_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT expression_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT if_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT while_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT for_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT forin_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT continue_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT break_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT return_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT with_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT labelled_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT switch_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT throw_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
HRESULT try_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*);
typedef struct {
enum {
EXPRVAL_VARIANT,
EXPRVAL_JSVAL,
EXPRVAL_IDREF,
EXPRVAL_NAMEREF,
EXPRVAL_INVALID
} type;
union {
VARIANT var;
jsval_t val;
struct {
IDispatch *disp;
DISPID id;
} idref;
struct {
IDispatch *disp;
BSTR name;
} nameref;
BSTR identifier;
} u;
} exprval_t;
typedef HRESULT (*expression_eval_t)(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
typedef enum {
EXPR_COMMA,
EXPR_OR,
EXPR_AND,
EXPR_BOR,
EXPR_BXOR,
EXPR_BAND,
EXPR_INSTANCEOF,
EXPR_IN,
EXPR_ADD,
EXPR_SUB,
EXPR_MUL,
EXPR_DIV,
EXPR_MOD,
EXPR_DELETE,
EXPR_VOID,
EXPR_TYPEOF,
EXPR_MINUS,
EXPR_PLUS,
EXPR_POSTINC,
EXPR_POSTDEC,
EXPR_PREINC,
EXPR_PREDEC,
EXPR_EQ,
EXPR_EQEQ,
EXPR_NOTEQ,
EXPR_NOTEQEQ,
EXPR_LESS,
EXPR_LESSEQ,
EXPR_GREATER,
EXPR_GREATEREQ,
EXPR_BITNEG,
EXPR_LOGNEG,
EXPR_LSHIFT,
EXPR_RSHIFT,
EXPR_RRSHIFT,
EXPR_ASSIGN,
EXPR_ASSIGNLSHIFT,
EXPR_ASSIGNRSHIFT,
EXPR_ASSIGNRRSHIFT,
EXPR_ASSIGNADD,
EXPR_ASSIGNSUB,
EXPR_ASSIGNMUL,
EXPR_ASSIGNDIV,
EXPR_ASSIGNMOD,
EXPR_ASSIGNAND,
EXPR_ASSIGNOR,
EXPR_ASSIGNXOR,
EXPR_COND,
EXPR_ARRAY,
EXPR_MEMBER,
EXPR_NEW,
EXPR_CALL,
EXPR_THIS,
EXPR_FUNC,
EXPR_IDENT,
EXPR_ARRAYLIT,
EXPR_PROPVAL,
EXPR_LITERAL
} expression_type_t;
struct _expression_t {
expression_eval_t eval;
expression_type_t type;
};
struct _parameter_t {
typedef struct _parameter_t {
const WCHAR *identifier;
struct _parameter_t *next;
};
} parameter_t;
struct _source_elements_t {
statement_t *statement;
statement_t *statement_tail;
function_declaration_t *functions;
var_list_t *variables;
};
struct _function_expression_t {
typedef struct _function_expression_t {
expression_t expr;
const WCHAR *identifier;
parameter_t *parameter_list;
source_elements_t *source_elements;
const WCHAR *src_str;
DWORD src_len;
};
struct _function_expression_t *next; /* for compiler */
} function_expression_t;
typedef struct {
expression_t expr;
@@ -349,12 +518,6 @@ typedef struct {
expression_t *false_expression;
} conditional_expression_t;
typedef struct {
expression_t expr;
expression_t *member_expr;
expression_t *expression;
} array_expression_t;
typedef struct {
expression_t expr;
expression_t *expression;
@@ -407,113 +570,3 @@ typedef struct {
expression_t expr;
prop_val_t *property_list;
} property_value_expression_t;
typedef enum {
EXPR_COMMA,
EXPR_OR,
EXPR_AND,
EXPR_BOR,
EXPR_BXOR,
EXPR_BAND,
EXPR_INSTANCEOF,
EXPR_IN,
EXPR_ADD,
EXPR_SUB,
EXPR_MUL,
EXPR_DIV,
EXPR_MOD,
EXPR_DELETE,
EXPR_VOID,
EXPR_TYPEOF,
EXPR_MINUS,
EXPR_PLUS,
EXPR_POSTINC,
EXPR_POSTDEC,
EXPR_PREINC,
EXPR_PREDEC,
EXPR_EQ,
EXPR_EQEQ,
EXPR_NOTEQ,
EXPR_NOTEQEQ,
EXPR_LESS,
EXPR_LESSEQ,
EXPR_GREATER,
EXPR_GREATEREQ,
EXPR_BITNEG,
EXPR_LOGNEG,
EXPR_LSHIFT,
EXPR_RSHIFT,
EXPR_RRSHIFT,
EXPR_ASSIGN,
EXPR_ASSIGNLSHIFT,
EXPR_ASSIGNRSHIFT,
EXPR_ASSIGNRRSHIFT,
EXPR_ASSIGNADD,
EXPR_ASSIGNSUB,
EXPR_ASSIGNMUL,
EXPR_ASSIGNDIV,
EXPR_ASSIGNMOD,
EXPR_ASSIGNAND,
EXPR_ASSIGNOR,
EXPR_ASSIGNXOR
} expression_type_t;
HRESULT function_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT conditional_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT array_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT member_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT call_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT this_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT identifier_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT literal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT array_literal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT property_value_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT comma_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT logical_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT logical_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT binary_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT binary_xor_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT binary_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT instanceof_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT in_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT add_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT sub_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT mul_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT div_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT mod_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT delete_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT void_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT typeof_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT minus_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT plus_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT post_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT post_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT pre_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT pre_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT equal2_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT not_equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT not_equal2_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT less_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT lesseq_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT greater_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT greatereq_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT binary_negation_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT logical_negation_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT left_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT right_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT right2_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_lshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_rshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_rrshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_add_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_sub_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_mul_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_div_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_mod_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
HRESULT assign_xor_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*);
+160 -250
View File
@@ -26,171 +26,104 @@
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct {
DispatchEx dispex;
VARIANT number;
VARIANT description;
VARIANT message;
} ErrorInstance;
static const WCHAR descriptionW[] = {'d','e','s','c','r','i','p','t','i','o','n',0};
static const WCHAR messageW[] = {'m','e','s','s','a','g','e',0};
static const WCHAR nameW[] = {'n','a','m','e',0};
static const WCHAR numberW[] = {'n','u','m','b','e','r',0};
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
static inline ErrorInstance *error_from_vdisp(vdisp_t *vdisp)
{
return (ErrorInstance*)vdisp->u.jsdisp;
}
static inline ErrorInstance *error_this(vdisp_t *jsthis)
{
return is_vclass(jsthis, JSCLASS_ERROR) ? error_from_vdisp(jsthis) : NULL;
}
static HRESULT Error_number(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
ErrorInstance *This = error_from_vdisp(jsthis);
TRACE("\n");
switch(flags) {
case DISPATCH_PROPERTYGET:
return VariantCopy(retv, &This->number);
case DISPATCH_PROPERTYPUT:
return VariantCopy(&This->number, get_arg(dp, 0));
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
}
}
static HRESULT Error_description(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
ErrorInstance *This = error_from_vdisp(jsthis);
TRACE("\n");
switch(flags) {
case DISPATCH_PROPERTYGET:
return VariantCopy(retv, &This->description);
case DISPATCH_PROPERTYPUT:
return VariantCopy(&This->description, get_arg(dp, 0));
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
}
}
/* ECMA-262 3rd Edition 15.11.4.3 */
static HRESULT Error_message(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
ErrorInstance *This = error_from_vdisp(jsthis);
TRACE("\n");
switch(flags) {
case DISPATCH_PROPERTYGET:
return VariantCopy(retv, &This->message);
case DISPATCH_PROPERTYPUT:
return VariantCopy(&This->message, get_arg(dp, 0));
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
}
}
/* ECMA-262 3rd Edition 15.11.4.4 */
static HRESULT Error_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
static HRESULT Error_toString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags,
unsigned argc, jsval_t *argv, jsval_t *r)
{
ErrorInstance *error;
BSTR name, msg = NULL, ret = NULL;
VARIANT v;
jsdisp_t *jsthis;
jsstr_t *name = NULL, *msg = NULL, *ret = NULL;
jsval_t v;
HRESULT hres;
static const WCHAR str[] = {'[','o','b','j','e','c','t',' ','E','r','r','o','r',']',0};
static const WCHAR object_errorW[] = {'[','o','b','j','e','c','t',' ','E','r','r','o','r',']',0};
TRACE("\n");
error = error_this(jsthis);
if(ctx->version < 2 || !error) {
if(retv) {
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = SysAllocString(str);
if(!V_BSTR(retv))
jsthis = get_jsdisp(vthis);
if(!jsthis || ctx->version < 2) {
if(r) {
jsstr_t *str;
str = jsstr_alloc(object_errorW);
if(!str)
return E_OUTOFMEMORY;
*r = jsval_string(str);
}
return S_OK;
}
hres = jsdisp_propget_name(&error->dispex, nameW, &v, ei, caller);
hres = jsdisp_propget_name(jsthis, nameW, &v);
if(FAILED(hres))
return hres;
hres = to_string(ctx, &v, ei, &name);
VariantClear(&v);
if(FAILED(hres))
return hres;
if(!is_undefined(v)) {
hres = to_string(ctx, v, &name);
jsval_release(v);
if(FAILED(hres))
return hres;
}
if(V_VT(&error->message) != VT_EMPTY) {
hres = to_string(ctx, &error->message, ei, &msg);
if(SUCCEEDED(hres) && !*msg) {
SysFreeString(msg);
msg = NULL;
hres = jsdisp_propget_name(jsthis, messageW, &v);
if(SUCCEEDED(hres)) {
if(!is_undefined(v)) {
hres = to_string(ctx, v, &msg);
jsval_release(v);
}
}
if(SUCCEEDED(hres)) {
if(msg) {
DWORD name_len, msg_len;
unsigned name_len = name ? jsstr_length(name) : 0;
unsigned msg_len = msg ? jsstr_length(msg) : 0;
name_len = SysStringLen(name);
msg_len = SysStringLen(msg);
ret = SysAllocStringLen(NULL, name_len + msg_len + 2);
if(name_len && msg_len) {
ret = jsstr_alloc_buf(name_len + msg_len + 2);
if(ret) {
memcpy(ret, name, name_len*sizeof(WCHAR));
ret[name_len] = ':';
ret[name_len+1] = ' ';
memcpy(ret+name_len+2, msg, msg_len*sizeof(WCHAR));
jsstr_flush(name, ret->str);
ret->str[name_len] = ':';
ret->str[name_len+1] = ' ';
jsstr_flush(msg, ret->str+name_len+2);
}
}else {
}else if(name_len) {
ret = name;
name = NULL;
}else if(msg_len) {
ret = msg;
msg = NULL;
}else {
ret = jsstr_alloc(object_errorW);
}
}
SysFreeString(msg);
SysFreeString(name);
if(msg)
jsstr_release(msg);
if(name)
jsstr_release(name);
if(FAILED(hres))
return hres;
if(!ret)
return E_OUTOFMEMORY;
if(retv) {
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = ret;
}else {
SysFreeString(ret);
}
if(r)
*r = jsval_string(ret);
else
jsstr_release(ret);
return S_OK;
}
static HRESULT Error_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
switch(flags) {
case INVOKE_FUNC:
return throw_type_error(ctx, ei, IDS_NOT_FUNC, NULL);
return throw_type_error(ctx, JS_E_FUNCTION_EXPECTED, NULL);
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
@@ -199,20 +132,7 @@ static HRESULT Error_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
return S_OK;
}
static void Error_destructor(DispatchEx *dispex)
{
ErrorInstance *This = (ErrorInstance*)dispex;
VariantClear(&This->number);
VariantClear(&This->description);
VariantClear(&This->message);
heap_free(This);
}
static const builtin_prop_t Error_props[] = {
{descriptionW, Error_description, 0},
{messageW, Error_message, 0},
{numberW, Error_number, 0},
{toStringW, Error_toString, PROPF_METHOD}
};
@@ -221,39 +141,33 @@ static const builtin_info_t Error_info = {
{NULL, Error_value, 0},
sizeof(Error_props)/sizeof(*Error_props),
Error_props,
Error_destructor,
NULL,
NULL
};
static const builtin_prop_t ErrorInst_props[] = {
{descriptionW, Error_description, 0},
{messageW, Error_message, 0},
{numberW, Error_number, 0},
};
static const builtin_info_t ErrorInst_info = {
JSCLASS_ERROR,
{NULL, Error_value, 0},
sizeof(ErrorInst_props)/sizeof(*ErrorInst_props),
ErrorInst_props,
Error_destructor,
0,
NULL,
NULL,
NULL
};
static HRESULT alloc_error(script_ctx_t *ctx, DispatchEx *prototype,
DispatchEx *constr, ErrorInstance **ret)
static HRESULT alloc_error(script_ctx_t *ctx, jsdisp_t *prototype,
jsdisp_t *constr, jsdisp_t **ret)
{
ErrorInstance *err;
jsdisp_t *err;
HRESULT hres;
err = heap_alloc_zero(sizeof(ErrorInstance));
err = heap_alloc_zero(sizeof(*err));
if(!err)
return E_OUTOFMEMORY;
if(prototype)
hres = init_dispex(&err->dispex, ctx, &Error_info, prototype);
hres = init_dispex(err, ctx, &Error_info, prototype);
else
hres = init_dispex_from_constr(&err->dispex, ctx, &ErrorInst_info,
hres = init_dispex_from_constr(err, ctx, &ErrorInst_info,
constr ? constr : ctx->error_constr);
if(FAILED(hres)) {
heap_free(err);
@@ -264,149 +178,143 @@ static HRESULT alloc_error(script_ctx_t *ctx, DispatchEx *prototype,
return S_OK;
}
static HRESULT create_error(script_ctx_t *ctx, DispatchEx *constr,
const UINT *number, const WCHAR *msg, DispatchEx **ret)
static HRESULT create_error(script_ctx_t *ctx, jsdisp_t *constr,
UINT number, jsstr_t *msg, jsdisp_t **ret)
{
ErrorInstance *err;
jsdisp_t *err;
HRESULT hres;
hres = alloc_error(ctx, NULL, constr, &err);
if(FAILED(hres))
return hres;
if(number) {
V_VT(&err->number) = VT_I4;
V_I4(&err->number) = *number;
hres = jsdisp_propput_dontenum(err, numberW, jsval_number((INT)number));
if(FAILED(hres)) {
jsdisp_release(err);
return hres;
}
V_VT(&err->message) = VT_BSTR;
if(msg) V_BSTR(&err->message) = SysAllocString(msg);
else V_BSTR(&err->message) = SysAllocStringLen(NULL, 0);
VariantCopy(&err->description, &err->message);
if(!V_BSTR(&err->message)) {
heap_free(err);
return E_OUTOFMEMORY;
hres = jsdisp_propput_name(err, messageW, jsval_string(msg));
if(SUCCEEDED(hres))
hres = jsdisp_propput_dontenum(err, descriptionW, jsval_string(msg));
if(FAILED(hres)) {
jsdisp_release(err);
return hres;
}
*ret = &err->dispex;
*ret = err;
return S_OK;
}
static HRESULT error_constr(script_ctx_t *ctx, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, DispatchEx *constr) {
DispatchEx *err;
VARIANT numv;
UINT num;
BSTR msg = NULL;
static HRESULT error_constr(script_ctx_t *ctx, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r, jsdisp_t *constr) {
jsdisp_t *err;
UINT num = 0;
jsstr_t *msg = NULL;
HRESULT hres;
V_VT(&numv) = VT_NULL;
if(arg_cnt(dp)) {
hres = to_number(ctx, get_arg(dp, 0), ei, &numv);
if(FAILED(hres) || (V_VT(&numv)==VT_R8 && isnan(V_R8(&numv))))
hres = to_string(ctx, get_arg(dp, 0), ei, &msg);
else if(V_VT(&numv) == VT_I4)
num = V_I4(&numv);
else
num = V_R8(&numv);
if(argc) {
double n;
hres = to_number(ctx, argv[0], &n);
if(FAILED(hres)) /* FIXME: really? */
n = NAN;
if(isnan(n))
hres = to_string(ctx, argv[0], &msg);
if(FAILED(hres))
return hres;
num = n;
}
if(arg_cnt(dp)>1 && !msg) {
hres = to_string(ctx, get_arg(dp, 1), ei, &msg);
if(FAILED(hres))
return hres;
if(!msg) {
if(argc > 1) {
hres = to_string(ctx, argv[1], &msg);
if(FAILED(hres))
return hres;
}else {
msg = jsstr_empty();
}
}
switch(flags) {
case INVOKE_FUNC:
case DISPATCH_CONSTRUCT:
if(V_VT(&numv) == VT_NULL)
hres = create_error(ctx, constr, NULL, msg, &err);
else
hres = create_error(ctx, constr, &num, msg, &err);
SysFreeString(msg);
hres = create_error(ctx, constr, num, msg, &err);
jsstr_release(msg);
if(FAILED(hres))
return hres;
if(retv) {
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(err);
}
if(r)
*r = jsval_obj(err);
else
jsdisp_release(err);
return S_OK;
default:
if(msg)
jsstr_release(msg);
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
}
}
static HRESULT ErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->error_constr);
}
static HRESULT EvalErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->eval_error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->eval_error_constr);
}
static HRESULT RangeErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->range_error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->range_error_constr);
}
static HRESULT ReferenceErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->reference_error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->reference_error_constr);
}
static HRESULT RegExpErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->regexp_error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->regexp_error_constr);
}
static HRESULT SyntaxErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->syntax_error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->syntax_error_constr);
}
static HRESULT TypeErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->type_error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->type_error_constr);
}
static HRESULT URIErrorConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
unsigned argc, jsval_t *argv, jsval_t *r)
{
TRACE("\n");
return error_constr(ctx, flags, dp, retv, ei, ctx->uri_error_constr);
return error_constr(ctx, flags, argc, argv, r, ctx->uri_error_constr);
}
HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype)
HRESULT init_error_constr(script_ctx_t *ctx, jsdisp_t *object_prototype)
{
static const WCHAR ErrorW[] = {'E','r','r','o','r',0};
static const WCHAR EvalErrorW[] = {'E','v','a','l','E','r','r','o','r',0};
@@ -418,7 +326,7 @@ HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype)
static const WCHAR URIErrorW[] = {'U','R','I','E','r','r','o','r',0};
static const WCHAR *names[] = {ErrorW, EvalErrorW, RangeErrorW,
ReferenceErrorW, RegExpErrorW, SyntaxErrorW, TypeErrorW, URIErrorW};
DispatchEx **constr_addr[] = {&ctx->error_constr, &ctx->eval_error_constr,
jsdisp_t **constr_addr[] = {&ctx->error_constr, &ctx->eval_error_constr,
&ctx->range_error_constr, &ctx->reference_error_constr, &ctx->regexp_error_constr,
&ctx->syntax_error_constr, &ctx->type_error_constr,
&ctx->uri_error_constr};
@@ -426,9 +334,9 @@ HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype)
RangeErrorConstr_value, ReferenceErrorConstr_value, RegExpErrorConstr_value,
SyntaxErrorConstr_value, TypeErrorConstr_value, URIErrorConstr_value};
ErrorInstance *err;
INT i;
VARIANT v;
jsdisp_t *err;
unsigned int i;
jsstr_t *str;
HRESULT hres;
for(i=0; i < sizeof(names)/sizeof(names[0]); i++) {
@@ -436,21 +344,19 @@ HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype)
if(FAILED(hres))
return hres;
V_VT(&v) = VT_BSTR;
V_BSTR(&v) = SysAllocString(names[i]);
if(!V_BSTR(&v)) {
jsdisp_release(&err->dispex);
str = jsstr_alloc(names[i]);
if(!str) {
jsdisp_release(err);
return E_OUTOFMEMORY;
}
hres = jsdisp_propput_name(&err->dispex, nameW, &v, NULL/*FIXME*/, NULL/*FIXME*/);
hres = jsdisp_propput_dontenum(err, nameW, jsval_string(str));
jsstr_release(str);
if(SUCCEEDED(hres))
hres = create_builtin_function(ctx, constr_val[i], names[i], NULL,
PROPF_CONSTR|1, &err->dispex, constr_addr[i]);
hres = create_builtin_constructor(ctx, constr_val[i], names[i], NULL,
PROPF_CONSTR|1, err, constr_addr[i]);
jsdisp_release(&err->dispex);
VariantClear(&v);
jsdisp_release(err);
if(FAILED(hres))
return hres;
}
@@ -458,14 +364,18 @@ HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype)
return S_OK;
}
static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str, DispatchEx *constr)
static HRESULT throw_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str, jsdisp_t *constr)
{
WCHAR buf[1024], *pos = NULL;
DispatchEx *err;
jsdisp_t *err;
jsstr_t *msg;
HRESULT hres;
if(!is_jscript_error(error))
return error;
buf[0] = '\0';
LoadStringW(jscript_hinstance, id&0xFFFF, buf, sizeof(buf)/sizeof(WCHAR));
LoadStringW(jscript_hinstance, HRESULT_CODE(error), buf, sizeof(buf)/sizeof(WCHAR));
if(str) pos = strchrW(buf, '|');
if(pos) {
@@ -476,51 +386,51 @@ static HRESULT throw_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCH
WARN("%s\n", debugstr_w(buf));
id |= JSCRIPT_ERROR;
hres = create_error(ctx, constr, &id, buf, &err);
msg = jsstr_alloc(buf);
if(!msg)
return E_OUTOFMEMORY;
hres = create_error(ctx, constr, error, msg, &err);
jsstr_release(msg);
if(FAILED(hres))
return hres;
if(!ei)
return id;
V_VT(&ei->var) = VT_DISPATCH;
V_DISPATCH(&ei->var) = (IDispatch*)_IDispatchEx_(err);
return id;
jsval_release(ctx->ei.val);
ctx->ei.val = jsval_obj(err);
return error;
}
HRESULT throw_generic_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
HRESULT throw_generic_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
{
return throw_error(ctx, ei, id, str, ctx->error_constr);
return throw_error(ctx, error, str, ctx->error_constr);
}
HRESULT throw_range_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
HRESULT throw_range_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
{
return throw_error(ctx, ei, id, str, ctx->range_error_constr);
return throw_error(ctx, error, str, ctx->range_error_constr);
}
HRESULT throw_reference_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
HRESULT throw_reference_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
{
return throw_error(ctx, ei, id, str, ctx->reference_error_constr);
return throw_error(ctx, error, str, ctx->reference_error_constr);
}
HRESULT throw_regexp_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
HRESULT throw_regexp_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
{
return throw_error(ctx, ei, id, str, ctx->regexp_error_constr);
return throw_error(ctx, error, str, ctx->regexp_error_constr);
}
HRESULT throw_syntax_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
HRESULT throw_syntax_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
{
return throw_error(ctx, ei, id, str, ctx->syntax_error_constr);
return throw_error(ctx, error, str, ctx->syntax_error_constr);
}
HRESULT throw_type_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
HRESULT throw_type_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
{
return throw_error(ctx, ei, id, str, ctx->type_error_constr);
return throw_error(ctx, error, str, ctx->type_error_constr);
}
HRESULT throw_uri_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str)
HRESULT throw_uri_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
{
return throw_error(ctx, ei, id, str, ctx->uri_error_constr);
return throw_error(ctx, error, str, ctx->uri_error_constr);
}
File diff suppressed because it is too large Load Diff
+421 -382
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+461 -381
View File
@@ -37,17 +37,12 @@
#include <wine/unicode.h>
#include <wine/list.h>
#define JSCRIPT_ERROR 0x800A0000
typedef struct _jsval_t jsval_t;
typedef struct _jsstr_t jsstr_t;
typedef struct _script_ctx_t script_ctx_t;
typedef struct _exec_ctx_t exec_ctx_t;
typedef struct _dispex_prop_t dispex_prop_t;
typedef struct {
EXCEPINFO ei;
VARIANT var;
} jsexcept_t;
typedef struct {
void **blocks;
DWORD block_cnt;
@@ -55,378 +50,14 @@ typedef struct {
DWORD offset;
BOOL mark;
struct list custom_blocks;
} jsheap_t;
void jsheap_init(jsheap_t*);
void *jsheap_alloc(jsheap_t*,DWORD);
void *jsheap_grow(jsheap_t*,void*,DWORD,DWORD);
void jsheap_clear(jsheap_t*);
void jsheap_free(jsheap_t*);
jsheap_t *jsheap_mark(jsheap_t*);
typedef struct DispatchEx DispatchEx;
extern HINSTANCE jscript_hinstance;
#define PROPF_ARGMASK 0x00ff
#define PROPF_METHOD 0x0100
#define PROPF_ENUM 0x0200
#define PROPF_CONSTR 0x0400
#define PROPF_CONST 0x0800
/* NOTE: Keep in sync with names in Object.toString implementation */
typedef enum {
JSCLASS_NONE,
JSCLASS_ARRAY,
JSCLASS_BOOLEAN,
JSCLASS_DATE,
JSCLASS_ERROR,
JSCLASS_FUNCTION,
JSCLASS_GLOBAL,
JSCLASS_MATH,
JSCLASS_NUMBER,
JSCLASS_OBJECT,
JSCLASS_REGEXP,
JSCLASS_STRING,
JSCLASS_ARGUMENTS
} jsclass_t;
DispatchEx *iface_to_jsdisp(IUnknown*);
typedef struct {
union {
IDispatch *disp;
IDispatchEx *dispex;
DispatchEx *jsdisp;
} u;
DWORD flags;
} vdisp_t;
#define VDISP_DISPEX 0x0001
#define VDISP_JSDISP 0x0002
static inline void vdisp_release(vdisp_t *vdisp)
{
IDispatch_Release(vdisp->u.disp);
}
static inline BOOL is_jsdisp(vdisp_t *vdisp)
{
return (vdisp->flags & VDISP_JSDISP) != 0;
}
static inline BOOL is_dispex(vdisp_t *vdisp)
{
return (vdisp->flags & VDISP_DISPEX) != 0;
}
static inline void set_jsdisp(vdisp_t *vdisp, DispatchEx *jsdisp)
{
vdisp->u.jsdisp = jsdisp;
vdisp->flags = VDISP_JSDISP | VDISP_DISPEX;
IDispatch_AddRef(vdisp->u.disp);
}
static inline void set_disp(vdisp_t *vdisp, IDispatch *disp)
{
IDispatchEx *dispex;
DispatchEx *jsdisp;
HRESULT hres;
jsdisp = iface_to_jsdisp((IUnknown*)disp);
if(jsdisp) {
vdisp->u.jsdisp = jsdisp;
vdisp->flags = VDISP_JSDISP | VDISP_DISPEX;
return;
}
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(SUCCEEDED(hres)) {
vdisp->u.dispex = dispex;
vdisp->flags = VDISP_DISPEX;
return;
}
IDispatch_AddRef(disp);
vdisp->u.disp = disp;
vdisp->flags = 0;
}
static inline DispatchEx *get_jsdisp(vdisp_t *vdisp)
{
return is_jsdisp(vdisp) ? vdisp->u.jsdisp : NULL;
}
typedef HRESULT (*builtin_invoke_t)(script_ctx_t*,vdisp_t*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
typedef struct {
const WCHAR *name;
builtin_invoke_t invoke;
DWORD flags;
} builtin_prop_t;
typedef struct {
jsclass_t class;
builtin_prop_t value_prop;
DWORD props_cnt;
const builtin_prop_t *props;
void (*destructor)(DispatchEx*);
void (*on_put)(DispatchEx*,const WCHAR*);
} builtin_info_t;
struct DispatchEx {
const IDispatchExVtbl *lpIDispatchExVtbl;
LONG ref;
DWORD buf_size;
DWORD prop_cnt;
dispex_prop_t *props;
script_ctx_t *ctx;
DispatchEx *prototype;
const builtin_info_t *builtin_info;
};
#define _IDispatchEx_(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl)
static inline void jsdisp_release(DispatchEx *jsdisp)
{
IDispatchEx_Release(_IDispatchEx_(jsdisp));
}
HRESULT create_dispex(script_ctx_t*,const builtin_info_t*,DispatchEx*,DispatchEx**);
HRESULT init_dispex(DispatchEx*,script_ctx_t*,const builtin_info_t*,DispatchEx*);
HRESULT init_dispex_from_constr(DispatchEx*,script_ctx_t*,const builtin_info_t*,DispatchEx*);
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_call_value(DispatchEx*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_call(DispatchEx*,DISPID,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_call_name(DispatchEx*,const WCHAR*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT disp_propget(script_ctx_t*,IDispatch*,DISPID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget(DispatchEx*,DISPID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propput_name(DispatchEx*,const WCHAR*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propput_const(DispatchEx*,const WCHAR*,VARIANT*);
HRESULT jsdisp_propput_idx(DispatchEx*,DWORD,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_get_idx(DispatchEx*,DWORD,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_get_id(DispatchEx*,const WCHAR*,DWORD,DISPID*);
HRESULT jsdisp_delete_idx(DispatchEx*,DWORD);
HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD,
DispatchEx*,DispatchEx**);
HRESULT Function_value(script_ctx_t*,vdisp_t*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT throw_eval_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT throw_generic_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT throw_range_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT throw_reference_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT throw_regexp_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT throw_syntax_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT throw_type_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT throw_uri_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_math(script_ctx_t*,DispatchEx**);
HRESULT create_array(script_ctx_t*,DWORD,DispatchEx**);
HRESULT create_regexp(script_ctx_t*,const WCHAR *,int,DWORD,DispatchEx**);
HRESULT create_regexp_var(script_ctx_t*,VARIANT*,VARIANT*,DispatchEx**);
HRESULT create_string(script_ctx_t*,const WCHAR*,DWORD,DispatchEx**);
HRESULT create_bool(script_ctx_t*,VARIANT_BOOL,DispatchEx**);
HRESULT create_number(script_ctx_t*,VARIANT*,DispatchEx**);
typedef enum {
NO_HINT,
HINT_STRING,
HINT_NUMBER
} hint_t;
HRESULT to_primitive(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*, hint_t);
HRESULT to_boolean(VARIANT*,VARIANT_BOOL*);
HRESULT to_number(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*);
HRESULT to_integer(script_ctx_t*,VARIANT*,jsexcept_t*,VARIANT*);
HRESULT to_int32(script_ctx_t*,VARIANT*,jsexcept_t*,INT*);
HRESULT to_uint32(script_ctx_t*,VARIANT*,jsexcept_t*,DWORD*);
HRESULT to_string(script_ctx_t*,VARIANT*,jsexcept_t*,BSTR*);
HRESULT to_object(script_ctx_t*,VARIANT*,IDispatch**);
typedef struct named_item_t {
IDispatch *disp;
DWORD flags;
LPWSTR name;
struct named_item_t *next;
} named_item_t;
struct _script_ctx_t {
LONG ref;
SCRIPTSTATE state;
exec_ctx_t *exec_ctx;
named_item_t *named_items;
IActiveScriptSite *site;
IInternetHostSecurityManager *secmgr;
DWORD safeopt;
DWORD version;
LCID lcid;
jsheap_t tmp_heap;
IDispatch *host_global;
BSTR last_match;
DWORD last_match_index;
DWORD last_match_length;
DispatchEx *global;
DispatchEx *function_constr;
DispatchEx *activex_constr;
DispatchEx *array_constr;
DispatchEx *bool_constr;
DispatchEx *date_constr;
DispatchEx *error_constr;
DispatchEx *eval_error_constr;
DispatchEx *range_error_constr;
DispatchEx *reference_error_constr;
DispatchEx *regexp_error_constr;
DispatchEx *syntax_error_constr;
DispatchEx *type_error_constr;
DispatchEx *uri_error_constr;
DispatchEx *number_constr;
DispatchEx *object_constr;
DispatchEx *regexp_constr;
DispatchEx *string_constr;
};
void script_release(script_ctx_t*);
static inline void script_addref(script_ctx_t *ctx)
{
ctx->ref++;
}
HRESULT init_global(script_ctx_t*);
HRESULT init_function_constr(script_ctx_t*,DispatchEx*);
HRESULT create_object_prototype(script_ctx_t*,DispatchEx**);
HRESULT create_activex_constr(script_ctx_t*,DispatchEx**);
HRESULT create_array_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_bool_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_date_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT init_error_constr(script_ctx_t*,DispatchEx*);
HRESULT create_number_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_object_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_regexp_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
HRESULT create_string_constr(script_ctx_t*,DispatchEx*,DispatchEx**);
IUnknown *create_ax_site(script_ctx_t*);
typedef struct {
const WCHAR *str;
DWORD len;
} match_result_t;
#define REM_CHECK_GLOBAL 0x0001
#define REM_RESET_INDEX 0x0002
#define REM_NO_CTX_UPDATE 0x0004
HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,const WCHAR**,match_result_t**,
DWORD*,DWORD*,match_result_t*);
HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*);
HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*);
HRESULT regexp_string_match(script_ctx_t*,DispatchEx*,BSTR,VARIANT*,jsexcept_t*);
static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i)
{
return dp->rgvarg + dp->cArgs-i-1;
}
static inline DWORD arg_cnt(const DISPPARAMS *dp)
{
return dp->cArgs - dp->cNamedArgs;
}
static inline BOOL is_class(DispatchEx *jsdisp, jsclass_t class)
{
return jsdisp->builtin_info->class == class;
}
static inline BOOL is_vclass(vdisp_t *vdisp, jsclass_t class)
{
return is_jsdisp(vdisp) && is_class(vdisp->u.jsdisp, class);
}
static inline BOOL is_num_vt(enum VARENUM vt)
{
return vt == VT_I4 || vt == VT_R8;
}
static inline DOUBLE num_val(const VARIANT *v)
{
return V_VT(v) == VT_I4 ? V_I4(v) : V_R8(v);
}
static inline void num_set_val(VARIANT *v, DOUBLE d)
{
if(d == (DOUBLE)(INT)d) {
V_VT(v) = VT_I4;
V_I4(v) = d;
}else {
V_VT(v) = VT_R8;
V_R8(v) = d;
}
}
static inline void num_set_nan(VARIANT *v)
{
V_VT(v) = VT_R8;
#ifdef NAN
V_R8(v) = NAN;
#else
V_UI8(v) = (ULONGLONG)0x7ff80000<<32;
#endif
}
static inline DOUBLE ret_nan(void)
{
VARIANT v;
num_set_nan(&v);
return V_R8(&v);
}
static inline void num_set_inf(VARIANT *v, BOOL positive)
{
V_VT(v) = VT_R8;
#ifdef INFINITY
V_R8(v) = positive ? INFINITY : -INFINITY;
#else
V_UI8(v) = (ULONGLONG)0x7ff00000<<32;
if(!positive)
V_R8(v) = -V_R8(v);
#endif
}
static inline DWORD make_grfdex(script_ctx_t *ctx, DWORD flags)
{
return (ctx->version << 28) | flags;
}
const char *debugstr_variant(const VARIANT*);
HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**);
extern LONG module_ref;
static inline void lock_module(void)
{
InterlockedIncrement(&module_ref);
}
static inline void unlock_module(void)
{
InterlockedDecrement(&module_ref);
}
} heap_pool_t;
void heap_pool_init(heap_pool_t*) DECLSPEC_HIDDEN;
void *heap_pool_alloc(heap_pool_t*,DWORD) __WINE_ALLOC_SIZE(2) DECLSPEC_HIDDEN;
void *heap_pool_grow(heap_pool_t*,void*,DWORD,DWORD) DECLSPEC_HIDDEN;
void heap_pool_clear(heap_pool_t*) DECLSPEC_HIDDEN;
void heap_pool_free(heap_pool_t*) DECLSPEC_HIDDEN;
heap_pool_t *heap_pool_mark(heap_pool_t*) DECLSPEC_HIDDEN;
static inline void *heap_alloc(size_t len)
{
@@ -457,10 +88,459 @@ static inline LPWSTR heap_strdupW(LPCWSTR str)
size = (strlenW(str)+1)*sizeof(WCHAR);
ret = heap_alloc(size);
memcpy(ret, str, size);
if(ret)
memcpy(ret, str, size);
}
return ret;
}
#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl)))
typedef struct jsdisp_t jsdisp_t;
extern HINSTANCE jscript_hinstance DECLSPEC_HIDDEN;
#define PROPF_ARGMASK 0x00ff
#define PROPF_METHOD 0x0100
#define PROPF_ENUM 0x0200
#define PROPF_CONSTR 0x0400
#define PROPF_CONST 0x0800
#define PROPF_DONTDELETE 0x1000
/* NOTE: Keep in sync with names in Object.toString implementation */
typedef enum {
JSCLASS_NONE,
JSCLASS_ARRAY,
JSCLASS_BOOLEAN,
JSCLASS_DATE,
JSCLASS_ERROR,
JSCLASS_FUNCTION,
JSCLASS_GLOBAL,
JSCLASS_MATH,
JSCLASS_NUMBER,
JSCLASS_OBJECT,
JSCLASS_REGEXP,
JSCLASS_STRING,
JSCLASS_ARGUMENTS,
JSCLASS_VBARRAY
} jsclass_t;
jsdisp_t *iface_to_jsdisp(IUnknown*) DECLSPEC_HIDDEN;
typedef struct {
union {
IDispatch *disp;
IDispatchEx *dispex;
jsdisp_t *jsdisp;
} u;
DWORD flags;
} vdisp_t;
#define VDISP_DISPEX 0x0001
#define VDISP_JSDISP 0x0002
static inline void vdisp_release(vdisp_t *vdisp)
{
IDispatch_Release(vdisp->u.disp);
}
static inline BOOL is_jsdisp(vdisp_t *vdisp)
{
return (vdisp->flags & VDISP_JSDISP) != 0;
}
static inline BOOL is_dispex(vdisp_t *vdisp)
{
return (vdisp->flags & VDISP_DISPEX) != 0;
}
static inline void set_jsdisp(vdisp_t *vdisp, jsdisp_t *jsdisp)
{
vdisp->u.jsdisp = jsdisp;
vdisp->flags = VDISP_JSDISP | VDISP_DISPEX;
IDispatch_AddRef(vdisp->u.disp);
}
static inline void set_disp(vdisp_t *vdisp, IDispatch *disp)
{
IDispatchEx *dispex;
jsdisp_t *jsdisp;
HRESULT hres;
jsdisp = iface_to_jsdisp((IUnknown*)disp);
if(jsdisp) {
vdisp->u.jsdisp = jsdisp;
vdisp->flags = VDISP_JSDISP | VDISP_DISPEX;
return;
}
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(SUCCEEDED(hres)) {
vdisp->u.dispex = dispex;
vdisp->flags = VDISP_DISPEX;
return;
}
IDispatch_AddRef(disp);
vdisp->u.disp = disp;
vdisp->flags = 0;
}
static inline jsdisp_t *get_jsdisp(vdisp_t *vdisp)
{
return is_jsdisp(vdisp) ? vdisp->u.jsdisp : NULL;
}
typedef HRESULT (*builtin_invoke_t)(script_ctx_t*,vdisp_t*,WORD,unsigned,jsval_t*,jsval_t*);
typedef struct {
const WCHAR *name;
builtin_invoke_t invoke;
DWORD flags;
} builtin_prop_t;
typedef struct {
jsclass_t class;
builtin_prop_t value_prop;
DWORD props_cnt;
const builtin_prop_t *props;
void (*destructor)(jsdisp_t*);
void (*on_put)(jsdisp_t*,const WCHAR*);
unsigned (*idx_length)(jsdisp_t*);
HRESULT (*idx_get)(jsdisp_t*,unsigned,jsval_t*);
HRESULT (*idx_put)(jsdisp_t*,unsigned,jsval_t);
} builtin_info_t;
struct jsdisp_t {
IDispatchEx IDispatchEx_iface;
LONG ref;
DWORD buf_size;
DWORD prop_cnt;
dispex_prop_t *props;
script_ctx_t *ctx;
jsdisp_t *prototype;
const builtin_info_t *builtin_info;
};
static inline IDispatch *to_disp(jsdisp_t *jsdisp)
{
return (IDispatch*)&jsdisp->IDispatchEx_iface;
}
jsdisp_t *as_jsdisp(IDispatch*) DECLSPEC_HIDDEN;
jsdisp_t *to_jsdisp(IDispatch*) DECLSPEC_HIDDEN;
void jsdisp_free(jsdisp_t*) DECLSPEC_HIDDEN;
#ifndef TRACE_REFCNT
/*
* We do a lot of refcount calls during script execution, so having an inline
* version is a nice perf win. Define TRACE_REFCNT macro when debugging
* refcount bugs to have traces. Also, since jsdisp_t is not thread safe anyways,
* there is no point in using atomic operations.
*/
static inline jsdisp_t *jsdisp_addref(jsdisp_t *jsdisp)
{
jsdisp->ref++;
return jsdisp;
}
static inline void jsdisp_release(jsdisp_t *jsdisp)
{
if(!--jsdisp->ref)
jsdisp_free(jsdisp);
}
#else
jsdisp_t *jsdisp_addref(jsdisp_t*) DECLSPEC_HIDDEN;
void jsdisp_release(jsdisp_t*) DECLSPEC_HIDDEN;
#endif
HRESULT create_dispex(script_ctx_t*,const builtin_info_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT init_dispex(jsdisp_t*,script_ctx_t*,const builtin_info_t*,jsdisp_t*) DECLSPEC_HIDDEN;
HRESULT init_dispex_from_constr(jsdisp_t*,script_ctx_t*,const builtin_info_t*,jsdisp_t*) DECLSPEC_HIDDEN;
HRESULT disp_call(script_ctx_t*,IDispatch*,DISPID,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT disp_call_value(script_ctx_t*,IDispatch*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsdisp_call_value(jsdisp_t*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsdisp_call(jsdisp_t*,DISPID,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsdisp_call_name(jsdisp_t*,const WCHAR*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT disp_propget(script_ctx_t*,IDispatch*,DISPID,jsval_t*) DECLSPEC_HIDDEN;
HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,jsval_t) DECLSPEC_HIDDEN;
HRESULT jsdisp_propget(jsdisp_t*,DISPID,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsdisp_propput(jsdisp_t*,const WCHAR*,DWORD,jsval_t) DECLSPEC_HIDDEN;
HRESULT jsdisp_propput_name(jsdisp_t*,const WCHAR*,jsval_t) DECLSPEC_HIDDEN;
HRESULT jsdisp_propput_const(jsdisp_t*,const WCHAR*,jsval_t) DECLSPEC_HIDDEN;
HRESULT jsdisp_propput_dontenum(jsdisp_t*,const WCHAR*,jsval_t) DECLSPEC_HIDDEN;
HRESULT jsdisp_propput_idx(jsdisp_t*,DWORD,jsval_t) DECLSPEC_HIDDEN;
HRESULT jsdisp_propget_name(jsdisp_t*,LPCWSTR,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsdisp_get_idx(jsdisp_t*,DWORD,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsdisp_get_id(jsdisp_t*,const WCHAR*,DWORD,DISPID*) DECLSPEC_HIDDEN;
HRESULT disp_delete(IDispatch*,DISPID,BOOL*) DECLSPEC_HIDDEN;
HRESULT disp_delete_name(script_ctx_t*,IDispatch*,jsstr_t*,BOOL*);
HRESULT jsdisp_delete_idx(jsdisp_t*,DWORD) DECLSPEC_HIDDEN;
HRESULT jsdisp_is_own_prop(jsdisp_t*,const WCHAR*,BOOL*) DECLSPEC_HIDDEN;
HRESULT jsdisp_is_enumerable(jsdisp_t*,const WCHAR*,BOOL*) DECLSPEC_HIDDEN;
HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD,
jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_builtin_constructor(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD,
jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT Function_value(script_ctx_t*,vdisp_t*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT Function_invoke(jsdisp_t*,IDispatch*,WORD,unsigned,jsval_t*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT throw_eval_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT throw_generic_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT throw_range_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT throw_reference_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT throw_regexp_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT throw_syntax_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT throw_type_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT throw_uri_error(script_ctx_t*,HRESULT,const WCHAR*) DECLSPEC_HIDDEN;
HRESULT create_object(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_math(script_ctx_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_array(script_ctx_t*,DWORD,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_regexp(script_ctx_t*,jsstr_t*,DWORD,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_regexp_var(script_ctx_t*,jsval_t,jsval_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_string(script_ctx_t*,jsstr_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_bool(script_ctx_t*,BOOL,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_number(script_ctx_t*,double,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_vbarray(script_ctx_t*,SAFEARRAY*,jsdisp_t**) DECLSPEC_HIDDEN;
typedef enum {
NO_HINT,
HINT_STRING,
HINT_NUMBER
} hint_t;
HRESULT to_primitive(script_ctx_t*,jsval_t,jsval_t*, hint_t) DECLSPEC_HIDDEN;
HRESULT to_boolean(jsval_t,BOOL*) DECLSPEC_HIDDEN;
HRESULT to_number(script_ctx_t*,jsval_t,double*) DECLSPEC_HIDDEN;
HRESULT to_integer(script_ctx_t*,jsval_t,double*) DECLSPEC_HIDDEN;
HRESULT to_int32(script_ctx_t*,jsval_t,INT*) DECLSPEC_HIDDEN;
HRESULT to_uint32(script_ctx_t*,jsval_t,UINT32*) DECLSPEC_HIDDEN;
HRESULT to_string(script_ctx_t*,jsval_t,jsstr_t**) DECLSPEC_HIDDEN;
HRESULT to_object(script_ctx_t*,jsval_t,IDispatch**) DECLSPEC_HIDDEN;
HRESULT variant_change_type(script_ctx_t*,VARIANT*,VARIANT*,VARTYPE) DECLSPEC_HIDDEN;
HRESULT decode_source(WCHAR*) DECLSPEC_HIDDEN;
HRESULT double_to_string(double,jsstr_t**) DECLSPEC_HIDDEN;
typedef struct named_item_t {
IDispatch *disp;
DWORD flags;
LPWSTR name;
struct named_item_t *next;
} named_item_t;
typedef struct _cc_var_t cc_var_t;
typedef struct {
cc_var_t *vars;
} cc_ctx_t;
void release_cc(cc_ctx_t*) DECLSPEC_HIDDEN;
typedef struct {
IServiceProvider IServiceProvider_iface;
LONG ref;
script_ctx_t *ctx;
} JSCaller;
#include "jsval.h"
typedef struct {
EXCEPINFO ei;
jsval_t val;
} jsexcept_t;
typedef struct {
unsigned index;
unsigned length;
} match_result_t;
struct _script_ctx_t {
LONG ref;
SCRIPTSTATE state;
IActiveScript *active_script;
exec_ctx_t *exec_ctx;
named_item_t *named_items;
IActiveScriptSite *site;
IInternetHostSecurityManager *secmgr;
DWORD safeopt;
DWORD version;
LCID lcid;
cc_ctx_t *cc;
JSCaller *jscaller;
jsexcept_t ei;
heap_pool_t tmp_heap;
IDispatch *host_global;
jsstr_t *last_match;
match_result_t match_parens[9];
DWORD last_match_index;
DWORD last_match_length;
jsdisp_t *global;
jsdisp_t *function_constr;
jsdisp_t *activex_constr;
jsdisp_t *array_constr;
jsdisp_t *bool_constr;
jsdisp_t *date_constr;
jsdisp_t *error_constr;
jsdisp_t *eval_error_constr;
jsdisp_t *range_error_constr;
jsdisp_t *reference_error_constr;
jsdisp_t *regexp_error_constr;
jsdisp_t *syntax_error_constr;
jsdisp_t *type_error_constr;
jsdisp_t *uri_error_constr;
jsdisp_t *number_constr;
jsdisp_t *object_constr;
jsdisp_t *regexp_constr;
jsdisp_t *string_constr;
jsdisp_t *vbarray_constr;
};
void script_release(script_ctx_t*) DECLSPEC_HIDDEN;
void clear_ei(script_ctx_t*) DECLSPEC_HIDDEN;
static inline void script_addref(script_ctx_t *ctx)
{
ctx->ref++;
}
HRESULT init_global(script_ctx_t*) DECLSPEC_HIDDEN;
HRESULT init_function_constr(script_ctx_t*,jsdisp_t*) DECLSPEC_HIDDEN;
HRESULT create_object_prototype(script_ctx_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_activex_constr(script_ctx_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_array_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_bool_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_date_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT init_error_constr(script_ctx_t*,jsdisp_t*) DECLSPEC_HIDDEN;
HRESULT create_number_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_object_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_regexp_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_string_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
HRESULT create_vbarray_constr(script_ctx_t*,jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
IUnknown *create_ax_site(script_ctx_t*) DECLSPEC_HIDDEN;
HRESULT create_jscaller(script_ctx_t*) DECLSPEC_HIDDEN;
#define REM_CHECK_GLOBAL 0x0001
#define REM_RESET_INDEX 0x0002
#define REM_NO_CTX_UPDATE 0x0004
#define REM_ALLOC_RESULT 0x0008
#define REM_NO_PARENS 0x0010
struct match_state_t;
HRESULT regexp_match_next(script_ctx_t*,jsdisp_t*,DWORD,jsstr_t*,struct match_state_t**) DECLSPEC_HIDDEN;
HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*) DECLSPEC_HIDDEN;
HRESULT regexp_string_match(script_ctx_t*,jsdisp_t*,jsstr_t*,jsval_t*) DECLSPEC_HIDDEN;
static inline BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
{
return jsdisp->builtin_info->class == class;
}
static inline BOOL is_vclass(vdisp_t *vdisp, jsclass_t class)
{
return is_jsdisp(vdisp) && is_class(vdisp->u.jsdisp, class);
}
#ifndef INT32_MIN
#define INT32_MIN (-2147483647-1)
#endif
#ifndef INT32_MAX
#define INT32_MAX (2147483647)
#endif
static inline BOOL is_int32(double d)
{
return INT32_MIN <= d && d <= INT32_MAX && (double)(int)d == d;
}
static inline DWORD make_grfdex(script_ctx_t *ctx, DWORD flags)
{
return (ctx->version << 28) | flags;
}
#define FACILITY_JSCRIPT 10
#define MAKE_JSERROR(code) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_JSCRIPT, code)
#define JS_E_TO_PRIMITIVE MAKE_JSERROR(IDS_TO_PRIMITIVE)
#define JS_E_INVALIDARG MAKE_JSERROR(IDS_INVALID_CALL_ARG)
#define JS_E_SUBSCRIPT_OUT_OF_RANGE MAKE_JSERROR(IDS_SUBSCRIPT_OUT_OF_RANGE)
#define JS_E_OBJECT_REQUIRED MAKE_JSERROR(IDS_OBJECT_REQUIRED)
#define JS_E_CANNOT_CREATE_OBJ MAKE_JSERROR(IDS_CREATE_OBJ_ERROR)
#define JS_E_INVALID_PROPERTY MAKE_JSERROR(IDS_NO_PROPERTY)
#define JS_E_INVALID_ACTION MAKE_JSERROR(IDS_UNSUPPORTED_ACTION)
#define JS_E_MISSING_ARG MAKE_JSERROR(IDS_ARG_NOT_OPT)
#define JS_E_SYNTAX MAKE_JSERROR(IDS_SYNTAX_ERROR)
#define JS_E_MISSING_SEMICOLON MAKE_JSERROR(IDS_SEMICOLON)
#define JS_E_MISSING_LBRACKET MAKE_JSERROR(IDS_LBRACKET)
#define JS_E_MISSING_RBRACKET MAKE_JSERROR(IDS_RBRACKET)
#define JS_E_INVALID_CHAR MAKE_JSERROR(IDS_INVALID_CHAR)
#define JS_E_UNTERMINATED_STRING MAKE_JSERROR(IDS_UNTERMINATED_STR)
#define JS_E_MISPLACED_RETURN MAKE_JSERROR(IDS_MISPLACED_RETURN)
#define JS_E_INVALID_BREAK MAKE_JSERROR(IDS_INVALID_BREAK)
#define JS_E_INVALID_CONTINUE MAKE_JSERROR(IDS_INVALID_CONTINUE)
#define JS_E_LABEL_REDEFINED MAKE_JSERROR(IDS_LABEL_REDEFINED)
#define JS_E_LABEL_NOT_FOUND MAKE_JSERROR(IDS_LABEL_NOT_FOUND)
#define JS_E_DISABLED_CC MAKE_JSERROR(IDS_DISABLED_CC)
#define JS_E_FUNCTION_EXPECTED MAKE_JSERROR(IDS_NOT_FUNC)
#define JS_E_DATE_EXPECTED MAKE_JSERROR(IDS_NOT_DATE)
#define JS_E_NUMBER_EXPECTED MAKE_JSERROR(IDS_NOT_NUM)
#define JS_E_OBJECT_EXPECTED MAKE_JSERROR(IDS_OBJECT_EXPECTED)
#define JS_E_ILLEGAL_ASSIGN MAKE_JSERROR(IDS_ILLEGAL_ASSIGN)
#define JS_E_UNDEFINED_VARIABLE MAKE_JSERROR(IDS_UNDEFINED)
#define JS_E_BOOLEAN_EXPECTED MAKE_JSERROR(IDS_NOT_BOOL)
#define JS_E_VBARRAY_EXPECTED MAKE_JSERROR(IDS_NOT_VBARRAY)
#define JS_E_INVALID_DELETE MAKE_JSERROR(IDS_INVALID_DELETE)
#define JS_E_JSCRIPT_EXPECTED MAKE_JSERROR(IDS_JSCRIPT_EXPECTED)
#define JS_E_REGEXP_SYNTAX MAKE_JSERROR(IDS_REGEXP_SYNTAX_ERROR)
#define JS_E_INVALID_URI_CODING MAKE_JSERROR(IDS_URI_INVALID_CODING)
#define JS_E_INVALID_URI_CHAR MAKE_JSERROR(IDS_URI_INVALID_CHAR)
#define JS_E_FRACTION_DIGITS_OUT_OF_RANGE MAKE_JSERROR(IDS_FRACTION_DIGITS_OUT_OF_RANGE)
#define JS_E_PRECISION_OUT_OF_RANGE MAKE_JSERROR(IDS_PRECISION_OUT_OF_RANGE)
#define JS_E_INVALID_LENGTH MAKE_JSERROR(IDS_INVALID_LENGTH)
#define JS_E_ARRAY_EXPECTED MAKE_JSERROR(IDS_ARRAY_EXPECTED)
static inline BOOL is_jscript_error(HRESULT hres)
{
return HRESULT_FACILITY(hres) == FACILITY_JSCRIPT;
}
const char *debugstr_variant(const VARIANT*) DECLSPEC_HIDDEN;
const char *debugstr_jsval(const jsval_t) DECLSPEC_HIDDEN;
HRESULT create_jscript_object(BOOL,REFIID,void**) DECLSPEC_HIDDEN;
extern LONG module_ref DECLSPEC_HIDDEN;
static inline void lock_module(void)
{
InterlockedIncrement(&module_ref);
}
static inline void unlock_module(void)
{
InterlockedDecrement(&module_ref);
}
-97
View File
@@ -1,97 +0,0 @@
[version]
Signature="$CHICAGO$"
[RegisterDll]
AddReg=Classes.Reg
[UnregisterDll]
DelReg=Classes.Reg
[Classes.Reg]
HKCR,"CLSID\%CLSID_JScript%",,,"JScript Language"
HKCR,"CLSID\%CLSID_JScript%\Implemented Categories\%CATID_ActiveScript%",,16
HKCR,"CLSID\%CLSID_JScript%\Implemented Categories\%CATID_ActiveScriptParse%",,16
HKCR,"CLSID\%CLSID_JScript%\InprocServer32",,,"%MODULE%"
HKCR,"CLSID\%CLSID_JScript%\InprocServer32","ThreadingModel",,"Both"
HKCR,"CLSID\%CLSID_JScript%\OLEScript",,16
HKCR,"CLSID\%CLSID_JScript%\ProgID",,,"JScript"
HKCR,"CLSID\%CLSID_JScriptAuthor%",,,"JScript Language Authoring"
HKCR,"CLSID\%CLSID_JScriptAuthor%\Implemented Categories\%CATID_ActiveScriptAuthor%",,16
HKCR,"CLSID\%CLSID_JScriptAuthor%\InprocServer32",,,"%MODULE%"
HKCR,"CLSID\%CLSID_JScriptAuthor%\InprocServer32","ThreadingModel",,"Both"
HKCR,"CLSID\%CLSID_JScriptAuthor%\OLEScript",,16
HKCR,"CLSID\%CLSID_JScriptAuthor%\ProgID",,,"JScript Author"
HKCR,"CLSID\%CLSID_JScriptEncode%",,,"JScript Language Encoding"
HKCR,"CLSID\%CLSID_JScriptEncode%\Implemented Categories\%CATID_ActiveScript%",,16
HKCR,"CLSID\%CLSID_JScriptEncode%\Implemented Categories\%CATID_ActiveScriptParse%",,16
HKCR,"CLSID\%CLSID_JScriptEncode%\Implemented Categories\%CATID_ActiveScriptEncode%",,16
HKCR,"CLSID\%CLSID_JScriptEncode%\InprocServer32",,,"%MODULE%"
HKCR,"CLSID\%CLSID_JScriptEncode%\InprocServer32","ThreadingModel",,"Both"
HKCR,"CLSID\%CLSID_JScriptEncode%\OLEScript",,16
HKCR,"CLSID\%CLSID_JScriptEncode%\ProgID",,,"JScript.Encode"
HKCR,"Component Categories\%CATID_ActiveScriptAuthor%","409",,"Active Scripting Engine with Authoring"
HKCR,"Component Categories\%CATID_ActiveScript%","409",,"Active Scripting Engine"
HKCR,"Component Categories\%CATID_ActiveScriptParse%","409",,"Active Scripting Engine with Parsing"
HKCR,"Component Categories\%CATID_ActiveScriptEncode%","409",,"Active Scripting Engine with Encoding"
HKCR,"ECMAScript",,,"JScript Language"
HKCR,"ECMAScript\CLSID",,,"%CLSID_JScript%"
HKCR,"ECMAScript\OLEScript",,16
HKCR,"JavaScript",,,"JScript Language"
HKCR,"JavaScript\CLSID",,,"%CLSID_JScript%"
HKCR,"JavaScript\OLEScript",,16
HKCR,"JavaScript Author",,,"JScript Language Authoring"
HKCR,"JavaScript Author\CLSID",,,"%CLSID_JScriptAuthor%"
HKCR,"JavaScript Author\OLEScript",,16
HKCR,"JavaScript1.1",,,"JScript Language"
HKCR,"JavaScript1.1\CLSID",,,"%CLSID_JScript%"
HKCR,"JavaScript1.1\OLEScript",,16
HKCR,"JavaScript1.1 Author",,,"JScript Language Authoring"
HKCR,"JavaScript1.1 Author\CLSID",,,"%CLSID_JScriptAuthor%"
HKCR,"JavaScript1.1 Author\OLEScript",,16
HKCR,"JavaScript1.2",,,"JScript Language"
HKCR,"JavaScript1.2\CLSID",,,"%CLSID_JScript%"
HKCR,"JavaScript1.2\OLEScript",,16
HKCR,"JavaScript1.2 Author",,,"JScript Language Authoring"
HKCR,"JavaScript1.2 Author\CLSID",,,"%CLSID_JScriptAuthor%"
HKCR,"JavaScript1.2 Author\OLEScript",,16
HKCR,"JavaScript1.3",,,"JScript Language"
HKCR,"JavaScript1.3\CLSID",,,"%CLSID_JScript%"
HKCR,"JavaScript1.3\OLEScript",,16
HKCR,"JScript",,,"JScript Language"
HKCR,"JScript\CLSID",,,"%CLSID_JScript%"
HKCR,"JScript\OLEScript",,16
HKCR,"JScript Author",,,"JScript Language Authoring"
HKCR,"JScript Author\CLSID",,,"%CLSID_JScriptAuthor%"
HKCR,"JScript Author\OLEScript",,16
HKCR,"JScript.Encode",,,"JScript Language Encoding"
HKCR,"JScript.Encode\CLSID",,,"%CLSID_JScriptEncode%"
HKCR,"JScript.Encode\OLEScript",,16
HKCR,"LiveScript",,,"JScript Language"
HKCR,"LiveScript\CLSID",,,"%CLSID_JScript%"
HKCR,"LiveScript\OLEScript",,16
HKCR,"LiveScript Author",,,"JScript Language Authoring"
HKCR,"LiveScript Author\CLSID",,,"%CLSID_JScriptAuthor%"
HKCR,"LiveScript Author\OLEScript",,16
[Strings]
MODULE="jscript.dll"
+78
View File
@@ -0,0 +1,78 @@
/*
* Copyright 2009 Piotr Caban
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "resource.h"
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE
{
IDS_TO_PRIMITIVE "Error converting object to primitive type"
IDS_INVALID_CALL_ARG "Invalid procedure call or argument"
IDS_SUBSCRIPT_OUT_OF_RANGE "Subscript out of range"
IDS_OBJECT_REQUIRED "Object required"
IDS_CREATE_OBJ_ERROR "Automation server can't create object"
IDS_NO_PROPERTY "Object doesn't support this property or method"
IDS_UNSUPPORTED_ACTION "Object doesn't support this action"
IDS_ARG_NOT_OPT "Argument not optional"
IDS_SYNTAX_ERROR "Syntax error"
IDS_SEMICOLON "Expected ';'"
IDS_LBRACKET "Expected '('"
IDS_RBRACKET "Expected ')'"
IDS_INVALID_CHAR "Invalid character"
IDS_UNTERMINATED_STR "Unterminated string constant"
IDS_MISPLACED_RETURN "'return' statement outside of function"
IDS_INVALID_BREAK "Can't have 'break' outside of loop"
IDS_INVALID_CONTINUE "Can't have 'continue' outside of loop"
IDS_LABEL_REDEFINED "Label redefined"
IDS_LABEL_NOT_FOUND "Label not found"
IDS_DISABLED_CC "Conditional compilation is turned off"
IDS_NOT_FUNC "Function expected"
IDS_NOT_DATE "'[object]' is not a date object"
IDS_NOT_NUM "Number expected"
IDS_OBJECT_EXPECTED "Object expected"
IDS_ILLEGAL_ASSIGN "Illegal assignment"
IDS_UNDEFINED "'|' is undefined"
IDS_NOT_BOOL "Boolean object expected"
IDS_INVALID_DELETE "Cannot delete '|'"
IDS_NOT_VBARRAY "VBArray object expected"
IDS_JSCRIPT_EXPECTED "JScript object expected"
IDS_REGEXP_SYNTAX_ERROR "Syntax error in regular expression"
IDS_URI_INVALID_CODING "URI to be decoded is incorrect"
IDS_URI_INVALID_CHAR "URI to be encoded contains invalid characters"
IDS_FRACTION_DIGITS_OUT_OF_RANGE "Number of fraction digits is out of range"
IDS_PRECISION_OUT_OF_RANGE "Precision is out of range"
IDS_INVALID_LENGTH "Array length must be a finite positive integer"
IDS_ARRAY_EXPECTED "Array object expected"
}
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
/* @makedep: jscript.rgs */
2 WINE_REGISTRY jscript.rgs
3 WINE_REGISTRY jscript_classes.rgs
#define WINE_FILEDESCRIPTION_STR "Wine JScript"
#define WINE_FILENAME_STR "jscript.dll"
#define WINE_FILEVERSION 5,7,7601,16982
#define WINE_FILEVERSION_STR "5.8.7601.16982"
#define WINE_PRODUCTVERSION 5,8,7601,16982
#define WINE_PRODUCTVERSION_STR "5.8.7601.16982"
#include "wine/wine_common_ver.rc"
+123
View File
@@ -0,0 +1,123 @@
HKCR
{
NoRemove CLSID
{
'{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
{
'Implemented Categories'
{
'{f0b7a1a1-9847-11cf-8f20-00805f2cd064}'
'{f0b7a1a2-9847-11cf-8f20-00805f2cd064}'
}
OLEScript
}
'{F414C261-6AC0-11CF-B6D1-00AA00BBBB58}'
{
'Implemented Categories'
{
'{0aee2a92-bcbb-11d0-8c72-00c04fc2b085}'
}
OLEScript
}
'{F414C262-6AC0-11CF-B6D1-00AA00BBBB58}'
{
'Implemented Categories'
{
'{f0b7a1a1-9847-11cf-8f20-00805f2cd064}'
'{f0b7a1a2-9847-11cf-8f20-00805f2cd064}'
'{f0b7a1a3-9847-11cf-8f20-00805f2cd064}'
}
OLEScript
}
}
NoRemove 'Component Categories'
{
ForceRemove '{f0b7a1a1-9847-11cf-8f20-00805f2cd064}'
{
val '409' = s 'Active Scripting Engine'
}
ForceRemove '{f0b7a1a2-9847-11cf-8f20-00805f2cd064}'
{
val '409' = s 'Active Scripting Engine with Parsing'
}
ForceRemove '{f0b7a1a3-9847-11cf-8f20-00805f2cd064}'
{
val '409' = s 'Active Scripting Engine with Encoding'
}
ForceRemove '{0aee2a92-bcbb-11d0-8c72-00c04fc2b085}'
{
val '409' = s 'Active Scripting Engine with Authoring'
}
}
'ECMAScript' = s 'JScript Language'
{
CLSID = s '{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JavaScript' = s 'JScript Language'
{
CLSID = s '{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JavaScript1.1' = s 'JScript Language'
{
CLSID = s '{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JavaScript1.2' = s 'JScript Language'
{
CLSID = s '{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JavaScript1.3' = s 'JScript Language'
{
CLSID = s '{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'LiveScript' = s 'JScript Language'
{
CLSID = s '{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JScript'
{
OLEScript
}
'JScript Author'
{
OLEScript
}
'JavaScript Author' = s 'JScript Language Authoring'
{
CLSID = s '{F414C261-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JavaScript1.1 Author' = s 'JScript Language Authoring'
{
CLSID = s '{F414C261-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JavaScript1.2 Author' = s 'JScript Language Authoring'
{
CLSID = s '{F414C261-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'LiveScript Author' = s 'JScript Language Authoring'
{
CLSID = s '{F414C261-6AC0-11CF-B6D1-00AA00BBBB58}'
OLEScript
}
'JScript.Encode'
{
OLEScript
}
ForceRemove JSFile = s 'JScript Script File'
{
ScriptEngine = s 'JScript'
}
}
+41
View File
@@ -0,0 +1,41 @@
/*
* Copyright 2010 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
[
helpstring("JScript Language"),
threading(both),
progid("JScript"),
uuid(f414c260-6ac0-11cf-b6d1-00aa00bbbb58)
]
coclass JScript {}
[
helpstring("JScript Language Authoring"),
threading(both),
progid("JScript Author"),
uuid(f414c261-6ac0-11cf-b6d1-00aa00bbbb58)
]
coclass JScriptAuthor {}
[
helpstring("JScript Language Encoding"),
threading(both),
progid("JScript.Encode"),
uuid(f414c262-6ac0-11cf-b6d1-00aa00bbbb58)
]
coclass JScriptEncode {}
+36
View File
@@ -0,0 +1,36 @@
HKCR
{
NoRemove Interface
{
}
NoRemove CLSID
{
'{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}' = s 'JScript Language'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
ProgId = s 'JScript'
}
'{F414C261-6AC0-11CF-B6D1-00AA00BBBB58}' = s 'JScript Language Authoring'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
ProgId = s 'JScript Author'
}
'{F414C262-6AC0-11CF-B6D1-00AA00BBBB58}' = s 'JScript Language Encoding'
{
InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' }
ProgId = s 'JScript.Encode'
}
}
'JScript' = s 'JScript Language'
{
CLSID = s '{F414C260-6AC0-11CF-B6D1-00AA00BBBB58}'
}
'JScript Author' = s 'JScript Language Authoring'
{
CLSID = s '{F414C261-6AC0-11CF-B6D1-00AA00BBBB58}'
}
'JScript.Encode' = s 'JScript Language Encoding'
{
CLSID = s '{F414C262-6AC0-11CF-B6D1-00AA00BBBB58}'
}
}
+50 -70
View File
@@ -25,6 +25,8 @@
#include <activaut.h>
#include <objsafe.h>
#include <mshtmhst.h>
#include <rpcproxy.h>
#include <jscript_classes.h>
#include <wine/debug.h>
@@ -32,13 +34,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript);
LONG module_ref = 0;
static const CLSID CLSID_JScript =
{0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
static const CLSID CLSID_JScriptAuthor =
{0xf414c261,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
static const CLSID CLSID_JScriptEncode =
{0xf414c262,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
HINSTANCE jscript_hinstance;
@@ -88,6 +83,19 @@ static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
return S_OK;
}
static HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *outer,
REFIID riid, void **ppv)
{
TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
if(outer) {
*ppv = NULL;
return CLASS_E_NOAGGREGATION;
}
return create_jscript_object(FALSE, riid, ppv);
}
static const IClassFactoryVtbl JScriptFactoryVtbl = {
ClassFactory_QueryInterface,
ClassFactory_AddRef,
@@ -98,6 +106,29 @@ static const IClassFactoryVtbl JScriptFactoryVtbl = {
static IClassFactory JScriptFactory = { &JScriptFactoryVtbl };
static HRESULT WINAPI JScriptEncodeFactory_CreateInstance(IClassFactory *iface, IUnknown *outer,
REFIID riid, void **ppv)
{
TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
if(outer) {
*ppv = NULL;
return CLASS_E_NOAGGREGATION;
}
return create_jscript_object(TRUE, riid, ppv);
}
static const IClassFactoryVtbl JScriptEncodeFactoryVtbl = {
ClassFactory_QueryInterface,
ClassFactory_AddRef,
ClassFactory_Release,
JScriptEncodeFactory_CreateInstance,
ClassFactory_LockServer
};
static IClassFactory JScriptEncodeFactory = { &JScriptEncodeFactoryVtbl };
/******************************************************************
* DllMain (jscript.@)
*/
@@ -105,14 +136,15 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
{
TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpv);
switch(fdwReason)
{
case DLL_WINE_PREATTACH:
return FALSE; /* prefer native version */
switch(fdwReason) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hInstDLL);
jscript_hinstance = hInstDLL;
if(!init_strings())
return FALSE;
break;
case DLL_PROCESS_DETACH:
free_strings();
}
return TRUE;
@@ -128,6 +160,11 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
return IClassFactory_QueryInterface(&JScriptFactory, riid, ppv);
}
if(IsEqualGUID(&CLSID_JScriptEncode, rclsid)) {
TRACE("(CLSID_JScriptEncode %s %p)\n", debugstr_guid(riid), ppv);
return IClassFactory_QueryInterface(&JScriptEncodeFactory, riid, ppv);
}
FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
return CLASS_E_CLASSNOTAVAILABLE;
}
@@ -142,70 +179,13 @@ HRESULT WINAPI DllCanUnloadNow(void)
return module_ref ? S_FALSE : S_OK;
}
/***********************************************************************
* register_inf
*/
#define INF_SET_ID(id) \
do \
{ \
static CHAR name[] = #id; \
\
pse[i].pszName = name; \
clsids[i++] = &id; \
} while (0)
static HRESULT register_inf(BOOL doregister)
{
HRESULT hres;
HMODULE hAdvpack;
HRESULT (WINAPI *pRegInstall)(HMODULE hm, LPCSTR pszSection, const STRTABLEA* pstTable);
STRTABLEA strtable;
STRENTRYA pse[7];
static CLSID const *clsids[7];
unsigned int i = 0;
static const WCHAR advpackW[] = {'a','d','v','p','a','c','k','.','d','l','l',0};
INF_SET_ID(CLSID_JScript);
INF_SET_ID(CLSID_JScriptAuthor);
INF_SET_ID(CLSID_JScriptEncode);
INF_SET_ID(CATID_ActiveScript);
INF_SET_ID(CATID_ActiveScriptParse);
INF_SET_ID(CATID_ActiveScriptEncode);
INF_SET_ID(CATID_ActiveScriptAuthor);
for(i = 0; i < sizeof(pse)/sizeof(pse[0]); i++) {
pse[i].pszValue = HeapAlloc(GetProcessHeap(), 0, 39);
sprintf(pse[i].pszValue, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
clsids[i]->Data1, clsids[i]->Data2, clsids[i]->Data3, clsids[i]->Data4[0],
clsids[i]->Data4[1], clsids[i]->Data4[2], clsids[i]->Data4[3], clsids[i]->Data4[4],
clsids[i]->Data4[5], clsids[i]->Data4[6], clsids[i]->Data4[7]);
}
strtable.cEntries = sizeof(pse)/sizeof(pse[0]);
strtable.pse = pse;
hAdvpack = LoadLibraryW(advpackW);
pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall");
hres = pRegInstall(jscript_hinstance, doregister ? "RegisterDll" : "UnregisterDll", &strtable);
for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++)
HeapFree(GetProcessHeap(), 0, pse[i].pszValue);
return hres;
}
#undef INF_SET_CLSID
/***********************************************************************
* DllRegisterServer (jscript.@)
*/
HRESULT WINAPI DllRegisterServer(void)
{
TRACE("()\n");
return register_inf(TRUE);
return __wine_register_resources(jscript_hinstance);
}
/***********************************************************************
@@ -214,5 +194,5 @@ HRESULT WINAPI DllRegisterServer(void)
HRESULT WINAPI DllUnregisterServer(void)
{
TRACE("()\n");
return register_inf(FALSE);
return __wine_unregister_resources(jscript_hinstance);
}
File diff suppressed because it is too large Load Diff
+127
View File
@@ -0,0 +1,127 @@
/*
* Copyright 2012 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "jscript.h"
#include <wine/debug.h>
const char *debugstr_jsstr(jsstr_t *str)
{
return debugstr_wn(str->str, jsstr_length(str));
}
jsstr_t *jsstr_alloc_buf(unsigned len)
{
jsstr_t *ret;
if(len > JSSTR_MAX_LENGTH)
return NULL;
ret = heap_alloc(FIELD_OFFSET(jsstr_t, str[len+1]));
if(!ret)
return NULL;
ret->length_flags = len << JSSTR_LENGTH_SHIFT;
ret->ref = 1;
ret->str[len] = 0;
return ret;
}
jsstr_t *jsstr_alloc_len(const WCHAR *buf, unsigned len)
{
jsstr_t *ret;
ret = jsstr_alloc_buf(len);
if(ret)
memcpy(ret->str, buf, len*sizeof(WCHAR));
return ret;
}
int jsstr_cmp(jsstr_t *str1, jsstr_t *str2)
{
int len1 = jsstr_length(str1);
int len2 = jsstr_length(str2);
int ret;
ret = memcmp(str1->str, str2->str, min(len1, len2)*sizeof(WCHAR));
if(!ret)
ret = len1 - len2;
return ret;
}
jsstr_t *jsstr_concat(jsstr_t *str1, jsstr_t *str2)
{
unsigned len1, len2;
jsstr_t *ret;
len1 = jsstr_length(str1);
if(!len1)
return jsstr_addref(str2);
len2 = jsstr_length(str2);
if(!len2)
return jsstr_addref(str1);
ret = jsstr_alloc_buf(len1+len2);
if(!ret)
return NULL;
jsstr_flush(str1, ret->str);
jsstr_flush(str2, ret->str+len1);
return ret;
}
static jsstr_t *empty_str, *nan_str, *undefined_str;
jsstr_t *jsstr_nan(void)
{
return jsstr_addref(nan_str);
}
jsstr_t *jsstr_empty(void)
{
return jsstr_addref(empty_str);
}
jsstr_t *jsstr_undefined(void)
{
return jsstr_addref(undefined_str);
}
BOOL init_strings(void)
{
static const WCHAR NaNW[] = { 'N','a','N',0 };
static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
if(!(empty_str = jsstr_alloc_buf(0)))
return FALSE;
if(!(nan_str = jsstr_alloc(NaNW)))
return FALSE;
if(!(undefined_str = jsstr_alloc(undefinedW)))
return FALSE;
return TRUE;
}
void free_strings(void)
{
jsstr_release(empty_str);
jsstr_release(nan_str);
jsstr_release(undefined_str);
}
+84
View File
@@ -0,0 +1,84 @@
/*
* Copyright 2012 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
struct _jsstr_t {
unsigned length_flags;
unsigned ref;
WCHAR str[1];
};
#define JSSTR_LENGTH_SHIFT 4
#define JSSTR_MAX_LENGTH (1 << (32-JSSTR_LENGTH_SHIFT))
#define JSSTR_FLAGS_MASK ((1 << JSSTR_LENGTH_SHIFT)-1)
#define JSSTR_FLAG_NULLBSTR 1
static inline unsigned jsstr_length(jsstr_t *str)
{
return str->length_flags >> JSSTR_LENGTH_SHIFT;
}
jsstr_t *jsstr_alloc_len(const WCHAR*,unsigned) DECLSPEC_HIDDEN;
jsstr_t *jsstr_alloc_buf(unsigned) DECLSPEC_HIDDEN;
static inline jsstr_t *jsstr_alloc(const WCHAR *str)
{
return jsstr_alloc_len(str, strlenW(str));
}
static inline void jsstr_release(jsstr_t *str)
{
if(!--str->ref)
heap_free(str);
}
static inline jsstr_t *jsstr_addref(jsstr_t *str)
{
str->ref++;
return str;
}
static inline BOOL jsstr_eq(jsstr_t *str1, jsstr_t *str2)
{
unsigned len = jsstr_length(str1);
return len == jsstr_length(str2) && !memcmp(str1->str, str2->str, len*sizeof(WCHAR));
}
static inline unsigned jsstr_flush(jsstr_t *str, WCHAR *buf)
{
unsigned len = jsstr_length(str);
memcpy(buf, str->str, len*sizeof(WCHAR));
return len;
}
static inline jsstr_t *jsstr_substr(jsstr_t *str, unsigned off, unsigned len)
{
return jsstr_alloc_len(str->str+off, len);
}
int jsstr_cmp(jsstr_t*,jsstr_t*) DECLSPEC_HIDDEN;
jsstr_t *jsstr_concat(jsstr_t*,jsstr_t*) DECLSPEC_HIDDEN;
jsstr_t *jsstr_nan(void) DECLSPEC_HIDDEN;
jsstr_t *jsstr_empty(void) DECLSPEC_HIDDEN;
jsstr_t *jsstr_undefined(void) DECLSPEC_HIDDEN;
BOOL init_strings(void) DECLSPEC_HIDDEN;
void free_strings(void) DECLSPEC_HIDDEN;
const char *debugstr_jsstr(jsstr_t*) DECLSPEC_HIDDEN;
File diff suppressed because it is too large Load Diff
+249
View File
@@ -0,0 +1,249 @@
/*
* Copyright 2012 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef JSVAL_H
#define JSVAL_H
#include "jsstr.h"
/*
* jsval_t structure is used to represent JavaScript dynamically-typed values.
* It's a (type,value) pair, usually represented as a structure of enum (type)
* and union (value of given type). For both memory and speed performance, we
* use tricks allowing storing both values as a struct with size equal to
* size of double (that is 64-bit) on 32-bit systems. For that, we use the fact
* that NaN value representation has 52 (almost) free bits.
*/
#ifdef __i386__
#define JSVAL_DOUBLE_LAYOUT_PTR32
#endif
#ifdef JSVAL_DOUBLE_LAYOUT_PTR32
/* NaN exponent and our 0x80000 marker */
#define JSV_VAL(x) (0x7ff80000|x)
#else
#define JSV_VAL(x) x
#endif
typedef enum {
JSV_UNDEFINED = JSV_VAL(1),
JSV_NULL = JSV_VAL(2),
JSV_OBJECT = JSV_VAL(3),
JSV_STRING = JSV_VAL(4),
JSV_NUMBER = JSV_VAL(5),
JSV_BOOL = JSV_VAL(6),
JSV_VARIANT = JSV_VAL(7)
} jsval_type_t;
struct _jsval_t {
#ifdef JSVAL_DOUBLE_LAYOUT_PTR32
union {
double n;
struct {
union {
IDispatch *obj;
jsstr_t *str;
BOOL b;
VARIANT *v;
UINT_PTR as_uintptr;
} u;
jsval_type_t tag;
} s;
} u;
#else
jsval_type_t type;
union {
IDispatch *obj;
jsstr_t *str;
double n;
BOOL b;
VARIANT *v;
} u;
#endif
};
#ifdef JSVAL_DOUBLE_LAYOUT_PTR32
C_ASSERT(sizeof(jsval_t) == sizeof(double));
#define __JSVAL_TYPE(x) ((x).u.s.tag)
#define __JSVAL_BOOL(x) ((x).u.s.u.b)
#define __JSVAL_STR(x) ((x).u.s.u.str)
#define __JSVAL_OBJ(x) ((x).u.s.u.obj)
#define __JSVAL_VAR(x) ((x).u.s.u.v)
#else
#define __JSVAL_TYPE(x) ((x).type)
#define __JSVAL_BOOL(x) ((x).u.b)
#define __JSVAL_STR(x) ((x).u.str)
#define __JSVAL_OBJ(x) ((x).u.obj)
#define __JSVAL_VAR(x) ((x).u.v)
#endif
static inline jsval_t jsval_bool(BOOL b)
{
jsval_t ret;
__JSVAL_TYPE(ret) = JSV_BOOL;
__JSVAL_BOOL(ret) = b;
return ret;
}
static inline jsval_t jsval_string(jsstr_t *str)
{
jsval_t ret;
__JSVAL_TYPE(ret) = JSV_STRING;
__JSVAL_STR(ret) = str;
return ret;
}
static inline jsval_t jsval_disp(IDispatch *obj)
{
jsval_t ret;
__JSVAL_TYPE(ret) = JSV_OBJECT;
__JSVAL_OBJ(ret) = obj;
return ret;
}
static inline jsval_t jsval_obj(jsdisp_t *obj)
{
return jsval_disp(to_disp(obj));
}
static inline jsval_t jsval_null(void)
{
jsval_t ret;
__JSVAL_TYPE(ret) = JSV_NULL;
return ret;
}
static inline jsval_t jsval_undefined(void)
{
jsval_t ret;
__JSVAL_TYPE(ret) = JSV_UNDEFINED;
return ret;
}
static inline jsval_t jsval_number(double n)
{
jsval_t ret;
#ifdef JSVAL_DOUBLE_LAYOUT_PTR32
ret.u.n = n;
/* normalize NaN value */
if((ret.u.s.tag & 0x7ff00000) == 0x7ff00000) {
/* isinf */
if(ret.u.s.tag & 0xfffff) {
ret.u.s.tag = 0x7ff00000;
ret.u.s.u.as_uintptr = ~0;
}else if(ret.u.s.u.as_uintptr) {
ret.u.s.tag = 0x7ff00000;
}
}
#else
ret.type = JSV_NUMBER;
ret.u.n = n;
#endif
return ret;
}
static inline BOOL is_object_instance(jsval_t v)
{
return __JSVAL_TYPE(v) == JSV_OBJECT;
}
static inline BOOL is_undefined(jsval_t v)
{
return __JSVAL_TYPE(v) == JSV_UNDEFINED;
}
static inline BOOL is_null(jsval_t v)
{
return __JSVAL_TYPE(v) == JSV_NULL;
}
static inline BOOL is_null_instance(jsval_t v)
{
return is_null(v) || (is_object_instance(v) && !__JSVAL_OBJ(v));
}
static inline BOOL is_string(jsval_t v)
{
return __JSVAL_TYPE(v) == JSV_STRING;
}
static inline BOOL is_number(jsval_t v)
{
#ifdef JSVAL_DOUBLE_LAYOUT_PTR32
return (v.u.s.tag & 0x7ff80000) != 0x7ff80000;
#else
return v.type == JSV_NUMBER;
#endif
}
static inline BOOL is_variant(jsval_t v)
{
return __JSVAL_TYPE(v) == JSV_VARIANT;
}
static inline BOOL is_bool(jsval_t v)
{
return __JSVAL_TYPE(v) == JSV_BOOL;
}
static inline jsval_type_t jsval_type(jsval_t v)
{
#ifdef JSVAL_DOUBLE_LAYOUT_PTR32
return is_number(v) ? JSV_NUMBER : v.u.s.tag;
#else
return v.type;
#endif
}
static inline IDispatch *get_object(jsval_t v)
{
return __JSVAL_OBJ(v);
}
static inline double get_number(jsval_t v)
{
return v.u.n;
}
static inline jsstr_t *get_string(jsval_t v)
{
return __JSVAL_STR(v);
}
static inline VARIANT *get_variant(jsval_t v)
{
return __JSVAL_VAR(v);
}
static inline BOOL get_bool(jsval_t v)
{
return __JSVAL_BOOL(v);
}
HRESULT variant_to_jsval(VARIANT*,jsval_t*) DECLSPEC_HIDDEN;
HRESULT jsval_to_variant(jsval_t,VARIANT*) DECLSPEC_HIDDEN;
void jsval_release(jsval_t) DECLSPEC_HIDDEN;
HRESULT jsval_copy(jsval_t,jsval_t*) DECLSPEC_HIDDEN;
#endif
+276 -95
View File
@@ -16,7 +16,9 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <math.h>
#include "config.h"
#include "wine/port.h"
//#include <limits.h>
#include "jscript.h"
@@ -57,7 +59,6 @@ static const WCHAR throwW[] = {'t','h','r','o','w',0};
static const WCHAR trueW[] = {'t','r','u','e',0};
static const WCHAR tryW[] = {'t','r','y',0};
static const WCHAR typeofW[] = {'t','y','p','e','o','f',0};
static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
static const WCHAR varW[] = {'v','a','r',0};
static const WCHAR voidW[] = {'v','o','i','d',0};
static const WCHAR whileW[] = {'w','h','i','l','e',0};
@@ -66,11 +67,12 @@ static const WCHAR withW[] = {'w','i','t','h',0};
static const struct {
const WCHAR *word;
int token;
BOOL no_nl;
} keywords[] = {
{breakW, kBREAK},
{breakW, kBREAK, TRUE},
{caseW, kCASE},
{catchW, kCATCH},
{continueW, kCONTINUE},
{continueW, kCONTINUE, TRUE},
{defaultW, kDEFAULT},
{deleteW, kDELETE},
{doW, kDO},
@@ -84,7 +86,7 @@ static const struct {
{instanceofW, kINSTANCEOF},
{newW, kNEW},
{nullW, kNULL},
{returnW, kRETURN},
{returnW, kRETURN, TRUE},
{switchW, kSWITCH},
{thisW, kTHIS},
{throwW, kTHROW},
@@ -99,7 +101,7 @@ static const struct {
static int lex_error(parser_ctx_t *ctx, HRESULT hres)
{
ctx->hres = JSCRIPT_ERROR|hres;
ctx->hres = hres;
ctx->lexer_error = TRUE;
return -1;
}
@@ -125,7 +127,8 @@ static int check_keyword(parser_ctx_t *ctx, const WCHAR *word, const WCHAR **lva
if(*p2 || (p1 < ctx->end && is_identifier_char(*p1)))
return 1;
*lval = ctx->ptr;
if(lval)
*lval = ctx->ptr;
ctx->ptr = p1;
return 0;
}
@@ -158,8 +161,10 @@ static int check_keywords(parser_ctx_t *ctx, const WCHAR **lval)
i = (min+max)/2;
r = check_keyword(ctx, keywords[i].word, lval);
if(!r)
if(!r) {
ctx->implicit_nl_semicolon = keywords[i].no_nl;
return keywords[i].token;
}
if(r > 0)
min = i+1;
@@ -170,14 +175,6 @@ static int check_keywords(parser_ctx_t *ctx, const WCHAR **lval)
return 0;
}
static void skip_spaces(parser_ctx_t *ctx)
{
while(ctx->ptr < ctx->end && isspaceW(*ctx->ptr)) {
if(is_endline(*ctx->ptr++))
ctx->nl = TRUE;
}
}
static BOOL skip_html_comment(parser_ctx_t *ctx)
{
const WCHAR html_commentW[] = {'<','!','-','-',0};
@@ -194,12 +191,23 @@ static BOOL skip_html_comment(parser_ctx_t *ctx)
static BOOL skip_comment(parser_ctx_t *ctx)
{
if(ctx->ptr+1 >= ctx->end || *ctx->ptr != '/')
if(ctx->ptr+1 >= ctx->end)
return FALSE;
if(*ctx->ptr != '/') {
if(*ctx->ptr == '@' && ctx->ptr+2 < ctx->end && ctx->ptr[1] == '*' && ctx->ptr[2] == '/') {
ctx->ptr += 3;
return TRUE;
}
return FALSE;
}
switch(ctx->ptr[1]) {
case '*':
ctx->ptr += 2;
if(ctx->ptr+2 < ctx->end && *ctx->ptr == '@' && is_identifier_char(ctx->ptr[1]))
return FALSE;
while(ctx->ptr+1 < ctx->end && (ctx->ptr[0] != '*' || ctx->ptr[1] != '/'))
ctx->ptr++;
@@ -212,6 +220,8 @@ static BOOL skip_comment(parser_ctx_t *ctx)
break;
case '/':
ctx->ptr += 2;
if(ctx->ptr+2 < ctx->end && *ctx->ptr == '@' && is_identifier_char(ctx->ptr[1]))
return FALSE;
while(ctx->ptr < ctx->end && !is_endline(*ctx->ptr))
ctx->ptr++;
break;
@@ -235,7 +245,6 @@ static BOOL unescape(WCHAR *str)
}
p++;
c = 0;
switch(*p) {
case '\'':
@@ -252,9 +261,6 @@ static BOOL unescape(WCHAR *str)
case 'n':
c = '\n';
break;
case 'v':
c = '\v';
break;
case 'f':
c = '\f';
break;
@@ -327,7 +333,7 @@ static int parse_identifier(parser_ctx_t *ctx, const WCHAR **ret)
len = ctx->ptr-ptr;
*ret = wstr = parser_alloc(ctx, (len+1)*sizeof(WCHAR));
memcpy(wstr, ptr, (len+1)*sizeof(WCHAR));
memcpy(wstr, ptr, len*sizeof(WCHAR));
wstr[len] = 0;
/* FIXME: unescape */
@@ -346,12 +352,12 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret, WCHAR endc
}
if(ctx->ptr == ctx->end)
return lex_error(ctx, IDS_UNTERMINATED_STR);
return lex_error(ctx, JS_E_UNTERMINATED_STRING);
len = ctx->ptr-ptr;
*ret = wstr = parser_alloc(ctx, (len+1)*sizeof(WCHAR));
memcpy(wstr, ptr, (len+1)*sizeof(WCHAR));
memcpy(wstr, ptr, len*sizeof(WCHAR));
wstr[len] = 0;
ctx->ptr++;
@@ -364,12 +370,21 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret, WCHAR endc
return tStringLiteral;
}
static literal_t *alloc_int_literal(parser_ctx_t *ctx, LONG l)
static literal_t *new_double_literal(parser_ctx_t *ctx, DOUBLE d)
{
literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
ret->type = LT_INT;
ret->u.lval = l;
ret->type = LT_DOUBLE;
ret->u.dval = d;
return ret;
}
literal_t *new_boolean_literal(parser_ctx_t *ctx, BOOL bval)
{
literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
ret->type = LT_BOOL;
ret->u.bval = bval;
return ret;
}
@@ -379,12 +394,6 @@ static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **li
LONGLONG d, hlp;
int exp = 0;
if(ctx->ptr == ctx->end || (!isdigitW(*ctx->ptr) &&
*ctx->ptr!='.' && *ctx->ptr!='e' && *ctx->ptr!='E')) {
ERR("Illegal character\n");
return 0;
}
d = int_part;
while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
hlp = d*10 + *(ctx->ptr++) - '0';
@@ -400,19 +409,21 @@ static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **li
ctx->ptr++;
}
if(*ctx->ptr == '.') ctx->ptr++;
while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
hlp = d*10 + *(ctx->ptr++) - '0';
if(d>LONGLONG_MAX/10 || hlp<0)
break;
d = hlp;
exp--;
}
while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
if(*ctx->ptr == '.') {
ctx->ptr++;
while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) {
hlp = d*10 + *(ctx->ptr++) - '0';
if(d>LONGLONG_MAX/10 || hlp<0)
break;
d = hlp;
exp--;
}
while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
ctx->ptr++;
}
if(ctx->ptr < ctx->end && (*ctx->ptr == 'e' || *ctx->ptr == 'E')) {
int sign = 1, e = 0;
@@ -445,10 +456,7 @@ static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **li
else exp += e;
}
*literal = parser_alloc(ctx, sizeof(literal_t));
(*literal)->type = LT_DOUBLE;
(*literal)->u.dval = (double)d*pow(10, exp);
*literal = new_double_literal(ctx, exp>=0 ? d*pow(10, exp) : d/pow(10, -exp));
return tNumericLiteral;
}
@@ -457,15 +465,10 @@ static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
LONG l, d;
l = *ctx->ptr++ - '0';
if(ctx->ptr == ctx->end) {
*literal = alloc_int_literal(ctx, l);
return tNumericLiteral;
}
if(!l) {
if(*ctx->ptr == 'x' || *ctx->ptr == 'X') {
if(++ctx->ptr == ctx->end) {
ERR("unexpexted end of file\n");
ERR("unexpected end of file\n");
return 0;
}
@@ -479,58 +482,43 @@ static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal)
return lex_error(ctx, E_FAIL);
}
*literal = alloc_int_literal(ctx, l);
*literal = new_double_literal(ctx, l);
return tNumericLiteral;
}
if(isdigitW(*ctx->ptr) || is_identifier_char(*ctx->ptr)) {
if(is_identifier_char(*ctx->ptr)) {
WARN("wrong char after zero\n");
return lex_error(ctx, E_FAIL);
}
*literal = alloc_int_literal(ctx, 0);
}
while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr))
{
d = l*10 + *(ctx->ptr)-'0';
/* Check for integer overflow */
if (l > INT_MAX/10 || d < 0)
return parse_double_literal(ctx, l, literal);
l = d;
ctx->ptr++;
}
if(ctx->ptr < ctx->end) {
if(*ctx->ptr == '.' || *ctx->ptr == 'e' || *ctx->ptr == 'E')
return parse_double_literal(ctx, l, literal);
if(is_identifier_char(*ctx->ptr)) {
WARN("unexpected identifier char\n");
return lex_error(ctx, E_FAIL);
if(isdigitW(*ctx->ptr)) {
FIXME("octal literals not implemented\n");
return lex_error(ctx, E_NOTIMPL);
}
}
*literal = alloc_int_literal(ctx, l);
return tNumericLiteral;
return parse_double_literal(ctx, l, literal);
}
int parser_lex(void *lval, parser_ctx_t *ctx)
static int next_token(parser_ctx_t *ctx, void *lval)
{
int ret;
ctx->nl = ctx->ptr == ctx->begin;
do {
skip_spaces(ctx);
while(ctx->ptr < ctx->end && isspaceW(*ctx->ptr)) {
if(is_endline(*ctx->ptr++))
ctx->nl = TRUE;
}
if(ctx->ptr == ctx->end)
return 0;
return tEOF;
}while(skip_comment(ctx) || skip_html_comment(ctx));
if(ctx->implicit_nl_semicolon) {
if(ctx->nl)
return ';';
ctx->implicit_nl_semicolon = FALSE;
}
if(isalphaW(*ctx->ptr)) {
ret = check_keywords(ctx, lval);
int ret = check_keywords(ctx, lval);
if(ret)
return ret;
@@ -748,32 +736,225 @@ int parser_lex(void *lval, parser_ctx_t *ctx)
case '_':
case '$':
return parse_identifier(ctx, lval);
case '@':
return '@';
}
WARN("unexpected char '%c' %d\n", *ctx->ptr, *ctx->ptr);
return 0;
}
struct _cc_var_t {
BOOL is_num;
union {
BOOL b;
DOUBLE n;
} u;
struct _cc_var_t *next;
unsigned name_len;
WCHAR name[0];
};
void release_cc(cc_ctx_t *cc)
{
cc_var_t *iter, *next;
for(iter = cc->vars; iter; iter = next) {
next = iter->next;
heap_free(iter);
}
heap_free(cc);
}
static BOOL add_cc_var(cc_ctx_t *cc, const WCHAR *name, cc_var_t *v)
{
cc_var_t *new_v;
unsigned len;
len = strlenW(name);
new_v = heap_alloc(sizeof(cc_var_t) + (len+1)*sizeof(WCHAR));
if(!new_v)
return FALSE;
memcpy(new_v, v, sizeof(*v));
memcpy(new_v->name, name, (len+1)*sizeof(WCHAR));
new_v->name_len = len;
new_v->next = cc->vars;
cc->vars = new_v;
return TRUE;
}
static cc_var_t *find_cc_var(cc_ctx_t *cc, const WCHAR *name, unsigned name_len)
{
cc_var_t *iter;
for(iter = cc->vars; iter; iter = iter->next) {
if(iter->name_len == name_len && !memcmp(iter->name, name, name_len*sizeof(WCHAR)))
return iter;
}
return NULL;
}
static int init_cc(parser_ctx_t *ctx)
{
cc_ctx_t *cc;
cc_var_t v;
static const WCHAR _win32W[] = {'_','w','i','n','3','2',0};
static const WCHAR _win64W[] = {'_','w','i','n','6','4',0};
static const WCHAR _x86W[] = {'_','x','8','6',0};
static const WCHAR _amd64W[] = {'_','a','m','d','6','4',0};
static const WCHAR _jscriptW[] = {'_','j','s','c','r','i','p','t',0};
static const WCHAR _jscript_buildW[] = {'_','j','s','c','r','i','p','t','_','b','u','i','l','d',0};
static const WCHAR _jscript_versionW[] = {'_','j','s','c','r','i','p','t','_','v','e','r','s','i','o','n',0};
if(ctx->script->cc)
return 0;
cc = heap_alloc(sizeof(cc_ctx_t));
if(!cc)
return lex_error(ctx, E_OUTOFMEMORY);
cc->vars = NULL;
v.is_num = FALSE;
v.u.b = TRUE;
if(!add_cc_var(cc, _jscriptW, &v)
|| !add_cc_var(cc, sizeof(void*) == 8 ? _win64W : _win32W, &v)
|| !add_cc_var(cc, sizeof(void*) == 8 ? _amd64W : _x86W, &v)) {
release_cc(cc);
return lex_error(ctx, E_OUTOFMEMORY);
}
v.is_num = TRUE;
v.u.n = JSCRIPT_BUILD_VERSION;
if(!add_cc_var(cc, _jscript_buildW, &v)) {
release_cc(cc);
return lex_error(ctx, E_OUTOFMEMORY);
}
v.u.n = JSCRIPT_MAJOR_VERSION + (DOUBLE)JSCRIPT_MINOR_VERSION/10.0;
if(!add_cc_var(cc, _jscript_versionW, &v)) {
release_cc(cc);
return lex_error(ctx, E_OUTOFMEMORY);
}
ctx->script->cc = cc;
return 0;
}
static int cc_token(parser_ctx_t *ctx, void *lval)
{
unsigned id_len = 0;
cc_var_t *var;
static const WCHAR cc_onW[] = {'c','c','_','o','n',0};
static const WCHAR setW[] = {'s','e','t',0};
static const WCHAR elifW[] = {'e','l','i','f',0};
static const WCHAR endW[] = {'e','n','d',0};
ctx->ptr++;
if(!check_keyword(ctx, cc_onW, NULL))
return init_cc(ctx);
if(!check_keyword(ctx, setW, NULL)) {
FIXME("@set not implemented\n");
return lex_error(ctx, E_NOTIMPL);
}
if(!check_keyword(ctx, ifW, NULL)) {
FIXME("@if not implemented\n");
return lex_error(ctx, E_NOTIMPL);
}
if(!check_keyword(ctx, elifW, NULL)) {
FIXME("@elif not implemented\n");
return lex_error(ctx, E_NOTIMPL);
}
if(!check_keyword(ctx, elseW, NULL)) {
FIXME("@else not implemented\n");
return lex_error(ctx, E_NOTIMPL);
}
if(!check_keyword(ctx, endW, NULL)) {
FIXME("@end not implemented\n");
return lex_error(ctx, E_NOTIMPL);
}
if(!ctx->script->cc)
return lex_error(ctx, JS_E_DISABLED_CC);
while(ctx->ptr+id_len < ctx->end && is_identifier_char(ctx->ptr[id_len]))
id_len++;
if(!id_len)
return '@';
TRACE("var %s\n", debugstr_wn(ctx->ptr, id_len));
var = find_cc_var(ctx->script->cc, ctx->ptr, id_len);
ctx->ptr += id_len;
if(!var || var->is_num) {
*(literal_t**)lval = new_double_literal(ctx, var ? var->u.n : NAN);
return tNumericLiteral;
}
*(literal_t**)lval = new_boolean_literal(ctx, var->u.b);
return tBooleanLiteral;
}
int parser_lex(void *lval, parser_ctx_t *ctx)
{
int ret;
ctx->nl = ctx->ptr == ctx->begin;
do {
ret = next_token(ctx, lval);
} while(ret == '@' && !(ret = cc_token(ctx, lval)));
return ret;
}
literal_t *parse_regexp(parser_ctx_t *ctx)
{
const WCHAR *re, *flags_ptr;
BOOL in_class = FALSE;
DWORD re_len, flags;
literal_t *ret;
HRESULT hres;
TRACE("\n");
while(*ctx->ptr != '/')
ctx->ptr--;
while(*--ctx->ptr != '/');
/* Simple regexp pre-parser; '/' if used in char class does not terminate regexp literal */
re = ++ctx->ptr;
while(ctx->ptr < ctx->end && *ctx->ptr != '/') {
if(*ctx->ptr++ == '\\' && ctx->ptr < ctx->end)
ctx->ptr++;
while(ctx->ptr < ctx->end) {
if(*ctx->ptr == '\\') {
if(++ctx->ptr == ctx->end)
break;
}else if(in_class) {
if(*ctx->ptr == '\n')
break;
if(*ctx->ptr == ']')
in_class = FALSE;
}else {
if(*ctx->ptr == '/')
break;
if(*ctx->ptr == '[')
in_class = TRUE;
}
ctx->ptr++;
}
if(ctx->ptr == ctx->end) {
WARN("unexpected end of file\n");
if(ctx->ptr == ctx->end || *ctx->ptr != '/') {
WARN("pre-parsing failed\n");
return NULL;
}
+189 -238
View File
@@ -57,520 +57,448 @@ static const WCHAR sinW[] = {'s','i','n',0};
static const WCHAR sqrtW[] = {'s','q','r','t',0};
static const WCHAR tanW[] = {'t','a','n',0};
static HRESULT math_constant(DOUBLE val, WORD flags, VARIANT *retv)
{
switch(flags) {
case DISPATCH_PROPERTYGET:
V_VT(retv) = VT_R8;
V_R8(retv) = val;
return S_OK;
case DISPATCH_PROPERTYPUT:
return S_OK;
}
FIXME("unhandled flags %x\n", flags);
return E_NOTIMPL;
}
/* ECMA-262 3rd Edition 15.8.1.1 */
static HRESULT Math_E(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_E, flags, retv);
}
/* ECMA-262 3rd Edition 15.8.1.4 */
static HRESULT Math_LOG2E(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_LOG2E, flags, retv);
}
/* ECMA-262 3rd Edition 15.8.1.4 */
static HRESULT Math_LOG10E(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_LOG10E, flags, retv);
}
static HRESULT Math_LN2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_LN2, flags, retv);
}
static HRESULT Math_LN10(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_LN10, flags, retv);
}
/* ECMA-262 3rd Edition 15.8.1.6 */
static HRESULT Math_PI(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_PI, flags, retv);
}
static HRESULT Math_SQRT2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_SQRT2, flags, retv);
}
static HRESULT Math_SQRT1_2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
TRACE("\n");
return math_constant(M_SQRT1_2, flags, retv);
}
/* ECMA-262 3rd Edition 15.8.2.12 */
static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_abs(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
DOUBLE d;
double d;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv)
num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &d);
if(FAILED(hres))
return hres;
d = num_val(&v);
if(retv)
num_set_val(retv, d < 0.0 ? -d : d);
if(r)
*r = jsval_number(d < 0.0 ? -d : d);
return S_OK;
}
static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_acos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, acos(num_val(&v)));
if(r)
*r = jsval_number(x < -1.0 || x > 1.0 ? NAN : acos(x));
return S_OK;
}
static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_asin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, asin(num_val(&v)));
if(r)
*r = jsval_number(x < -1.0 || x > 1.0 ? NAN : asin(x));
return S_OK;
}
static HRESULT Math_atan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_atan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, atan(num_val(&v)));
if(r)
*r = jsval_number(atan(x));
return S_OK;
}
static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_atan2(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v1, v2;
double x, y;
HRESULT hres;
TRACE("\n");
if(arg_cnt(dp)<2) {
if(retv) num_set_nan(retv);
if(argc<2) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v1);
hres = to_number(ctx, argv[0], &y);
if(FAILED(hres))
return hres;
hres = to_number(ctx, get_arg(dp, 1), ei, &v2);
hres = to_number(ctx, argv[1], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, atan2(num_val(&v1), num_val(&v2)));
if(r)
*r = jsval_number(atan2(y, x));
return S_OK;
}
/* ECMA-262 3rd Edition 15.8.2.6 */
static HRESULT Math_ceil(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_ceil(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv)
num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv)
num_set_val(retv, ceil(num_val(&v)));
if(r)
*r = jsval_number(ceil(x));
return S_OK;
}
static HRESULT Math_cos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_cos(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, cos(num_val(&v)));
if(r)
*r = jsval_number(cos(x));
return S_OK;
}
static HRESULT Math_exp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_exp(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, exp(num_val(&v)));
if(r)
*r = jsval_number(exp(x));
return S_OK;
}
static HRESULT Math_floor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_floor(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv)
num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv)
num_set_val(retv, floor(num_val(&v)));
if(r)
*r = jsval_number(floor(x));
return S_OK;
}
static HRESULT Math_log(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_log(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv)
num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv)
num_set_val(retv, log(num_val(&v)));
if(r)
*r = jsval_number(x < -0.0 ? NAN : log(x));
return S_OK;
}
/* ECMA-262 3rd Edition 15.8.2.11 */
static HRESULT Math_max(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_max(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
DOUBLE max, d;
VARIANT v;
DWORD i;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv)
num_set_inf(retv, FALSE);
if(!argc) {
if(r)
*r = jsval_number(-INFINITY);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &max);
if(FAILED(hres))
return hres;
max = num_val(&v);
for(i=1; i < arg_cnt(dp); i++) {
hres = to_number(ctx, get_arg(dp, i), ei, &v);
for(i=1; i < argc; i++) {
hres = to_number(ctx, argv[i], &d);
if(FAILED(hres))
return hres;
d = num_val(&v);
if(d > max || isnan(d))
max = d;
}
if(retv)
num_set_val(retv, max);
if(r)
*r = jsval_number(max);
return S_OK;
}
/* ECMA-262 3rd Edition 15.8.2.12 */
static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_min(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
DOUBLE min, d;
VARIANT v;
DWORD i;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv)
num_set_inf(retv, TRUE);
if(!argc) {
if(r)
*r = jsval_number(INFINITY);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &min);
if(FAILED(hres))
return hres;
min = num_val(&v);
for(i=1; i < arg_cnt(dp); i++) {
hres = to_number(ctx, get_arg(dp, i), ei, &v);
for(i=1; i < argc; i++) {
hres = to_number(ctx, argv[i], &d);
if(FAILED(hres))
return hres;
d = num_val(&v);
if(d < min || isnan(d))
min = d;
}
if(retv)
num_set_val(retv, min);
if(r)
*r = jsval_number(min);
return S_OK;
}
/* ECMA-262 3rd Edition 15.8.2.13 */
static HRESULT Math_pow(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_pow(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT x, y;
double x, y;
HRESULT hres;
TRACE("\n");
if(arg_cnt(dp) < 2) {
if(retv) num_set_nan(retv);
if(argc < 2) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &x);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
hres = to_number(ctx, get_arg(dp, 1), ei, &y);
hres = to_number(ctx, argv[1], &y);
if(FAILED(hres))
return hres;
if(retv)
num_set_val(retv, pow(num_val(&x), num_val(&y)));
if(r)
*r = jsval_number(pow(x, y));
return S_OK;
}
/* ECMA-262 3rd Edition 15.8.2.14 */
static HRESULT Math_random(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_random(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
UINT r;
UINT x;
TRACE("\n");
if(!RtlGenRandom(&r, sizeof(r)))
if(!RtlGenRandom(&x, sizeof(x)))
return E_UNEXPECTED;
if(retv)
num_set_val(retv, (DOUBLE)r/(DOUBLE)UINT_MAX);
if(r)
*r = jsval_number((double)x/(double)UINT_MAX);
return S_OK;
}
/* ECMA-262 3rd Edition 15.8.2.15 */
static HRESULT Math_round(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_round(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv)
num_set_val(retv, floor(num_val(&v)+0.5));
if(r)
*r = jsval_number(floor(x+0.5));
return S_OK;
}
static HRESULT Math_sin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_sin(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, sin(num_val(&v)));
if(r)
*r = jsval_number(sin(x));
return S_OK;
}
static HRESULT Math_sqrt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_sqrt(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, sqrt(num_val(&v)));
if(r)
*r = jsval_number(sqrt(x));
return S_OK;
}
static HRESULT Math_tan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Math_tan(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT v;
double x;
HRESULT hres;
TRACE("\n");
if(!arg_cnt(dp)) {
if(retv) num_set_nan(retv);
if(!argc) {
if(r)
*r = jsval_number(NAN);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &v);
hres = to_number(ctx, argv[0], &x);
if(FAILED(hres))
return hres;
if(retv) num_set_val(retv, tan(num_val(&v)));
if(r)
*r = jsval_number(tan(x));
return S_OK;
}
static const builtin_prop_t Math_props[] = {
{EW, Math_E, 0},
{LN10W, Math_LN10, 0},
{LN2W, Math_LN2, 0},
{LOG10EW, Math_LOG10E, 0},
{LOG2EW, Math_LOG2E, 0},
{PIW, Math_PI, 0},
{SQRT1_2W, Math_SQRT1_2, 0},
{SQRT2W, Math_SQRT2, 0},
{absW, Math_abs, PROPF_METHOD|1},
{acosW, Math_acos, PROPF_METHOD|1},
{asinW, Math_asin, PROPF_METHOD|1},
@@ -600,12 +528,27 @@ static const builtin_info_t Math_info = {
NULL
};
HRESULT create_math(script_ctx_t *ctx, DispatchEx **ret)
HRESULT create_math(script_ctx_t *ctx, jsdisp_t **ret)
{
DispatchEx *math;
jsdisp_t *math;
unsigned i;
HRESULT hres;
math = heap_alloc_zero(sizeof(DispatchEx));
struct {
const WCHAR *name;
DOUBLE val;
}constants[] = {
{EW, M_E}, /* ECMA-262 3rd Edition 15.8.1.1 */
{LN10W, M_LN10}, /* ECMA-262 3rd Edition 15.8.1.2 */
{LN2W, M_LN2}, /* ECMA-262 3rd Edition 15.8.1.3 */
{LOG2EW, M_LOG2E}, /* ECMA-262 3rd Edition 15.8.1.4 */
{LOG10EW, M_LOG10E}, /* ECMA-262 3rd Edition 15.8.1.5 */
{PIW, M_PI}, /* ECMA-262 3rd Edition 15.8.1.6 */
{SQRT1_2W, M_SQRT1_2}, /* ECMA-262 3rd Edition 15.8.1.7 */
{SQRT2W, M_SQRT2}, /* ECMA-262 3rd Edition 15.8.1.8 */
};
math = heap_alloc_zero(sizeof(jsdisp_t));
if(!math)
return E_OUTOFMEMORY;
@@ -615,6 +558,14 @@ HRESULT create_math(script_ctx_t *ctx, DispatchEx **ret)
return hres;
}
for(i=0; i < sizeof(constants)/sizeof(*constants); i++) {
hres = jsdisp_propput_const(math, constants[i].name, jsval_number(constants[i].val));
if(FAILED(hres)) {
jsdisp_release(math);
return hres;
}
}
*ret = math;
return S_OK;
}
+360 -74
View File
@@ -20,6 +20,7 @@
#include <wine/port.h>
//#include <math.h>
#include <assert.h>
#include "jscript.h"
@@ -28,9 +29,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct {
DispatchEx dispex;
jsdisp_t dispex;
VARIANT num;
double value;
} NumberInstance;
static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
@@ -41,6 +42,7 @@ static const WCHAR toPrecisionW[] = {'t','o','P','r','e','c','i','s','i','o','n'
static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
#define NUMBER_TOSTRING_BUF_SIZE 64
#define NUMBER_DTOA_SIZE 18
static inline NumberInstance *number_from_vdisp(vdisp_t *vdisp)
{
@@ -52,41 +54,211 @@ static inline NumberInstance *number_this(vdisp_t *jsthis)
return is_vclass(jsthis, JSCLASS_NUMBER) ? number_from_vdisp(jsthis) : NULL;
}
static inline void dtoa(double d, WCHAR *buf, int size, int *dec_point)
{
ULONGLONG l;
int i;
/* TODO: this function should print doubles with bigger precision */
assert(size>=2 && size<=NUMBER_DTOA_SIZE && d>=0);
if(d == 0)
*dec_point = 0;
else
*dec_point = floor(log10(d));
l = d*pow(10, size-*dec_point-1);
if(l%10 >= 5)
l = l/10+1;
else
l /= 10;
buf[size-1] = 0;
for(i=size-2; i>=0; i--) {
buf[i] = '0'+l%10;
l /= 10;
}
/* log10 was wrong by 1 or rounding changed number of digits */
if(l) {
(*dec_point)++;
memmove(buf+1, buf, size-2);
buf[0] = '0'+l;
}else if(buf[0]=='0' && buf[1]>='1' && buf[1]<='9') {
(*dec_point)--;
memmove(buf, buf+1, size-2);
buf[size-2] = '0';
}
}
static inline jsstr_t *number_to_fixed(double val, int prec)
{
WCHAR buf[NUMBER_DTOA_SIZE];
int dec_point, size, buf_size, buf_pos;
BOOL neg = FALSE;
jsstr_t *ret;
WCHAR *str;
TRACE("%lf %d\n", val, prec);
if(val < 0) {
neg = TRUE;
val = -val;
}
if(val >= 1)
buf_size = log10(val)+prec+2;
else
buf_size = prec ? prec+1 : 2;
if(buf_size > NUMBER_DTOA_SIZE)
buf_size = NUMBER_DTOA_SIZE;
dtoa(val, buf, buf_size, &dec_point);
dec_point++;
size = 0;
if(neg)
size++;
if(dec_point > 0)
size += dec_point;
else
size++;
if(prec)
size += prec+1;
ret = jsstr_alloc_buf(size);
if(!ret)
return NULL;
str = ret->str;
size = buf_pos = 0;
if(neg)
str[size++] = '-';
if(dec_point > 0) {
for(;buf_pos<buf_size-1 && dec_point; dec_point--)
str[size++] = buf[buf_pos++];
}else {
str[size++] = '0';
}
for(; dec_point>0; dec_point--)
str[size++] = '0';
if(prec) {
str[size++] = '.';
for(; dec_point<0 && prec; dec_point++, prec--)
str[size++] = '0';
for(; buf_pos<buf_size-1 && prec; prec--)
str[size++] = buf[buf_pos++];
for(; prec; prec--) {
str[size++] = '0';
}
}
str[size++] = 0;
return ret;
}
static inline jsstr_t *number_to_exponential(double val, int prec)
{
WCHAR buf[NUMBER_DTOA_SIZE], *pbuf;
int dec_point, size, buf_size, exp_size = 1;
BOOL neg = FALSE;
jsstr_t *ret;
WCHAR *str;
if(val < 0) {
neg = TRUE;
val = -val;
}
buf_size = prec+2;
if(buf_size<2 || buf_size>NUMBER_DTOA_SIZE)
buf_size = NUMBER_DTOA_SIZE;
dtoa(val, buf, buf_size, &dec_point);
buf_size--;
if(prec == -1)
for(; buf_size>1 && buf[buf_size-1]=='0'; buf_size--)
buf[buf_size-1] = 0;
size = 10;
while(dec_point>=size || dec_point<=-size) {
size *= 10;
exp_size++;
}
if(buf_size == 1)
size = buf_size+2+exp_size; /* 2 = strlen(e+) */
else if(prec == -1)
size = buf_size+3+exp_size; /* 3 = strlen(.e+) */
else
size = prec+4+exp_size; /* 4 = strlen(0.e+) */
if(neg)
size++;
ret = jsstr_alloc_buf(size);
if(!ret)
return NULL;
str = ret->str;
size = 0;
pbuf = buf;
if(neg)
str[size++] = '-';
str[size++] = *pbuf++;
if(buf_size != 1) {
str[size++] = '.';
while(*pbuf)
str[size++] = *pbuf++;
for(; prec>buf_size-1; prec--)
str[size++] = '0';
}
str[size++] = 'e';
if(dec_point >= 0) {
str[size++] = '+';
}else {
str[size++] = '-';
dec_point = -dec_point;
}
size += exp_size;
do {
str[--size] = '0'+dec_point%10;
dec_point /= 10;
}while(dec_point>0);
size += exp_size;
str[size] = 0;
return ret;
}
/* ECMA-262 3rd Edition 15.7.4.2 */
static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
NumberInstance *number;
INT radix = 10;
DOUBLE val;
BSTR str;
jsstr_t *str;
HRESULT hres;
TRACE("\n");
if(!(number = number_this(jsthis)))
return throw_type_error(ctx, ei, IDS_NOT_NUM, NULL);
return throw_type_error(ctx, JS_E_NUMBER_EXPECTED, NULL);
if(arg_cnt(dp)) {
hres = to_int32(ctx, get_arg(dp, 0), ei, &radix);
if(argc) {
hres = to_int32(ctx, argv[0], &radix);
if(FAILED(hres))
return hres;
if(radix<2 || radix>36)
return throw_type_error(ctx, ei, IDS_INVALID_CALL_ARG, NULL);
return throw_type_error(ctx, JS_E_INVALIDARG, NULL);
}
if(V_VT(&number->num) == VT_I4)
val = V_I4(&number->num);
else
val = V_R8(&number->num);
val = number->value;
if(radix==10 || isnan(val) || isinf(val)) {
hres = to_string(ctx, &number->num, ei, &str);
hres = to_string(ctx, jsval_number(val), &str);
if(FAILED(hres))
return hres;
}
else {
}else {
INT idx = 0;
DOUBLE integ, frac, log_radix = 0;
WCHAR buf[NUMBER_TOSTRING_BUF_SIZE+16];
@@ -150,7 +322,7 @@ static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
if(exp) {
if(log_radix==0)
buf[idx++] = '\0';
buf[idx] = 0;
else {
static const WCHAR formatW[] = {'(','e','%','c','%','d',')',0};
WCHAR ch;
@@ -165,73 +337,181 @@ static HRESULT Number_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
}
else buf[idx] = '\0';
str = SysAllocString(buf);
str = jsstr_alloc(buf);
if(!str)
return E_OUTOFMEMORY;
}
if(retv) {
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = str;
}else {
SysFreeString(str);
}
if(r)
*r = jsval_string(str);
else
jsstr_release(str);
return S_OK;
}
static HRESULT Number_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Number_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT Number_toFixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Number_toFixed(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
return E_NOTIMPL;
NumberInstance *number;
DOUBLE val;
INT prec = 0;
jsstr_t *str;
HRESULT hres;
TRACE("\n");
if(!(number = number_this(jsthis)))
return throw_type_error(ctx, JS_E_NUMBER_EXPECTED, NULL);
if(argc) {
hres = to_int32(ctx, argv[0], &prec);
if(FAILED(hres))
return hres;
if(prec<0 || prec>20)
return throw_range_error(ctx, JS_E_FRACTION_DIGITS_OUT_OF_RANGE, NULL);
}
val = number->value;
if(isinf(val) || isnan(val)) {
hres = to_string(ctx, jsval_number(val), &str);
if(FAILED(hres))
return hres;
}else {
str = number_to_fixed(val, prec);
if(!str)
return E_OUTOFMEMORY;
}
if(r)
*r = jsval_string(str);
else
jsstr_release(str);
return S_OK;
}
static HRESULT Number_toExponential(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Number_toExponential(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
return E_NOTIMPL;
NumberInstance *number;
DOUBLE val;
INT prec = 0;
jsstr_t *str;
HRESULT hres;
TRACE("\n");
if(!(number = number_this(jsthis)))
return throw_type_error(ctx, JS_E_NUMBER_EXPECTED, NULL);
if(argc) {
hres = to_int32(ctx, argv[0], &prec);
if(FAILED(hres))
return hres;
if(prec<0 || prec>20)
return throw_range_error(ctx, JS_E_FRACTION_DIGITS_OUT_OF_RANGE, NULL);
}
val = number->value;
if(isinf(val) || isnan(val)) {
hres = to_string(ctx, jsval_number(val), &str);
if(FAILED(hres))
return hres;
}else {
if(!prec)
prec--;
str = number_to_exponential(val, prec);
if(!str)
return E_OUTOFMEMORY;
}
if(r)
*r = jsval_string(str);
else
jsstr_release(str);
return S_OK;
}
static HRESULT Number_toPrecision(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Number_toPrecision(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
return E_NOTIMPL;
NumberInstance *number;
INT prec = 0, size;
jsstr_t *str;
DOUBLE val;
HRESULT hres;
if(!(number = number_this(jsthis)))
return throw_type_error(ctx, JS_E_NUMBER_EXPECTED, NULL);
if(argc) {
hres = to_int32(ctx, argv[0], &prec);
if(FAILED(hres))
return hres;
if(prec<1 || prec>21)
return throw_range_error(ctx, JS_E_PRECISION_OUT_OF_RANGE, NULL);
}
val = number->value;
if(isinf(val) || isnan(val) || !prec) {
hres = to_string(ctx, jsval_number(val), &str);
if(FAILED(hres))
return hres;
}else {
if(val != 0)
size = floor(log10(val>0 ? val : -val)) + 1;
else
size = 1;
if(size > prec)
str = number_to_exponential(val, prec-1);
else
str = number_to_fixed(val, prec-size);
if(!str)
return E_OUTOFMEMORY;
}
if(r)
*r = jsval_string(str);
else
jsstr_release(str);
return S_OK;
}
static HRESULT Number_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Number_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
NumberInstance *number;
TRACE("\n");
if(!(number = number_this(jsthis)))
return throw_type_error(ctx, ei, IDS_NOT_NUM, NULL);
return throw_type_error(ctx, JS_E_NUMBER_EXPECTED, NULL);
if(retv)
*retv = number->num;
if(r)
*r = jsval_number(number->value);
return S_OK;
}
static HRESULT Number_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Number_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
NumberInstance *number = number_from_vdisp(jsthis);
switch(flags) {
case INVOKE_FUNC:
return throw_type_error(ctx, ei, IDS_NOT_FUNC, NULL);
return throw_type_error(ctx, JS_E_FUNCTION_EXPECTED, NULL);
case DISPATCH_PROPERTYGET:
*retv = number->num;
*r = jsval_number(number->value);
break;
default:
@@ -260,50 +540,54 @@ static const builtin_info_t Number_info = {
NULL
};
static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static const builtin_info_t NumberInst_info = {
JSCLASS_NUMBER,
{NULL, Number_value, 0},
0, NULL,
NULL,
NULL
};
static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VARIANT num;
double n;
HRESULT hres;
TRACE("\n");
switch(flags) {
case INVOKE_FUNC:
if(!arg_cnt(dp)) {
if(retv) {
V_VT(retv) = VT_I4;
V_I4(retv) = 0;
}
if(!argc) {
if(r)
*r = jsval_number(0);
return S_OK;
}
hres = to_number(ctx, get_arg(dp, 0), ei, &num);
hres = to_number(ctx, argv[0], &n);
if(FAILED(hres))
return hres;
if(retv)
*retv = num;
if(r)
*r = jsval_number(n);
break;
case DISPATCH_CONSTRUCT: {
DispatchEx *obj;
jsdisp_t *obj;
if(arg_cnt(dp)) {
hres = to_number(ctx, get_arg(dp, 0), ei, &num);
if(argc) {
hres = to_number(ctx, argv[0], &n);
if(FAILED(hres))
return hres;
}else {
V_VT(&num) = VT_I4;
V_I4(&num) = 0;
n = 0;
}
hres = create_number(ctx, &num, &obj);
hres = create_number(ctx, n, &obj);
if(FAILED(hres))
return hres;
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
*r = jsval_obj(obj);
break;
}
default:
@@ -314,7 +598,7 @@ static HRESULT NumberConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
return S_OK;
}
static HRESULT alloc_number(script_ctx_t *ctx, DispatchEx *object_prototype, NumberInstance **ret)
static HRESULT alloc_number(script_ctx_t *ctx, jsdisp_t *object_prototype, NumberInstance **ret)
{
NumberInstance *number;
HRESULT hres;
@@ -326,15 +610,17 @@ static HRESULT alloc_number(script_ctx_t *ctx, DispatchEx *object_prototype, Num
if(object_prototype)
hres = init_dispex(&number->dispex, ctx, &Number_info, object_prototype);
else
hres = init_dispex_from_constr(&number->dispex, ctx, &Number_info, ctx->number_constr);
if(FAILED(hres))
hres = init_dispex_from_constr(&number->dispex, ctx, &NumberInst_info, ctx->number_constr);
if(FAILED(hres)) {
heap_free(number);
return hres;
}
*ret = number;
return S_OK;
}
HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
HRESULT create_number_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
{
NumberInstance *number;
HRESULT hres;
@@ -345,15 +631,15 @@ HRESULT create_number_constr(script_ctx_t *ctx, DispatchEx *object_prototype, Di
if(FAILED(hres))
return hres;
V_VT(&number->num) = VT_I4;
hres = create_builtin_function(ctx, NumberConstr_value, NumberW, NULL,
number->value = 0;
hres = create_builtin_constructor(ctx, NumberConstr_value, NumberW, NULL,
PROPF_CONSTR|1, &number->dispex, ret);
jsdisp_release(&number->dispex);
return hres;
}
HRESULT create_number(script_ctx_t *ctx, VARIANT *num, DispatchEx **ret)
HRESULT create_number(script_ctx_t *ctx, double value, jsdisp_t **ret)
{
NumberInstance *number;
HRESULT hres;
@@ -362,7 +648,7 @@ HRESULT create_number(script_ctx_t *ctx, VARIANT *num, DispatchEx **ret)
if(FAILED(hres))
return hres;
number->num = *num;
number->value = value;
*ret = &number->dispex;
return S_OK;
+146 -68
View File
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <assert.h>
#include "jscript.h"
#include <wine/debug.h>
@@ -32,10 +34,10 @@ static const WCHAR isPrototypeOfW[] = {'i','s','P','r','o','t','o','t','y','p','
static const WCHAR default_valueW[] = {'[','o','b','j','e','c','t',' ','O','b','j','e','c','t',']',0};
static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
DispatchEx *jsdisp;
jsdisp_t *jsdisp;
const WCHAR *str;
static const WCHAR formatW[] = {'[','o','b','j','e','c','t',' ','%','s',']',0};
@@ -51,8 +53,8 @@ static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
static const WCHAR regexpW[] = {'R','e','g','E','x','p',0};
static const WCHAR stringW[] = {'S','t','r','i','n','g',0};
/* Keep in sync with jsclass_t enum */
static const WCHAR *names[] = {objectW, arrayW, booleanW, dateW, errorW,
functionW, NULL, mathW, numberW, objectW, regexpW, stringW, objectW};
static const WCHAR *names[] = {NULL, arrayW, booleanW, dateW, errorW,
functionW, NULL, mathW, numberW, objectW, regexpW, stringW, objectW, objectW};
TRACE("\n");
@@ -62,27 +64,28 @@ static HRESULT Object_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, D
}else if(names[jsdisp->builtin_info->class]) {
str = names[jsdisp->builtin_info->class];
}else {
assert(jsdisp->builtin_info->class != JSCLASS_NONE);
FIXME("jdisp->builtin_info->class = %d\n", jsdisp->builtin_info->class);
return E_FAIL;
}
if(retv) {
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = SysAllocStringLen(NULL, 9+strlenW(str));
if(!V_BSTR(retv))
if(r) {
jsstr_t *ret;
ret = jsstr_alloc_buf(9+strlenW(str));
if(!ret)
return E_OUTOFMEMORY;
sprintfW(V_BSTR(retv), formatW, str);
sprintfW(ret->str, formatW, str);
*r = jsval_string(ret);
}
return S_OK;
}
static HRESULT Object_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Object_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
DISPPARAMS params = {NULL, NULL, 0, 0};
TRACE("\n");
if(!is_jsdisp(jsthis)) {
@@ -90,59 +93,128 @@ static HRESULT Object_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD fl
return E_FAIL;
}
return jsdisp_call_name(jsthis->u.jsdisp, toStringW, DISPATCH_METHOD, &params, retv, ei, sp);
return jsdisp_call_name(jsthis->u.jsdisp, toStringW, DISPATCH_METHOD, 0, NULL, r);
}
static HRESULT Object_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Object_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
TRACE("\n");
if(retv) {
if(r) {
IDispatch_AddRef(jsthis->u.disp);
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = jsthis->u.disp;
*r = jsval_disp(jsthis->u.disp);
}
return S_OK;
}
static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Object_hasOwnProperty(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
jsstr_t *name;
DISPID id;
BSTR bstr;
HRESULT hres;
TRACE("\n");
if(!argc) {
if(r)
*r = jsval_bool(FALSE);
return S_OK;
}
hres = to_string(ctx, argv[0], &name);
if(FAILED(hres))
return hres;
if(is_jsdisp(jsthis)) {
BOOL result;
hres = jsdisp_is_own_prop(jsthis->u.jsdisp, name->str, &result);
jsstr_release(name);
if(FAILED(hres))
return hres;
if(r)
*r = jsval_bool(result);
return S_OK;
}
bstr = SysAllocStringLen(NULL, jsstr_length(name));
if(bstr)
jsstr_flush(name, bstr);
jsstr_release(name);
if(!bstr)
return E_OUTOFMEMORY;
if(is_dispex(jsthis))
hres = IDispatchEx_GetDispID(jsthis->u.dispex, bstr, make_grfdex(ctx, fdexNameCaseSensitive), &id);
else
hres = IDispatch_GetIDsOfNames(jsthis->u.disp, &IID_NULL, &bstr, 1, ctx->lcid, &id);
SysFreeString(bstr);
if(r)
*r = jsval_bool(SUCCEEDED(hres));
return S_OK;
}
static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
jsstr_t *name;
BOOL ret;
HRESULT hres;
TRACE("\n");
if(argc != 1) {
FIXME("argc %d not supported\n", argc);
return E_NOTIMPL;
}
if(!is_jsdisp(jsthis)) {
FIXME("Host object this\n");
return E_FAIL;
}
hres = to_string(ctx, argv[0], &name);
if(FAILED(hres))
return hres;
hres = jsdisp_is_enumerable(jsthis->u.jsdisp, name->str, &ret);
jsstr_release(name);
if(FAILED(hres))
return hres;
if(r)
*r = jsval_bool(ret);
return S_OK;
}
static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
FIXME("\n");
return E_NOTIMPL;
}
static HRESULT Object_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
static HRESULT Object_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
TRACE("\n");
switch(flags) {
case INVOKE_FUNC:
return throw_type_error(ctx, ei, IDS_NOT_FUNC, NULL);
case DISPATCH_PROPERTYGET:
V_VT(retv) = VT_BSTR;
V_BSTR(retv) = SysAllocString(default_valueW);
if(!V_BSTR(retv))
return throw_type_error(ctx, JS_E_FUNCTION_EXPECTED, NULL);
case DISPATCH_PROPERTYGET: {
jsstr_t *ret = jsstr_alloc(default_valueW);
if(!ret)
return E_OUTOFMEMORY;
*r = jsval_string(ret);
break;
}
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
@@ -151,7 +223,7 @@ static HRESULT Object_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP
return S_OK;
}
static void Object_destructor(DispatchEx *dispex)
static void Object_destructor(jsdisp_t *dispex)
{
heap_free(dispex);
}
@@ -174,8 +246,16 @@ static const builtin_info_t Object_info = {
NULL
};
static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller)
static const builtin_info_t ObjectInst_info = {
JSCLASS_OBJECT,
{NULL, Object_value, 0},
0, NULL,
Object_destructor,
NULL
};
static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
HRESULT hres;
@@ -183,35 +263,33 @@ static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
switch(flags) {
case DISPATCH_METHOD:
if(arg_cnt(dp)) {
VARIANT *arg = get_arg(dp,0);
if(V_VT(arg) != VT_EMPTY && V_VT(arg) != VT_NULL) {
if(argc) {
if(!is_undefined(argv[0]) && !is_null(argv[0]) && (!is_object_instance(argv[0]) || get_object(argv[0]))) {
IDispatch *disp;
hres = to_object(ctx, arg, &disp);
hres = to_object(ctx, argv[0], &disp);
if(FAILED(hres))
return hres;
if(retv) {
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = disp;
}else {
if(r)
*r = jsval_disp(disp);
else
IDispatch_Release(disp);
}
return S_OK;
}
}
/* fall through */
case DISPATCH_CONSTRUCT: {
DispatchEx *obj;
jsdisp_t *obj;
hres = create_object(ctx, NULL, &obj);
if(FAILED(hres))
return hres;
V_VT(retv) = VT_DISPATCH;
V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(obj);
if(r)
*r = jsval_obj(obj);
else
jsdisp_release(obj);
break;
}
@@ -223,29 +301,29 @@ static HRESULT ObjectConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
return S_OK;
}
HRESULT create_object_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
HRESULT create_object_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
{
static const WCHAR ObjectW[] = {'O','b','j','e','c','t',0};
return create_builtin_function(ctx, ObjectConstr_value, ObjectW, NULL, PROPF_CONSTR,
return create_builtin_constructor(ctx, ObjectConstr_value, ObjectW, NULL, PROPF_CONSTR,
object_prototype, ret);
}
HRESULT create_object_prototype(script_ctx_t *ctx, DispatchEx **ret)
HRESULT create_object_prototype(script_ctx_t *ctx, jsdisp_t **ret)
{
return create_dispex(ctx, &Object_info, NULL, ret);
}
HRESULT create_object(script_ctx_t *ctx, DispatchEx *constr, DispatchEx **ret)
HRESULT create_object(script_ctx_t *ctx, jsdisp_t *constr, jsdisp_t **ret)
{
DispatchEx *object;
jsdisp_t *object;
HRESULT hres;
object = heap_alloc_zero(sizeof(DispatchEx));
object = heap_alloc_zero(sizeof(jsdisp_t));
if(!object)
return E_OUTOFMEMORY;
hres = init_dispex_from_constr(object, ctx, &Object_info, constr ? constr : ctx->object_constr);
hres = init_dispex_from_constr(object, ctx, &ObjectInst_info, constr ? constr : ctx->object_constr);
if(FAILED(hres)) {
heap_free(object);
return hres;
File diff suppressed because it is too large Load Diff
+6 -4
View File
@@ -79,8 +79,10 @@
tShiftOper = 295,
tRelOper = 296,
tNumericLiteral = 297,
tStringLiteral = 298,
LOWER_THAN_ELSE = 299
tBooleanLiteral = 298,
tStringLiteral = 299,
tEOF = 300,
LOWER_THAN_ELSE = 301
};
#endif
@@ -91,7 +93,7 @@ typedef union YYSTYPE
{
/* Line 1676 of yacc.c */
#line 150 "parser.y"
#line 145 "parser.y"
int ival;
const WCHAR *srcptr;
@@ -115,7 +117,7 @@ typedef union YYSTYPE
/* Line 1676 of yacc.c */
#line 119 "parser.tab.h"
#line 121 "parser.tab.h"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+145 -250
View File
@@ -21,6 +21,10 @@
#include "jscript.h"
#include "engine.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
#define YYLEX_PARAM ctx
#define YYPARSE_PARAM ctx
@@ -29,7 +33,6 @@ static void set_error(parser_ctx_t*,UINT);
static BOOL explicit_error(parser_ctx_t*,void*,WCHAR);
static BOOL allow_auto_semicolon(parser_ctx_t*);
static void program_parsed(parser_ctx_t*,source_elements_t*);
static source_elements_t *function_body_parsed(parser_ctx_t*,source_elements_t*);
typedef struct _statement_list_t {
statement_t *head;
@@ -38,7 +41,6 @@ typedef struct _statement_list_t {
static literal_t *new_string_literal(parser_ctx_t*,const WCHAR*);
static literal_t *new_null_literal(parser_ctx_t*);
static literal_t *new_boolean_literal(parser_ctx_t*,VARIANT_BOOL);
typedef struct _property_list_t {
prop_val_t *head;
@@ -84,9 +86,9 @@ static variable_declaration_t *new_variable_declaration(parser_ctx_t*,const WCHA
static variable_list_t *new_variable_list(parser_ctx_t*,variable_declaration_t*);
static variable_list_t *variable_list_add(parser_ctx_t*,variable_list_t*,variable_declaration_t*);
static void *new_statement(parser_ctx_t*,statement_type_t,size_t);
static statement_t *new_block_statement(parser_ctx_t*,statement_list_t*);
static statement_t *new_var_statement(parser_ctx_t*,variable_list_t*);
static statement_t *new_empty_statement(parser_ctx_t*);
static statement_t *new_expression_statement(parser_ctx_t*,expression_t*);
static statement_t *new_if_statement(parser_ctx_t*,expression_t*,statement_t*,statement_t*);
static statement_t *new_while_statement(parser_ctx_t*,BOOL,expression_t*,statement_t*);
@@ -118,22 +120,15 @@ typedef struct _parameter_list_t {
static parameter_list_t *new_parameter_list(parser_ctx_t*,const WCHAR*);
static parameter_list_t *parameter_list_add(parser_ctx_t*,parameter_list_t*,const WCHAR*);
static void push_func(parser_ctx_t*);
static inline void pop_func(parser_ctx_t *ctx)
{
ctx->func_stack = ctx->func_stack->next;
}
static void *new_expression(parser_ctx_t *ctx,expression_type_t,size_t);
static expression_t *new_function_expression(parser_ctx_t*,const WCHAR*,parameter_list_t*,
source_elements_t*,const WCHAR*,DWORD);
static expression_t *new_binary_expression(parser_ctx_t*,expression_type_t,expression_t*,expression_t*);
static expression_t *new_unary_expression(parser_ctx_t*,expression_type_t,expression_t*);
static expression_t *new_conditional_expression(parser_ctx_t*,expression_t*,expression_t*,expression_t*);
static expression_t *new_array_expression(parser_ctx_t*,expression_t*,expression_t*);
static expression_t *new_member_expression(parser_ctx_t*,expression_t*,const WCHAR*);
static expression_t *new_new_expression(parser_ctx_t*,expression_t*,argument_list_t*);
static expression_t *new_call_expression(parser_ctx_t*,expression_t*,argument_list_t*);
static expression_t *new_this_expression(parser_ctx_t*);
static expression_t *new_identifier_expression(parser_ctx_t*,const WCHAR*);
static expression_t *new_literal_expression(parser_ctx_t*,literal_t*);
static expression_t *new_array_literal_expression(parser_ctx_t*,element_list_t*,int);
@@ -178,8 +173,9 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
/* tokens */
%token <identifier> tIdentifier
%token <ival> tAssignOper tEqOper tShiftOper tRelOper
%token <literal> tNumericLiteral
%token <literal> tNumericLiteral tBooleanLiteral
%token <wstr> tStringLiteral
%token tEOF
%type <source_elements> SourceElements
%type <source_elements> FunctionBody
@@ -253,7 +249,7 @@ static source_elements_t *source_elements_add_statement(source_elements_t*,state
/* ECMA-262 3rd Edition 14 */
Program
: SourceElements HtmlComment
: SourceElements HtmlComment tEOF
{ program_parsed(ctx, $1); }
HtmlComment
@@ -272,11 +268,11 @@ FunctionExpression
{ $$ = new_function_expression(ctx, $2, $4, $7, $1, $8-$1+1); }
KFunction
: kFUNCTION { push_func(ctx); $$ = $1; }
: kFUNCTION { $$ = $1; }
/* ECMA-262 3rd Edition 13 */
FunctionBody
: SourceElements { $$ = function_body_parsed(ctx, $1); }
: SourceElements { $$ = $1; }
/* ECMA-262 3rd Edition 13 */
FormalParameterList
@@ -294,7 +290,7 @@ Statement
: Block { $$ = $1; }
| VariableStatement { $$ = $1; }
| EmptyStatement { $$ = $1; }
| FunctionExpression { $$ = new_empty_statement(ctx); } /* FIXME: return NULL */
| FunctionExpression { $$ = new_expression_statement(ctx, $1); }
| ExpressionStatement { $$ = $1; }
| IfStatement { $$ = $1; }
| IterationStatement { $$ = $1; }
@@ -373,7 +369,7 @@ InitialiserNoIn
/* ECMA-262 3rd Edition 12.3 */
EmptyStatement
: ';' { $$ = new_empty_statement(ctx); }
: ';' { $$ = new_statement(ctx, STAT_EMPTY, 0); }
/* ECMA-262 3rd Edition 12.4 */
ExpressionStatement
@@ -496,7 +492,7 @@ Expression_opt
Expression_err
: Expression { $$ = $1; }
| error { set_error(ctx, IDS_SYNTAX_ERROR); YYABORT; }
| error { set_error(ctx, JS_E_SYNTAX); YYABORT; }
/* ECMA-262 3rd Edition 11.14 */
Expression
@@ -710,7 +706,7 @@ MemberExpression
: PrimaryExpression { $$ = $1; }
| FunctionExpression { $$ = $1; }
| MemberExpression '[' Expression ']'
{ $$ = new_array_expression(ctx, $1, $3); }
{ $$ = new_binary_expression(ctx, EXPR_ARRAY, $1, $3); }
| MemberExpression '.' tIdentifier
{ $$ = new_member_expression(ctx, $1, $3); }
| kNEW MemberExpression Arguments
@@ -723,7 +719,7 @@ CallExpression
| CallExpression Arguments
{ $$ = new_call_expression(ctx, $1, $2); }
| CallExpression '[' Expression ']'
{ $$ = new_array_expression(ctx, $1, $3); }
{ $$ = new_binary_expression(ctx, EXPR_ARRAY, $1, $3); }
| CallExpression '.' tIdentifier
{ $$ = new_member_expression(ctx, $1, $3); }
@@ -740,7 +736,7 @@ ArgumentList
/* ECMA-262 3rd Edition 11.1 */
PrimaryExpression
: kTHIS { $$ = new_this_expression(ctx); }
: kTHIS { $$ = new_expression(ctx, EXPR_THIS, 0); }
| tIdentifier { $$ = new_identifier_expression(ctx, $1); }
| Literal { $$ = new_literal_expression(ctx, $1); }
| ArrayLiteral { $$ = $1; }
@@ -811,6 +807,7 @@ Literal
BooleanLiteral
: kTRUE { $$ = new_boolean_literal(ctx, VARIANT_TRUE); }
| kFALSE { $$ = new_boolean_literal(ctx, VARIANT_FALSE); }
| tBooleanLiteral { $$ = $1; }
semicolon_opt
: ';'
@@ -818,15 +815,15 @@ semicolon_opt
left_bracket
: '('
| error { set_error(ctx, IDS_LBRACKET); YYABORT; }
| error { set_error(ctx, JS_E_MISSING_LBRACKET); YYABORT; }
right_bracket
: ')'
| error { set_error(ctx, IDS_RBRACKET); YYABORT; }
| error { set_error(ctx, JS_E_MISSING_RBRACKET); YYABORT; }
semicolon
: ';'
| error { set_error(ctx, IDS_SEMICOLON); YYABORT; }
| error { set_error(ctx, JS_E_MISSING_SEMICOLON); YYABORT; }
%%
@@ -835,6 +832,20 @@ static BOOL allow_auto_semicolon(parser_ctx_t *ctx)
return ctx->nl || ctx->ptr == ctx->end || *(ctx->ptr-1) == '}';
}
static void *new_statement(parser_ctx_t *ctx, statement_type_t type, size_t size)
{
statement_t *stat;
stat = parser_alloc(ctx, size ? size : sizeof(*stat));
if(!stat)
return NULL;
stat->type = type;
stat->next = NULL;
return stat;
}
static literal_t *new_string_literal(parser_ctx_t *ctx, const WCHAR *str)
{
literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
@@ -854,16 +865,6 @@ static literal_t *new_null_literal(parser_ctx_t *ctx)
return ret;
}
static literal_t *new_boolean_literal(parser_ctx_t *ctx, VARIANT_BOOL bval)
{
literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
ret->type = LT_BOOL;
ret->u.bval = bval;
return ret;
}
static prop_val_t *new_prop_val(parser_ctx_t *ctx, literal_t *name, expression_t *value)
{
prop_val_t *ret = parser_alloc(ctx, sizeof(prop_val_t));
@@ -1033,10 +1034,12 @@ static case_clausule_t *new_case_block(parser_ctx_t *ctx, case_list_t *case_list
static statement_t *new_block_statement(parser_ctx_t *ctx, statement_list_t *list)
{
block_statement_t *ret = parser_alloc(ctx, sizeof(block_statement_t));
block_statement_t *ret;
ret = new_statement(ctx, STAT_BLOCK, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = block_statement_eval;
ret->stat.next = NULL;
ret->stat_list = list ? list->head : NULL;
return &ret->stat;
@@ -1045,19 +1048,11 @@ static statement_t *new_block_statement(parser_ctx_t *ctx, statement_list_t *lis
static variable_declaration_t *new_variable_declaration(parser_ctx_t *ctx, const WCHAR *identifier, expression_t *expr)
{
variable_declaration_t *ret = parser_alloc(ctx, sizeof(variable_declaration_t));
var_list_t *var_list = parser_alloc(ctx, sizeof(var_list_t));
ret->identifier = identifier;
ret->expr = expr;
ret->next = NULL;
var_list->identifier = identifier;
var_list->next = NULL;
if(ctx->func_stack->var_tail)
ctx->func_stack->var_tail = ctx->func_stack->var_tail->next = var_list;
else
ctx->func_stack->var_head = ctx->func_stack->var_tail = var_list;
ret->global_next = NULL;
return ret;
}
@@ -1080,31 +1075,25 @@ static variable_list_t *variable_list_add(parser_ctx_t *ctx, variable_list_t *li
static statement_t *new_var_statement(parser_ctx_t *ctx, variable_list_t *variable_list)
{
var_statement_t *ret = parser_alloc(ctx, sizeof(var_statement_t));
var_statement_t *ret;
ret = new_statement(ctx, STAT_VAR, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = var_statement_eval;
ret->stat.next = NULL;
ret->variable_list = variable_list->head;
return &ret->stat;
}
static statement_t *new_empty_statement(parser_ctx_t *ctx)
{
statement_t *ret = parser_alloc(ctx, sizeof(statement_t));
ret->eval = empty_statement_eval;
ret->next = NULL;
return ret;
}
static statement_t *new_expression_statement(parser_ctx_t *ctx, expression_t *expr)
{
expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t));
expression_statement_t *ret;
ret = new_statement(ctx, STAT_EXPR, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = expression_statement_eval;
ret->stat.next = NULL;
ret->expr = expr;
return &ret->stat;
@@ -1112,10 +1101,12 @@ static statement_t *new_expression_statement(parser_ctx_t *ctx, expression_t *ex
static statement_t *new_if_statement(parser_ctx_t *ctx, expression_t *expr, statement_t *if_stat, statement_t *else_stat)
{
if_statement_t *ret = parser_alloc(ctx, sizeof(if_statement_t));
if_statement_t *ret;
ret = new_statement(ctx, STAT_IF, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = if_statement_eval;
ret->stat.next = NULL;
ret->expr = expr;
ret->if_stat = if_stat;
ret->else_stat = else_stat;
@@ -1125,10 +1116,12 @@ static statement_t *new_if_statement(parser_ctx_t *ctx, expression_t *expr, stat
static statement_t *new_while_statement(parser_ctx_t *ctx, BOOL dowhile, expression_t *expr, statement_t *stat)
{
while_statement_t *ret = parser_alloc(ctx, sizeof(while_statement_t));
while_statement_t *ret;
ret = new_statement(ctx, STAT_WHILE, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = while_statement_eval;
ret->stat.next = NULL;
ret->do_while = dowhile;
ret->expr = expr;
ret->statement = stat;
@@ -1139,10 +1132,12 @@ static statement_t *new_while_statement(parser_ctx_t *ctx, BOOL dowhile, express
static statement_t *new_for_statement(parser_ctx_t *ctx, variable_list_t *variable_list, expression_t *begin_expr,
expression_t *expr, expression_t *end_expr, statement_t *statement)
{
for_statement_t *ret = parser_alloc(ctx, sizeof(for_statement_t));
for_statement_t *ret;
ret = new_statement(ctx, STAT_FOR, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = for_statement_eval;
ret->stat.next = NULL;
ret->variable_list = variable_list ? variable_list->head : NULL;
ret->begin_expr = begin_expr;
ret->expr = expr;
@@ -1155,10 +1150,12 @@ static statement_t *new_for_statement(parser_ctx_t *ctx, variable_list_t *variab
static statement_t *new_forin_statement(parser_ctx_t *ctx, variable_declaration_t *variable, expression_t *expr,
expression_t *in_expr, statement_t *statement)
{
forin_statement_t *ret = parser_alloc(ctx, sizeof(forin_statement_t));
forin_statement_t *ret;
ret = new_statement(ctx, STAT_FORIN, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = forin_statement_eval;
ret->stat.next = NULL;
ret->variable = variable;
ret->expr = expr;
ret->in_expr = in_expr;
@@ -1169,10 +1166,12 @@ static statement_t *new_forin_statement(parser_ctx_t *ctx, variable_declaration_
static statement_t *new_continue_statement(parser_ctx_t *ctx, const WCHAR *identifier)
{
branch_statement_t *ret = parser_alloc(ctx, sizeof(branch_statement_t));
branch_statement_t *ret;
ret = new_statement(ctx, STAT_CONTINUE, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = continue_statement_eval;
ret->stat.next = NULL;
ret->identifier = identifier;
return &ret->stat;
@@ -1180,10 +1179,12 @@ static statement_t *new_continue_statement(parser_ctx_t *ctx, const WCHAR *ident
static statement_t *new_break_statement(parser_ctx_t *ctx, const WCHAR *identifier)
{
branch_statement_t *ret = parser_alloc(ctx, sizeof(branch_statement_t));
branch_statement_t *ret;
ret = new_statement(ctx, STAT_BREAK, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = break_statement_eval;
ret->stat.next = NULL;
ret->identifier = identifier;
return &ret->stat;
@@ -1191,10 +1192,12 @@ static statement_t *new_break_statement(parser_ctx_t *ctx, const WCHAR *identifi
static statement_t *new_return_statement(parser_ctx_t *ctx, expression_t *expr)
{
expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t));
expression_statement_t *ret;
ret = new_statement(ctx, STAT_RETURN, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = return_statement_eval;
ret->stat.next = NULL;
ret->expr = expr;
return &ret->stat;
@@ -1202,10 +1205,12 @@ static statement_t *new_return_statement(parser_ctx_t *ctx, expression_t *expr)
static statement_t *new_with_statement(parser_ctx_t *ctx, expression_t *expr, statement_t *statement)
{
with_statement_t *ret = parser_alloc(ctx, sizeof(with_statement_t));
with_statement_t *ret;
ret = new_statement(ctx, STAT_WITH, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = with_statement_eval;
ret->stat.next = NULL;
ret->expr = expr;
ret->statement = statement;
@@ -1214,10 +1219,12 @@ static statement_t *new_with_statement(parser_ctx_t *ctx, expression_t *expr, st
static statement_t *new_labelled_statement(parser_ctx_t *ctx, const WCHAR *identifier, statement_t *statement)
{
labelled_statement_t *ret = parser_alloc(ctx, sizeof(labelled_statement_t));
labelled_statement_t *ret;
ret = new_statement(ctx, STAT_LABEL, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = labelled_statement_eval;
ret->stat.next = NULL;
ret->identifier = identifier;
ret->statement = statement;
@@ -1226,10 +1233,12 @@ static statement_t *new_labelled_statement(parser_ctx_t *ctx, const WCHAR *ident
static statement_t *new_switch_statement(parser_ctx_t *ctx, expression_t *expr, case_clausule_t *case_list)
{
switch_statement_t *ret = parser_alloc(ctx, sizeof(switch_statement_t));
switch_statement_t *ret;
ret = new_statement(ctx, STAT_SWITCH, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = switch_statement_eval;
ret->stat.next = NULL;
ret->expr = expr;
ret->case_list = case_list;
@@ -1238,10 +1247,12 @@ static statement_t *new_switch_statement(parser_ctx_t *ctx, expression_t *expr,
static statement_t *new_throw_statement(parser_ctx_t *ctx, expression_t *expr)
{
expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t));
expression_statement_t *ret;
ret = new_statement(ctx, STAT_THROW, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = throw_statement_eval;
ret->stat.next = NULL;
ret->expr = expr;
return &ret->stat;
@@ -1250,10 +1261,12 @@ static statement_t *new_throw_statement(parser_ctx_t *ctx, expression_t *expr)
static statement_t *new_try_statement(parser_ctx_t *ctx, statement_t *try_statement,
catch_block_t *catch_block, statement_t *finally_statement)
{
try_statement_t *ret = parser_alloc(ctx, sizeof(try_statement_t));
try_statement_t *ret;
ret = new_statement(ctx, STAT_TRY, sizeof(*ret));
if(!ret)
return NULL;
ret->stat.eval = try_statement_eval;
ret->stat.next = NULL;
ret->try_statement = try_statement;
ret->catch_block = catch_block;
ret->finally_statement = finally_statement;
@@ -1290,86 +1303,32 @@ static parameter_list_t *parameter_list_add(parser_ctx_t *ctx, parameter_list_t
static expression_t *new_function_expression(parser_ctx_t *ctx, const WCHAR *identifier,
parameter_list_t *parameter_list, source_elements_t *source_elements, const WCHAR *src_str, DWORD src_len)
{
function_expression_t *ret = parser_alloc(ctx, sizeof(function_expression_t));
function_expression_t *ret = new_expression(ctx, EXPR_FUNC, sizeof(*ret));
ret->expr.eval = function_expression_eval;
ret->identifier = identifier;
ret->parameter_list = parameter_list ? parameter_list->head : NULL;
ret->source_elements = source_elements;
ret->src_str = src_str;
ret->src_len = src_len;
if(ret->identifier) {
function_declaration_t *decl = parser_alloc(ctx, sizeof(function_declaration_t));
decl->expr = ret;
decl->next = NULL;
if(ctx->func_stack->func_tail)
ctx->func_stack->func_tail = ctx->func_stack->func_tail->next = decl;
else
ctx->func_stack->func_head = ctx->func_stack->func_tail = decl;
}
ret->next = NULL;
return &ret->expr;
}
static const expression_eval_t expression_eval_table[] = {
comma_expression_eval,
logical_or_expression_eval,
logical_and_expression_eval,
binary_or_expression_eval,
binary_xor_expression_eval,
binary_and_expression_eval,
instanceof_expression_eval,
in_expression_eval,
add_expression_eval,
sub_expression_eval,
mul_expression_eval,
div_expression_eval,
mod_expression_eval,
delete_expression_eval,
void_expression_eval,
typeof_expression_eval,
minus_expression_eval,
plus_expression_eval,
post_increment_expression_eval,
post_decrement_expression_eval,
pre_increment_expression_eval,
pre_decrement_expression_eval,
equal_expression_eval,
equal2_expression_eval,
not_equal_expression_eval,
not_equal2_expression_eval,
less_expression_eval,
lesseq_expression_eval,
greater_expression_eval,
greatereq_expression_eval,
binary_negation_expression_eval,
logical_negation_expression_eval,
left_shift_expression_eval,
right_shift_expression_eval,
right2_shift_expression_eval,
assign_expression_eval,
assign_lshift_expression_eval,
assign_rshift_expression_eval,
assign_rrshift_expression_eval,
assign_add_expression_eval,
assign_sub_expression_eval,
assign_mul_expression_eval,
assign_div_expression_eval,
assign_mod_expression_eval,
assign_and_expression_eval,
assign_or_expression_eval,
assign_xor_expression_eval,
};
static void *new_expression(parser_ctx_t *ctx, expression_type_t type, size_t size)
{
expression_t *ret = parser_alloc(ctx, size ? size : sizeof(*ret));
ret->type = type;
return ret;
}
static expression_t *new_binary_expression(parser_ctx_t *ctx, expression_type_t type,
expression_t *expression1, expression_t *expression2)
{
binary_expression_t *ret = parser_alloc(ctx, sizeof(binary_expression_t));
binary_expression_t *ret = new_expression(ctx, type, sizeof(*ret));
ret->expr.eval = expression_eval_table[type];
ret->expression1 = expression1;
ret->expression2 = expression2;
@@ -1378,9 +1337,8 @@ static expression_t *new_binary_expression(parser_ctx_t *ctx, expression_type_t
static expression_t *new_unary_expression(parser_ctx_t *ctx, expression_type_t type, expression_t *expression)
{
unary_expression_t *ret = parser_alloc(ctx, sizeof(unary_expression_t));
unary_expression_t *ret = new_expression(ctx, type, sizeof(*ret));
ret->expr.eval = expression_eval_table[type];
ret->expression = expression;
return &ret->expr;
@@ -1389,9 +1347,8 @@ static expression_t *new_unary_expression(parser_ctx_t *ctx, expression_type_t t
static expression_t *new_conditional_expression(parser_ctx_t *ctx, expression_t *expression,
expression_t *true_expression, expression_t *false_expression)
{
conditional_expression_t *ret = parser_alloc(ctx, sizeof(conditional_expression_t));
conditional_expression_t *ret = new_expression(ctx, EXPR_COND, sizeof(*ret));
ret->expr.eval = conditional_expression_eval;
ret->expression = expression;
ret->true_expression = true_expression;
ret->false_expression = false_expression;
@@ -1399,22 +1356,10 @@ static expression_t *new_conditional_expression(parser_ctx_t *ctx, expression_t
return &ret->expr;
}
static expression_t *new_array_expression(parser_ctx_t *ctx, expression_t *member_expr, expression_t *expression)
{
array_expression_t *ret = parser_alloc(ctx, sizeof(array_expression_t));
ret->expr.eval = array_expression_eval;
ret->member_expr = member_expr;
ret->expression = expression;
return &ret->expr;
}
static expression_t *new_member_expression(parser_ctx_t *ctx, expression_t *expression, const WCHAR *identifier)
{
member_expression_t *ret = parser_alloc(ctx, sizeof(member_expression_t));
member_expression_t *ret = new_expression(ctx, EXPR_MEMBER, sizeof(*ret));
ret->expr.eval = member_expression_eval;
ret->expression = expression;
ret->identifier = identifier;
@@ -1423,9 +1368,8 @@ static expression_t *new_member_expression(parser_ctx_t *ctx, expression_t *expr
static expression_t *new_new_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list)
{
call_expression_t *ret = parser_alloc(ctx, sizeof(call_expression_t));
call_expression_t *ret = new_expression(ctx, EXPR_NEW, sizeof(*ret));
ret->expr.eval = new_expression_eval;
ret->expression = expression;
ret->argument_list = argument_list ? argument_list->head : NULL;
@@ -1434,24 +1378,14 @@ static expression_t *new_new_expression(parser_ctx_t *ctx, expression_t *express
static expression_t *new_call_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list)
{
call_expression_t *ret = parser_alloc(ctx, sizeof(call_expression_t));
call_expression_t *ret = new_expression(ctx, EXPR_CALL, sizeof(*ret));
ret->expr.eval = call_expression_eval;
ret->expression = expression;
ret->argument_list = argument_list ? argument_list->head : NULL;
return &ret->expr;
}
static expression_t *new_this_expression(parser_ctx_t *ctx)
{
expression_t *ret = parser_alloc(ctx, sizeof(expression_t));
ret->eval = this_expression_eval;
return ret;
}
static int parser_error(const char *str)
{
return 0;
@@ -1459,23 +1393,22 @@ static int parser_error(const char *str)
static void set_error(parser_ctx_t *ctx, UINT error)
{
ctx->hres = JSCRIPT_ERROR|error;
ctx->hres = error;
}
static BOOL explicit_error(parser_ctx_t *ctx, void *obj, WCHAR next)
{
if(obj || *(ctx->ptr-1)==next) return TRUE;
set_error(ctx, IDS_SYNTAX_ERROR);
set_error(ctx, JS_E_SYNTAX);
return FALSE;
}
static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *identifier)
{
identifier_expression_t *ret = parser_alloc(ctx, sizeof(identifier_expression_t));
identifier_expression_t *ret = new_expression(ctx, EXPR_IDENT, sizeof(*ret));
ret->expr.eval = identifier_expression_eval;
ret->identifier = identifier;
return &ret->expr;
@@ -1483,9 +1416,8 @@ static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *i
static expression_t *new_array_literal_expression(parser_ctx_t *ctx, element_list_t *element_list, int length)
{
array_literal_expression_t *ret = parser_alloc(ctx, sizeof(array_literal_expression_t));
array_literal_expression_t *ret = new_expression(ctx, EXPR_ARRAYLIT, sizeof(*ret));
ret->expr.eval = array_literal_expression_eval;
ret->element_list = element_list ? element_list->head : NULL;
ret->length = length;
@@ -1494,9 +1426,8 @@ static expression_t *new_array_literal_expression(parser_ctx_t *ctx, element_lis
static expression_t *new_prop_and_value_expression(parser_ctx_t *ctx, property_list_t *property_list)
{
property_value_expression_t *ret = parser_alloc(ctx, sizeof(property_value_expression_t));
property_value_expression_t *ret = new_expression(ctx, EXPR_PROPVAL, sizeof(*ret));
ret->expr.eval = property_value_expression_eval;
ret->property_list = property_list ? property_list->head : NULL;
return &ret->expr;
@@ -1504,9 +1435,8 @@ static expression_t *new_prop_and_value_expression(parser_ctx_t *ctx, property_l
static expression_t *new_literal_expression(parser_ctx_t *ctx, literal_t *literal)
{
literal_expression_t *ret = parser_alloc(ctx, sizeof(literal_expression_t));
literal_expression_t *ret = new_expression(ctx, EXPR_LITERAL, sizeof(*ret));
ret->expr.eval = literal_expression_eval;
ret->literal = literal;
return &ret->expr;
@@ -1547,32 +1477,8 @@ static statement_list_t *statement_list_add(statement_list_t *list, statement_t
return list;
}
static void push_func(parser_ctx_t *ctx)
{
func_stack_t *new_func = parser_alloc_tmp(ctx, sizeof(func_stack_t));
new_func->func_head = new_func->func_tail = NULL;
new_func->var_head = new_func->var_tail = NULL;
new_func->next = ctx->func_stack;
ctx->func_stack = new_func;
}
static source_elements_t *function_body_parsed(parser_ctx_t *ctx, source_elements_t *source)
{
source->functions = ctx->func_stack->func_head;
source->variables = ctx->func_stack->var_head;
pop_func(ctx);
return source;
}
static void program_parsed(parser_ctx_t *ctx, source_elements_t *source)
{
source->functions = ctx->func_stack->func_head;
source->variables = ctx->func_stack->var_head;
pop_func(ctx);
ctx->source = source;
if(!ctx->lexer_error)
ctx->hres = S_OK;
@@ -1580,20 +1486,16 @@ static void program_parsed(parser_ctx_t *ctx, source_elements_t *source)
void parser_release(parser_ctx_t *ctx)
{
if(--ctx->ref)
return;
script_release(ctx->script);
heap_free(ctx->begin);
jsheap_free(&ctx->heap);
heap_pool_free(&ctx->heap);
heap_free(ctx);
}
HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimiter,
HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimiter, BOOL from_eval,
parser_ctx_t **ret)
{
parser_ctx_t *parser_ctx;
jsheap_t *mark;
heap_pool_t *mark;
HRESULT hres;
const WCHAR html_tagW[] = {'<','/','s','c','r','i','p','t','>',0};
@@ -1602,31 +1504,24 @@ HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimite
if(!parser_ctx)
return E_OUTOFMEMORY;
parser_ctx->ref = 1;
parser_ctx->hres = JSCRIPT_ERROR|IDS_SYNTAX_ERROR;
parser_ctx->hres = JS_E_SYNTAX;
parser_ctx->is_html = delimiter && !strcmpiW(delimiter, html_tagW);
parser_ctx->begin = heap_strdupW(code);
if(!parser_ctx->begin) {
heap_free(parser_ctx);
return E_OUTOFMEMORY;
}
parser_ctx->ptr = parser_ctx->begin;
parser_ctx->begin = parser_ctx->ptr = code;
parser_ctx->end = parser_ctx->begin + strlenW(parser_ctx->begin);
script_addref(ctx);
parser_ctx->script = ctx;
mark = jsheap_mark(&ctx->tmp_heap);
jsheap_init(&parser_ctx->heap);
push_func(parser_ctx);
mark = heap_pool_mark(&ctx->tmp_heap);
heap_pool_init(&parser_ctx->heap);
parser_parse(parser_ctx);
jsheap_clear(mark);
if(FAILED(parser_ctx->hres)) {
hres = parser_ctx->hres;
heap_pool_clear(mark);
hres = parser_ctx->hres;
if(FAILED(hres)) {
WARN("parser failed around %s\n",
debugstr_w(parser_ctx->begin+20 > parser_ctx->ptr ? parser_ctx->begin : parser_ctx->ptr-20));
parser_release(parser_ctx);
return hres;
}
+124 -1006
View File
File diff suppressed because it is too large Load Diff
+81
View File
@@ -0,0 +1,81 @@
/*
* Copyright 2008 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/*
* Code in this file is based on files:
* js/src/jsregexp.h
* js/src/jsregexp.c
* from Mozilla project, released under LGPL 2.1 or later.
*
* The Original Code is Mozilla Communicator client code, released
* March 31, 1998.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*/
#define REG_FOLD 0x01 /* fold uppercase to lowercase */
#define REG_GLOB 0x02 /* global exec, creates array of matches */
#define REG_MULTILINE 0x04 /* treat ^ and $ as begin and end of line */
#define REG_STICKY 0x08 /* only match starting at lastIndex */
typedef struct RECapture {
ptrdiff_t index; /* start of contents, -1 for empty */
size_t length; /* length of capture */
} RECapture;
typedef struct match_state_t {
const WCHAR *cp;
DWORD match_len;
DWORD paren_count;
RECapture parens[1];
} match_state_t;
typedef BYTE jsbytecode;
typedef struct regexp_t {
WORD flags; /* flags, see jsapi.h's REG_* defines */
size_t parenCount; /* number of parenthesized submatches */
size_t classCount; /* count [...] bitmaps */
struct RECharSet *classList; /* list of [...] bitmaps */
const WCHAR *source; /* locked source string, sans // */
DWORD source_len;
jsbytecode program[1]; /* regular expression bytecode */
} regexp_t;
regexp_t* regexp_new(void*, heap_pool_t*, const WCHAR*, DWORD, WORD, BOOL) DECLSPEC_HIDDEN;
void regexp_destroy(regexp_t*) DECLSPEC_HIDDEN;
HRESULT regexp_execute(regexp_t*, void*, heap_pool_t*, const WCHAR*,
DWORD, match_state_t*) DECLSPEC_HIDDEN;
static inline match_state_t* alloc_match_state(regexp_t *regexp,
heap_pool_t *pool, const WCHAR *pos)
{
size_t size = offsetof(match_state_t, parens) + regexp->parenCount*sizeof(RECapture);
match_state_t *ret;
ret = pool ? heap_pool_alloc(pool, size) : heap_alloc(size);
if(!ret)
return NULL;
ret->cp = pos;
return ret;
}
+19
View File
@@ -18,16 +18,30 @@
#include <windef.h>
#define JSCRIPT_MAJOR_VERSION 5
#define JSCRIPT_MINOR_VERSION 8
#define JSCRIPT_BUILD_VERSION 16475
#define IDS_TO_PRIMITIVE 0x0001
#define IDS_INVALID_CALL_ARG 0x0005
#define IDS_SUBSCRIPT_OUT_OF_RANGE 0x0009
#define IDS_OBJECT_REQUIRED 0x01A8
#define IDS_CREATE_OBJ_ERROR 0x01AD
#define IDS_NO_PROPERTY 0x01B6
#define IDS_UNSUPPORTED_ACTION 0x01BD
#define IDS_ARG_NOT_OPT 0x01c1
#define IDS_SYNTAX_ERROR 0x03EA
#define IDS_SEMICOLON 0x03EC
#define IDS_LBRACKET 0x03ED
#define IDS_RBRACKET 0x03EE
#define IDS_INVALID_CHAR 0x03F6
#define IDS_UNTERMINATED_STR 0x03F7
#define IDS_MISPLACED_RETURN 0x03FA
#define IDS_INVALID_BREAK 0x03FB
#define IDS_INVALID_CONTINUE 0x03FC
#define IDS_LABEL_REDEFINED 0x0401
#define IDS_LABEL_NOT_FOUND 0x0402
#define IDS_DISABLED_CC 0x0406
#define IDS_NOT_FUNC 0x138A
#define IDS_NOT_DATE 0x138E
#define IDS_NOT_NUM 0x1389
@@ -35,8 +49,13 @@
#define IDS_ILLEGAL_ASSIGN 0x1390
#define IDS_UNDEFINED 0x1391
#define IDS_NOT_BOOL 0x1392
#define IDS_INVALID_DELETE 0x1394
#define IDS_NOT_VBARRAY 0x1395
#define IDS_JSCRIPT_EXPECTED 0x1396
#define IDS_REGEXP_SYNTAX_ERROR 0x1399
#define IDS_URI_INVALID_CHAR 0x13A0
#define IDS_URI_INVALID_CODING 0x13A1
#define IDS_FRACTION_DIGITS_OUT_OF_RANGE 0x13A2
#define IDS_PRECISION_OUT_OF_RANGE 0x13A3
#define IDS_INVALID_LENGTH 0x13A5
#define IDS_ARRAY_EXPECTED 0x13A7
+13 -2
View File
@@ -16,12 +16,23 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/* @makedep: jscript.inf */
REGINST REGINST jscript.inf
/* @makedep: jscript.rgs */
2 WINE_REGISTRY jscript.rgs
3 WINE_REGISTRY jscript_classes.rgs
/* @makedep: jsglobal.tlb */
1 TYPELIB jsglobal.tlb
#define WINE_FILEDESCRIPTION_STR "Wine JScript"
#define WINE_FILENAME_STR "jscript.dll"
#define WINE_FILEVERSION 5,7,7601,16982
#define WINE_FILEVERSION_STR "5.8.7601.16982"
#define WINE_PRODUCTVERSION 5,8,7601,16982
#define WINE_PRODUCTVERSION_STR "5.8.7601.16982"
#include "wine/wine_common_ver.rc"
#ifdef LANGUAGE_EN_US
#include "jscript_En.rc"
#endif
+750 -844
View File
File diff suppressed because it is too large Load Diff
+359
View File
@@ -0,0 +1,359 @@
/*
* Copyright 2010 Piotr Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "jscript.h"
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
typedef struct {
jsdisp_t dispex;
SAFEARRAY *safearray;
} VBArrayInstance;
static const WCHAR dimensionsW[] = {'d','i','m','e','n','s','i','o','n','s',0};
static const WCHAR getItemW[] = {'g','e','t','I','t','e','m',0};
static const WCHAR lboundW[] = {'l','b','o','u','n','d',0};
static const WCHAR toArrayW[] = {'t','o','A','r','r','a','y',0};
static const WCHAR uboundW[] = {'u','b','o','u','n','d',0};
static inline VBArrayInstance *vbarray_from_vdisp(vdisp_t *vdisp)
{
return (VBArrayInstance*)vdisp->u.jsdisp;
}
static inline VBArrayInstance *vbarray_this(vdisp_t *jsthis)
{
return is_vclass(jsthis, JSCLASS_VBARRAY) ? vbarray_from_vdisp(jsthis) : NULL;
}
static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VBArrayInstance *vbarray;
TRACE("\n");
vbarray = vbarray_this(vthis);
if(!vbarray)
return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL);
if(r)
*r = jsval_number(SafeArrayGetDim(vbarray->safearray));
return S_OK;
}
static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VBArrayInstance *vbarray;
int i, *indexes;
VARIANT out;
HRESULT hres;
TRACE("\n");
vbarray = vbarray_this(vthis);
if(!vbarray)
return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL);
if(argc < SafeArrayGetDim(vbarray->safearray))
return throw_range_error(ctx, JS_E_SUBSCRIPT_OUT_OF_RANGE, NULL);
indexes = heap_alloc(sizeof(int)*argc);
if(!indexes)
return E_OUTOFMEMORY;
for(i=0; i<argc; i++) {
hres = to_int32(ctx, argv[i], indexes+i);
if(FAILED(hres)) {
heap_free(indexes);
return hres;
}
}
hres = SafeArrayGetElement(vbarray->safearray, indexes, (void*)&out);
heap_free(indexes);
if(hres == DISP_E_BADINDEX)
return throw_range_error(ctx, JS_E_SUBSCRIPT_OUT_OF_RANGE, NULL);
else if(FAILED(hres))
return hres;
if(r) {
hres = variant_to_jsval(&out, r);
VariantClear(&out);
}
return hres;
}
static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VBArrayInstance *vbarray;
int dim;
HRESULT hres;
TRACE("\n");
vbarray = vbarray_this(vthis);
if(!vbarray)
return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL);
if(argc) {
hres = to_int32(ctx, argv[0], &dim);
if(FAILED(hres))
return hres;
} else
dim = 1;
hres = SafeArrayGetLBound(vbarray->safearray, dim, &dim);
if(hres == DISP_E_BADINDEX)
return throw_range_error(ctx, JS_E_SUBSCRIPT_OUT_OF_RANGE, NULL);
else if(FAILED(hres))
return hres;
if(r)
*r = jsval_number(dim);
return S_OK;
}
static HRESULT VBArray_toArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VBArrayInstance *vbarray;
jsdisp_t *array;
jsval_t val;
VARIANT *v;
int i, size = 1, ubound, lbound;
HRESULT hres;
TRACE("\n");
vbarray = vbarray_this(vthis);
if(!vbarray)
return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL);
for(i=1; i<=SafeArrayGetDim(vbarray->safearray); i++) {
SafeArrayGetLBound(vbarray->safearray, i, &lbound);
SafeArrayGetUBound(vbarray->safearray, i, &ubound);
size *= ubound-lbound+1;
}
hres = SafeArrayAccessData(vbarray->safearray, (void**)&v);
if(FAILED(hres))
return hres;
hres = create_array(ctx, 0, &array);
if(FAILED(hres)) {
SafeArrayUnaccessData(vbarray->safearray);
return hres;
}
for(i=0; i<size; i++) {
hres = variant_to_jsval(v, &val);
if(SUCCEEDED(hres)) {
hres = jsdisp_propput_idx(array, i, val);
jsval_release(val);
}
if(FAILED(hres)) {
SafeArrayUnaccessData(vbarray->safearray);
jsdisp_release(array);
return hres;
}
v++;
}
SafeArrayUnaccessData(vbarray->safearray);
if(r)
*r = jsval_obj(array);
else
jsdisp_release(array);
return S_OK;
}
static HRESULT VBArray_ubound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VBArrayInstance *vbarray;
int dim;
HRESULT hres;
TRACE("\n");
vbarray = vbarray_this(vthis);
if(!vbarray)
return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL);
if(argc) {
hres = to_int32(ctx, argv[0], &dim);
if(FAILED(hres))
return hres;
} else
dim = 1;
hres = SafeArrayGetUBound(vbarray->safearray, dim, &dim);
if(hres == DISP_E_BADINDEX)
return throw_range_error(ctx, JS_E_SUBSCRIPT_OUT_OF_RANGE, NULL);
else if(FAILED(hres))
return hres;
if(r)
*r = jsval_number(dim);
return S_OK;
}
static HRESULT VBArray_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
switch(flags) {
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
}
return S_OK;
}
static void VBArray_destructor(jsdisp_t *dispex)
{
VBArrayInstance *vbarray = (VBArrayInstance*)dispex;
SafeArrayDestroy(vbarray->safearray);
heap_free(vbarray);
}
static const builtin_prop_t VBArray_props[] = {
{dimensionsW, VBArray_dimensions, PROPF_METHOD},
{getItemW, VBArray_getItem, PROPF_METHOD|1},
{lboundW, VBArray_lbound, PROPF_METHOD},
{toArrayW, VBArray_toArray, PROPF_METHOD},
{uboundW, VBArray_ubound, PROPF_METHOD}
};
static const builtin_info_t VBArray_info = {
JSCLASS_VBARRAY,
{NULL, VBArray_value, 0},
sizeof(VBArray_props)/sizeof(*VBArray_props),
VBArray_props,
VBArray_destructor,
NULL
};
static HRESULT alloc_vbarray(script_ctx_t *ctx, jsdisp_t *object_prototype, VBArrayInstance **ret)
{
VBArrayInstance *vbarray;
HRESULT hres;
vbarray = heap_alloc_zero(sizeof(VBArrayInstance));
if(!vbarray)
return E_OUTOFMEMORY;
if(object_prototype)
hres = init_dispex(&vbarray->dispex, ctx, &VBArray_info, object_prototype);
else
hres = init_dispex_from_constr(&vbarray->dispex, ctx, &VBArray_info, ctx->vbarray_constr);
if(FAILED(hres)) {
heap_free(vbarray);
return hres;
}
*ret = vbarray;
return S_OK;
}
static HRESULT VBArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
VBArrayInstance *vbarray;
HRESULT hres;
TRACE("\n");
switch(flags) {
case DISPATCH_METHOD:
if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL);
return jsval_copy(argv[0], r);
case DISPATCH_CONSTRUCT:
if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
return throw_type_error(ctx, JS_E_VBARRAY_EXPECTED, NULL);
hres = alloc_vbarray(ctx, NULL, &vbarray);
if(FAILED(hres))
return hres;
hres = SafeArrayCopy(V_ARRAY(get_variant(argv[0])), &vbarray->safearray);
if(FAILED(hres)) {
jsdisp_release(&vbarray->dispex);
return hres;
}
*r = jsval_obj(&vbarray->dispex);
break;
default:
FIXME("unimplemented flags: %x\n", flags);
return E_NOTIMPL;
}
return S_OK;
}
HRESULT create_vbarray_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
{
VBArrayInstance *vbarray;
HRESULT hres;
static const WCHAR VBArrayW[] = {'V','B','A','r','r','a','y',0};
hres = alloc_vbarray(ctx, object_prototype, &vbarray);
if(FAILED(hres))
return hres;
hres = create_builtin_constructor(ctx, VBArrayConstr_value, VBArrayW, NULL, PROPF_CONSTR|1, &vbarray->dispex, ret);
jsdisp_release(&vbarray->dispex);
return hres;
}
HRESULT create_vbarray(script_ctx_t *ctx, SAFEARRAY *sa, jsdisp_t **ret)
{
VBArrayInstance *vbarray;
HRESULT hres;
hres = alloc_vbarray(ctx, NULL, &vbarray);
if(FAILED(hres))
return hres;
hres = SafeArrayCopy(sa, &vbarray->safearray);
if(FAILED(hres)) {
jsdisp_release(&vbarray->dispex);
return hres;
}
*ret = &vbarray->dispex;
return S_OK;
}
+1 -1
View File
@@ -1437,7 +1437,7 @@ Quickie:
RtlFreeHeap(RtlGetProcessHeap(), 0, PathString.Buffer);
}
/* Return the final result lenght */
/* Return the final result length */
return Result;
}
+1 -1
View File
@@ -1917,7 +1917,7 @@ Severity=Success
Facility=System
SymbolicName=ERROR_APP_INIT_FAILURE
Language=German
ERROR_APP_INIT_FAILURE - Das Programm konnte nicht richtig initalisiert werden (0x%lx). Klicken Sie auf OK, um das Programm zu beenden.
ERROR_APP_INIT_FAILURE - Das Programm konnte nicht richtig initialisiert werden (0x%lx). Klicken Sie auf OK, um das Programm zu beenden.
.
MessageId=576

Some files were not shown because too many files have changed in this diff Show More