Skip to content

Commit 127e678

Browse files
authored
Merge pull request #495 from vtereshkov/ub__self
No access to internal variables
2 parents 93924a9 + a6fd557 commit 127e678

18 files changed

+126
-78
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Umka is a statically typed embeddable scripting language. It combines simplicity
1818
* [Standard library](https://github.com/vtereshkov/umka-lang/blob/master/doc/lib.md)
1919
* [Embedding API](https://github.com/vtereshkov/umka-lang/blob/master/doc/api.md)
2020
* Editor support
21-
* [Sublime Text](https://github.com/vtereshkov/umka-lang/blob/master/Umka.sublime-syntax)
21+
* [Sublime Text](https://github.com/vtereshkov/umka-lang/blob/master/editors/Umka.sublime-syntax)
2222
* [VS Code](https://marketplace.visualstudio.com/items?itemName=mrms.vscode-umka)
2323
* [Community](https://discord.gg/PcT7cn59h9)
2424

build_linux.sh

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ mkdir umka_linux/examples/fractal -p
2828
mkdir umka_linux/examples/lisp -p
2929
mkdir umka_linux/examples/raytracer -p
3030
mkdir umka_linux/doc
31+
mkdir umka_linux/editors
3132

3233
mv src/libumka* src/umka umka_linux/
33-
cp src/umka_api.h Umka.sublime-syntax LICENSE umka_linux/
34+
cp src/umka_api.h LICENSE umka_linux/
3435

3536
cp examples/* umka_linux/examples -r
3637
cp doc/* umka_linux/doc
38+
cp editors/* umka_linux/editors
3739

3840
echo Build finished

build_linux_mingw.sh

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ mkdir umka_windows_mingw/examples/fractal -p
2828
mkdir umka_windows_mingw/examples/lisp -p
2929
mkdir umka_windows_mingw/examples/raytracer -p
3030
mkdir umka_windows_mingw/doc
31+
mkdir umka_windows_mingw/editors
3132

3233
mv src/libumka* src/umka.exe umka_windows_mingw/
33-
cp src/umka_api.h Umka.sublime-syntax LICENSE umka_windows_mingw/
34+
cp src/umka_api.h LICENSE umka_windows_mingw/
3435

3536
cp examples/* umka_windows_mingw/examples -r
3637
cp doc/* umka_windows_mingw/doc
38+
cp editors/* umka_windows_mingw/editors
3739

3840
echo Build finished

build_windows_mingw.bat

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@ move /y src\libumka* umka_windows_mingw
1616
move /y src\umka.exe umka_windows_mingw
1717
copy src\umka_api.h umka_windows_mingw
1818
copy LICENSE umka_windows_mingw
19-
copy Umka.sublime-syntax umka_windows_mingw
2019

2120
mkdir umka_windows_mingw\examples
2221
mkdir umka_windows_mingw\examples\3dcam
2322
mkdir umka_windows_mingw\examples\fractal
2423
mkdir umka_windows_mingw\examples\lisp
2524
mkdir umka_windows_mingw\examples\raytracer
2625
mkdir umka_windows_mingw\doc
26+
mkdir umka_windows_mingw\editors
2727

2828
copy examples\3dcam\*.* umka_windows_mingw\examples\3dcam
2929
copy examples\fractal\*.* umka_windows_mingw\examples\fractal
3030
copy examples\lisp\*.* umka_windows_mingw\examples\lisp
3131
copy examples\raytracer\*.* umka_windows_mingw\examples\raytracer
3232
copy doc\*.* umka_windows_mingw\doc
33+
copy editors\*.* umka_windows_mingw\editors

build_windows_msvc.bat

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,18 @@ move /y src\libumka* umka_windows_msvc
1414
move /y src\umka.exe umka_windows_msvc
1515
copy src\umka_api.h umka_windows_msvc
1616
copy LICENSE umka_windows_msvc
17-
copy Umka.sublime-syntax umka_windows_msvc
1817

1918
mkdir umka_windows_msvc\examples
2019
mkdir umka_windows_msvc\examples\3dcam
2120
mkdir umka_windows_msvc\examples\fractal
2221
mkdir umka_windows_msvc\examples\lisp
2322
mkdir umka_windows_msvc\examples\raytracer
2423
mkdir umka_windows_msvc\doc
24+
mkdir umka_windows_msvc\editors
2525

2626
copy examples\3dcam\*.* umka_windows_msvc\examples\3dcam
2727
copy examples\fractal\*.* umka_windows_msvc\examples\fractal
2828
copy examples\lisp\*.* umka_windows_msvc\examples\lisp
2929
copy examples\raytracer\*.* umka_windows_msvc\examples\raytracer
3030
copy doc\*.* umka_windows_msvc\doc
31+
copy editors\*.* umka_windows_msvc\editors

doc/lang.md

+6
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,12 @@ fn sizeofself(a: interface{...}): int
786786

787787
Returns the size in bytes of the variable that has been converted to the interface `a`.
788788

789+
```
790+
fn selfptr(a: interface{...}): ^void
791+
```
792+
793+
Returns the pointer to the variable that has been converted to the interface `a`.
794+
789795
```
790796
fn selfhasptr(a: interface{...}): bool
791797
```

Umka.sublime-syntax editors/Umka.sublime-syntax

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ file_extensions:
66
scope: source.umka
77
variables:
88
keyword: (break|case|const|continue|default|else|enum|for|fn|import|interface|if|in|map|return|str|struct|switch|type|var|weak)
9-
builtin: (abs|append|atan|atan2|cap|ceil|copy|cos|delete|exit|exp|fabs|floor|fprintf|fscanf|insert|keys|len|log|make|memusage|new|printf|resume|round|scanf|selfhasptr|selftypeeq|sin|sizeof|sizeofself|slice|sort|sprintf|sqrt|sscanf|trunc|typeptr|valid|validkey)
9+
builtin: (abs|append|atan|atan2|cap|ceil|copy|cos|delete|exit|exp|fabs|floor|fprintf|fscanf|insert|keys|len|log|make|memusage|new|printf|resume|round|scanf|selfhasptr|selfptr|selftypeeq|sin|sizeof|sizeofself|slice|sort|sprintf|sqrt|sscanf|trunc|typeptr|valid|validkey)
1010
ident: '[A-Za-z_][A-Za-z_0-9]*'
1111
typeident: '_*[A-Z][A-Za-z_0-9]*'
1212
space: '\s*'

playground/umka.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

runtime/std.um

+3-3
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ fn tobytes*(buf: any): []uint8 {
8282
return {}
8383
}
8484
bytes := make([]uint8, sizeofself(buf))
85-
rtlmemcpy(&bytes[0], buf.__self, sizeofself(buf))
85+
rtlmemcpy(&bytes[0], selfptr(buf), sizeofself(buf))
8686
return bytes
8787
}
8888

@@ -93,7 +93,7 @@ fn frombytes*(buf: any, bytes: []uint8): Err {
9393
if selfhasptr(buf) {
9494
return stderror(.ptr)
9595
}
96-
rtlmemcpy(buf.__self, &bytes[0], sizeofself(buf))
96+
rtlmemcpy(selfptr(buf), &bytes[0], sizeofself(buf))
9797
return {}
9898
}
9999

@@ -203,7 +203,7 @@ fn freadwrite(f: File, buf: any, reading: bool): (int, Err) {
203203
if selfhasptr(buf) {
204204
return 0, stderror(.ptr)
205205
}
206-
length, data = sizeofself(buf), buf.__self
206+
length, data = sizeofself(buf), selfptr(buf)
207207
}
208208
if length == 0 || data == null {
209209
return 0, stderror(.ok)

src/umka_compiler.c

+7-6
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,19 @@ static void compilerDeclareBuiltinTypes(Compiler *comp)
7070
// any
7171
comp->anyType = typeAdd(&comp->types, &comp->blocks, TYPE_INTERFACE);
7272

73-
typeAddField(&comp->types, comp->anyType, comp->ptrVoidType, "__self");
74-
typeAddField(&comp->types, comp->anyType, comp->ptrVoidType, "__selftype");
73+
typeAddField(&comp->types, comp->anyType, comp->ptrVoidType, "#self");
74+
typeAddField(&comp->types, comp->anyType, comp->ptrVoidType, "#selftype");
7575

7676
// fiber
7777
comp->fiberType = typeAdd(&comp->types, &comp->blocks, TYPE_FIBER);
7878

7979
Type *fnType = typeAdd(&comp->types, &comp->blocks, TYPE_FN);
80-
typeAddParam(&comp->types, &fnType->sig, comp->anyType, "__upvalues");
80+
typeAddParam(&comp->types, &fnType->sig, comp->anyType, "#upvalues");
8181
fnType->sig.resultType = comp->voidType;
8282

8383
comp->fiberType->base = typeAdd(&comp->types, &comp->blocks, TYPE_CLOSURE);
84-
typeAddField(&comp->types, comp->fiberType->base, fnType, "__fn");
85-
typeAddField(&comp->types, comp->fiberType->base, comp->anyType, "__upvalues");
84+
typeAddField(&comp->types, comp->fiberType->base, fnType, "#fn");
85+
typeAddField(&comp->types, comp->fiberType->base, comp->anyType, "#upvalues");
8686
}
8787

8888

@@ -151,6 +151,7 @@ static void compilerDeclareBuiltinIdents(Compiler *comp)
151151
identAddBuiltinFunc(&comp->idents, &comp->modules, &comp->blocks, "cap", comp->intType, BUILTIN_CAP);
152152
identAddBuiltinFunc(&comp->idents, &comp->modules, &comp->blocks, "sizeof", comp->intType, BUILTIN_SIZEOF);
153153
identAddBuiltinFunc(&comp->idents, &comp->modules, &comp->blocks, "sizeofself", comp->intType, BUILTIN_SIZEOFSELF);
154+
identAddBuiltinFunc(&comp->idents, &comp->modules, &comp->blocks, "selfptr", comp->ptrVoidType, BUILTIN_SELFPTR);
154155
identAddBuiltinFunc(&comp->idents, &comp->modules, &comp->blocks, "selfhasptr", comp->boolType, BUILTIN_SELFHASPTR);
155156
identAddBuiltinFunc(&comp->idents, &comp->modules, &comp->blocks, "selftypeeq", comp->boolType, BUILTIN_SELFTYPEEQ);
156157
identAddBuiltinFunc(&comp->idents, &comp->modules, &comp->blocks, "typeptr", comp->ptrVoidType, BUILTIN_TYPEPTR);
@@ -229,7 +230,7 @@ void compilerInit(Compiler *comp, const char *fileName, const char *sourceString
229230
comp->argc = argc;
230231
comp->argv = argv;
231232

232-
comp->blocks.module = moduleAdd(&comp->modules, "__universe");
233+
comp->blocks.module = moduleAdd(&comp->modules, "#universe");
233234

234235
compilerDeclareBuiltinTypes (comp);
235236
compilerDeclareBuiltinIdents(comp);

src/umka_decl.c

+13-13
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ static void parseSignature(Compiler *comp, Signature *sig)
106106
{
107107
// Dummy hidden parameter that allows any function to be converted to a closure
108108
if (!sig->isMethod)
109-
typeAddParam(&comp->types, sig, comp->anyType, "__upvalues");
109+
typeAddParam(&comp->types, sig, comp->anyType, "#upvalues");
110110

111111
// Formal parameter list
112112
lexEat(&comp->lex, TOK_LPAR);
@@ -207,7 +207,7 @@ static void parseSignature(Compiler *comp, Signature *sig)
207207

208208
// Structured result parameter
209209
if (typeStructured(sig->resultType))
210-
typeAddParam(&comp->types, sig, typeAddPtrTo(&comp->types, &comp->blocks, sig->resultType), "__result");
210+
typeAddParam(&comp->types, sig, typeAddPtrTo(&comp->types, &comp->blocks, sig->resultType), "#result");
211211
}
212212

213213

@@ -401,11 +401,11 @@ static Type *parseMapType(Compiler *comp)
401401
Type *nodeType = typeAdd(&comp->types, &comp->blocks, TYPE_STRUCT);
402402
Type *ptrNodeType = typeAddPtrTo(&comp->types, &comp->blocks, nodeType);
403403

404-
typeAddField(&comp->types, nodeType, comp->intType, "__len");
405-
typeAddField(&comp->types, nodeType, ptrKeyType, "__key");
406-
typeAddField(&comp->types, nodeType, ptrItemType, "__data");
407-
typeAddField(&comp->types, nodeType, ptrNodeType, "__left");
408-
typeAddField(&comp->types, nodeType, ptrNodeType, "__right");
404+
typeAddField(&comp->types, nodeType, comp->intType, "#len");
405+
typeAddField(&comp->types, nodeType, ptrKeyType, "#key");
406+
typeAddField(&comp->types, nodeType, ptrItemType, "#data");
407+
typeAddField(&comp->types, nodeType, ptrNodeType, "#left");
408+
typeAddField(&comp->types, nodeType, ptrNodeType, "#right");
409409

410410
type->base = nodeType;
411411
return type;
@@ -453,8 +453,8 @@ static Type *parseInterfaceType(Compiler *comp)
453453
type->numItems = 0;
454454

455455
// The interface type is the Umka equivalent of Interface + methods
456-
typeAddField(&comp->types, type, comp->ptrVoidType, "__self");
457-
typeAddField(&comp->types, type, comp->ptrVoidType, "__selftype");
456+
typeAddField(&comp->types, type, comp->ptrVoidType, "#self");
457+
typeAddField(&comp->types, type, comp->ptrVoidType, "#selftype");
458458

459459
// Method names and signatures, or embedded interfaces
460460
while (comp->lex.tok.kind == TOK_IDENT)
@@ -472,7 +472,7 @@ static Type *parseInterfaceType(Compiler *comp)
472472
Type *methodType = typeAdd(&comp->types, &comp->blocks, TYPE_FN);
473473
methodType->sig.isMethod = true;
474474

475-
typeAddParam(&comp->types, &methodType->sig, comp->ptrVoidType, "__self");
475+
typeAddParam(&comp->types, &methodType->sig, comp->ptrVoidType, "#self");
476476
parseSignature(comp, &methodType->sig);
477477

478478
Field *method = typeAddField(&comp->types, type, methodType, methodName);
@@ -486,7 +486,7 @@ static Type *parseInterfaceType(Compiler *comp)
486486
if (embeddedType->kind != TYPE_INTERFACE)
487487
comp->error.handler(comp->error.context, "Interface type expected");
488488

489-
for (int i = 2; i < embeddedType->numItems; i++) // Skip __self and __selftype in embedded interface
489+
for (int i = 2; i < embeddedType->numItems; i++) // Skip #self and #selftype in embedded interface
490490
{
491491
Type *methodType = typeAdd(&comp->types, &comp->blocks, TYPE_FN);
492492
typeDeepCopy(methodType, embeddedType->field[i]->type);
@@ -514,10 +514,10 @@ static Type *parseClosureType(Compiler *comp)
514514
// Function field
515515
Type *fnType = typeAdd(&comp->types, &comp->blocks, TYPE_FN);
516516
parseSignature(comp, &fnType->sig);
517-
typeAddField(&comp->types, type, fnType, "__fn");
517+
typeAddField(&comp->types, type, fnType, "#fn");
518518

519519
// Upvalues field
520-
typeAddField(&comp->types, type, comp->anyType, "__upvalues");
520+
typeAddField(&comp->types, type, comp->anyType, "#upvalues");
521521

522522
return type;
523523
}

0 commit comments

Comments
 (0)