Vous êtes sur la page 1sur 10

Ring Documentation, Release 1.

RingVM_CFunctionsList() ---> List

Example:
See RingVM_CFunctionsList()

58.9 ringvm_functionslist() function

The Function return a list of functions written in Ring.


Each List Member is a list contains the next items
Function Name
Program Counter (PC) - Function Position in Byte Code.
Source Code File Name
Private Flag (For Private Methods in Classes)
Syntax:
RingVM_FunctionsList() ---> List

Example:
test()

func test
see ringvm_functionslist()

Output:
test
8
B:/ring/tests/scripts/functionslist.ring
0

58.10 ringvm_classeslist() function

The Function return a list of Classes.


Each List Member is a list contains the next items
Class Name
Program Counter (PC) - Class Position in Byte Code.
Parent Class Name
Methods List
Flag (Is parent class information collected)
Pointer to the package (or NULL if no package is used)
Syntax:
RingVM_ClassesList() ---> List

58.9. ringvm_functionslist() function 568


Ring Documentation, Release 1.3

Example:
see ringvm_classeslist()

class class1
func f1
class class2 from class1
class class3 from class1

Output:
class1
9

f1
13
B:/ring/tests/scripts/classeslist.ring
0
0
00000000
class2
16
class1
0
00000000
class3
20
class1
0
00000000

58.11 ringvm_packageslist() function

The Function return a list of Packages.


Each List Member is a list contains the next items
Package Name
Classes List
Syntax:
RingVM_PackagesList() ---> List

Example:
see ringvm_packageslist()

package package1
class class1

package package2
class class1

package package3
class class1

Output:

58.11. ringvm_packageslist() function 569


Ring Documentation, Release 1.3

package1
class1
11

0
00FEF838
package2
class1
17

0
00FEF978
package3
class1
23

0
00FEFF68

58.12 ringvm_memorylist() function

The Function return a list of Memory Scopes and Variables.


Each List Member is a list contains variables in a different scope.
Each Item in the scope list is a list contains the next items
Variable Name
Variable Type
Variable Value
Pointer Type (List/Item) if the value is a list
Private Flag (if the variable is an attribute in a Class)
Syntax:
RingVM_MemoryList() ---> List

Example:
x = 10
test()
func test
y = 20
see ringvm_memorylist()

Output:
true
2
1
0
0
false
2
0
0

58.12. ringvm_memorylist() function 570


Ring Documentation, Release 1.3

0
nl
1

0
0
null
1

0
0
ring_gettemp_var
4
00000000
0
0
ccatcherror
1
NULL
0
0
ring_settemp_var
4
00000000
0
0
ring_tempflag_var
2
0
0
0
stdin
3
50512DB8
file
0
0
0
stdout
3
50512DD8
file
0
0
0
stderr
3
50512DF8
file
0
0
0
this
4
00000000
0
0

58.12. ringvm_memorylist() function 571


Ring Documentation, Release 1.3

sysargv
3
B:\ring\bin/ring
B:/ring/tests/scripts/memorylist.ring
0
0
x
2
10
0
0
y
2
20
0
0

58.13 ringvm_calllist() function

The Function return a list of the functions call list.


Each List Member is a list contains the next items
Function Type
Function Name
Program Counter (PC)
Stack Pointer (SP)
Temp. Memory List
Method or Function Flag
Caller PC
FuncExec Flag
ListStart Flag
Nested Lists Pointer
State List
Syntax:
RingVM_CallList() ---> List

Example:
hello()
func hello
test()

func test
mylist = ringvm_calllist()
for t in mylist see t[2] + nl next

Output:

58.13. ringvm_calllist() function 572


Ring Documentation, Release 1.3

function hello() in file B:/ring/tests/scripts/calllist.ring


called from line 1
function test() in file B:/ring/tests/scripts/calllist.ring
called from line 3
ringvm_calllist

58.14 ringvm_fileslist() function

Function return a list of the Ring Files.


Syntax:
RingVM_FilesList() ---> List

Example:
load "stdlib.ring"
see ringvm_fileslist()

Output:
B:/ring/tests/scripts/fileslist.ring
B:\ring\bin\stdlib.ring
eval
stdlib.ring
stdlib.rh
stdclasses.ring
stdfunctions.ring
stdbase.ring
stdstring.ring
stdlist.ring
stdstack.ring
stdqueue.ring
stdmath.ring
stddatetime.ring
stdfile.ring
stdsystem.ring
stddebug.ring
stddatatype.ring
stdconversion.ring
stdodbc.ring
stdmysql.ring
stdsecurity.ring
stdinternet.ring
stdhashtable.ring
stdtree.ring

58.14. ringvm_fileslist() function 573


CHAPTER

FIFTYNINE

INTRODUCTION

In this chapter we will learn about embedding Ring in Ring programs and applications.

59.1 Embedding Ring in Ring without sharing the State

From Ring 1.0 we already have functions for embedding Ring in the C language. Also we can execute Ring code
inside Ring programs using the eval() function. In this release we provide functions for embedding Ring in Ring
programs without sharing the state.
Advantages:
1. Quick integration for Ring programs and applications together without conflicts.
2. Execute and run Ring code in safe environments that we can trace.
Example:
pState = ring_state_init()
ring_state_runcode(pState,"See 'Hello, World!'+nl")
ring_state_runcode(pState,"x = 10")

pState2 = ring_state_init()
ring_state_runcode(pState2,"See 'Hello, World!'+nl")
ring_state_runcode(pState2,"x = 20")

ring_state_runcode(pState,"see x +nl")
ring_state_runcode(pState2,"see x +nl")

v1 = ring_state_findvar(pState,"x")
v2 = ring_state_findvar(pState2,"x")

see v1[3] + nl
see V2[3] + nl

ring_state_delete(pState)
ring_state_delete(pState2)

Output:
Hello, World!
Hello, World!
10
20
10
20

574
Ring Documentation, Release 1.3

59.2 Serial Execution of Programs

We can execute application after another application using ring_state_main()


Example:
chdir(exefolder()+"/../applications/formdesigner")
ring_state_main('formdesigner.ring')
chdir(exefolder()+"/../applications/cards")
ring_state_main('cards.ring')

59.2. Serial Execution of Programs 575


CHAPTER

SIXTY

EXTENSION USING THE C/C++ LANGUAGES

We can extend the Ring Virtual Machine (RingVM) by adding new functions written in the C programming language
or C++. The RingVM comes with many functions written in C that we can call like any Ring function.
We can extend the language by writing new functions then rebuilding the RingVM again, or we can create shared
library (DLL/So) file to extend the RingVM without the need to rebuild it.
The Ring language source code comes with two files to add new modules to the RingVM, ring_ext.h and ring_ext.c

60.1 ring_ext.h

The file ring_ext.h contains constants that we can change to include/exclude modules during the build process.
#ifndef ringext_h
#define ringext_h
/* Constants */
#define RING_VM_LISTFUNCS 1
#define RING_VM_REFMETA 1
#define RING_VM_MATH 1
#define RING_VM_FILE 1
#define RING_VM_OS 1
#define RING_VM_MYSQL 1
#define RING_VM_ODBC 1
#define RING_VM_OPENSSL 1
#define RING_VM_CURL 1
#define RING_VM_DLL 1
#endif

60.2 ring_ext.c

The file ring_ext.c check constants defined in ring_ext.h before calling the start-up function in each module.
Each module contains a function that register the module functions in the RingVM.
#include "ring.h"

void ring_vm_extension ( RingState *pRingState )


{
/* Reflection and Meta-programming */
#if RING_VM_REFMETA
ring_vm_refmeta_loadfunctions(pRingState);
#endif

576
Ring Documentation, Release 1.3

/* List Functions */
#if RING_VM_LISTFUNCS
ring_vm_listfuncs_loadfunctions(pRingState);
#endif
/* Math */
#if RING_VM_MATH
ring_vm_math_loadfunctions(pRingState);
#endif
/* File */
#if RING_VM_FILE
ring_vm_file_loadfunctions(pRingState);
#endif
/* OS */
#if RING_VM_OS
ring_vm_os_loadfunctions(pRingState);
#endif
/* MySQL */
#if RING_VM_MYSQL
ring_vm_mysql_loadfunctions(pRingState);
#endif
/* ODBC */
#if RING_VM_ODBC
ring_vm_odbc_loadfunctions(pRingState);
#endif
/* OPENSSL */
#if RING_VM_OPENSSL
ring_vm_openssl_loadfunctions(pRingState);
#endif
/* CURL */
#if RING_VM_CURL
ring_vm_curl_loadfunctions(pRingState);
#endif
/* DLL */
#if RING_VM_DLL
ring_vm_dll_loadfunctions(pRingState);
#endif
}

60.3 Module Organization

Each module starts by include the ring header file (ring.h). This files contains the Ring API that we can use to extend
the RingVM.
Each module comes with a function to register the module functions in the RingVM The registration is done by using
ring_vm_funcregister() function.
The ring_vm_funcregister() function takes two parameters, the first is the function name that will be used by Ring
programs to call the function. The second parameter is the function pointer in the C program.
for example, the ring_vmmath.c module contains the next code to register the module functions
#include "ring.h"

void ring_vm_math_loadfunctions ( RingState *pRingState )


{
ring_vm_funcregister("sin",ring_vm_math_sin);
ring_vm_funcregister("cos",ring_vm_math_cos);

60.3. Module Organization 577

Vous aimerez peut-être aussi